From 2c2e2b5f21784456608fc69d79a46fadec00117c Mon Sep 17 00:00:00 2001 From: "Antonio Moura (@antl3x)" Date: Mon, 4 Mar 2024 11:23:55 -0700 Subject: [PATCH 01/11] #0 --- .../_scripts/dockerhub.release.mjs | 2 +- minirepos/@codeplot-api/package.json | 2 +- .../_scripts/dockerhub.release.mjs | 2 +- minirepos/@codeplot-front/index.html | 2 +- minirepos/@codeplot-front/package.json | 6 +- minirepos/@codeplot-front/pnpm-lock.yaml | 1434 ++++++++++++++++- .../_impl_/CodeplotShapeUtil.tsx | 5 + .../@.tldraw.shapes/_impl_/ICodeplotShape.ts | 1 + ...] DefaultMimeApplicationPlotlyV1Render.tsx | 45 + .../[render] DefaultMimeImagePngRender.tsx | 36 + .../src/@.tldraw.shapes/_impl_/styles.css | 5 + .../@codeplot-front/src/@types/index.d.ts | 1 + .../codeplot-ipython/__init__.py | 67 +- minirepos/@codeplot-ipython/setup.py | 4 +- .../build/lib/codeplot/main.py | 78 +- .../codeplot.egg-info/PKG-INFO | 4 +- .../codeplot.egg-info/requires.txt | 2 +- minirepos/@codeplot-python/codeplot/main.py | 78 +- minirepos/@codeplot-python/setup.py | 4 +- 19 files changed, 1613 insertions(+), 165 deletions(-) create mode 100644 minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeApplicationPlotlyV1Render.tsx diff --git a/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs b/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs index 3e76d28..458bb8f 100644 --- a/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs +++ b/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs @@ -6,7 +6,7 @@ echo "$CODEPLOT_DOCKER_ACCESS_TOKEN" | docker login --username "codeplotco" --pa pnpm compile -docker build -t codeplotco/codeplot-api:latest --file Dockerfile ../../ +docker buildx build --platform linux/amd64,linux/arm64 -t codeplotco/codeplot-api:latest --file Dockerfile ../../ docker tag codeplotco/codeplot-api:latest codeplotco/codeplot-api:${pkg.version} docker tag codeplotco/codeplot-api:latest codeplotco/codeplot-api:${pkg.version}-$(git rev-parse --short HEAD) docker push codeplotco/codeplot-api:latest diff --git a/minirepos/@codeplot-api/package.json b/minirepos/@codeplot-api/package.json index 4e09211..d360688 100644 --- a/minirepos/@codeplot-api/package.json +++ b/minirepos/@codeplot-api/package.json @@ -1,6 +1,6 @@ { "name": "@codeplot/api", - "version": "0.1.0", + "version": "1.0.0", "description": "Server API", "author": "Antonio Moura (@antl3x)", "type": "module", diff --git a/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs b/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs index a1a5cb8..4fbb721 100644 --- a/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs +++ b/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs @@ -7,7 +7,7 @@ echo "$CODEPLOT_DOCKER_ACCESS_TOKEN" | docker login --username "codeplotco" --pa pnpm compile -docker build -t codeplotco/codeplot-front:latest . +docker buildx build --platform linux/amd64,linux/arm64 -t codeplotco/codeplot-front:latest . docker tag codeplotco/codeplot-front:latest codeplotco/codeplot-front:${pkg.version} docker tag codeplotco/codeplot-front:latest codeplotco/codeplot-front:${pkg.version}-$(git rev-parse --short HEAD) docker push codeplotco/codeplot-front:latest diff --git a/minirepos/@codeplot-front/index.html b/minirepos/@codeplot-front/index.html index 560369e..f83293a 100644 --- a/minirepos/@codeplot-front/index.html +++ b/minirepos/@codeplot-front/index.html @@ -7,7 +7,7 @@ - + ▱ codeplot / your spatial canvas for data exploration diff --git a/minirepos/@codeplot-front/package.json b/minirepos/@codeplot-front/package.json index e6c66d2..09a18e4 100644 --- a/minirepos/@codeplot-front/package.json +++ b/minirepos/@codeplot-front/package.json @@ -1,7 +1,7 @@ { "name": "@codeplot/front", "private": true, - "version": "0.3.0", + "version": "1.0.0", "type": "module", "scripts": { "compile": "zx _scripts/compile.mjs", @@ -32,12 +32,14 @@ "mobx": "^6.12.0", "mobx-react": "^9.1.0", "mobx-state-tree": "5.4.0", + "plotly.js": "^2.29.1", "react": "^18.2.0", "react-aria-components": "^1.0.1", "react-dom": "^18.2.0", "react-inspector": "^6.0.2", "react-json-view": "^1.21.3", "react-katex": "^3.0.1", + "react-plotly.js": "^2.6.0", "socket.io-client": "^4.7.4", "typeid-js": "^0.5.0", "y-utility": "^0.1.3", @@ -46,9 +48,11 @@ "yjs": "^13.6.12" }, "devDependencies": { + "@types/plotly.js": "^2.29.1", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.17", "@types/react-katex": "^3.0.4", + "@types/react-plotly.js": "^2.6.3", "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^6.14.0", "@vitejs/plugin-react": "^4.2.1", diff --git a/minirepos/@codeplot-front/pnpm-lock.yaml b/minirepos/@codeplot-front/pnpm-lock.yaml index 45e4fef..63b0681 100644 --- a/minirepos/@codeplot-front/pnpm-lock.yaml +++ b/minirepos/@codeplot-front/pnpm-lock.yaml @@ -56,6 +56,9 @@ dependencies: mobx-state-tree: specifier: 5.4.0 version: 5.4.0(mobx@6.12.0) + plotly.js: + specifier: ^2.29.1 + version: 2.29.1(mapbox-gl@1.13.3) react: specifier: ^18.2.0 version: 18.2.0 @@ -74,6 +77,9 @@ dependencies: react-katex: specifier: ^3.0.1 version: 3.0.1(prop-types@15.8.1)(react@18.2.0) + react-plotly.js: + specifier: ^2.6.0 + version: 2.6.0(plotly.js@2.29.1)(react@18.2.0) socket.io-client: specifier: ^4.7.4 version: 4.7.4 @@ -94,6 +100,9 @@ dependencies: version: 13.6.12 devDependencies: + '@types/plotly.js': + specifier: ^2.29.1 + version: 2.29.1 '@types/react': specifier: ^18.2.48 version: 18.2.55 @@ -103,6 +112,9 @@ devDependencies: '@types/react-katex': specifier: ^3.0.4 version: 3.0.4 + '@types/react-plotly.js': + specifier: ^2.6.3 + version: 2.6.3 '@typescript-eslint/eslint-plugin': specifier: ^6.14.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) @@ -493,6 +505,13 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@choojs/findup@0.2.1: + resolution: {integrity: sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: false + /@csstools/css-parser-algorithms@2.5.0(@csstools/css-tokenizer@2.2.3): resolution: {integrity: sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==} engines: {node: ^14 || ^16 || >=18} @@ -1042,6 +1061,54 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@mapbox/geojson-rewind@0.5.2: + resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} + hasBin: true + dependencies: + get-stream: 6.0.1 + minimist: 1.2.8 + dev: false + + /@mapbox/geojson-types@1.0.2: + resolution: {integrity: sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==} + dev: false + + /@mapbox/jsonlint-lines-primitives@2.0.2: + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + dev: false + + /@mapbox/mapbox-gl-supported@1.5.0(mapbox-gl@1.13.3): + resolution: {integrity: sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==} + peerDependencies: + mapbox-gl: '>=0.32.1 <2.0.0' + dependencies: + mapbox-gl: 1.13.3 + dev: false + + /@mapbox/point-geometry@0.1.0: + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + dev: false + + /@mapbox/tiny-sdf@1.2.5: + resolution: {integrity: sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==} + dev: false + + /@mapbox/unitbezier@0.0.0: + resolution: {integrity: sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==} + dev: false + + /@mapbox/vector-tile@1.3.1: + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + dependencies: + '@mapbox/point-geometry': 0.1.0 + dev: false + + /@mapbox/whoots-js@3.1.0: + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1174,6 +1241,76 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dev: true + /@plotly/d3-sankey-circular@0.33.1: + resolution: {integrity: sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==} + dependencies: + d3-array: 1.2.4 + d3-collection: 1.0.7 + d3-shape: 1.3.7 + elementary-circuits-directed-graph: 1.3.1 + dev: false + + /@plotly/d3-sankey@0.7.2: + resolution: {integrity: sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==} + dependencies: + d3-array: 1.2.4 + d3-collection: 1.0.7 + d3-shape: 1.3.7 + dev: false + + /@plotly/d3@3.8.1: + resolution: {integrity: sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg==} + dev: false + + /@plotly/mapbox-gl@1.13.4(mapbox-gl@1.13.3): + resolution: {integrity: sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==} + engines: {node: '>=6.4.0'} + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/geojson-types': 1.0.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 1.5.0(mapbox-gl@1.13.3) + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 1.2.5 + '@mapbox/unitbezier': 0.0.0 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + csscolorparser: 1.0.3 + earcut: 2.2.4 + geojson-vt: 3.2.1 + gl-matrix: 3.4.3 + grid-index: 1.1.0 + murmurhash-js: 1.0.0 + pbf: 3.2.1 + potpack: 1.0.2 + quickselect: 2.0.0 + rw: 1.3.3 + supercluster: 7.1.5 + tinyqueue: 2.0.3 + vt-pbf: 3.1.3 + transitivePeerDependencies: + - mapbox-gl + dev: false + + /@plotly/point-cluster@3.1.9: + resolution: {integrity: sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==} + dependencies: + array-bounds: 1.0.1 + binary-search-bounds: 2.0.5 + clamp: 1.0.1 + defined: 1.0.1 + dtype: 2.0.0 + flatten-vertex-data: 1.0.2 + is-obj: 1.0.1 + math-log2: 1.0.1 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + dev: false + + /@plotly/regl@2.1.2: + resolution: {integrity: sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==} + dev: false + /@primer/octicons-react@12.1.0(react@18.2.0): resolution: {integrity: sha512-eb/5Obsp6/pVkyzzGhobK6aPAkKqx6VleF/7HYeihGTYm3rGZc+prL/jhxD5Mo1P6U343YEkHjc2gKuvtENn1g==} engines: {node: '>=8'} @@ -5364,6 +5501,37 @@ packages: '@tldraw/utils': 2.0.0-alpha.19 dev: false + /@turf/area@6.5.0: + resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: false + + /@turf/bbox@6.5.0: + resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: false + + /@turf/centroid@6.5.0: + resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==} + dependencies: + '@turf/helpers': 6.5.0 + '@turf/meta': 6.5.0 + dev: false + + /@turf/helpers@6.5.0: + resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} + dev: false + + /@turf/meta@6.5.0: + resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} + dependencies: + '@turf/helpers': 6.5.0 + dev: false + /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: @@ -5446,6 +5614,10 @@ packages: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} dev: false + /@types/plotly.js@2.29.1: + resolution: {integrity: sha512-rQwpL3XFqSjCjG3qTlZCDvIOgc17m/0pgOpkv0O/0awdsHD+CAxaczgJTBlAsd8OhsjIcJC3UESrbBEJ92kUVg==} + dev: true + /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} @@ -5464,6 +5636,13 @@ packages: '@types/react': 18.2.55 dev: true + /@types/react-plotly.js@2.6.3: + resolution: {integrity: sha512-HBQwyGuu/dGXDsWhnQrhH+xcJSsHvjkwfSRjP+YpOsCCWryIuXF78ZCBjpfgO3sCc0Jo8sYp4NOGtqT7Cn3epQ==} + dependencies: + '@types/plotly.js': 2.29.1 + '@types/react': 18.2.55 + dev: true + /@types/react-virtualized-auto-sizer@1.0.4: resolution: {integrity: sha512-nhYwlFiYa8M3S+O2T9QO/e1FQUYMr/wJENUdf/O0dhRi1RS/93rjrYQFYdbUqtdFySuhrtnEDX29P6eKOttY+A==} dependencies: @@ -5675,6 +5854,10 @@ packages: resolution: {integrity: sha512-uTHDeu2xI5E1IFwf37JFQM31RrH7mY7877RqPBS4ZqSNUwoLDuct8AhBWaXGnVizBAYyimVwgCyGa9z/NiRhXA==} dev: false + /abs-svg-path@0.1.1: + resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + dev: false + /abstract-leveldown@6.2.3: resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} engines: {node: '>=6'} @@ -5752,6 +5935,10 @@ packages: uri-js: 4.4.1 dev: true + /almost-equal@1.1.0: + resolution: {integrity: sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==} + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -5800,6 +5987,29 @@ packages: tslib: 2.6.2 dev: false + /array-bounds@1.0.1: + resolution: {integrity: sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==} + dev: false + + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: false + + /array-normalize@1.1.4: + resolution: {integrity: sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==} + dependencies: + array-bounds: 1.0.1 + dev: false + + /array-range@1.0.1: + resolution: {integrity: sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==} + dev: false + + /array-rearrange@2.2.2: + resolution: {integrity: sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==} + dev: false + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -5877,6 +6087,11 @@ packages: resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} dev: false + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} requiresBuild: true @@ -5890,6 +6105,25 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /binary-search-bounds@2.0.5: + resolution: {integrity: sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==} + dev: false + + /bit-twiddle@1.0.2: + resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} + dev: false + + /bitmap-sdf@1.0.4: + resolution: {integrity: sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==} + dev: false + + /bl@2.2.1: + resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -5917,6 +6151,10 @@ packages: node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.3) + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} requiresBuild: true @@ -5954,6 +6192,12 @@ packages: /caniuse-lite@1.0.30001585: resolution: {integrity: sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==} + /canvas-fit@1.5.0: + resolution: {integrity: sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==} + dependencies: + element-size: 1.1.1 + dev: false + /canvas-size@1.2.6: resolution: {integrity: sha512-x2iVHOrZ5x9V0Hwx6kBz+Yxf/VCAII+jrD6WLjJbytJLozHq/oDJjEva432Os0eHxWMFR0vYlLJwTr6QxyxQqw==} dev: false @@ -5992,6 +6236,10 @@ packages: optionalDependencies: fsevents: 2.3.3 + /clamp@1.0.1: + resolution: {integrity: sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==} + dev: false + /classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false @@ -6014,6 +6262,12 @@ packages: engines: {node: '>=6'} dev: false + /color-alpha@1.0.4: + resolution: {integrity: sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==} + dependencies: + color-parse: 1.3.8 + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -6025,12 +6279,49 @@ packages: dependencies: color-name: 1.1.4 + /color-id@1.1.0: + resolution: {integrity: sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==} + dependencies: + clamp: 1.0.1 + dev: false + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /color-normalize@1.5.0: + resolution: {integrity: sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==} + dependencies: + clamp: 1.0.1 + color-rgba: 2.1.1 + dtype: 2.0.0 + dev: false + + /color-parse@1.3.8: + resolution: {integrity: sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==} + dependencies: + color-name: 1.1.4 + defined: 1.0.1 + is-plain-obj: 1.1.0 + dev: false + + /color-rgba@2.1.1: + resolution: {integrity: sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==} + dependencies: + clamp: 1.0.1 + color-parse: 1.3.8 + color-space: 1.16.0 + dev: false + + /color-space@1.16.0: + resolution: {integrity: sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==} + dependencies: + hsluv: 0.0.3 + mumath: 3.3.4 + dev: false + /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: @@ -6084,6 +6375,16 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: false + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false @@ -6103,6 +6404,10 @@ packages: requiresBuild: true dev: false + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} @@ -6157,6 +6462,10 @@ packages: typescript: 5.3.3 dev: true + /country-regex@1.1.0: + resolution: {integrity: sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==} + dev: false + /cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: @@ -6177,17 +6486,55 @@ packages: resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} dev: false + /css-font-size-keywords@1.0.0: + resolution: {integrity: sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==} + dev: false + + /css-font-stretch-keywords@1.0.1: + resolution: {integrity: sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==} + dev: false + + /css-font-style-keywords@1.0.1: + resolution: {integrity: sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==} + dev: false + + /css-font-weight-keywords@1.0.0: + resolution: {integrity: sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==} + dev: false + + /css-font@1.2.0: + resolution: {integrity: sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==} + dependencies: + css-font-size-keywords: 1.0.0 + css-font-stretch-keywords: 1.0.1 + css-font-style-keywords: 1.0.1 + css-font-weight-keywords: 1.0.0 + css-global-keywords: 1.0.1 + css-system-font-keywords: 1.0.0 + pick-by-alias: 1.2.0 + string-split-by: 1.0.0 + unquote: 1.1.1 + dev: false + /css-functions-list@3.2.1: resolution: {integrity: sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==} engines: {node: '>=12 || >=16'} dev: true + /css-global-keywords@1.0.1: + resolution: {integrity: sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==} + dev: false + /css-in-js-utils@3.1.0: resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} dependencies: hyphenate-style-name: 1.0.4 dev: false + /css-system-font-keywords@1.0.0: + resolution: {integrity: sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==} + dev: false + /css-tree@1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} @@ -6208,6 +6555,10 @@ packages: resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} dev: false + /csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -6216,6 +6567,10 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /d3-array@1.2.4: + resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + dev: false + /d3-array@2.12.1: resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} dependencies: @@ -6242,6 +6597,10 @@ packages: d3-path: 2.0.0 dev: false + /d3-collection@1.0.7: + resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} + dev: false + /d3-color@2.0.0: resolution: {integrity: sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==} dev: false @@ -6258,6 +6617,10 @@ packages: delaunator: 4.0.1 dev: false + /d3-dispatch@1.0.6: + resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} + dev: false + /d3-dispatch@2.0.0: resolution: {integrity: sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==} dev: false @@ -6288,6 +6651,15 @@ packages: d3-dsv: 2.0.0 dev: false + /d3-force@1.2.1: + resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} + dependencies: + d3-collection: 1.0.7 + d3-dispatch: 1.0.6 + d3-quadtree: 1.0.7 + d3-timer: 1.0.10 + dev: false + /d3-force@2.1.1: resolution: {integrity: sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==} dependencies: @@ -6296,16 +6668,40 @@ packages: d3-timer: 2.0.0 dev: false + /d3-format@1.4.5: + resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} + dev: false + /d3-format@2.0.0: resolution: {integrity: sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==} dev: false + /d3-geo-projection@2.9.0: + resolution: {integrity: sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==} + hasBin: true + dependencies: + commander: 2.20.3 + d3-array: 1.2.4 + d3-geo: 1.12.1 + resolve: 1.22.8 + dev: false + + /d3-geo@1.12.1: + resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} + dependencies: + d3-array: 1.2.4 + dev: false + /d3-geo@2.0.2: resolution: {integrity: sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==} dependencies: d3-array: 2.12.1 dev: false + /d3-hierarchy@1.1.9: + resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} + dev: false + /d3-hierarchy@2.0.0: resolution: {integrity: sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==} dev: false @@ -6316,6 +6712,17 @@ packages: d3-color: 2.0.0 dev: false + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 2.0.0 + dev: false + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + /d3-path@2.0.0: resolution: {integrity: sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==} dev: false @@ -6324,6 +6731,10 @@ packages: resolution: {integrity: sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==} dev: false + /d3-quadtree@1.0.7: + resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} + dev: false + /d3-quadtree@2.0.0: resolution: {integrity: sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==} dev: false @@ -6353,24 +6764,44 @@ packages: resolution: {integrity: sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==} dev: false + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + /d3-shape@2.1.0: resolution: {integrity: sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==} dependencies: d3-path: 2.0.0 dev: false + /d3-time-format@2.3.0: + resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} + dependencies: + d3-time: 1.1.0 + dev: false + /d3-time-format@3.0.0: resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==} dependencies: d3-time: 2.1.1 dev: false + /d3-time@1.1.0: + resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} + dev: false + /d3-time@2.1.1: resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} dependencies: d3-array: 2.12.1 dev: false + /d3-timer@1.0.10: + resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} + dev: false + /d3-timer@2.0.0: resolution: {integrity: sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==} dev: false @@ -6433,6 +6864,13 @@ packages: d3-zoom: 2.0.0 dev: false + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.64 + type: 1.2.0 + dev: false + /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -6445,6 +6883,28 @@ packages: '@babel/runtime': 7.23.9 dev: false + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -6487,6 +6947,10 @@ packages: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: true + /detect-kerning@2.1.2: + resolution: {integrity: sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==} + dev: false + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -6556,21 +7020,60 @@ packages: tslib: 2.6.2 dev: false + /draw-svg-path@1.0.0: + resolution: {integrity: sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==} + dependencies: + abs-svg-path: 0.1.1 + normalize-svg-path: 0.1.0 + dev: false + /dset@2.1.0: resolution: {integrity: sha512-hlQYwNEdW7Qf8zxysy+yN1E8C/SxRst3Z9n+IvXOR35D9bPVwNHhnL8ZBeoZjvinuGrlvGg6pAMDwhmjqFDgjA==} engines: {node: '>=4'} dev: false + /dtype@2.0.0: + resolution: {integrity: sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==} + engines: {node: '>= 0.8.0'} + dev: false + + /dup@1.0.0: + resolution: {integrity: sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==} + dev: false + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + dev: false + + /earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + dev: false + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} /electron-to-chromium@1.4.662: resolution: {integrity: sha512-gfl1XVWTQmPHhqEG0kN77SpUxaqPpMb9r83PT4gvKhg7P3irSxru3lW85RxvK1uI1j2CAcTWPjG/HbE0IP/Rtg==} + /element-size@1.1.1: + resolution: {integrity: sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==} + dev: false + + /elementary-circuits-directed-graph@1.3.1: + resolution: {integrity: sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==} + dependencies: + strongly-connected-components: 1.0.1 + dev: false + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6589,6 +7092,12 @@ packages: dev: false optional: true + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + /engine.io-client@6.5.3: resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} dependencies: @@ -6642,6 +7151,41 @@ packages: stackframe: 1.3.4 dev: false + /es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + esniff: 2.0.1 + next-tick: 1.1.0 + dev: false + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.64 + es6-symbol: 3.1.3 + dev: false + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: false + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: false + /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -6685,13 +7229,25 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-prettier@9.1.0(eslint@8.56.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} hasBin: true - peerDependencies: - eslint: '>=7.0.0' dependencies: - eslint: 8.56.0 + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-config-prettier@9.1.0(eslint@8.56.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 dev: true /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5): @@ -6792,6 +7348,16 @@ packages: - supports-color dev: true + /esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: false + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6801,6 +7367,12 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -6818,7 +7390,6 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -6827,7 +7398,13 @@ packages: /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.64 + dev: false /event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} @@ -6845,6 +7422,25 @@ packages: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: false + + /falafel@2.2.5: + resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 7.4.1 + isarray: 2.0.5 + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -6862,6 +7458,12 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 + /fast-isnumeric@1.1.4: + resolution: {integrity: sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==} + dependencies: + is-string-blank: 1.0.1 + dev: false + /fast-json-patch@3.1.1: resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} dev: false @@ -6984,6 +7586,12 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /flatten-vertex-data@1.0.2: + resolution: {integrity: sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==} + dependencies: + dtype: 2.0.0 + dev: false + /flux@4.0.4(react@18.2.0): resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} peerDependencies: @@ -7008,6 +7616,18 @@ packages: debug: 4.3.4 dev: true + /font-atlas@2.1.0: + resolution: {integrity: sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==} + dependencies: + css-font: 1.2.0 + dev: false + + /font-measure@1.2.2: + resolution: {integrity: sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==} + dependencies: + css-font: 1.2.0 + dev: false + /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -7034,6 +7654,13 @@ packages: /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: false + /from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} dev: true @@ -7079,6 +7706,10 @@ packages: engines: {node: '>=6.9.0'} dev: true + /geojson-vt@3.2.1: + resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + dev: false + /get-browser-rtc@1.1.0: resolution: {integrity: sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==} dev: false @@ -7088,11 +7719,62 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true + /get-canvas-context@1.0.2: + resolution: {integrity: sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==} + dev: false + /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} dev: false + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /gl-mat4@1.2.0: + resolution: {integrity: sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==} + dev: false + + /gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: false + + /gl-text@1.3.1: + resolution: {integrity: sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==} + dependencies: + bit-twiddle: 1.0.2 + color-normalize: 1.5.0 + css-font: 1.2.0 + detect-kerning: 2.1.2 + es6-weak-map: 2.0.3 + flatten-vertex-data: 1.0.2 + font-atlas: 2.1.0 + font-measure: 1.2.2 + gl-util: 3.1.3 + is-plain-obj: 1.1.0 + object-assign: 4.1.1 + parse-rect: 1.2.0 + parse-unit: 1.0.1 + pick-by-alias: 1.2.0 + regl: 2.1.0 + to-px: 1.0.1 + typedarray-pool: 1.2.0 + dev: false + + /gl-util@3.1.3: + resolution: {integrity: sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==} + dependencies: + is-browser: 2.1.0 + is-firefox: 1.0.3 + is-plain-obj: 1.1.0 + number-is-integer: 1.0.1 + object-assign: 4.1.1 + pick-by-alias: 1.2.0 + weak-map: 1.0.8 + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -7185,6 +7867,119 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true + /glsl-inject-defines@1.0.3: + resolution: {integrity: sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==} + dependencies: + glsl-token-inject-block: 1.1.0 + glsl-token-string: 1.0.1 + glsl-tokenizer: 2.1.5 + dev: false + + /glsl-resolve@0.0.1: + resolution: {integrity: sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==} + dependencies: + resolve: 0.6.3 + xtend: 2.2.0 + dev: false + + /glsl-token-assignments@2.0.2: + resolution: {integrity: sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==} + dev: false + + /glsl-token-defines@1.0.0: + resolution: {integrity: sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==} + dependencies: + glsl-tokenizer: 2.1.5 + dev: false + + /glsl-token-depth@1.1.2: + resolution: {integrity: sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==} + dev: false + + /glsl-token-descope@1.0.2: + resolution: {integrity: sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==} + dependencies: + glsl-token-assignments: 2.0.2 + glsl-token-depth: 1.1.2 + glsl-token-properties: 1.0.1 + glsl-token-scope: 1.1.2 + dev: false + + /glsl-token-inject-block@1.1.0: + resolution: {integrity: sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==} + dev: false + + /glsl-token-properties@1.0.1: + resolution: {integrity: sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==} + dev: false + + /glsl-token-scope@1.1.2: + resolution: {integrity: sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==} + dev: false + + /glsl-token-string@1.0.1: + resolution: {integrity: sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==} + dev: false + + /glsl-token-whitespace-trim@1.0.0: + resolution: {integrity: sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==} + dev: false + + /glsl-tokenizer@2.1.5: + resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + dependencies: + through2: 0.6.5 + dev: false + + /glslify-bundle@5.1.1: + resolution: {integrity: sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==} + dependencies: + glsl-inject-defines: 1.0.3 + glsl-token-defines: 1.0.0 + glsl-token-depth: 1.1.2 + glsl-token-descope: 1.0.2 + glsl-token-scope: 1.1.2 + glsl-token-string: 1.0.1 + glsl-token-whitespace-trim: 1.0.0 + glsl-tokenizer: 2.1.5 + murmurhash-js: 1.0.0 + shallow-copy: 0.0.1 + dev: false + + /glslify-deps@1.3.2: + resolution: {integrity: sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==} + dependencies: + '@choojs/findup': 0.2.1 + events: 3.3.0 + glsl-resolve: 0.0.1 + glsl-tokenizer: 2.1.5 + graceful-fs: 4.2.11 + inherits: 2.0.4 + map-limit: 0.0.1 + resolve: 1.22.8 + dev: false + + /glslify@7.1.1: + resolution: {integrity: sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==} + hasBin: true + dependencies: + bl: 2.2.1 + concat-stream: 1.6.2 + duplexify: 3.7.1 + falafel: 2.2.5 + from2: 2.3.0 + glsl-resolve: 0.0.1 + glsl-token-whitespace-trim: 1.0.0 + glslify-bundle: 5.1.1 + glslify-deps: 1.3.2 + minimist: 1.2.8 + resolve: 1.22.8 + stack-trace: 0.0.9 + static-eval: 2.1.1 + through2: 2.0.5 + xtend: 4.0.2 + dev: false + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -7192,6 +7987,10 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /grid-index@1.1.0: + resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} + dev: false + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -7200,6 +7999,18 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + /has-hover@1.0.1: + resolution: {integrity: sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==} + dependencies: + is-browser: 2.1.0 + dev: false + + /has-passive-events@1.0.0: + resolution: {integrity: sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==} + dependencies: + is-browser: 2.1.0 + dev: false + /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -7228,6 +8039,10 @@ packages: resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} dev: false + /hsluv@0.0.3: + resolution: {integrity: sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==} + dev: false + /html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -7331,6 +8146,10 @@ packages: dependencies: binary-extensions: 2.2.0 + /is-browser@2.1.0: + resolution: {integrity: sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==} + dev: false + /is-color-stop@1.1.0: resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} dependencies: @@ -7351,6 +8170,16 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: false + + /is-firefox@1.0.3: + resolution: {integrity: sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==} + engines: {node: '>=0.10.0'} + dev: false + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -7361,19 +8190,58 @@ packages: dependencies: is-extglob: 2.1.1 + /is-iexplorer@1.0.0: + resolution: {integrity: sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-mobile@4.0.0: + resolution: {integrity: sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==} + dev: false + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: false + /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + /is-string-blank@1.0.1: + resolution: {integrity: sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==} + dev: false + + /is-svg-path@1.0.2: + resolution: {integrity: sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -7452,6 +8320,10 @@ packages: commander: 8.3.0 dev: false + /kdbush@3.0.0: + resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} + dev: false + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -7700,10 +8572,44 @@ packages: hasBin: true dev: false + /map-limit@0.0.1: + resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + dependencies: + once: 1.3.3 + dev: false + /map-stream@0.1.0: resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} dev: true + /mapbox-gl@1.13.3: + resolution: {integrity: sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==} + engines: {node: '>=6.4.0'} + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/geojson-types': 1.0.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 1.5.0(mapbox-gl@1.13.3) + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 1.2.5 + '@mapbox/unitbezier': 0.0.0 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + csscolorparser: 1.0.3 + earcut: 2.2.4 + geojson-vt: 3.2.1 + gl-matrix: 3.4.3 + grid-index: 1.1.0 + murmurhash-js: 1.0.0 + pbf: 3.2.1 + potpack: 1.0.2 + quickselect: 2.0.0 + rw: 1.3.3 + supercluster: 7.1.5 + tinyqueue: 2.0.3 + vt-pbf: 3.1.3 + dev: false + /match-sorter@6.3.4: resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} dependencies: @@ -7711,6 +8617,11 @@ packages: remove-accents: 0.5.0 dev: false + /math-log2@1.0.1: + resolution: {integrity: sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==} + engines: {node: '>=0.10.0'} + dev: false + /mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} dev: true @@ -7828,9 +8739,46 @@ packages: engines: {node: '>=6'} dev: false + /mouse-change@1.4.0: + resolution: {integrity: sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==} + dependencies: + mouse-event: 1.0.5 + dev: false + + /mouse-event-offset@3.0.2: + resolution: {integrity: sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==} + dev: false + + /mouse-event@1.0.5: + resolution: {integrity: sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==} + dev: false + + /mouse-wheel@1.2.0: + resolution: {integrity: sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==} + dependencies: + right-now: 1.0.0 + signum: 1.0.0 + to-px: 1.0.1 + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + /mumath@3.3.4: + resolution: {integrity: sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==} + deprecated: Redundant dependency in your project. + dependencies: + almost-equal: 1.1.0 + dev: false + + /murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + dev: false + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -7873,10 +8821,30 @@ packages: dev: false optional: true + /native-promise-only@0.8.1: + resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: @@ -7934,6 +8902,23 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + /normalize-svg-path@0.1.0: + resolution: {integrity: sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==} + dev: false + + /normalize-svg-path@1.1.0: + resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} + dependencies: + svg-arc-to-cubic-bezier: 3.2.0 + dev: false + + /number-is-integer@1.0.1: + resolution: {integrity: sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -7947,6 +8932,12 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -7984,6 +8975,10 @@ packages: dependencies: callsites: 3.1.0 + /parenthesis@3.1.8: + resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==} + dev: false + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -7993,6 +8988,20 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + /parse-rect@1.2.0: + resolution: {integrity: sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==} + dependencies: + pick-by-alias: 1.2.0 + dev: false + + /parse-svg-path@0.1.2: + resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + dev: false + + /parse-unit@1.0.1: + resolution: {integrity: sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==} + dev: false + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -8026,6 +9035,22 @@ packages: through: 2.3.8 dev: true + /pbf@3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + dev: false + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: false + + /pick-by-alias@1.2.0: + resolution: {integrity: sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==} + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -8041,6 +9066,72 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + /plotly.js@2.29.1(mapbox-gl@1.13.3): + resolution: {integrity: sha512-+XirhgCh42JF/iVu/RtBRbhcs328ipinajy7hd3mnZdnQv2Th6F441DSXer5S+P0nNluNs10vAFTELo4k/icjg==} + dependencies: + '@plotly/d3': 3.8.1 + '@plotly/d3-sankey': 0.7.2 + '@plotly/d3-sankey-circular': 0.33.1 + '@plotly/mapbox-gl': 1.13.4(mapbox-gl@1.13.3) + '@turf/area': 6.5.0 + '@turf/bbox': 6.5.0 + '@turf/centroid': 6.5.0 + base64-arraybuffer: 1.0.2 + canvas-fit: 1.5.0 + color-alpha: 1.0.4 + color-normalize: 1.5.0 + color-parse: 1.3.8 + color-rgba: 2.1.1 + country-regex: 1.1.0 + d3-force: 1.2.1 + d3-format: 1.4.5 + d3-geo: 1.12.1 + d3-geo-projection: 2.9.0 + d3-hierarchy: 1.1.9 + d3-interpolate: 3.0.1 + d3-time: 1.1.0 + d3-time-format: 2.3.0 + fast-isnumeric: 1.1.4 + gl-mat4: 1.2.0 + gl-text: 1.3.1 + glslify: 7.1.1 + has-hover: 1.0.1 + has-passive-events: 1.0.0 + is-mobile: 4.0.0 + mouse-change: 1.4.0 + mouse-event-offset: 3.0.2 + mouse-wheel: 1.2.0 + native-promise-only: 0.8.1 + parse-svg-path: 0.1.2 + point-in-polygon: 1.1.0 + polybooljs: 1.2.0 + probe-image-size: 7.2.3 + regl: /@plotly/regl@2.1.2 + regl-error2d: 2.0.12 + regl-line2d: 3.1.3 + regl-scatter2d: 3.3.1 + regl-splom: 1.0.14 + strongly-connected-components: 1.0.1 + superscript-text: 1.0.0 + svg-path-sdf: 1.1.3 + tinycolor2: 1.6.0 + to-px: 1.0.1 + topojson-client: 3.1.0 + webgl-context: 2.2.0 + world-calendars: 1.0.3 + transitivePeerDependencies: + - mapbox-gl + - supports-color + dev: false + + /point-in-polygon@1.1.0: + resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + dev: false + + /polybooljs@1.2.0: + resolution: {integrity: sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ==} + dev: false + /postcss-import@15.1.0(postcss@8.4.35): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -8168,6 +9259,10 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -8191,6 +9286,20 @@ packages: engines: {node: '>= 0.8'} dev: false + /probe-image-size@7.2.3: + resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + /promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: @@ -8205,6 +9314,10 @@ packages: react-is: 16.13.1 dev: false + /protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true @@ -8250,6 +9363,16 @@ packages: engines: {node: '>=10'} dev: false + /quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + dev: false + + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: false + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -8395,6 +9518,17 @@ packages: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false + /react-plotly.js@2.6.0(plotly.js@2.29.1)(react@18.2.0): + resolution: {integrity: sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==} + peerDependencies: + plotly.js: '>1.34.0' + react: '>0.13.0' + dependencies: + plotly.js: 2.29.1(mapbox-gl@1.13.3) + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /react-range@1.8.14(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-v2nyD5106rHf9dwHzq+WRlhCes83h1wJRHIMFjbZsYYsO6LF4mG/mR3cH7Cf+dkeHq65DItuqIbLn/3jjYjsHg==} peerDependencies: @@ -8609,6 +9743,27 @@ packages: dependencies: pify: 2.3.0 + /readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -8636,6 +9791,71 @@ packages: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: false + /regl-error2d@2.0.12: + resolution: {integrity: sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==} + dependencies: + array-bounds: 1.0.1 + color-normalize: 1.5.0 + flatten-vertex-data: 1.0.2 + object-assign: 4.1.1 + pick-by-alias: 1.2.0 + to-float32: 1.1.0 + update-diff: 1.1.0 + dev: false + + /regl-line2d@3.1.3: + resolution: {integrity: sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==} + dependencies: + array-bounds: 1.0.1 + array-find-index: 1.0.2 + array-normalize: 1.1.4 + color-normalize: 1.5.0 + earcut: 2.2.4 + es6-weak-map: 2.0.3 + flatten-vertex-data: 1.0.2 + object-assign: 4.1.1 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + to-float32: 1.1.0 + dev: false + + /regl-scatter2d@3.3.1: + resolution: {integrity: sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==} + dependencies: + '@plotly/point-cluster': 3.1.9 + array-range: 1.0.1 + array-rearrange: 2.2.2 + clamp: 1.0.1 + color-id: 1.1.0 + color-normalize: 1.5.0 + color-rgba: 2.1.1 + flatten-vertex-data: 1.0.2 + glslify: 7.1.1 + is-iexplorer: 1.0.0 + object-assign: 4.1.1 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + to-float32: 1.1.0 + update-diff: 1.1.0 + dev: false + + /regl-splom@1.0.14: + resolution: {integrity: sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==} + dependencies: + array-bounds: 1.0.1 + array-range: 1.0.1 + color-alpha: 1.0.4 + flatten-vertex-data: 1.0.2 + parse-rect: 1.2.0 + pick-by-alias: 1.2.0 + raf: 3.4.1 + regl-scatter2d: 3.3.1 + dev: false + + /regl@2.1.0: + resolution: {integrity: sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==} + dev: false + /remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} dev: false @@ -8663,6 +9883,16 @@ packages: engines: {node: '>=8'} dev: true + /resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + dependencies: + protocol-buffers-schema: 3.6.0 + dev: false + + /resolve@0.6.3: + resolution: {integrity: sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==} + dev: false + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -8683,6 +9913,10 @@ packages: resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} dev: false + /right-now@1.0.0: + resolution: {integrity: sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==} + dev: false + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -8735,6 +9969,10 @@ packages: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} dev: false + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} requiresBuild: true @@ -8744,6 +9982,10 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: false + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -8777,6 +10019,10 @@ packages: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: false + /shallow-copy@0.0.1: + resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} + dev: false + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -8791,6 +10037,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + /signum@1.0.0: + resolution: {integrity: sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==} + dev: false + /simple-peer@9.11.1: resolution: {integrity: sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==} dependencies: @@ -8892,6 +10142,10 @@ packages: stackframe: 1.3.4 dev: false + /stack-trace@0.0.9: + resolution: {integrity: sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==} + dev: false + /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} dev: false @@ -8911,17 +10165,41 @@ packages: stacktrace-gps: 3.1.2 dev: false + /static-eval@2.1.1: + resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} + dependencies: + escodegen: 2.1.0 + dev: false + /stream-combiner@0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} dependencies: duplexer: 0.1.2 dev: true + /stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: false + + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + dev: false + /string-similarity@4.0.4: resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: false + /string-split-by@1.0.0: + resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==} + dependencies: + parenthesis: 3.1.8 + dev: false + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8938,6 +10216,16 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} requiresBuild: true @@ -8962,6 +10250,10 @@ packages: engines: {node: '>=8'} dev: true + /strongly-connected-components@1.0.1: + resolution: {integrity: sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==} + dev: false + /stylelint-prettier@5.0.0(prettier@3.2.5)(stylelint@16.2.1): resolution: {integrity: sha512-RHfSlRJIsaVg5Br94gZVdWlz/rBTyQzZflNE6dXvSxt/GthWMY3gEHsWZEBaVGg7GM+XrtVSp4RznFlB7i0oyw==} engines: {node: '>=18.12.0'} @@ -9043,6 +10335,16 @@ packages: pirates: 4.0.6 ts-interface-checker: 0.1.13 + /supercluster@7.1.5: + resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==} + dependencies: + kdbush: 3.0.0 + dev: false + + /superscript-text@1.0.0: + resolution: {integrity: sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==} + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -9067,10 +10369,33 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /svg-arc-to-cubic-bezier@3.2.0: + resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==} + dev: false + /svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} dev: true + /svg-path-bounds@1.0.2: + resolution: {integrity: sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==} + dependencies: + abs-svg-path: 0.1.1 + is-svg-path: 1.0.2 + normalize-svg-path: 1.1.0 + parse-svg-path: 0.1.2 + dev: false + + /svg-path-sdf@1.1.3: + resolution: {integrity: sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==} + dependencies: + bitmap-sdf: 1.0.4 + draw-svg-path: 1.0.0 + is-svg-path: 1.0.2 + parse-svg-path: 0.1.2 + svg-path-bounds: 1.0.2 + dev: false + /svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} dev: true @@ -9190,6 +10515,20 @@ packages: engines: {node: '>=10'} dev: false + /through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.2 + dev: false + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: false + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true @@ -9206,6 +10545,14 @@ packages: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false + /tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + dev: false + + /tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + dev: false + /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} @@ -9217,6 +10564,16 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} + /to-float32@1.1.0: + resolution: {integrity: sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==} + dev: false + + /to-px@1.0.1: + resolution: {integrity: sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==} + dependencies: + parse-unit: 1.0.1 + dev: false + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -9227,6 +10584,13 @@ packages: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false + /topojson-client@3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + dependencies: + commander: 2.20.3 + dev: false + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false @@ -9298,6 +10662,25 @@ packages: engines: {node: '>=10'} dev: true + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: false + + /typedarray-pool@1.2.0: + resolution: {integrity: sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==} + dependencies: + bit-twiddle: 1.0.2 + dup: 1.0.0 + dev: false + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: false + /typeid-js@0.5.0: resolution: {integrity: sha512-wgEWd5Ejd2gvb68y+5wWcjZmrJqPFX4rMV6Fi6CN5luzD9Wjaf9v1g3qfpGzaWahXcmlnA0cCPDP4Kr0F630xA==} dependencies: @@ -9330,6 +10713,10 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + /unquote@1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.3): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -9340,6 +10727,10 @@ packages: escalade: 3.1.2 picocolors: 1.0.0 + /update-diff@1.1.0: + resolution: {integrity: sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==} + dev: false + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -9510,17 +10901,35 @@ packages: fsevents: 2.3.3 dev: true + /vt-pbf@3.1.3: + resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} + dependencies: + '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile': 1.3.1 + pbf: 3.2.1 + dev: false + /warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} dependencies: loose-envify: 1.4.0 dev: false + /weak-map@1.0.8: + resolution: {integrity: sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==} + dev: false + /web-streams-polyfill@3.3.2: resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} engines: {node: '>= 8'} dev: true + /webgl-context@2.2.0: + resolution: {integrity: sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==} + dependencies: + get-canvas-context: 1.0.2 + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -9559,6 +10968,12 @@ packages: isexe: 2.0.0 dev: true + /world-calendars@1.0.3: + resolution: {integrity: sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==} + dependencies: + object-assign: 4.1.1 + dev: false + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9635,6 +11050,11 @@ packages: engines: {node: '>=0.4.0'} dev: false + /xtend@2.2.0: + resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} + engines: {node: '>=0.4'} + dev: false + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx index 2f9690c..62550e7 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx @@ -19,6 +19,7 @@ import { DefaultMimeTextPlainRender } from "./[render] DefaultMimeTextPlainRende import { Icon } from "@.ui.Icons"; import { ICodeplotShape } from "./ICodeplotShape"; import "./styles.css"; +import { DefaultMimeApplicationPlotlyV1Render } from "./[render] DefaultMimeApplicationPlotlyV1Render.tsx"; /* -------------------------------------------------------------------------- */ /* CodeplotShapeUtil */ /* -------------------------------------------------------------------------- */ @@ -138,6 +139,10 @@ export const RenderSwitch = observer(({ shape }: { shape: ICodeplotShape }) => { return ; } + if (shape.props.mime?.["application/vnd.plotly.v1+json"]) { + return ; + } + if (shape.props.mime?.["application/x-latex"]) { return ; } diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/ICodeplotShape.ts b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/ICodeplotShape.ts index 613ce7a..139c19e 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/ICodeplotShape.ts +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/ICodeplotShape.ts @@ -17,6 +17,7 @@ export type ICodeplotShape = TLBaseShape< "application/javascript": string; "application/x-latex": string; "text/markdown": string; + "application/vnd.plotly.v1+json": string; }; w: number; h: number; diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeApplicationPlotlyV1Render.tsx b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeApplicationPlotlyV1Render.tsx new file mode 100644 index 0000000..fddfe12 --- /dev/null +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeApplicationPlotlyV1Render.tsx @@ -0,0 +1,45 @@ +import { useEffect, useRef } from "react"; +import { ICodeplotShape } from "./ICodeplotShape"; + +export function DefaultMimeApplicationPlotlyV1Render({ + shape, +}: IDefaultMimeApplicationPlotlyV1RenderProps) { + const { data, layout, config } = JSON.parse( + JSON.stringify( + shape.props.mime[ + "application/vnd.plotly.v1+json" + ] as unknown as ChartProps, + ), + ); + + return ( + data && ( +
+ +
+ ) + ); +} + +interface ChartProps { + data?: Plotly.Data[]; + layout: Partial; + frames?: Plotly.Frame[]; + config?: Partial; +} + +const Plot: React.FC = ({ ...props }) => { + const ref = useRef(null); + + useEffect(() => { + if (!ref.current || !props.data) return; + + window.Plotly.newPlot(ref.current, props.data, props.layout, props.config); + }, [props]); + + return
; +}; + +type IDefaultMimeApplicationPlotlyV1RenderProps = { + shape: ICodeplotShape; +}; diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImagePngRender.tsx b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImagePngRender.tsx index 3f57028..142de75 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImagePngRender.tsx +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImagePngRender.tsx @@ -1,3 +1,5 @@ +import { useEditor } from "@tldraw/editor"; +import { useEffect } from "react"; import { ICodeplotShape } from "./ICodeplotShape"; // import ReactJson from "react-json-view"; @@ -11,6 +13,13 @@ type IDefaultMimeImagePngRenderProps = { export function DefaultMimeImagePngRender({ shape, }: IDefaultMimeImagePngRenderProps) { + const editor = useEditor(); + useEffect(() => { + _getBase64ImageDimensions(shape.props.mime["image/png"], ({ w, h }) => { + editor.updateShape({ ...shape, props: { w, h } }); + }); + }, []); // eslint-disable-line react-hooks/exhaustive-deps + return (
); } + +/* ------------------------ _getBase64ImageDimensions ----------------------- */ + +function _getBase64ImageDimensions( + base64String: string, + callback: (dimensions: { w: number; h: number }) => void, +) { + // Create a new Image object + const image = new Image(); + + // Define the onload event handler + image.src = `data:image/png;base64,${base64String}`; + image.onload = function () { + // Once the image is loaded, retrieve the dimensions + const dimensions = { + w: image.width, + h: image.height, + }; + + // Execute the callback function with the dimensions + callback(dimensions); + }; + + // Set the source of the image to the base64 string +} + +// Example usage diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/styles.css b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/styles.css index c48ef97..576940a 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/styles.css +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/styles.css @@ -53,6 +53,11 @@ cursor: move; } + &:active { + display: flex; + cursor: grabbing; + } + &__TitleContainer { display: flex; gap: 8px; diff --git a/minirepos/@codeplot-front/src/@types/index.d.ts b/minirepos/@codeplot-front/src/@types/index.d.ts index d74d75d..5b40152 100644 --- a/minirepos/@codeplot-front/src/@types/index.d.ts +++ b/minirepos/@codeplot-front/src/@types/index.d.ts @@ -9,6 +9,7 @@ declare module "*.svg?react" { declare global { interface Window { + Plotly: typeof import("plotly.js"); MathJax: { tex2svg: (latex: string, options: any) => any; startup: { diff --git a/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py b/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py index 67eb748..5f14cad 100644 --- a/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py +++ b/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py @@ -1,5 +1,7 @@ import asyncio from IPython.core.magic import Magics, magics_class, line_magic +from IPython.core.magic_arguments import (argument, magic_arguments, parse_argstring) + import codeplot @@ -11,20 +13,31 @@ def cP_connect(self, line): "A line magic to accept parameters and establish connection." # Process the line into parameters here params = line.split() - self.shell.user_ns['my_extension_params'] = params # Establish connection using the first parameter as URL if params: url = params[0] - asyncio.create_task(self.shell.user_ns['ext'].connect_to_codeplot(url)) + asyncio.create_task(self.shell.user_ns['_cP_extension'].connect_to_codeplot(url)) else: - print("No URL provided.") + raise Exception("No URL provided.") @line_magic def cP_supress_output(self, boolean): "Toggle output suppression." - ext = self.shell.user_ns.get('ext') - ext._supress_output = boolean + _cP_extension = self.shell.user_ns.get('_cP_extension') + _cP_extension._supress_output = boolean print(f"Output suppression is now: {boolean}.") + @magic_arguments() + @argument('-id', '--id', help='ID of the plot to update.') + @argument('-tl', '--title', help='Title of the plot.') + @line_magic + def cP_plot(self, line): + # Parse arguments + _cP_extension = self.shell.user_ns.get('_cP_extension') + _cP_extension._plot_magic_args = { + **_cP_extension._plot_magic_args, + **vars(parse_argstring(self.cP_plot, line)) + } + class IPythonExtension: def __init__(self, ipython): self.ipython = ipython @@ -32,8 +45,10 @@ def __init__(self, ipython): self.cP = None self.connection_established = False self._supress_output = True - - + self._plot_magic_args = {} + self._original_display_pub_publish = self.ipython.display_pub.publish + self.ipython.display_pub.publish = self.custom_display_pub_publish + async def connect_to_codeplot(self, url): if not self.connection_established and url: @@ -42,27 +57,43 @@ async def connect_to_codeplot(self, url): print("Connected to Codeplot.") def custom_display_pub_publish(self, *args, **kwargs): - data = kwargs.get('data', {}) - if self.cP is not None and data: - asyncio.create_task(self.cP._plotIPythonCell(data)) + data = kwargs.get('data', None) + if data is not None: + asyncio.create_task(self.cP.plot(data, **self._plot_magic_args)) + self._ploted_by_display_pub = True + if self._supress_output is False: + self._original_display_pub_publish(*args, **kwargs) + + + def pre_run_cell(self, info): + + # Build args from the cell info + if hasattr(info, 'cell_id'): + if info.cell_id is not None: + self._plot_magic_args['id'] = info.cell_id + self._plot_magic_args['ipythonCellId'] = info.cell_id + if hasattr(info, 'raw_cell'): + self._plot_magic_args['ipythonRawCell'] = info.raw_cell + def post_run_cell(self, result): if not self.connection_established: # The connection is now established using the %connect magic, so this may not be needed pass if result.result is not None and self.cP is not None: - # Now that connection is established, we can plot - asyncio.create_task(self.cP.plot(result.result, id=result.info.cell_id, ipython_raw_cell=result.info.raw_cell, ipython_cell_id=result.info.cell_id)) - - if self._supress_output and result.result is not None: - self.ipython.display_pub.clear_output() + asyncio.create_task(self.cP.plot(result.result, **self._plot_magic_args)) + # Clean up the current cell id + self._magic_current_cell_id = None + self._plot_magic_args = {} def load_ipython_extension(ipython): ipython.register_magics(Magics(ipython)) - ext = IPythonExtension(ipython) + _cP_extension = IPythonExtension(ipython) # Store the extension instance in the IPython user namespace for access from magics - ipython.user_ns['ext'] = ext - ipython.events.register('post_run_cell', ext.post_run_cell) + ipython.user_ns['_cP_extension'] = _cP_extension + ipython.events.register('pre_run_cell', _cP_extension.pre_run_cell) + ipython.events.register('post_run_cell', _cP_extension.post_run_cell) + diff --git a/minirepos/@codeplot-ipython/setup.py b/minirepos/@codeplot-ipython/setup.py index d543925..4296147 100644 --- a/minirepos/@codeplot-ipython/setup.py +++ b/minirepos/@codeplot-ipython/setup.py @@ -2,10 +2,10 @@ setup( name='codeplot-ipython', - version='0.1.0', + version='1.8.0', packages=find_packages(), install_requires=[ - 'codeplot >= 0.4.0', + 'codeplot >= 1.2.0', 'asyncio >= 3.4.3', ], author='Antonio Moura (@antl3x)', diff --git a/minirepos/@codeplot-python/build/lib/codeplot/main.py b/minirepos/@codeplot-python/build/lib/codeplot/main.py index 8604d7d..75aff49 100644 --- a/minirepos/@codeplot-python/build/lib/codeplot/main.py +++ b/minirepos/@codeplot-python/build/lib/codeplot/main.py @@ -103,9 +103,9 @@ async def plot(self, data, **kwargs) -> None: instance = self._get_instance() # to get x and y pos to plot we need consider camera zoom and xy position - shape = self._get_shape(kwargs['id']) + shape = self._get_shape(kwargs['id']) if kwargs.get('id') else None kwargs.setdefault("id", str(TypeID(prefix="plot"))) kwargs.setdefault("title", "Untitled"), kwargs.setdefault("width", shape['props']['w'] if shape else 500) @@ -116,8 +116,11 @@ async def plot(self, data, **kwargs) -> None: kwargs.setdefault("x_pos", shape['x'] if shape else -camera["x"] + 100) kwargs.setdefault("y_pos", shape['y'] if shape else -camera["y"] + 100) kwargs.setdefault("page_id", instance["currentPageId"]) + kwargs.setdefault("ipythonRawCell", None) + kwargs.setdefault("ipythonCellId", None) kwargs.setdefault("id", str(TypeID(prefix="plot"))) + shape = { "id": "shape:"+kwargs["id"], "x": kwargs["x_pos"], @@ -136,6 +139,8 @@ async def plot(self, data, **kwargs) -> None: "metadata": { "isPinned": False, "pythonCallerFrameCodeContext": metacode_line, + "ipythonRawCell": kwargs["ipythonRawCell"], + "ipythonCellId": kwargs["ipythonCellId"], }, "createdAt": datetime.datetime.utcnow().isoformat() + "Z" }, @@ -145,73 +150,14 @@ async def plot(self, data, **kwargs) -> None: "index": "a1", "typeName": "shape" } - - - await self.set(f"shape:"+kwargs['id'], shape) - except Exception as e: - print("Error plotting:", e) - - async def _plotIPythonCell(self, data, **kwargs) -> None: - - try: - # We force this update to receive latest data from the shared document - self._update_ykeyvalue() - - - # last_plot_coords = PatchManager.get_last_plot_xz_coordinates() - camera = self._get_current_page_camera() - instance = self._get_instance() - - # to get x and y pos to plot we need consider camera zoom and xy position - shape = self._get_shape(kwargs['id']) - - kwargs.setdefault("id", str(TypeID(prefix="plot"))) - kwargs.setdefault("title", "Untitled"), - kwargs.setdefault("width", shape['props']['w'] if shape else 500) - kwargs.setdefault("height", shape['props']['h'] if shape else 250) - kwargs.setdefault("rotation",shape['rotation'] if shape else 0) - kwargs.setdefault("opacity", shape['opacity'] if shape else 1) - kwargs.setdefault("is_locked", shape['isLocked'] if shape else False) - kwargs.setdefault("x_pos", shape['x'] if shape else -camera["x"] + 100) - kwargs.setdefault("y_pos", shape['y'] if shape else -camera["y"] + 100) - kwargs.setdefault("page_id", instance["currentPageId"]) - kwargs.setdefault("id", str(TypeID(prefix="plot"))) - - shape = { - "id": "shape:"+kwargs["id"], - "x": kwargs["x_pos"], - "y": kwargs["y_pos"], - "rotation": kwargs["rotation"], - "opacity": kwargs["opacity"], - "isLocked": kwargs["is_locked"], - "props": { - "w": kwargs["width"], - "h": kwargs["height"], - "id": "shape:"+kwargs["id"], - "title": kwargs["title"], - "type": str(type(data)), - "renderWith": "default", - "mime": data, - "metadata": { - "isPinned": False, - "ipythonRawCell": kwargs["ipython_raw_cell"], - "ipythonCellId": kwargs["ipython_cell_id"], - }, - "createdAt": datetime.datetime.utcnow().isoformat() + "Z" - }, - "meta": {}, - "type": "codeplot", - "parentId": kwargs["page_id"], - "index": "a1", - "typeName": "shape" - } - await self.set(f"shape:"+kwargs['id'], shape) except Exception as e: - print("Error plotting:", e) + raise Exception("Error plotting") from e + + class CustomJSONEncoder(json.JSONEncoder): def default(self, obj): @@ -251,6 +197,10 @@ def _get_mime_representations(obj): representations = {} + # Here we check if obj is a representation itself + if isinstance(obj, dict) and 'text/plain' in obj: + return obj + for method_name, mime_type in mime_types.items(): if hasattr(obj, method_name): method = getattr(obj, method_name) @@ -259,7 +209,7 @@ def _get_mime_representations(obj): if content is not None: representations[mime_type] = content except Exception as e: - print(f"Error calling {method_name}: {e}") + raise Exception(f"Error calling {method_name}: {e}") from e # Duck typing check for a matplotlib figure-like object if hasattr(obj, 'savefig'): diff --git a/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO b/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO index bf61f9e..b9f64d8 100644 --- a/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO +++ b/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: codeplot -Version: 0.4.0 +Version: 1.2.0 Summary: codeplot is a canvas designed for code-driven data exploration where you can plot graphs, data frames, markdown and much more using plain Python Home-page: https://github.com/codeplot-co/codeplot Author: Antonio Moura (@antl3x) @@ -13,7 +13,7 @@ Requires-Dist: watchdog>=3.0.0 Requires-Dist: typeid-python>=0.2.2 Requires-Dist: ypy-websocket>=0.12.4 Requires-Dist: asyncio>=3.4.3 -Requires-Dist: websockets>=12.0 +Requires-Dist: websockets>=11.0 Requires-Dist: y-py>=0.6.2 ![codeplot-readme](https://github.com/codeplot-co/codeplot/assets/26308297/e1212d25-a731-4755-875d-e988848f6d87) diff --git a/minirepos/@codeplot-python/codeplot.egg-info/requires.txt b/minirepos/@codeplot-python/codeplot.egg-info/requires.txt index c3503d2..5891352 100644 --- a/minirepos/@codeplot-python/codeplot.egg-info/requires.txt +++ b/minirepos/@codeplot-python/codeplot.egg-info/requires.txt @@ -2,5 +2,5 @@ watchdog>=3.0.0 typeid-python>=0.2.2 ypy-websocket>=0.12.4 asyncio>=3.4.3 -websockets>=12.0 +websockets>=11.0 y-py>=0.6.2 diff --git a/minirepos/@codeplot-python/codeplot/main.py b/minirepos/@codeplot-python/codeplot/main.py index 8604d7d..472ea0d 100644 --- a/minirepos/@codeplot-python/codeplot/main.py +++ b/minirepos/@codeplot-python/codeplot/main.py @@ -103,9 +103,9 @@ async def plot(self, data, **kwargs) -> None: instance = self._get_instance() # to get x and y pos to plot we need consider camera zoom and xy position - shape = self._get_shape(kwargs['id']) + shape = self._get_shape(kwargs['id']) if kwargs.get('id') else None kwargs.setdefault("id", str(TypeID(prefix="plot"))) kwargs.setdefault("title", "Untitled"), kwargs.setdefault("width", shape['props']['w'] if shape else 500) @@ -116,8 +116,11 @@ async def plot(self, data, **kwargs) -> None: kwargs.setdefault("x_pos", shape['x'] if shape else -camera["x"] + 100) kwargs.setdefault("y_pos", shape['y'] if shape else -camera["y"] + 100) kwargs.setdefault("page_id", instance["currentPageId"]) + kwargs.setdefault("ipythonRawCell", None) + kwargs.setdefault("ipythonCellId", None) kwargs.setdefault("id", str(TypeID(prefix="plot"))) + shape = { "id": "shape:"+kwargs["id"], "x": kwargs["x_pos"], @@ -136,6 +139,8 @@ async def plot(self, data, **kwargs) -> None: "metadata": { "isPinned": False, "pythonCallerFrameCodeContext": metacode_line, + "ipythonRawCell": kwargs["ipythonRawCell"], + "ipythonCellId": kwargs["ipythonCellId"], }, "createdAt": datetime.datetime.utcnow().isoformat() + "Z" }, @@ -145,73 +150,14 @@ async def plot(self, data, **kwargs) -> None: "index": "a1", "typeName": "shape" } - - - await self.set(f"shape:"+kwargs['id'], shape) - except Exception as e: - print("Error plotting:", e) - - async def _plotIPythonCell(self, data, **kwargs) -> None: - - try: - # We force this update to receive latest data from the shared document - self._update_ykeyvalue() - - - # last_plot_coords = PatchManager.get_last_plot_xz_coordinates() - camera = self._get_current_page_camera() - instance = self._get_instance() - - # to get x and y pos to plot we need consider camera zoom and xy position - shape = self._get_shape(kwargs['id']) - - kwargs.setdefault("id", str(TypeID(prefix="plot"))) - kwargs.setdefault("title", "Untitled"), - kwargs.setdefault("width", shape['props']['w'] if shape else 500) - kwargs.setdefault("height", shape['props']['h'] if shape else 250) - kwargs.setdefault("rotation",shape['rotation'] if shape else 0) - kwargs.setdefault("opacity", shape['opacity'] if shape else 1) - kwargs.setdefault("is_locked", shape['isLocked'] if shape else False) - kwargs.setdefault("x_pos", shape['x'] if shape else -camera["x"] + 100) - kwargs.setdefault("y_pos", shape['y'] if shape else -camera["y"] + 100) - kwargs.setdefault("page_id", instance["currentPageId"]) - kwargs.setdefault("id", str(TypeID(prefix="plot"))) - - shape = { - "id": "shape:"+kwargs["id"], - "x": kwargs["x_pos"], - "y": kwargs["y_pos"], - "rotation": kwargs["rotation"], - "opacity": kwargs["opacity"], - "isLocked": kwargs["is_locked"], - "props": { - "w": kwargs["width"], - "h": kwargs["height"], - "id": "shape:"+kwargs["id"], - "title": kwargs["title"], - "type": str(type(data)), - "renderWith": "default", - "mime": data, - "metadata": { - "isPinned": False, - "ipythonRawCell": kwargs["ipython_raw_cell"], - "ipythonCellId": kwargs["ipython_cell_id"], - }, - "createdAt": datetime.datetime.utcnow().isoformat() + "Z" - }, - "meta": {}, - "type": "codeplot", - "parentId": kwargs["page_id"], - "index": "a1", - "typeName": "shape" - } - await self.set(f"shape:"+kwargs['id'], shape) except Exception as e: - print("Error plotting:", e) + raise Exception("Error plotting") from e + + class CustomJSONEncoder(json.JSONEncoder): def default(self, obj): @@ -251,6 +197,10 @@ def _get_mime_representations(obj): representations = {} + # Here we check if obj is a representation itself + if isinstance(obj, dict): + return obj + for method_name, mime_type in mime_types.items(): if hasattr(obj, method_name): method = getattr(obj, method_name) @@ -259,7 +209,7 @@ def _get_mime_representations(obj): if content is not None: representations[mime_type] = content except Exception as e: - print(f"Error calling {method_name}: {e}") + raise Exception(f"Error calling {method_name}: {e}") from e # Duck typing check for a matplotlib figure-like object if hasattr(obj, 'savefig'): diff --git a/minirepos/@codeplot-python/setup.py b/minirepos/@codeplot-python/setup.py index 3ee48e0..c2808fa 100644 --- a/minirepos/@codeplot-python/setup.py +++ b/minirepos/@codeplot-python/setup.py @@ -2,14 +2,14 @@ setup( name='codeplot', - version='0.4.0', + version='1.2.0', packages=find_packages(), install_requires=[ 'watchdog >= 3.0.0', 'typeid-python >= 0.2.2', 'ypy-websocket >= 0.12.4', 'asyncio >= 3.4.3', - 'websockets >= 12.0', + 'websockets >= 11.0', 'y-py >= 0.6.2', ], author='Antonio Moura (@antl3x)', From 2fda9333b5069f928557670969b696780bfc73aa Mon Sep 17 00:00:00 2001 From: "Antonio Moura (@antl3x)" Date: Wed, 10 Apr 2024 20:57:39 -0600 Subject: [PATCH 02/11] #0 --- README.md | 4 + .../_scripts/dockerhub.release.mjs | 18 ++-- minirepos/@codeplot-api/package.json | 1 - .../_scripts/dockerhub.release.mjs | 16 +-- minirepos/@codeplot-front/package.json | 2 +- .../src/@.core/_impl_/AppModel.ts | 21 ++++ .../src/@.tldraw.canvas/_impl_/Canvas.tsx | 4 +- .../src/@.tldraw.canvas/_impl_/overrides.ts | 4 +- .../src/@.tldraw.canvas/_impl_/useStore.ts | 26 ++++- minirepos/@codeplot-ipython/README.md | 4 + .../codeplot-ipython/__init__.py | 97 ++++++++++--------- minirepos/@codeplot-ipython/setup.py | 4 +- minirepos/@codeplot-python/README.md | 4 + .../build/lib/codeplot/main.py | 8 +- .../codeplot.egg-info/PKG-INFO | 12 +-- minirepos/@codeplot-python/codeplot/main.py | 6 +- minirepos/@codeplot-python/setup.py | 2 +- 17 files changed, 149 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index 22fd6a4..9add95a 100644 --- a/README.md +++ b/README.md @@ -121,3 +121,7 @@ Codeplot is free to use for personal and non-commercial purposes. Only pay if you use Codeplot commercially. Read more about [License and Pricing here](LICENSE.md). + +# Sponsor + +This project is sponsored by [LearnPolars.co](https://learnpolars.co). LearnPolars is a platform to learn data manipulation and analysis using Polars, a blazingly fast DataFrame library in Python (Rust). \ No newline at end of file diff --git a/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs b/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs index 458bb8f..2da74d0 100644 --- a/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs +++ b/minirepos/@codeplot-api/_scripts/dockerhub.release.mjs @@ -1,15 +1,17 @@ #!/usr/bin/env zx -import pkg from "../package.json" with { type: "json" }; - await $` echo "$CODEPLOT_DOCKER_ACCESS_TOKEN" | docker login --username "codeplotco" --password-stdin pnpm compile -docker buildx build --platform linux/amd64,linux/arm64 -t codeplotco/codeplot-api:latest --file Dockerfile ../../ -docker tag codeplotco/codeplot-api:latest codeplotco/codeplot-api:${pkg.version} -docker tag codeplotco/codeplot-api:latest codeplotco/codeplot-api:${pkg.version}-$(git rev-parse --short HEAD) -docker push codeplotco/codeplot-api:latest -docker push codeplotco/codeplot-api:${pkg.version} -docker push codeplotco/codeplot-api:${pkg.version}-$(git rev-parse --short HEAD) +# Build and push the multi-architecture image +docker buildx build -t codeplotco/codeplot-api:latest --platform linux/amd64,linux/arm64 --push --file Dockerfile ../../ --no-cache + +# Extract the package version and the short git commit hash +PKG_VERSION=$(grep 'version' package.json | cut -d '"' -f 4) +GIT_COMMIT_HASH=$(git rev-parse --short HEAD) + +# Tag and push the versioned image +docker buildx build -t codeplotco/codeplot-api:$PKG_VERSION --platform linux/amd64,linux/arm64 --push --file Dockerfile ../../ --no-cache +docker buildx build -t codeplotco/codeplot-api:$PKG_VERSION-$GIT_COMMIT_HASH --platform linux/amd64,linux/arm64 --push --file Dockerfile ../../ --no-cache `; diff --git a/minirepos/@codeplot-api/package.json b/minirepos/@codeplot-api/package.json index d360688..14ac039 100644 --- a/minirepos/@codeplot-api/package.json +++ b/minirepos/@codeplot-api/package.json @@ -13,7 +13,6 @@ "@production:app.deploy": "zx _scripts/@production:app.deploy.mjs" }, "dependencies": { - "@codeplot/shared": "workspace:^", "cors": "^2.8.5", "debug": "^4.3.4", "express": "^4.18.2", diff --git a/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs b/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs index 4fbb721..172976d 100644 --- a/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs +++ b/minirepos/@codeplot-front/_scripts/dockerhub.release.mjs @@ -7,10 +7,14 @@ echo "$CODEPLOT_DOCKER_ACCESS_TOKEN" | docker login --username "codeplotco" --pa pnpm compile -docker buildx build --platform linux/amd64,linux/arm64 -t codeplotco/codeplot-front:latest . -docker tag codeplotco/codeplot-front:latest codeplotco/codeplot-front:${pkg.version} -docker tag codeplotco/codeplot-front:latest codeplotco/codeplot-front:${pkg.version}-$(git rev-parse --short HEAD) -docker push codeplotco/codeplot-front:latest -docker push codeplotco/codeplot-front:${pkg.version} -docker push codeplotco/codeplot-front:${pkg.version}-$(git rev-parse --short HEAD) +# Build and push the multi-architecture image +docker buildx build -t codeplotco/codeplot-front:latest --platform linux/amd64,linux/arm64 --push . + +# Extract the package version and the short git commit hash +PKG_VERSION=$(grep 'version' package.json | cut -d '"' -f 4) +GIT_COMMIT_HASH=$(git rev-parse --short HEAD) + +# Tag and push the versioned image +docker buildx build -t codeplotco/codeplot-front:$PKG_VERSION --platform linux/amd64,linux/arm64 --push . +docker buildx build -t codeplotco/codeplot-front:$PKG_VERSION-$GIT_COMMIT_HASH --platform linux/amd64,linux/arm64 --push . `; diff --git a/minirepos/@codeplot-front/package.json b/minirepos/@codeplot-front/package.json index 09a18e4..a326119 100644 --- a/minirepos/@codeplot-front/package.json +++ b/minirepos/@codeplot-front/package.json @@ -1,7 +1,7 @@ { "name": "@codeplot/front", "private": true, - "version": "1.0.0", + "version": "1.1.0", "type": "module", "scripts": { "compile": "zx _scripts/compile.mjs", diff --git a/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts b/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts index 79d6128..43d98ec 100644 --- a/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts +++ b/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts @@ -2,6 +2,7 @@ import { ToastQueue } from "@react-spectrum/toast"; import { StoreSnapshot, TLRecord, + TLShape, Editor as TldrawEditor, debounce, } from "@tldraw/editor"; @@ -135,7 +136,27 @@ const AppModel = types }, 1000), ); + /* ---------------------------- autoZoomListener ---------------------------- */ + /** + * # Overview + * We want to zoom to the selection when a new shape is added to the canvas. + */ + const autoZoomListener = editor.store.listen((entry) => { + const rec = entry?.changes?.added; + const recId = Object.keys(rec)?.[0] as TLShape["id"]; + if (!recId) return; + + editor.select(rec[recId] as TLShape); + editor.zoomToSelection(); + editor.zoomToBounds(editor.getSelectionPageBounds()!); + editor.resetZoom(); + editor.zoomToSelection(); + }); + + /* ------------------------------------ - ----------------------------------- */ + self.tldrEditorListeners.push(lin); + self.tldrEditorListeners.push(autoZoomListener); }, beforeDestroy() { self.tldrEditorListeners.forEach((lin) => lin()); diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx index ed0d112..044e362 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx @@ -126,7 +126,9 @@ export const Canvas = observer((props: React.PropsWithChildren) => { aria-label="Copy WS URL to clipboard" onClick={() => { navigator.clipboard.writeText(appStore.wsUrl); - ToastQueue.neutral("Room url copied to clipboard!"); + ToastQueue.neutral("Room url copied to clipboard!", { + timeout: 3000, + }); }} > {appStore.wsUrl} diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts index 6ad126c..fc62a30 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts @@ -93,7 +93,9 @@ const _copyRoomUrlTldrawAction: NonNullable = ( readonlyOk: true, onSelect() { navigator.clipboard.writeText(appStore.wsUrl); - ToastQueue.neutral("Room url copied to clipboard!"); + ToastQueue.neutral("Room url copied to clipboard!", { + timeout: 3000, + }); }, }; return actions; diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts index 93e3d99..ed746eb 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts @@ -3,6 +3,7 @@ import { StoreSnapshot, TLAnyShapeUtilConstructor, TLRecord, + TLShape, TLStoreWithStatus, createTLStore, debounce, @@ -114,7 +115,30 @@ export function useStore({ switch (change.action) { case "add": case "update": { - const record = yStore.get(id)!; + const record = yStore.get(id)! as TLShape & { + props: { h: number }; + }; + + // Check if Record has x and y = 0, if so, set it to stack with the last record + if (record.x === 0 && record.y === 0) { + const lastRecord = store + .allRecords() + .filter((v) => (v as TLShape).type === "codeplot") + .sort((a, b) => { + const _a = a as unknown as { createdAt: number }; + const _b = b as unknown as { createdAt: number }; + if (_a.createdAt < _b.createdAt) return -1; + if (_a.createdAt > _b.createdAt) return 1; + return 0; + }) + .pop() as TLShape & { props: { h: number } }; + + if (lastRecord) { + record.x = lastRecord.x; + record.y = + lastRecord.y + lastRecord.props.h + record.props.h / 10; + } + } toPut.push(record); break; } diff --git a/minirepos/@codeplot-ipython/README.md b/minirepos/@codeplot-ipython/README.md index 22fd6a4..9add95a 100644 --- a/minirepos/@codeplot-ipython/README.md +++ b/minirepos/@codeplot-ipython/README.md @@ -121,3 +121,7 @@ Codeplot is free to use for personal and non-commercial purposes. Only pay if you use Codeplot commercially. Read more about [License and Pricing here](LICENSE.md). + +# Sponsor + +This project is sponsored by [LearnPolars.co](https://learnpolars.co). LearnPolars is a platform to learn data manipulation and analysis using Polars, a blazingly fast DataFrame library in Python (Rust). \ No newline at end of file diff --git a/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py b/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py index 5f14cad..d356882 100644 --- a/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py +++ b/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py @@ -5,25 +5,25 @@ import codeplot + + @magics_class -class Magics(Magics): - +class CodeplotMagics(Magics): @line_magic def cP_connect(self, line): - "A line magic to accept parameters and establish connection." - # Process the line into parameters here + """Establish a connection to Codeplot with the provided URL.""" params = line.split() - # Establish connection using the first parameter as URL if params: url = params[0] asyncio.create_task(self.shell.user_ns['_cP_extension'].connect_to_codeplot(url)) else: raise Exception("No URL provided.") + @line_magic - def cP_supress_output(self, boolean): - "Toggle output suppression." - _cP_extension = self.shell.user_ns.get('_cP_extension') - _cP_extension._supress_output = boolean + def cP_supress(self, boolean): + """Toggle output suppression.""" + _cP_extension = self.shell.user_ns['_cP_extension'] + _cP_extension._suppress = boolean.lower() == 'true' print(f"Output suppression is now: {boolean}.") @magic_arguments() @@ -31,69 +31,70 @@ def cP_supress_output(self, boolean): @argument('-tl', '--title', help='Title of the plot.') @line_magic def cP_plot(self, line): - # Parse arguments - _cP_extension = self.shell.user_ns.get('_cP_extension') - _cP_extension._plot_magic_args = { - **_cP_extension._plot_magic_args, - **vars(parse_argstring(self.cP_plot, line)) - } + """Parse arguments for plotting.""" + args = parse_argstring(self.cP_plot, line) + _cP_extension = self.shell.user_ns['_cP_extension'] + _cP_extension._plot_magic_args.update(vars(args)) + class IPythonExtension: def __init__(self, ipython): self.ipython = ipython - self.captured_output = [] self.cP = None self.connection_established = False - self._supress_output = True + self._suppress = True self._plot_magic_args = {} - self._original_display_pub_publish = self.ipython.display_pub.publish + self.hook_into_ipython() + + def hook_into_ipython(self): + """Modify IPython hooks and methods for custom behavior.""" self.ipython.display_pub.publish = self.custom_display_pub_publish - + self.ipython.user_ns['_cP_extension'] = self + self.ipython.events.register('pre_run_cell', self.pre_run_cell) async def connect_to_codeplot(self, url): + """Connect to Codeplot asynchronously.""" if not self.connection_established and url: self.cP = await codeplot.connect(url) self.connection_established = True print("Connected to Codeplot.") + def _display_hook__call__(self, result=None): + """Custom display hook.""" + if result is not None and self.cP: + asyncio.create_task(self.cP.plot(result, **self._plot_magic_args)) + + self._plot_magic_args = {} + if not self._suppress: + self.ipython.displayhook.__ocall__(result) + + def custom_display_pub_publish(self, *args, **kwargs): - data = kwargs.get('data', None) - if data is not None: + """Custom publishing method that integrates with Codeplot.""" + data = kwargs.get('data') + if data and self.cP: asyncio.create_task(self.cP.plot(data, **self._plot_magic_args)) - self._ploted_by_display_pub = True - if self._supress_output is False: + + if not self._suppress: self._original_display_pub_publish(*args, **kwargs) - def pre_run_cell(self, info): + """Prepare arguments before running a cell.""" + if hasattr(info, 'cell_id') and info.cell_id: + self._plot_magic_args['id'] = info.cell_id + self._plot_magic_args['ipythonCellId'] = info.cell_id - # Build args from the cell info - if hasattr(info, 'cell_id'): - if info.cell_id is not None: - self._plot_magic_args['id'] = info.cell_id - self._plot_magic_args['ipythonCellId'] = info.cell_id if hasattr(info, 'raw_cell'): self._plot_magic_args['ipythonRawCell'] = info.raw_cell - def post_run_cell(self, result): - if not self.connection_established: - # The connection is now established using the %connect magic, so this may not be needed - pass - if result.result is not None and self.cP is not None: - asyncio.create_task(self.cP.plot(result.result, **self._plot_magic_args)) - - # Clean up the current cell id - self._magic_current_cell_id = None - self._plot_magic_args = {} - - def load_ipython_extension(ipython): - - ipython.register_magics(Magics(ipython)) - _cP_extension = IPythonExtension(ipython) - # Store the extension instance in the IPython user namespace for access from magics - ipython.user_ns['_cP_extension'] = _cP_extension - ipython.events.register('pre_run_cell', _cP_extension.pre_run_cell) - ipython.events.register('post_run_cell', _cP_extension.post_run_cell) + """Load the IPython extension.""" + magics = CodeplotMagics(ipython) + ipython.register_magics(magics) + ext = IPythonExtension(ipython) + # Save the original display_pub.publish method + # and replace it with the custom method. + ipython.displayhook_class.__ocall__ = ipython.displayhook_class.__call__ + ipython.displayhook_class.__call__ = ext._display_hook__call__ diff --git a/minirepos/@codeplot-ipython/setup.py b/minirepos/@codeplot-ipython/setup.py index 4296147..3c54a5b 100644 --- a/minirepos/@codeplot-ipython/setup.py +++ b/minirepos/@codeplot-ipython/setup.py @@ -2,10 +2,10 @@ setup( name='codeplot-ipython', - version='1.8.0', + version='1.14.1', packages=find_packages(), install_requires=[ - 'codeplot >= 1.2.0', + 'codeplot >= 1.3.1', 'asyncio >= 3.4.3', ], author='Antonio Moura (@antl3x)', diff --git a/minirepos/@codeplot-python/README.md b/minirepos/@codeplot-python/README.md index 22fd6a4..9add95a 100644 --- a/minirepos/@codeplot-python/README.md +++ b/minirepos/@codeplot-python/README.md @@ -121,3 +121,7 @@ Codeplot is free to use for personal and non-commercial purposes. Only pay if you use Codeplot commercially. Read more about [License and Pricing here](LICENSE.md). + +# Sponsor + +This project is sponsored by [LearnPolars.co](https://learnpolars.co). LearnPolars is a platform to learn data manipulation and analysis using Polars, a blazingly fast DataFrame library in Python (Rust). \ No newline at end of file diff --git a/minirepos/@codeplot-python/build/lib/codeplot/main.py b/minirepos/@codeplot-python/build/lib/codeplot/main.py index 75aff49..bae0b38 100644 --- a/minirepos/@codeplot-python/build/lib/codeplot/main.py +++ b/minirepos/@codeplot-python/build/lib/codeplot/main.py @@ -113,8 +113,8 @@ async def plot(self, data, **kwargs) -> None: kwargs.setdefault("rotation",shape['rotation'] if shape else 0) kwargs.setdefault("opacity", shape['opacity'] if shape else 1) kwargs.setdefault("is_locked", shape['isLocked'] if shape else False) - kwargs.setdefault("x_pos", shape['x'] if shape else -camera["x"] + 100) - kwargs.setdefault("y_pos", shape['y'] if shape else -camera["y"] + 100) + kwargs.setdefault("x_pos", shape['x'] if shape else 0) + kwargs.setdefault("y_pos", shape['y'] if shape else 0) kwargs.setdefault("page_id", instance["currentPageId"]) kwargs.setdefault("ipythonRawCell", None) kwargs.setdefault("ipythonCellId", None) @@ -137,7 +137,7 @@ async def plot(self, data, **kwargs) -> None: "renderWith": "default", "mime": _get_mime_representations(data), "metadata": { - "isPinned": False, + "isPinned": True, "pythonCallerFrameCodeContext": metacode_line, "ipythonRawCell": kwargs["ipythonRawCell"], "ipythonCellId": kwargs["ipythonCellId"], @@ -198,7 +198,7 @@ def _get_mime_representations(obj): representations = {} # Here we check if obj is a representation itself - if isinstance(obj, dict) and 'text/plain' in obj: + if isinstance(obj, dict): return obj for method_name, mime_type in mime_types.items(): diff --git a/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO b/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO index b9f64d8..b45d759 100644 --- a/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO +++ b/minirepos/@codeplot-python/codeplot.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: codeplot -Version: 1.2.0 +Version: 1.3.1 Summary: codeplot is a canvas designed for code-driven data exploration where you can plot graphs, data frames, markdown and much more using plain Python Home-page: https://github.com/codeplot-co/codeplot Author: Antonio Moura (@antl3x) @@ -9,12 +9,6 @@ License: AGPL-3.0-or-later Classifier: Programming Language :: Python :: 3 Requires-Python: >=3.6 Description-Content-Type: text/markdown -Requires-Dist: watchdog>=3.0.0 -Requires-Dist: typeid-python>=0.2.2 -Requires-Dist: ypy-websocket>=0.12.4 -Requires-Dist: asyncio>=3.4.3 -Requires-Dist: websockets>=11.0 -Requires-Dist: y-py>=0.6.2 ![codeplot-readme](https://github.com/codeplot-co/codeplot/assets/26308297/e1212d25-a731-4755-875d-e988848f6d87)
@@ -139,3 +133,7 @@ Codeplot is free to use for personal and non-commercial purposes. Only pay if you use Codeplot commercially. Read more about [License and Pricing here](LICENSE.md). + +# Sponsor + +This project is sponsored by [LearnPolars.co](https://learnpolars.co). LearnPolars is a platform to learn data manipulation and analysis using Polars, a blazingly fast DataFrame library in Python (Rust). diff --git a/minirepos/@codeplot-python/codeplot/main.py b/minirepos/@codeplot-python/codeplot/main.py index 472ea0d..bae0b38 100644 --- a/minirepos/@codeplot-python/codeplot/main.py +++ b/minirepos/@codeplot-python/codeplot/main.py @@ -113,8 +113,8 @@ async def plot(self, data, **kwargs) -> None: kwargs.setdefault("rotation",shape['rotation'] if shape else 0) kwargs.setdefault("opacity", shape['opacity'] if shape else 1) kwargs.setdefault("is_locked", shape['isLocked'] if shape else False) - kwargs.setdefault("x_pos", shape['x'] if shape else -camera["x"] + 100) - kwargs.setdefault("y_pos", shape['y'] if shape else -camera["y"] + 100) + kwargs.setdefault("x_pos", shape['x'] if shape else 0) + kwargs.setdefault("y_pos", shape['y'] if shape else 0) kwargs.setdefault("page_id", instance["currentPageId"]) kwargs.setdefault("ipythonRawCell", None) kwargs.setdefault("ipythonCellId", None) @@ -137,7 +137,7 @@ async def plot(self, data, **kwargs) -> None: "renderWith": "default", "mime": _get_mime_representations(data), "metadata": { - "isPinned": False, + "isPinned": True, "pythonCallerFrameCodeContext": metacode_line, "ipythonRawCell": kwargs["ipythonRawCell"], "ipythonCellId": kwargs["ipythonCellId"], diff --git a/minirepos/@codeplot-python/setup.py b/minirepos/@codeplot-python/setup.py index c2808fa..54ff0d8 100644 --- a/minirepos/@codeplot-python/setup.py +++ b/minirepos/@codeplot-python/setup.py @@ -2,7 +2,7 @@ setup( name='codeplot', - version='1.2.0', + version='1.3.1', packages=find_packages(), install_requires=[ 'watchdog >= 3.0.0', From bd44bee6369e0a3f022b0c22126cdc4d2a84eb10 Mon Sep 17 00:00:00 2001 From: "Antonio Moura (@antl3x)" Date: Mon, 20 May 2024 10:39:56 -0600 Subject: [PATCH 03/11] #0 --- .vscode/settings.json | 4 +- README.md | 21 +- examples/Demo Notebook (SDK).ipynb | 120 ++++++++++ examples/Demo Notebook.ipynb | 208 ++++++++++++++++++ .../codeplot-ipython/__init__.py | 30 ++- minirepos/@codeplot-ipython/setup.py | 2 +- 6 files changed, 367 insertions(+), 18 deletions(-) create mode 100644 examples/Demo Notebook (SDK).ipynb create mode 100644 examples/Demo Notebook.ipynb diff --git a/.vscode/settings.json b/.vscode/settings.json index 6fc595d..bc09b5e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,7 @@ "source.fixAll.eslint": "explicit", "source.fixAll.stylelint": "explicit" }, - "stylelint.validate": ["css", "scss"] + "stylelint.validate": ["css", "scss"], + // Keybindings + } \ No newline at end of file diff --git a/README.md b/README.md index 9add95a..30e84c7 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Created by [@antl3x](https://github.com/antl3x), [read more](https://antl3x.co/p - **Open to Everyone**: Designed for data scientists and enthusiasts alike, codeplot aims to enhance your data exploration experience. # Getting Started (IPython Extension) -To use codeplot in a IPython Notebook like Jupyter, Google Colab, etc, you can install the IPython Extension using pip: +To use codeplot in a IPython environment like Jupyter, Google Colab, etc, you can install the IPython Extension using pip: ```bash pip install codeplot-ipython @@ -42,6 +42,8 @@ After install you can load the extension and connect to a new room: Now the output of your cells will be automatically plotted in the codeplot canvas! So you don't need to use the `cP.plot` function. +Take a look at [the Notebook Example](/examples/Demo%20Notebook.ipynb) + Thats all! # Getting Started (Python SDK) @@ -71,23 +73,18 @@ async def main(): asyncio.run(main()) ``` +Take a look at [the Notebook (SDK Example)](/examples/Demo%20Notebook%20(SDK).ipynb) + +--- + +## Demo - codeplot.co + You can use the public codeplot client & server to start plotting right away: 1. Join the codeplot room at [codeplot.co](https://codeplot.co) 2. Use the room id to connect to the room using the code above -If you want to use codeplot in a Jupyter Notebook, you can use the following code: - -```python -import codeplot -cP = await codeplot.connect("ws://your-ws-url/your-room-id") - -# Now you can start plotting -await cP.plot(df.describe()) -await cP.plot(df.head(10)) -await cP.plot(df) -``` # Run Codeplot on Docker diff --git a/examples/Demo Notebook (SDK).ipynb b/examples/Demo Notebook (SDK).ipynb new file mode 100644 index 0000000..505e5fd --- /dev/null +++ b/examples/Demo Notebook (SDK).ipynb @@ -0,0 +1,120 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jkBShJ2VtKop" + }, + "outputs": [], + "source": [ + "!pip install codeplot" + ] + }, + { + "cell_type": "code", + "source": [ + "# Import and connect to the session\n", + "import codeplot\n", + "cP = await codeplot.connect(\"wss://api.codeplot.co/room_01hpqznh4efe88tqhr31hd30yr\")" + ], + "metadata": { + "id": "5r-fFLuQtd9J" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import nest_asyncio\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "nest_asyncio.apply()\n", + "\n", + "df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv')" + ], + "metadata": { + "id": "N49ephcetfZv" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's plot the dataframe head.\n", + "await cP.plot(df.head(10));" + ], + "metadata": { + "id": "5aCBgBDEzEaK" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's plot the dataframe datatypes.\n", + "await cP.plot(df.dtypes);" + ], + "metadata": { + "id": "WX_9V3lqzFHB" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's plot the dataframe shape.\n", + "await cP.plot(df.shape);" + ], + "metadata": { + "id": "8xK1RatTzNvM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Drop rows with missing values in 'age' or 'fare' columns for clarity in the scatter plot\n", + "df = df.dropna(subset=['age', 'fare'])\n", + "\n", + "# Create the scatter plot\n", + "plt.figure(figsize=(10, 6)) # Set the figure size for better readability\n", + "sns.scatterplot(data=df, x='age', y='fare', hue='class', style='sex', size='survived', sizes=(20, 200), alpha=0.7)\n", + "\n", + "# Adding plot title and labels\n", + "plt.title('Age vs Fare on the Titanic')\n", + "plt.xlabel('Age')\n", + "plt.ylabel('Fare')\n", + "plt.legend(title='Passenger Details')\n", + "\n", + "# Show the plot\n", + "await cP.plot(plt);" + ], + "metadata": { + "id": "avxUwTNBzCZS" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/Demo Notebook.ipynb b/examples/Demo Notebook.ipynb new file mode 100644 index 0000000..fbe4042 --- /dev/null +++ b/examples/Demo Notebook.ipynb @@ -0,0 +1,208 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cP1-t9sGTe8n" + }, + "outputs": [], + "source": [ + "# Install Codeploy IPython Extension\n", + "!pip install codeplot-ipython" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "5IvRzlkZUSJx", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "095d164e-ba07-48cc-b77c-7595fa024237" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Output suppression is now: True.\n" + ] + } + ], + "source": [ + "# Load Extension\n", + "%load_ext codeplot-ipython\n", + "\n", + "# Connect to Codeplot Session\n", + "%cP_connect wss://api.codeplot.co/room_01hybcyhjnet4ak4zp9sh19sgh\n", + "%cP_supress True" + ] + }, + { + "cell_type": "code", + "source": [ + "import polars as pl\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "import numpy as np\n", + "import matplotlib.pylab as plt" + ], + "metadata": { + "id": "zLniXIES1U5M" + }, + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df = sns.load_dataset('titanic')\n", + "df.head()" + ], + "metadata": { + "id": "6fFHCYKXvKJ2" + }, + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's plot the dataframe shape.\n", + "df.shape;" + ], + "metadata": { + "id": "E6LnBEVkveue" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's plot the dataframe columns.\n", + "df.columns;" + ], + "metadata": { + "id": "1YSwHcOLyUUF" + }, + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's plot the dataframe datatypes.\n", + "df.dtypes" + ], + "metadata": { + "id": "s6DAZOmNviLn" + }, + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Let's describe the dataframe.\n", + "df.describe()" + ], + "metadata": { + "id": "H1iwyFLXyfB0" + }, + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Handling missing values\n", + "df.dropna(inplace=True) # Remove rows with missing values\n" + ], + "metadata": { + "id": "UdELTkTxv0dq" + }, + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Bar plot\n", + "sns.countplot(x='survived', data=df)\n", + "plt.xlabel('Survival Status')\n", + "plt.ylabel('Count')\n", + "plt.title('Survival Count')\n", + "plt.show()\n", + "\n", + "# Histogram\n", + "plt.hist(df['age'], bins=10)\n", + "plt.xlabel('Age')\n", + "plt.ylabel('Frequency')\n", + "plt.title('Distribution of Age')\n", + "plt.show()\n", + "\n", + "# Scatter plot\n", + "plt.scatter(df['age'], df['fare'])\n", + "plt.xlabel('Age')\n", + "plt.ylabel('Fare')\n", + "plt.title('Age vs. Fare')\n", + "plt.show()\n", + "\n", + "# Box plot\n", + "sns.boxplot(x=df['survived'], y=df['fare'])\n", + "plt.xlabel('Survival Status')\n", + "plt.ylabel('Fare')\n", + "plt.title('Survival Status vs. Fare')\n", + "plt.show()" + ], + "metadata": { + "id": "e_dq5Fie0rzg" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Correlation analysis\n", + "correlation = df[['age', 'fare']].corr()\n", + "correlation" + ], + "metadata": { + "id": "rHWdnZbv1UeG" + }, + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Cross-tabulation\n", + "cross_tab = pd.crosstab(df['pclass'], df['survived'])\n", + "cross_tab" + ], + "metadata": { + "id": "t9d8FwLk1fOT" + }, + "execution_count": 18, + "outputs": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py b/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py index d356882..21be621 100644 --- a/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py +++ b/minirepos/@codeplot-ipython/codeplot-ipython/__init__.py @@ -1,10 +1,32 @@ import asyncio from IPython.core.magic import Magics, magics_class, line_magic from IPython.core.magic_arguments import (argument, magic_arguments, parse_argstring) - +import threading import codeplot +class AsyncLoopThread: + """A class that manages an asyncio loop in a separate thread.""" + def __init__(self): + self.loop = asyncio.new_event_loop() + self.thread = threading.Thread(target=self.run_loop) + self.thread.start() + + def run_loop(self): + """Run the loop until it is stopped.""" + asyncio.set_event_loop(self.loop) + self.loop.run_forever() + + def stop(self): + """Stop the loop and wait for the thread to finish.""" + self.loop.call_soon_threadsafe(self.loop.stop) + self.thread.join() + + def run_coroutine(self, coro): + """Thread-safe way to schedule a coroutine in the loop.""" + return asyncio.run_coroutine_threadsafe(coro, self.loop) + +async_loop_thread = AsyncLoopThread() # Initialize this somewhere suitable @magics_class @@ -15,7 +37,7 @@ def cP_connect(self, line): params = line.split() if params: url = params[0] - asyncio.create_task(self.shell.user_ns['_cP_extension'].connect_to_codeplot(url)) + async_loop_thread.run_coroutine(self.shell.user_ns['_cP_extension'].connect_to_codeplot(url)) else: raise Exception("No URL provided.") @@ -62,7 +84,7 @@ async def connect_to_codeplot(self, url): def _display_hook__call__(self, result=None): """Custom display hook.""" if result is not None and self.cP: - asyncio.create_task(self.cP.plot(result, **self._plot_magic_args)) + async_loop_thread.run_coroutine(self.cP.plot(result, **self._plot_magic_args)) self._plot_magic_args = {} if not self._suppress: @@ -73,7 +95,7 @@ def custom_display_pub_publish(self, *args, **kwargs): """Custom publishing method that integrates with Codeplot.""" data = kwargs.get('data') if data and self.cP: - asyncio.create_task(self.cP.plot(data, **self._plot_magic_args)) + async_loop_thread.run_coroutine(self.cP.plot(data, **self._plot_magic_args)) if not self._suppress: self._original_display_pub_publish(*args, **kwargs) diff --git a/minirepos/@codeplot-ipython/setup.py b/minirepos/@codeplot-ipython/setup.py index 3c54a5b..1956c90 100644 --- a/minirepos/@codeplot-ipython/setup.py +++ b/minirepos/@codeplot-ipython/setup.py @@ -2,7 +2,7 @@ setup( name='codeplot-ipython', - version='1.14.1', + version='1.15.0', packages=find_packages(), install_requires=[ 'codeplot >= 1.3.1', From d7d3fdf38b97911bf35680404ba951fbbfca2f92 Mon Sep 17 00:00:00 2001 From: "Antonio Moura (@antl3x)" Date: Mon, 20 May 2024 13:23:21 -0600 Subject: [PATCH 04/11] #0 --- minirepos/@codeplot-front/package.json | 2 +- .../@codeplot-front/src/@.core/_impl_/AppModel.ts | 2 ++ .../src/@.tldraw.canvas/_impl_/Canvas.tsx | 4 ++++ .../src/@.tldraw.canvas/_impl_/overrides.ts | 2 +- .../src/@.tldraw.canvas/_impl_/styles.css | 8 ++++++-- .../src/@.tldraw.canvas/_impl_/useStore.ts | 2 ++ .../src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx | 11 ++++++++++- .../_impl_/[render] DefaultMimeImageSvgXmlRender.tsx | 6 +++++- .../_impl_/[render] DefaultMimeTextHtmlRender.tsx | 7 ++++--- .../src/@.tldraw.shapes/_impl_/styles.css | 4 ++++ 10 files changed, 39 insertions(+), 9 deletions(-) diff --git a/minirepos/@codeplot-front/package.json b/minirepos/@codeplot-front/package.json index a326119..e76a2d6 100644 --- a/minirepos/@codeplot-front/package.json +++ b/minirepos/@codeplot-front/package.json @@ -1,7 +1,7 @@ { "name": "@codeplot/front", "private": true, - "version": "1.1.0", + "version": "1.2.0", "type": "module", "scripts": { "compile": "zx _scripts/compile.mjs", diff --git a/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts b/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts index 43d98ec..8be0aa5 100644 --- a/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts +++ b/minirepos/@codeplot-front/src/@.core/_impl_/AppModel.ts @@ -145,6 +145,8 @@ const AppModel = types const rec = entry?.changes?.added; const recId = Object.keys(rec)?.[0] as TLShape["id"]; if (!recId) return; + // We only want to zoom to the selection if the shape is a codeplot + if ((rec[recId] as TLShape)?.type !== "codeplot") return; editor.select(rec[recId] as TLShape); editor.zoomToSelection(); diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx index 044e362..b65d61a 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/Canvas.tsx @@ -22,6 +22,8 @@ import { LaserTool, LineShapeTool, LineShapeUtil, + NoteShapeTool, + NoteShapeUtil, TldrawScribble as Scribble, SelectTool, TldrawSelectionBackground as SelectionBackground, @@ -70,6 +72,7 @@ export const Canvas = observer((props: React.PropsWithChildren) => { HighlightShapeUtil, VideoShapeUtil, CodeplotShapeUtil, + NoteShapeUtil, ], tools: [ EraserTool, @@ -83,6 +86,7 @@ export const Canvas = observer((props: React.PropsWithChildren) => { LineShapeTool, ArrowShapeTool, HighlightShapeTool, + NoteShapeTool, ], }), [], diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts index fc62a30..ecef4a0 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/overrides.ts @@ -234,7 +234,7 @@ const _toolsOverrides: TLUiOverrides["tools"] = (_, tools) => { const _toolbarOverrides: TLUiOverrides["toolbar"] = (_, toolbar) => { return toolbar.filter((item) => { - return item.id === "hand" || item.id === "select"; + return item; }); }; /* -------------------------------------------------------------------------- */ diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/styles.css b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/styles.css index 0770bf0..591d288 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/styles.css +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/styles.css @@ -51,11 +51,15 @@ display: none; } +button[data-tool="asset"] { + display: none; +} + .tlui-toolbar__tools { justify-content: center; width: fit-content; } -button[title="Styles"] { +/* button[title="Styles"] { display: none; -} +} */ diff --git a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts index ed746eb..c4357de 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts +++ b/minirepos/@codeplot-front/src/@.tldraw.canvas/_impl_/useStore.ts @@ -108,6 +108,8 @@ export function useStore({ ) => { if (transaction.local) return; + console.log("not local"); + const toRemove: TLRecord["id"][] = []; const toPut: TLRecord[] = []; diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx index 62550e7..fe16c54 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/CodeplotShapeUtil.tsx @@ -5,6 +5,7 @@ import { TLOnResizeHandler, TLShapeUtilFlag, resizeBox, + useEditor, } from "@tldraw/tldraw"; import { useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; @@ -69,6 +70,9 @@ export const Component = observer(({ shape }: { shape: ICodeplotShape }) => { const pinRef = useRef(shape.props.metadata.isPinned); const [, forceUpdate] = useState({}); + const editor = useEditor(); + const [toolId, setToolId] = useState(editor.getCurrentToolId()); + // Initialize pin state from props only on the first render useEffect(() => { pinRef.current = shape.props.metadata.isPinned; @@ -88,9 +92,14 @@ export const Component = observer(({ shape }: { shape: ICodeplotShape }) => { return ( setToolId(editor.getCurrentToolId())} id={shape.id} data-is_pinned={pinRef.current} - className="codeplot-HTMLContainer" + className={`${ + toolId !== "select" + ? "codeplot-HTMLContainer codeplot-HTMLContainer--disabled" + : "codeplot-HTMLContainer" + }`} style={{ width: shape.props.w, height: shape.props.h, diff --git a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImageSvgXmlRender.tsx b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImageSvgXmlRender.tsx index 05fbf94..8c5a9d3 100644 --- a/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImageSvgXmlRender.tsx +++ b/minirepos/@codeplot-front/src/@.tldraw.shapes/_impl_/[render] DefaultMimeImageSvgXmlRender.tsx @@ -1,7 +1,8 @@ import { appStore } from "@.core"; +import { observer } from "mobx-react"; +import { useRef } from "react"; import { ICodeplotShape } from "./ICodeplotShape"; import { GLOBAL_IFRAME_SCRIPT, GLOBAL_STYLE } from "./IFRAME_SANDBOX_SCRIPTS"; -import { observer } from "mobx-react"; // import ReactJson from "react-json-view"; @@ -13,9 +14,12 @@ type IDefaultMimeImageSvgXmlRenderProps = { export const DefaultMimeImageSvgXmlRender = observer( ({ shape }: IDefaultMimeImageSvgXmlRenderProps) => { + const iframeRef = useRef(null); + return (