jupyter blog
ci/woodpecker/manual/woodpecker Pipeline was successful

This commit is contained in:
2026-01-26 12:53:43 +01:00
parent 4c31659f0c
commit 2b50b0bdd6
13 changed files with 1332619 additions and 1 deletions
Submodule deno-jupyter-blog deleted from 0c2832920c
+3
View File
@@ -0,0 +1,3 @@
__pycache__
.ipynb_checkpoints/
data
+28
View File
@@ -0,0 +1,28 @@
# jupyter blog
Ensure you have the Jupyter kernel installed
```sh
deno jupyter --install
```
For **VS Code**, you should be able to open the notebook directly (see
[Deno docs](https://docs.deno.com/runtime/reference/cli/jupyter/) to enable the
kernel).
```sh
code post.ipynb
```
For **Jupyter Lab**, please ensure to have [uv](https://github.com/astral-sh/uv)
installed. Then, launch the notebook using the
[juv](https://github.com/manzt/juv) CLI:
```sh
uvx juv run --with=anywidget --jupyter=lab post.ipynb
```
The `--with=anywidget` flag ensures JupyterLab loads the required front-end
extension for interactive [anywidgets](https://github.com/manzt/anywidget) (e.g.
agrid, quak). This isn't needed in VS Code, where these assets load from a CDN
instead of the local file system.
File diff suppressed because it is too large Load Diff
+8
View File
@@ -0,0 +1,8 @@
{
"workspace": ["./jupyter-helper"],
"lint": {
"rules": {
"exclude": ["prefer-const"]
}
}
}
+842
View File
@@ -0,0 +1,842 @@
{
"version": "5",
"specifiers": {
"jsr:@anywidget/deno@~0.2.3": "0.2.3",
"jsr:@manzt/quak@^0.0.2": "0.0.2",
"jsr:@std/csv@1.0.5": "1.0.5",
"jsr:@std/encoding@^1.0.7": "1.0.8",
"jsr:@std/streams@^1.0.8": "1.0.9",
"npm:@js-temporal/polyfill@~0.4.4": "0.4.4",
"npm:@observablehq/plot@*": "0.6.17",
"npm:@preact/signals-core@^1.8.0": "1.8.0",
"npm:@types/d3-scale@4.0.8": "4.0.8",
"npm:@types/d3@7": "7.4.3",
"npm:@types/react-dom@^19.0.3": "19.0.4_@types+react@19.0.12",
"npm:@uwdata/flechette@^1.1.0": "1.1.2",
"npm:@uwdata/flechette@^1.1.2": "1.1.2",
"npm:@uwdata/mosaic-core@0.11": "0.11.0",
"npm:@uwdata/mosaic-plot@0.11": "0.11.0",
"npm:ag-grid-community@^33.1.0": "33.2.1",
"npm:d3@^7.9.0": "7.9.0_d3-selection@3.0.0",
"npm:htl@~0.3.1": "0.3.1",
"npm:linkedom@~0.18.9": "0.18.9",
"npm:nodejs-polars@0.18": "0.18.0",
"npm:nodejs-polars@0.18.0": "0.18.0",
"npm:react-dom@19": "19.0.0_react@19.0.0",
"npm:react@*": "19.0.0",
"npm:react@19": "19.0.0"
},
"jsr": {
"@anywidget/deno@0.2.3": {
"integrity": "6a6ae1cdc47d76b5d934da8883ce8ab420dc915c041d3663f224ff931eece25f"
},
"@manzt/quak@0.0.2": {
"integrity": "c1b7a31a9394acd243fc16be6d9d41f3bea71c2c9a19f328ba4043b8b688e48d",
"dependencies": [
"npm:@js-temporal/polyfill",
"npm:@preact/signals-core",
"npm:@types/d3",
"npm:@types/d3-scale",
"npm:@uwdata/flechette@^1.1.0",
"npm:@uwdata/mosaic-plot",
"npm:d3",
"npm:htl"
]
},
"@std/csv@1.0.5": {
"integrity": "02006ffd77e84b2bf01968d4e792f0b5cba057c73dc6a89accb96d803493675f",
"dependencies": [
"jsr:@std/streams"
]
},
"@std/encoding@1.0.8": {
"integrity": "a6c8f3f933ab1bed66244f435d1dc0fd23a888e07195532122ddc3d5f8f0e6b4"
},
"@std/streams@1.0.9": {
"integrity": "a9d26b1988cdd7aa7b1f4b51e1c36c1557f3f252880fa6cc5b9f37078b1a5035"
}
},
"npm": {
"@duckdb/duckdb-wasm@1.29.0": {
"integrity": "sha512-8Zq7vafQuIz9gklC/9375KE38UlkaS2n8+yvG+/JK7irm3DjwYNJHL4xfplIj0bSHFIg6we5XhWYFqtE/vO3+Q==",
"dependencies": [
"apache-arrow"
]
},
"@js-temporal/polyfill@0.4.4": {
"integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==",
"dependencies": [
"jsbi",
"tslib"
]
},
"@observablehq/plot@0.6.17": {
"integrity": "sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==",
"dependencies": [
"d3",
"interval-tree-1d",
"isoformat"
]
},
"@preact/signals-core@1.8.0": {
"integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA=="
},
"@swc/helpers@0.5.15": {
"integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
"dependencies": [
"tslib"
]
},
"@types/command-line-args@5.2.3": {
"integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw=="
},
"@types/command-line-usage@5.0.4": {
"integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg=="
},
"@types/d3-array@3.2.1": {
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
},
"@types/d3-axis@3.0.6": {
"integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
"dependencies": [
"@types/d3-selection"
]
},
"@types/d3-brush@3.0.6": {
"integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
"dependencies": [
"@types/d3-selection"
]
},
"@types/d3-chord@3.0.6": {
"integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="
},
"@types/d3-color@3.1.3": {
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
},
"@types/d3-contour@3.0.6": {
"integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
"dependencies": [
"@types/d3-array",
"@types/geojson"
]
},
"@types/d3-delaunay@6.0.4": {
"integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="
},
"@types/d3-dispatch@3.0.6": {
"integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="
},
"@types/d3-drag@3.0.7": {
"integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
"dependencies": [
"@types/d3-selection"
]
},
"@types/d3-dsv@3.0.7": {
"integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="
},
"@types/d3-ease@3.0.2": {
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
},
"@types/d3-fetch@3.0.7": {
"integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
"dependencies": [
"@types/d3-dsv"
]
},
"@types/d3-force@3.0.10": {
"integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="
},
"@types/d3-format@3.0.4": {
"integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="
},
"@types/d3-geo@3.1.0": {
"integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
"dependencies": [
"@types/geojson"
]
},
"@types/d3-hierarchy@3.1.7": {
"integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="
},
"@types/d3-interpolate@3.0.4": {
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
"dependencies": [
"@types/d3-color"
]
},
"@types/d3-path@3.1.1": {
"integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="
},
"@types/d3-polygon@3.0.2": {
"integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="
},
"@types/d3-quadtree@3.0.6": {
"integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="
},
"@types/d3-random@3.0.3": {
"integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="
},
"@types/d3-scale-chromatic@3.1.0": {
"integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="
},
"@types/d3-scale@4.0.8": {
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
"dependencies": [
"@types/d3-time"
]
},
"@types/d3-selection@3.0.11": {
"integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="
},
"@types/d3-shape@3.1.7": {
"integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
"dependencies": [
"@types/d3-path"
]
},
"@types/d3-time-format@4.0.3": {
"integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="
},
"@types/d3-time@3.0.4": {
"integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="
},
"@types/d3-timer@3.0.2": {
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
},
"@types/d3-transition@3.0.9": {
"integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
"dependencies": [
"@types/d3-selection"
]
},
"@types/d3-zoom@3.0.8": {
"integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
"dependencies": [
"@types/d3-interpolate",
"@types/d3-selection"
]
},
"@types/d3@7.4.3": {
"integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
"dependencies": [
"@types/d3-array",
"@types/d3-axis",
"@types/d3-brush",
"@types/d3-chord",
"@types/d3-color",
"@types/d3-contour",
"@types/d3-delaunay",
"@types/d3-dispatch",
"@types/d3-drag",
"@types/d3-dsv",
"@types/d3-ease",
"@types/d3-fetch",
"@types/d3-force",
"@types/d3-format",
"@types/d3-geo",
"@types/d3-hierarchy",
"@types/d3-interpolate",
"@types/d3-path",
"@types/d3-polygon",
"@types/d3-quadtree",
"@types/d3-random",
"@types/d3-scale",
"@types/d3-scale-chromatic",
"@types/d3-selection",
"@types/d3-shape",
"@types/d3-time",
"@types/d3-time-format",
"@types/d3-timer",
"@types/d3-transition",
"@types/d3-zoom"
]
},
"@types/geojson@7946.0.16": {
"integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="
},
"@types/node@20.17.28": {
"integrity": "sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==",
"dependencies": [
"undici-types"
]
},
"@types/react-dom@19.0.4_@types+react@19.0.12": {
"integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==",
"dependencies": [
"@types/react"
]
},
"@types/react@19.0.12": {
"integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==",
"dependencies": [
"csstype"
]
},
"@uwdata/flechette@1.1.2": {
"integrity": "sha512-hhtAgXlJbibLIHHIyFJ2fcPQ/hAK43HtEirRgrb/v2xEQv4It/KcUOyMklaVPUv2Z7+agKjSWLAXGyAQglRPvQ=="
},
"@uwdata/mosaic-core@0.11.0": {
"integrity": "sha512-0bW7zl90EXqZoUfIJCrytjeY5KNjZWoYN1of1M0fJ0A+7cxlh08iLTi9XRaptPmL6teIOpOthVV747422BYVcQ==",
"dependencies": [
"@duckdb/duckdb-wasm",
"@uwdata/flechette",
"@uwdata/mosaic-sql"
]
},
"@uwdata/mosaic-plot@0.11.0": {
"integrity": "sha512-WcIvrHqg5brlT8SPV3qFNsjaRI14govLsMrrmjTRA/uofb6kRmvFiNbNn/9+7VRReGzeB0wMiX2bvAriRAdIzA==",
"dependencies": [
"@observablehq/plot",
"@uwdata/mosaic-core",
"@uwdata/mosaic-sql",
"d3",
"isoformat"
]
},
"@uwdata/mosaic-sql@0.11.0": {
"integrity": "sha512-q2uDGxsfhhXkJYo1CXyo0RdyWsYUsHrwe+9FORfyGuxfU4+0KxhFRQn5njQm4hEejQhGoqvPbvcQxR9g6PnS+w=="
},
"ag-charts-types@11.2.1": {
"integrity": "sha512-uzN1OUEn5nCFDZ4GTNkYHpg+6hbF+NamIwUOK/aSHBRvJxJU9/sK+K1QkqYpU912mHtpAZ9x0zEddr2sw6pT2Q=="
},
"ag-grid-community@33.2.1": {
"integrity": "sha512-eQVRv+x8C3+T2weBux7Y+SN6IMs4lYJjTmNSfm/OX3ANH3GsscvqRiOxoV/R+hQWL7GUXOCLPZHFzZpzSdk0xg==",
"dependencies": [
"ag-charts-types"
]
},
"ansi-styles@4.3.0": {
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dependencies": [
"color-convert"
]
},
"apache-arrow@17.0.0": {
"integrity": "sha512-X0p7auzdnGuhYMVKYINdQssS4EcKec9TCXyez/qtJt32DrIMGbzqiaMiQ0X6fQlQpw8Fl0Qygcv4dfRAr5Gu9Q==",
"dependencies": [
"@swc/helpers",
"@types/command-line-args",
"@types/command-line-usage",
"@types/node",
"command-line-args",
"command-line-usage",
"flatbuffers",
"json-bignum",
"tslib"
],
"bin": true
},
"array-back@3.1.0": {
"integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="
},
"array-back@6.2.2": {
"integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw=="
},
"binary-search-bounds@2.0.5": {
"integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA=="
},
"boolbase@1.0.0": {
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
},
"chalk-template@0.4.0": {
"integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==",
"dependencies": [
"chalk"
]
},
"chalk@4.1.2": {
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dependencies": [
"ansi-styles",
"supports-color"
]
},
"color-convert@2.0.1": {
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dependencies": [
"color-name"
]
},
"color-name@1.1.4": {
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"command-line-args@5.2.1": {
"integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
"dependencies": [
"array-back@3.1.0",
"find-replace",
"lodash.camelcase",
"typical@4.0.0"
]
},
"command-line-usage@7.0.3": {
"integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==",
"dependencies": [
"array-back@6.2.2",
"chalk-template",
"table-layout",
"typical@7.3.0"
]
},
"commander@7.2.0": {
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
},
"css-select@5.1.0": {
"integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
"dependencies": [
"boolbase",
"css-what",
"domhandler",
"domutils",
"nth-check"
]
},
"css-what@6.1.0": {
"integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="
},
"cssom@0.5.0": {
"integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
},
"csstype@3.1.3": {
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"d3-array@3.2.4": {
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
"dependencies": [
"internmap"
]
},
"d3-axis@3.0.0": {
"integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="
},
"d3-brush@3.0.0_d3-selection@3.0.0": {
"integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
"dependencies": [
"d3-dispatch",
"d3-drag",
"d3-interpolate",
"d3-selection",
"d3-transition"
]
},
"d3-chord@3.0.1": {
"integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
"dependencies": [
"d3-path"
]
},
"d3-color@3.1.0": {
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
},
"d3-contour@4.0.2": {
"integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
"dependencies": [
"d3-array"
]
},
"d3-delaunay@6.0.4": {
"integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
"dependencies": [
"delaunator"
]
},
"d3-dispatch@3.0.1": {
"integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
},
"d3-drag@3.0.0": {
"integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
"dependencies": [
"d3-dispatch",
"d3-selection"
]
},
"d3-dsv@3.0.1": {
"integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
"dependencies": [
"commander",
"iconv-lite",
"rw"
],
"bin": true
},
"d3-ease@3.0.1": {
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
},
"d3-fetch@3.0.1": {
"integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
"dependencies": [
"d3-dsv"
]
},
"d3-force@3.0.0": {
"integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
"dependencies": [
"d3-dispatch",
"d3-quadtree",
"d3-timer"
]
},
"d3-format@3.1.0": {
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
},
"d3-geo@3.1.1": {
"integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
"dependencies": [
"d3-array"
]
},
"d3-hierarchy@3.1.2": {
"integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="
},
"d3-interpolate@3.0.1": {
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"dependencies": [
"d3-color"
]
},
"d3-path@3.1.0": {
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="
},
"d3-polygon@3.0.1": {
"integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="
},
"d3-quadtree@3.0.1": {
"integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="
},
"d3-random@3.0.1": {
"integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="
},
"d3-scale-chromatic@3.1.0": {
"integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
"dependencies": [
"d3-color",
"d3-interpolate"
]
},
"d3-scale@4.0.2": {
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"dependencies": [
"d3-array",
"d3-format",
"d3-interpolate",
"d3-time",
"d3-time-format"
]
},
"d3-selection@3.0.0": {
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="
},
"d3-shape@3.2.0": {
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"dependencies": [
"d3-path"
]
},
"d3-time-format@4.1.0": {
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"dependencies": [
"d3-time"
]
},
"d3-time@3.1.0": {
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
"dependencies": [
"d3-array"
]
},
"d3-timer@3.0.1": {
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
},
"d3-transition@3.0.1_d3-selection@3.0.0": {
"integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
"dependencies": [
"d3-color",
"d3-dispatch",
"d3-ease",
"d3-interpolate",
"d3-selection",
"d3-timer"
]
},
"d3-zoom@3.0.0_d3-selection@3.0.0": {
"integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
"dependencies": [
"d3-dispatch",
"d3-drag",
"d3-interpolate",
"d3-selection",
"d3-transition"
]
},
"d3@7.9.0_d3-selection@3.0.0": {
"integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
"dependencies": [
"d3-array",
"d3-axis",
"d3-brush",
"d3-chord",
"d3-color",
"d3-contour",
"d3-delaunay",
"d3-dispatch",
"d3-drag",
"d3-dsv",
"d3-ease",
"d3-fetch",
"d3-force",
"d3-format",
"d3-geo",
"d3-hierarchy",
"d3-interpolate",
"d3-path",
"d3-polygon",
"d3-quadtree",
"d3-random",
"d3-scale",
"d3-scale-chromatic",
"d3-selection",
"d3-shape",
"d3-time",
"d3-time-format",
"d3-timer",
"d3-transition",
"d3-zoom"
]
},
"delaunator@5.0.1": {
"integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
"dependencies": [
"robust-predicates"
]
},
"dom-serializer@2.0.0": {
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
"dependencies": [
"domelementtype",
"domhandler",
"entities@4.5.0"
]
},
"domelementtype@2.3.0": {
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
},
"domhandler@5.0.3": {
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
"dependencies": [
"domelementtype"
]
},
"domutils@3.2.2": {
"integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"dependencies": [
"dom-serializer",
"domelementtype",
"domhandler"
]
},
"entities@4.5.0": {
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
},
"entities@6.0.0": {
"integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="
},
"find-replace@3.0.0": {
"integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
"dependencies": [
"array-back@3.1.0"
]
},
"flatbuffers@24.12.23": {
"integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA=="
},
"has-flag@4.0.0": {
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"htl@0.3.1": {
"integrity": "sha512-1LBtd+XhSc+++jpOOt0lCcEycXs/zTQSupOISnVAUmvGBpV7DH+C2M6hwV7zWYfpTMMg9ch4NO0lHiOTAMHdVA=="
},
"html-escaper@3.0.3": {
"integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="
},
"htmlparser2@10.0.0": {
"integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
"dependencies": [
"domelementtype",
"domhandler",
"domutils",
"entities@6.0.0"
]
},
"iconv-lite@0.6.3": {
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dependencies": [
"safer-buffer"
]
},
"internmap@2.0.3": {
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
},
"interval-tree-1d@1.0.4": {
"integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==",
"dependencies": [
"binary-search-bounds"
]
},
"isoformat@0.2.1": {
"integrity": "sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ=="
},
"jsbi@4.3.0": {
"integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g=="
},
"json-bignum@0.0.3": {
"integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg=="
},
"linkedom@0.18.9": {
"integrity": "sha512-Pfvhwjs46nBrcQdauQjMXDJZqj6VwN7KStT84xQqmIgD9bPH6UVJ/ESW8y4VHVF2h7di0/P+f4Iln4U5emRcmg==",
"dependencies": [
"css-select",
"cssom",
"html-escaper",
"htmlparser2",
"uhyphen"
]
},
"lodash.camelcase@4.3.0": {
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
},
"nodejs-polars-android-arm64@0.18.0": {
"integrity": "sha512-ksmL8X2xsMkI9WMlzRw7Mt7csIDfNJVDlyybSDMMAfO1YWfC2aCFUroFc8UnXVK+8bIZXB7W+k1ZzTRhtSxPsQ==",
"os": ["android"],
"cpu": ["arm64"]
},
"nodejs-polars-darwin-arm64@0.18.0": {
"integrity": "sha512-Hs8pbyPZCvOLSVoPx6X07vmYu1NmGAvLFYVHry945alesjsMOXZ//9D8psKOsZAh8WRU36CHXHSS18+RxdzLyA==",
"os": ["darwin"],
"cpu": ["arm64"]
},
"nodejs-polars-darwin-x64@0.18.0": {
"integrity": "sha512-AmLHJ4a4ufTAFohr7b7cQmPvn1Owl6AQBwwows447GfwEO65lu0PSUcmJbeiGJcLtjM9Dji6uiJdadRnGXC4sw==",
"os": ["darwin"],
"cpu": ["x64"]
},
"nodejs-polars-linux-arm64-gnu@0.18.0": {
"integrity": "sha512-lqOA0b6XXd/8D0q4tfrlr9g+awN/lz1WoWlDJXlYDCXeEdiPzodHuKOROi/J8cwcM6RpiWLWviFkJ2FkxZBv7w==",
"os": ["linux"],
"cpu": ["arm64"]
},
"nodejs-polars-linux-arm64-musl@0.18.0": {
"integrity": "sha512-lylaOGB3c94UBpsDt4XtrS2RJymgICfAnMVlbvN+2bftejh7blDaYTJeLvZr4POHfltpWeSXjl28Zck7goDJCA==",
"os": ["linux"],
"cpu": ["arm64"]
},
"nodejs-polars-linux-x64-gnu@0.18.0": {
"integrity": "sha512-Gk6HJba0Hrea6yjDEj0u4jArWgry+s8/17g646vJdlcAWoaQYXDdfCseObGjtTqajVkFf2msrn76KWZ2Nadq5A==",
"os": ["linux"],
"cpu": ["x64"]
},
"nodejs-polars-linux-x64-musl@0.18.0": {
"integrity": "sha512-KAb72TGTphCUfTZj1mMyDAJ+/3pgifAucWjdCr6aO3Jw4XHJVu6mMRhfDUZgIGWilpwADwPLHnqPjs+qydOoCg==",
"os": ["linux"],
"cpu": ["x64"]
},
"nodejs-polars-win32-x64-msvc@0.18.0": {
"integrity": "sha512-jQJST6yDmY/q4kBCCErSaxNrJClL7Dpk7IsdoPrFHXaFzL25nmDxfgow7VWDaEiE45jNL7TXANAgDs7dT61H2Q==",
"os": ["win32"],
"cpu": ["x64"]
},
"nodejs-polars@0.18.0": {
"integrity": "sha512-TN0InAOCzXS2Nrpr+8Sh9oAvILBjIoKMscz9P5XDJ+Q2F6EMb39Um9gwRzJ2kmEqYsufw6NwsafgbY41xKwVWg==",
"optionalDependencies": [
"nodejs-polars-android-arm64",
"nodejs-polars-darwin-arm64",
"nodejs-polars-darwin-x64",
"nodejs-polars-linux-arm64-gnu",
"nodejs-polars-linux-arm64-musl",
"nodejs-polars-linux-x64-gnu",
"nodejs-polars-linux-x64-musl",
"nodejs-polars-win32-x64-msvc"
]
},
"nth-check@2.1.1": {
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
"dependencies": [
"boolbase"
]
},
"react-dom@19.0.0_react@19.0.0": {
"integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
"dependencies": [
"react",
"scheduler"
]
},
"react@19.0.0": {
"integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="
},
"robust-predicates@3.0.2": {
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"rw@1.3.3": {
"integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
},
"safer-buffer@2.1.2": {
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"scheduler@0.25.0": {
"integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="
},
"supports-color@7.2.0": {
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dependencies": [
"has-flag"
]
},
"table-layout@4.1.1": {
"integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==",
"dependencies": [
"array-back@6.2.2",
"wordwrapjs"
]
},
"tslib@2.8.1": {
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
},
"typical@4.0.0": {
"integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="
},
"typical@7.3.0": {
"integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw=="
},
"uhyphen@0.2.0": {
"integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA=="
},
"undici-types@6.19.8": {
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
},
"wordwrapjs@5.1.0": {
"integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg=="
}
},
"workspace": {
"members": {
"jupyter-helper": {
"dependencies": [
"jsr:@anywidget/deno@~0.2.3",
"jsr:@manzt/quak@^0.0.2",
"jsr:@std/encoding@^1.0.7",
"npm:@types/react-dom@^19.0.3",
"npm:@types/react@^19.0.8",
"npm:@uwdata/flechette@^1.1.2",
"npm:@uwdata/mosaic-core@0.11",
"npm:ag-grid-community@^33.1.0",
"npm:linkedom@~0.18.9",
"npm:nodejs-polars@0.18",
"npm:react-dom@19",
"npm:react@19"
]
}
}
}
}
+23
View File
@@ -0,0 +1,23 @@
{
"name": "@manzt/jupyter-helper",
"version": "0.0.4",
"license": "MIT",
"exports": "./mod.ts",
"compilerOptions": {
"lib": ["deno.ns", "deno.unstable", "dom", "dom.iterable", "esnext"]
},
"imports": {
"@anywidget/deno": "jsr:@anywidget/deno@~0.2.3",
"@manzt/quak": "jsr:@manzt/quak@^0.0.2",
"@std/encoding": "jsr:@std/encoding@^1.0.7",
"@types/react": "npm:@types/react@^19.0.8",
"@types/react-dom": "npm:@types/react-dom@^19.0.3",
"@uwdata/flechette": "npm:@uwdata/flechette@^1.1.2",
"@uwdata/mosaic-core": "npm:@uwdata/mosaic-core@~0.11.0",
"ag-grid-community": "npm:ag-grid-community@^33.1.0",
"linkedom": "npm:linkedom@^0.18.9",
"nodejs-polars": "npm:nodejs-polars@^0.18.0",
"react": "npm:react@^19.0.0",
"react-dom": "npm:react-dom@^19.0.0"
}
}
+143
View File
@@ -0,0 +1,143 @@
// @ts-types="@types/react-dom/server";
import * as ReactDOM from "react-dom/server";
import * as anywidget from "@anywidget/deno";
import * as base64 from "@std/encoding/base64";
import * as linkedom from "linkedom";
import type * as pl from "nodejs-polars";
import type * as React from "react";
/**
* A parsed HTML document for rendering Observable Plot's with Deno.
*/
export const document: globalThis.Document =
linkedom.parseHTML("<html></html>").document;
/**
* Renders a React node as an HTML string for display in Jupyter.
*
* Note: This only supports server-side rendering (SSR). Hooks and stateful
* components cannot be used.
*
* @example Usage
* ```tsx
* import * as React from "npm:react";
* import { render, document } from "jsr:@manzt/jupyter";
*
* render(<h1>Hello, Jupyter!</h1>);
* ```
*
* @param reactNode - The React node to render.
* @returns A Jupyter-compatible display object.
*/
export function render(reactNode: React.ReactNode): Deno.jupyter.Displayable {
return {
[Deno.jupyter.$display]() {
return {
"text/html": ReactDOM.renderToString(reactNode),
};
},
};
}
// Widgets
// Types for frontend libs included below
declare const $base64: typeof import("@std/encoding/base64");
declare const $agGrid: typeof import("ag-grid-community");
declare const $flech: typeof import("@uwdata/flechette");
declare const $mosaic: typeof import("@uwdata/mosaic-core");
declare const $quak: typeof import("@manzt/quak");
/**
* Display a Polars DataFrame as an interactive agGrid.
*
* @example Usage
* ```ts
* import * as pl from "npm:nodejs-polars";
* import { agGrid } from "jsr:@manzt/jupyter-helper";
*
* let response = await fetch("https://raw.githubusercontent.com/uwdata/mosaic/refs/heads/main/data/penguins.csv");
* let df = pl.readCSV(await response.text());
* agGrid(df);
* ```
*
* @param df The DataFrame to display
* @returns A "live" anywidget instance
*/
export function agGrid(
df: pl.DataFrame,
): anywidget.Model<unknown> {
return anywidget.widget({
state: {
ipc: base64.encodeBase64(df.writeIPC()),
_css: "https://esm.sh/ag-grid-community@33.0.4/styles/ag-grid.css",
},
imports: `
import * as $agGrid from "https://esm.sh/ag-grid-community@33.0.4";
import * as $flech from "https://esm.sh/@uwdata/flechette@1.1.2";
import * as $base64 from "https://esm.sh/jsr/@std/encoding@1.0.7/base64";
`,
render: ({ model, el }) => {
$agGrid.ModuleRegistry.registerModules([$agGrid.AllCommunityModule]);
el.style.height = "400px";
let bytes = $base64.decodeBase64(model.get("ipc"));
let table = $flech.tableFromIPC(bytes);
$agGrid.createGrid(el, {
columnDefs: table.names.map((field) => ({ field })),
rowData: table.toArray(),
pagination: true,
});
},
});
}
/**
* Display a Polars DataFrame as an interactive quak data table.
*
* @example Usage
* ```ts
* import * as pl from "npm:nodejs-polars";
* import { quak } from "jsr:@manzt/jupyter-helper";
*
* let response = await fetch("https://raw.githubusercontent.com/uwdata/mosaic/refs/heads/main/data/penguins.csv");
* let df = pl.readCSV(await response.text());
* quak(df)
* ```
*
* @param df The DataFrame to display
* @returns A "live" anywidget instance
*/
export function quak(
df: pl.DataFrame,
): anywidget.Model<unknown> {
return anywidget.widget({
state: { parquet: base64.encodeBase64(df.writeParquet()) },
imports: `
import * as $mosaic from "https://esm.sh/@uwdata/mosaic-core@~0.11?bundle";
import * as $quak from "https://esm.sh/jsr/@manzt/quak@0.0.2";
import * as $base64 from "https://esm.sh/jsr/@std/encoding@1.0.7/base64";
`,
render: async ({ model, el }) => {
let connector = $mosaic.wasmConnector();
let db = await connector.getDuckDB();
let coordinator = new $mosaic.Coordinator();
coordinator.databaseConnector(connector);
let bytes = $base64.decodeBase64(model.get("parquet"));
await db.registerFileBuffer("df.parquet", bytes);
await coordinator.exec([
`CREATE OR REPLACE TABLE "df" AS SELECT * FROM "df.parquet"`,
]);
let dt = await $quak.datatable("df", { coordinator, height: 400 });
el.appendChild(dt.node());
let div = document.createElement("div");
div.style.height = "435px";
div.appendChild(dt.node());
el.appendChild(div);
},
});
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long