diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7046477..18c5cd9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,10 @@
## v0.20.0
+- Feat: add support for showing a scatter plot in full-screen mode. In full-screen mode you can easily customize and up-scale the resolution for better exporting in PNG.
- Feat: add ability to change the point size zoom scale function via `scatter.size(scale_function='asinh')`
- Feat: add `scatter.camera(is_fixed=True)` to allow fixing the camera (i.e., disable pan/zoom) [#176](https://github.com/flekschas/jupyter-scatter/issues/176)
- Feat: add CLI for quick-starting a demo via `uvx jupyter-scatter demo`
+- Fix: properly alpha blend when saving a view as PNG
- Chore: switch from ESLint+Prettier to Biome [#170](https://github.com/flekschas/jupyter-scatter/pull/170)
- Chore: migrate from hatch to uv [#169](https://github.com/flekschas/jupyter-scatter/pull/169)
- Chore: bump minimum Python version to 3.9
diff --git a/docs/api.md b/docs/api.md
index 528bd22..080f164 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -42,6 +42,32 @@ scatter.show()
## Methods {#methods}
+### scatter.show(_buttons=Undefined_) {#scatter.show}
+
+Show the scatter plot widget.
+
+**Arguments:**
+- `buttons`: The buttons to show in the widget. Can be one of the following:
+ - `"pan_zoom"`: Button to activate the pan and zoom mode.
+ - `"lasso"`: Button to activate the lasso mode.
+ - `"full_screen"`: Button to enter full screen mode.
+ - `"save"`: Button to save the current view in `scatter.widget.view_data`.
+ - `"download"`: Button to download the current view as a PNG image.
+ - `"reset"`: Button to reset the view.
+ - `"divider"`: Not a button, but a divider between buttons.
+
+**Returns:** either the x coordinate when x is `Undefined` or `self`.
+
+**Examples:**
+
+```python
+# Show the widget with all buttons
+scatter.show()
+
+# Show the widget with only a subset of buttons
+scatter.show(['full_screen', 'download', 'reset'])
+```
+
### scatter.x(_x=Undefined_, _scale=Undefined_, _\*\*kwargs_) {#scatter.x}
Get or set the x coordinate.
diff --git a/docs/export-image.md b/docs/export-image.md
index 06abdfb..50c8743 100644
--- a/docs/export-image.md
+++ b/docs/export-image.md
@@ -7,7 +7,8 @@ it as a PNG or save it to the widget's `view_data` property.
Image exports follow [WYSIWYG](https://en.wikipedia.org/wiki/WYSIWYG), meaning
that the exported image will have the exact same size and viewport as the
widget. Hence, if you want to export a higher resolution image you have to
-increase the scatter's width and height.
+increase the scatter's width and height. See [custom PNG export](#customize-png-export)
+on how to easily adjust the export resolution.
:::
## Export as PNG
@@ -40,6 +41,22 @@ a transparent background by holding down Alt while clicking on the
camera button.
:::
+### Customize PNG Export
+
+To better control the resolution of the exported PNG, enter the full-screen mode
+(via the widget button on the left) and open up the resize panel (via the up
+arrow button in the bottom-left corner). This panel allows you to easily
+customize the width/height of the scatter plot and offers the ability to
+up-scale the exported image.
+
+
+
+::: info
+Note, the exported image is subject to your [device pixel ratio](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio), which cannot be changed. This means that if your plot is
+100 by 100 pixels in size and your display has a pixel ratio of `2`, the
+exported PNG is going to be 200 by 200 pixels.
+:::
+
## Export to `widget.view_data`
When you click on the camera icon, the current view will be exported and saved
@@ -101,6 +118,16 @@ plt.show()
background-image: url(/images/export-download-png-dark.png)
}
+ .img.export-download-png-advanced {
+ width: 3024px;
+ background-image: url(/images/full-screen-light.png)
+ }
+ .img.export-download-png-advanced div { padding-top: 62.5% }
+
+ :root.dark .img.export-download-png-advanced {
+ background-image: url(/images/full-screen-dark.png)
+ }
+
.img.export-save {
width: 1108px;
background-image: url(/images/export-save-light.png)
diff --git a/docs/package-lock.json b/docs/package-lock.json
index cd7a4d3..3969189 100644
--- a/docs/package-lock.json
+++ b/docs/package-lock.json
@@ -5,38 +5,41 @@
"packages": {
"": {
"devDependencies": {
- "vitepress": "^1.0.2"
+ "vitepress": "^1.5.0"
}
},
"node_modules/@algolia/autocomplete-core": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz",
- "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==",
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz",
+ "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/autocomplete-plugin-algolia-insights": "1.9.3",
- "@algolia/autocomplete-shared": "1.9.3"
+ "@algolia/autocomplete-plugin-algolia-insights": "1.17.7",
+ "@algolia/autocomplete-shared": "1.17.7"
}
},
"node_modules/@algolia/autocomplete-plugin-algolia-insights": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz",
- "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==",
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz",
+ "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/autocomplete-shared": "1.9.3"
+ "@algolia/autocomplete-shared": "1.17.7"
},
"peerDependencies": {
"search-insights": ">= 1 < 3"
}
},
"node_modules/@algolia/autocomplete-preset-algolia": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz",
- "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==",
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz",
+ "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/autocomplete-shared": "1.9.3"
+ "@algolia/autocomplete-shared": "1.17.7"
},
"peerDependencies": {
"@algolia/client-search": ">= 4.9.1 < 6",
@@ -44,168 +47,238 @@
}
},
"node_modules/@algolia/autocomplete-shared": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz",
- "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==",
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz",
+ "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"@algolia/client-search": ">= 4.9.1 < 6",
"algoliasearch": ">= 4.9.1 < 6"
}
},
- "node_modules/@algolia/cache-browser-local-storage": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz",
- "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==",
+ "node_modules/@algolia/client-abtesting": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.18.0.tgz",
+ "integrity": "sha512-DLIrAukjsSrdMNNDx1ZTks72o4RH/1kOn8Wx5zZm8nnqFexG+JzY4SANnCNEjnFQPJTTvC+KpgiNW/CP2lumng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/cache-common": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/cache-common": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz",
- "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==",
- "dev": true
- },
- "node_modules/@algolia/cache-in-memory": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz",
- "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==",
+ "node_modules/@algolia/client-analytics": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.18.0.tgz",
+ "integrity": "sha512-0VpGG2uQW+h2aejxbG8VbnMCQ9ary9/ot7OASXi6OjE0SRkYQ/+pkW+q09+IScif3pmsVVYggmlMPtAsmYWHng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/cache-common": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-account": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz",
- "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==",
+ "node_modules/@algolia/client-common": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.18.0.tgz",
+ "integrity": "sha512-X1WMSC+1ve2qlMsemyTF5bIjwipOT+m99Ng1Tyl36ZjQKTa54oajBKE0BrmM8LD8jGdtukAgkUhFoYOaRbMcmQ==",
"dev": true,
- "dependencies": {
- "@algolia/client-common": "4.23.2",
- "@algolia/client-search": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-analytics": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz",
- "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==",
+ "node_modules/@algolia/client-insights": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.18.0.tgz",
+ "integrity": "sha512-FAJRNANUOSs/FgYOJ/Njqp+YTe4TMz2GkeZtfsw1TMiA5mVNRS/nnMpxas9771aJz7KTEWvK9GwqPs0K6RMYWg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/client-common": "4.23.2",
- "@algolia/client-search": "4.23.2",
- "@algolia/requester-common": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-common": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz",
- "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==",
+ "node_modules/@algolia/client-personalization": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.18.0.tgz",
+ "integrity": "sha512-I2dc94Oiwic3SEbrRp8kvTZtYpJjGtg5y5XnqubgnA15AgX59YIY8frKsFG8SOH1n2rIhUClcuDkxYQNXJLg+w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/requester-common": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-personalization": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz",
- "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==",
+ "node_modules/@algolia/client-query-suggestions": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.18.0.tgz",
+ "integrity": "sha512-x6XKIQgKFTgK/bMasXhghoEjHhmgoP61pFPb9+TaUJ32aKOGc65b12usiGJ9A84yS73UDkXS452NjyP50Knh/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/client-common": "4.23.2",
- "@algolia/requester-common": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
"node_modules/@algolia/client-search": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz",
- "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==",
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.18.0.tgz",
+ "integrity": "sha512-qI3LcFsVgtvpsBGR7aNSJYxhsR+Zl46+958ODzg8aCxIcdxiK7QEVLMJMZAR57jGqW0Lg/vrjtuLFDMfSE53qA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/client-common": "4.23.2",
- "@algolia/requester-common": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/logger-common": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz",
- "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==",
- "dev": true
+ "node_modules/@algolia/ingestion": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.18.0.tgz",
+ "integrity": "sha512-bGvJg7HnGGm+XWYMDruZXWgMDPVt4yCbBqq8DM6EoaMBK71SYC4WMfIdJaw+ABqttjBhe6aKNRkWf/bbvYOGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
},
- "node_modules/@algolia/logger-console": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz",
- "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==",
+ "node_modules/@algolia/monitoring": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.18.0.tgz",
+ "integrity": "sha512-lBssglINIeGIR+8KyzH05NAgAmn1BCrm5D2T6pMtr/8kbTHvvrm1Zvcltc5dKUQEFyyx3J5+MhNc7kfi8LdjVw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/logger-common": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
"node_modules/@algolia/recommend": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz",
- "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==",
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.18.0.tgz",
+ "integrity": "sha512-uSnkm0cdAuFwdMp4pGT5vHVQ84T6AYpTZ3I0b3k/M3wg4zXDhl3aCiY8NzokEyRLezz/kHLEEcgb/tTTobOYVw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/cache-browser-local-storage": "4.23.2",
- "@algolia/cache-common": "4.23.2",
- "@algolia/cache-in-memory": "4.23.2",
- "@algolia/client-common": "4.23.2",
- "@algolia/client-search": "4.23.2",
- "@algolia/logger-common": "4.23.2",
- "@algolia/logger-console": "4.23.2",
- "@algolia/requester-browser-xhr": "4.23.2",
- "@algolia/requester-common": "4.23.2",
- "@algolia/requester-node-http": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "@algolia/client-common": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
"node_modules/@algolia/requester-browser-xhr": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz",
- "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==",
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.18.0.tgz",
+ "integrity": "sha512-1XFjW0C3pV0dS/9zXbV44cKI+QM4ZIz9cpatXpsjRlq6SUCpLID3DZHsXyE6sTb8IhyPaUjk78GEJT8/3hviqg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/requester-common": "4.23.2"
+ "@algolia/client-common": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/requester-common": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz",
- "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==",
- "dev": true
+ "node_modules/@algolia/requester-fetch": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.18.0.tgz",
+ "integrity": "sha512-0uodeNdAHz1YbzJh6C5xeQ4T6x5WGiUxUq3GOaT/R4njh5t78dq+Rb187elr7KtnjUmETVVuCvmEYaThfTHzNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
},
"node_modules/@algolia/requester-node-http": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz",
- "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==",
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.18.0.tgz",
+ "integrity": "sha512-tZCqDrqJ2YE2I5ukCQrYN8oiF6u3JIdCxrtKq+eniuLkjkO78TKRnXrVcKZTmfFJyyDK8q47SfDcHzAA3nHi6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/requester-common": "4.23.2"
+ "@algolia/client-common": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/@algolia/transporter": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz",
- "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==",
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"dev": true,
- "dependencies": {
- "@algolia/cache-common": "4.23.2",
- "@algolia/logger-common": "4.23.2",
- "@algolia/requester-common": "4.23.2"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.24.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz",
- "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.3"
+ },
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -213,32 +286,49 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/types": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@docsearch/css": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz",
- "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==",
- "dev": true
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz",
+ "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@docsearch/js": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz",
- "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==",
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz",
+ "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@docsearch/react": "3.6.0",
+ "@docsearch/react": "3.8.2",
"preact": "^10.0.0"
}
},
"node_modules/@docsearch/react": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz",
- "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==",
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz",
+ "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@algolia/autocomplete-core": "1.9.3",
- "@algolia/autocomplete-preset-algolia": "1.9.3",
- "@docsearch/css": "3.6.0",
- "algoliasearch": "^4.19.1"
+ "@algolia/autocomplete-core": "1.17.7",
+ "@algolia/autocomplete-preset-algolia": "1.17.7",
+ "@docsearch/css": "3.8.2",
+ "algoliasearch": "^5.14.2"
},
"peerDependencies": {
"@types/react": ">= 16.8.0 < 19.0.0",
@@ -269,6 +359,7 @@
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"aix"
@@ -285,6 +376,7 @@
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
@@ -301,6 +393,7 @@
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
@@ -317,6 +410,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
@@ -333,6 +427,7 @@
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -349,6 +444,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -365,6 +461,7 @@
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"freebsd"
@@ -381,6 +478,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"freebsd"
@@ -397,6 +495,7 @@
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -413,6 +512,7 @@
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -429,6 +529,7 @@
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -445,6 +546,7 @@
"loong64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -461,6 +563,7 @@
"mips64el"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -477,6 +580,7 @@
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -493,6 +597,7 @@
"riscv64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -509,6 +614,7 @@
"s390x"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -525,6 +631,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
@@ -541,6 +648,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"netbsd"
@@ -557,6 +665,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"openbsd"
@@ -573,6 +682,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"sunos"
@@ -589,6 +699,7 @@
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
@@ -605,6 +716,7 @@
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
@@ -621,6 +733,7 @@
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
@@ -629,436 +742,617 @@
"node": ">=12"
}
},
+ "node_modules/@iconify-json/simple-icons": {
+ "version": "1.2.17",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.17.tgz",
+ "integrity": "sha512-1vXbM6a6HV2rwXxu8ptD2OYhqrqX0ZZRepOg7nIjkvKlKq90Iici4X++A8h36bEVlV2wGjqx8uVYB0pwnPZVSw==",
+ "dev": true,
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz",
- "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz",
+ "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz",
- "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz",
+ "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz",
- "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz",
+ "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz",
- "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz",
+ "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz",
+ "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz",
+ "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz",
- "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz",
+ "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz",
- "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz",
+ "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz",
- "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz",
+ "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz",
- "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz",
+ "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz",
+ "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz",
- "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz",
+ "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz",
- "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz",
+ "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==",
"cpu": [
"riscv64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz",
- "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz",
+ "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==",
"cpu": [
"s390x"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz",
- "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz",
+ "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz",
- "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz",
+ "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz",
- "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz",
+ "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz",
- "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz",
+ "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz",
- "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz",
+ "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@shikijs/core": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.4.tgz",
- "integrity": "sha512-ClaUWpt8oTzjcF0MM1P81AeWyzc1sNSJlAjMG80CbwqbFqXSNz+NpQVUC0icobt3sZn43Sn27M4pHD/Jmp3zHw==",
- "dev": true
+ "version": "1.24.4",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.4.tgz",
+ "integrity": "sha512-jjLsld+xEEGYlxAXDyGwWsKJ1sw5Pc1pnp4ai2ORpjx2UX08YYTC0NNqQYO1PaghYaR+PvgMOGuvzw2he9sk0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/engine-javascript": "1.24.4",
+ "@shikijs/engine-oniguruma": "1.24.4",
+ "@shikijs/types": "1.24.4",
+ "@shikijs/vscode-textmate": "^9.3.1",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.4"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "1.24.4",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.4.tgz",
+ "integrity": "sha512-TClaQOLvo9WEMJv6GoUsykQ6QdynuKszuORFWCke8qvi6PeLm7FcD9+7y45UenysxEWYpDL5KJaVXTngTE+2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "1.24.4",
+ "@shikijs/vscode-textmate": "^9.3.1",
+ "oniguruma-to-es": "0.8.1"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "1.24.4",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.4.tgz",
+ "integrity": "sha512-Do2ry6flp2HWdvpj2XOwwa0ljZBRy15HKZITzPcNIBOGSeprnA8gOooA/bLsSPuy8aJBa+Q/r34dMmC3KNL/zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "1.24.4",
+ "@shikijs/vscode-textmate": "^9.3.1"
+ }
},
"node_modules/@shikijs/transformers": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.4.tgz",
- "integrity": "sha512-ysGkpsHxRxLmz8nGKeFdV+gKj1NXt+88sM/34kfKVWTWIXg5gsFOJxJBbG7k+fUR5JlD6sNh65W9qPXrbVE1wQ==",
+ "version": "1.24.4",
+ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.24.4.tgz",
+ "integrity": "sha512-0jq5p9WLB7ToM/O7RWfxuIwirTJbIQsUR06jxdG3h3CEuO5m7ik8GnDsxwHhyIEfgJSZczSnVUZWFrNKy5It6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shiki": "1.24.4"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "1.24.4",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.4.tgz",
+ "integrity": "sha512-0r0XU7Eaow0PuDxuWC1bVqmWCgm3XqizIaT7SM42K03vc69LGooT0U8ccSR44xP/hGlNx4FKhtYpV+BU6aaKAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "shiki": "1.2.4"
+ "@shikijs/vscode-textmate": "^9.3.1",
+ "@types/hast": "^3.0.4"
}
},
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz",
+ "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
},
"node_modules/@types/linkify-it": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz",
- "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==",
- "dev": true
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/markdown-it": {
- "version": "13.0.7",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz",
- "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==",
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/linkify-it": "*",
- "@types/mdurl": "*"
+ "@types/unist": "*"
}
},
"node_modules/@types/mdurl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz",
- "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.20",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
"integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
+ "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/@vitejs/plugin-vue": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
- "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+ "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.0.0 || >=20.0.0"
},
"peerDependencies": {
- "vite": "^5.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
"vue": "^3.2.25"
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
- "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+ "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/parser": "^7.23.9",
- "@vue/shared": "3.4.21",
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.13",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
- "source-map-js": "^1.0.2"
+ "source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
- "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+ "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.4.21",
- "@vue/shared": "3.4.21"
+ "@vue/compiler-core": "3.5.13",
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
- "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+ "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/parser": "^7.23.9",
- "@vue/compiler-core": "3.4.21",
- "@vue/compiler-dom": "3.4.21",
- "@vue/compiler-ssr": "3.4.21",
- "@vue/shared": "3.4.21",
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.13",
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13",
"estree-walker": "^2.0.2",
- "magic-string": "^0.30.7",
- "postcss": "^8.4.35",
- "source-map-js": "^1.0.2"
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.48",
+ "source-map-js": "^1.2.0"
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
- "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+ "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.4.21",
- "@vue/shared": "3.4.21"
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/devtools-api": {
- "version": "7.0.25",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.25.tgz",
- "integrity": "sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==",
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.6.8.tgz",
+ "integrity": "sha512-ma6dY/sZR36zALVsV1W7eC57c6IJPXsy8SNgZn1PLVWU4z4dPn5TIBmnF4stmdJ4sQcixqKaQ8pwjbMPzEZwiA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/devtools-kit": "^7.0.25"
+ "@vue/devtools-kit": "^7.6.8"
}
},
"node_modules/@vue/devtools-kit": {
- "version": "7.0.25",
- "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.25.tgz",
- "integrity": "sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==",
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz",
+ "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/devtools-shared": "^7.0.25",
+ "@vue/devtools-shared": "^7.6.8",
+ "birpc": "^0.2.19",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
- "speakingurl": "^14.0.1"
- },
- "peerDependencies": {
- "vue": "^3.0.0"
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.1"
}
},
"node_modules/@vue/devtools-shared": {
- "version": "7.0.25",
- "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.25.tgz",
- "integrity": "sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==",
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.6.8.tgz",
+ "integrity": "sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "rfdc": "^1.3.1"
+ "rfdc": "^1.4.1"
}
},
"node_modules/@vue/reactivity": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz",
- "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz",
+ "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/shared": "3.4.21"
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
- "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+ "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.4.21",
- "@vue/shared": "3.4.21"
+ "@vue/reactivity": "3.5.13",
+ "@vue/shared": "3.5.13"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
- "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+ "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/runtime-core": "3.4.21",
- "@vue/shared": "3.4.21",
+ "@vue/reactivity": "3.5.13",
+ "@vue/runtime-core": "3.5.13",
+ "@vue/shared": "3.5.13",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
- "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+ "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.4.21",
- "@vue/shared": "3.4.21"
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13"
},
"peerDependencies": {
- "vue": "3.4.21"
+ "vue": "3.5.13"
}
},
"node_modules/@vue/shared": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz",
- "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
- "dev": true
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@vueuse/core": {
- "version": "10.9.0",
- "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz",
- "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==",
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz",
+ "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.20",
- "@vueuse/metadata": "10.9.0",
- "@vueuse/shared": "10.9.0",
- "vue-demi": ">=0.14.7"
+ "@vueuse/metadata": "11.3.0",
+ "@vueuse/shared": "11.3.0",
+ "vue-demi": ">=0.14.10"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/core/node_modules/vue-demi": {
- "version": "0.14.7",
- "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
- "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
@@ -1080,31 +1374,32 @@
}
},
"node_modules/@vueuse/integrations": {
- "version": "10.9.0",
- "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz",
- "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==",
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-11.3.0.tgz",
+ "integrity": "sha512-5fzRl0apQWrDezmobchoiGTkGw238VWESxZHazfhP3RM7pDSiyXy18QbfYkILoYNTd23HPAfQTJpkUc5QbkwTw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vueuse/core": "10.9.0",
- "@vueuse/shared": "10.9.0",
- "vue-demi": ">=0.14.7"
+ "@vueuse/core": "11.3.0",
+ "@vueuse/shared": "11.3.0",
+ "vue-demi": ">=0.14.10"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
- "async-validator": "*",
- "axios": "*",
- "change-case": "*",
- "drauu": "*",
- "focus-trap": "*",
- "fuse.js": "*",
- "idb-keyval": "*",
- "jwt-decode": "*",
- "nprogress": "*",
- "qrcode": "*",
- "sortablejs": "*",
- "universal-cookie": "*"
+ "async-validator": "^4",
+ "axios": "^1",
+ "change-case": "^5",
+ "drauu": "^0.4",
+ "focus-trap": "^7",
+ "fuse.js": "^7",
+ "idb-keyval": "^6",
+ "jwt-decode": "^4",
+ "nprogress": "^0.2",
+ "qrcode": "^1.5",
+ "sortablejs": "^1",
+ "universal-cookie": "^7"
},
"peerDependenciesMeta": {
"async-validator": {
@@ -1146,11 +1441,12 @@
}
},
"node_modules/@vueuse/integrations/node_modules/vue-demi": {
- "version": "0.14.7",
- "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
- "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
@@ -1172,32 +1468,35 @@
}
},
"node_modules/@vueuse/metadata": {
- "version": "10.9.0",
- "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz",
- "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==",
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz",
+ "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
- "version": "10.9.0",
- "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz",
- "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==",
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz",
+ "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "vue-demi": ">=0.14.7"
+ "vue-demi": ">=0.14.10"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared/node_modules/vue-demi": {
- "version": "0.14.7",
- "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
- "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
@@ -1219,39 +1518,144 @@
}
},
"node_modules/algoliasearch": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz",
- "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==",
- "dev": true,
- "dependencies": {
- "@algolia/cache-browser-local-storage": "4.23.2",
- "@algolia/cache-common": "4.23.2",
- "@algolia/cache-in-memory": "4.23.2",
- "@algolia/client-account": "4.23.2",
- "@algolia/client-analytics": "4.23.2",
- "@algolia/client-common": "4.23.2",
- "@algolia/client-personalization": "4.23.2",
- "@algolia/client-search": "4.23.2",
- "@algolia/logger-common": "4.23.2",
- "@algolia/logger-console": "4.23.2",
- "@algolia/recommend": "4.23.2",
- "@algolia/requester-browser-xhr": "4.23.2",
- "@algolia/requester-common": "4.23.2",
- "@algolia/requester-node-http": "4.23.2",
- "@algolia/transporter": "4.23.2"
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.18.0.tgz",
+ "integrity": "sha512-/tfpK2A4FpS0o+S78o3YSdlqXr0MavJIDlFK3XZrlXLy7vaRXJvW5jYg3v5e/wCaF8y0IpMjkYLhoV6QqfpOgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-abtesting": "5.18.0",
+ "@algolia/client-analytics": "5.18.0",
+ "@algolia/client-common": "5.18.0",
+ "@algolia/client-insights": "5.18.0",
+ "@algolia/client-personalization": "5.18.0",
+ "@algolia/client-query-suggestions": "5.18.0",
+ "@algolia/client-search": "5.18.0",
+ "@algolia/ingestion": "1.18.0",
+ "@algolia/monitoring": "1.18.0",
+ "@algolia/recommend": "5.18.0",
+ "@algolia/requester-browser-xhr": "5.18.0",
+ "@algolia/requester-fetch": "5.18.0",
+ "@algolia/requester-node-http": "5.18.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "0.2.19",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
+ "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/emoji-regex-xs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
+ "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
@@ -1265,6 +1669,7 @@
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
@@ -1301,13 +1706,15 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/focus-trap": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz",
- "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.2.tgz",
+ "integrity": "sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"tabbable": "^6.2.0"
}
@@ -1318,6 +1725,7 @@
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -1326,22 +1734,83 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz",
+ "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
},
"node_modules/magic-string": {
- "version": "0.30.8",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
- "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/mark.js": {
@@ -1350,22 +1819,140 @@
"integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
"dev": true
},
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
+ "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/minisearch": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz",
- "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==",
- "dev": true
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.1.tgz",
+ "integrity": "sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true,
"funding": [
{
@@ -1373,6 +1960,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -1380,22 +1968,36 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/oniguruma-to-es": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.8.1.tgz",
+ "integrity": "sha512-dekySTEvCxCj0IgKcA2uUCO/e4ArsqpucDPcX26w9ajx+DvMWLc5eZeJaRQkd7oC/+rwif5gnT900tA34uN9Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex-xs": "^1.0.0",
+ "regex": "^5.0.2",
+ "regex-recursion": "^5.0.0"
+ }
+ },
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/picocolors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
- "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
- "dev": true
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/postcss": {
- "version": "8.4.47",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
- "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "version": "8.4.49",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
"dev": true,
"funding": [
{
@@ -1411,9 +2013,10 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
"nanoid": "^3.3.7",
- "picocolors": "^1.1.0",
+ "picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
@@ -1421,28 +2024,70 @@
}
},
"node_modules/preact": {
- "version": "10.20.1",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz",
- "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==",
+ "version": "10.25.4",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz",
+ "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==",
"dev": true,
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
}
},
+ "node_modules/property-information": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
+ "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/regex": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz",
+ "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz",
+ "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex": "^5.1.1",
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/rfdc": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
- "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
- "dev": true
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/rollup": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz",
- "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==",
+ "version": "4.29.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz",
+ "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/estree": "1.0.5"
+ "@types/estree": "1.0.6"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -1452,39 +2097,49 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.22.4",
- "@rollup/rollup-android-arm64": "4.22.4",
- "@rollup/rollup-darwin-arm64": "4.22.4",
- "@rollup/rollup-darwin-x64": "4.22.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
- "@rollup/rollup-linux-arm64-gnu": "4.22.4",
- "@rollup/rollup-linux-arm64-musl": "4.22.4",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
- "@rollup/rollup-linux-s390x-gnu": "4.22.4",
- "@rollup/rollup-linux-x64-gnu": "4.22.4",
- "@rollup/rollup-linux-x64-musl": "4.22.4",
- "@rollup/rollup-win32-arm64-msvc": "4.22.4",
- "@rollup/rollup-win32-ia32-msvc": "4.22.4",
- "@rollup/rollup-win32-x64-msvc": "4.22.4",
+ "@rollup/rollup-android-arm-eabi": "4.29.1",
+ "@rollup/rollup-android-arm64": "4.29.1",
+ "@rollup/rollup-darwin-arm64": "4.29.1",
+ "@rollup/rollup-darwin-x64": "4.29.1",
+ "@rollup/rollup-freebsd-arm64": "4.29.1",
+ "@rollup/rollup-freebsd-x64": "4.29.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.29.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.29.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.29.1",
+ "@rollup/rollup-linux-arm64-musl": "4.29.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.29.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.29.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.29.1",
+ "@rollup/rollup-linux-x64-gnu": "4.29.1",
+ "@rollup/rollup-linux-x64-musl": "4.29.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.29.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.29.1",
+ "@rollup/rollup-win32-x64-msvc": "4.29.1",
"fsevents": "~2.3.2"
}
},
"node_modules/search-insights": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz",
- "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==",
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
+ "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
"dev": true,
+ "license": "MIT",
"peer": true
},
"node_modules/shiki": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.4.tgz",
- "integrity": "sha512-Q9n9jKiOjJCRPztA9POn3/uZXNySHDNKAsPNpmtHDcFyi6ZQhx5vQKZW3Nhrwn8TWW3RudSRk66zqY603EZDeg==",
+ "version": "1.24.4",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.4.tgz",
+ "integrity": "sha512-aVGSFAOAr1v26Hh/+GBIsRVDWJ583XYV7CuNURKRWh9gpGv4OdbisZGq96B9arMYTZhTQkmRF5BrShOSTvNqhw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@shikijs/core": "1.2.4"
+ "@shikijs/core": "1.24.4",
+ "@shikijs/engine-javascript": "1.24.4",
+ "@shikijs/engine-oniguruma": "1.24.4",
+ "@shikijs/types": "1.24.4",
+ "@shikijs/vscode-textmate": "^9.3.1",
+ "@types/hast": "^3.0.4"
}
},
"node_modules/source-map-js": {
@@ -1492,30 +2147,187 @@
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
+ "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "copy-anything": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/tabbable": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
},
"node_modules/vite": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz",
- "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==",
+ "version": "5.4.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
+ "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -1571,26 +2383,30 @@
}
},
"node_modules/vitepress": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.2.tgz",
- "integrity": "sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==",
- "dev": true,
- "dependencies": {
- "@docsearch/css": "^3.6.0",
- "@docsearch/js": "^3.6.0",
- "@shikijs/core": "^1.2.0",
- "@shikijs/transformers": "^1.2.0",
- "@types/markdown-it": "^13.0.7",
- "@vitejs/plugin-vue": "^5.0.4",
- "@vue/devtools-api": "^7.0.16",
- "@vueuse/core": "^10.9.0",
- "@vueuse/integrations": "^10.9.0",
- "focus-trap": "^7.5.4",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.5.0.tgz",
+ "integrity": "sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@docsearch/css": "^3.6.2",
+ "@docsearch/js": "^3.6.2",
+ "@iconify-json/simple-icons": "^1.2.10",
+ "@shikijs/core": "^1.22.2",
+ "@shikijs/transformers": "^1.22.2",
+ "@shikijs/types": "^1.22.2",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^5.1.4",
+ "@vue/devtools-api": "^7.5.4",
+ "@vue/shared": "^3.5.12",
+ "@vueuse/core": "^11.1.0",
+ "@vueuse/integrations": "^11.1.0",
+ "focus-trap": "^7.6.0",
"mark.js": "8.11.1",
- "minisearch": "^6.3.0",
- "shiki": "^1.2.0",
- "vite": "^5.2.2",
- "vue": "^3.4.21"
+ "minisearch": "^7.1.0",
+ "shiki": "^1.22.2",
+ "vite": "^5.4.10",
+ "vue": "^3.5.12"
},
"bin": {
"vitepress": "bin/vitepress.js"
@@ -1609,16 +2425,17 @@
}
},
"node_modules/vue": {
- "version": "3.4.21",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz",
- "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz",
+ "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.4.21",
- "@vue/compiler-sfc": "3.4.21",
- "@vue/runtime-dom": "3.4.21",
- "@vue/server-renderer": "3.4.21",
- "@vue/shared": "3.4.21"
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-sfc": "3.5.13",
+ "@vue/runtime-dom": "3.5.13",
+ "@vue/server-renderer": "3.5.13",
+ "@vue/shared": "3.5.13"
},
"peerDependencies": {
"typescript": "*"
@@ -1628,6 +2445,17 @@
"optional": true
}
}
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
}
}
}
diff --git a/docs/package.json b/docs/package.json
index 6a422ff..4754e1e 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -1,7 +1,7 @@
{
"type": "module",
"devDependencies": {
- "vitepress": "^1.0.2"
+ "vitepress": "^1.5.0"
},
"scripts": {
"start": "vitepress dev",
diff --git a/docs/public/images/full-screen-dark.png b/docs/public/images/full-screen-dark.png
new file mode 100644
index 0000000..f7a2df0
--- /dev/null
+++ b/docs/public/images/full-screen-dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c596789f820769cb8c69241519e58fa1c61d375bb3c4238a7665d8b05d869cb5
+size 80234
diff --git a/docs/public/images/full-screen-light.png b/docs/public/images/full-screen-light.png
new file mode 100644
index 0000000..fc7abe0
--- /dev/null
+++ b/docs/public/images/full-screen-light.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9cd03024db4f344074c7b4c4584671dacf34e680f687bfce25322bd3f89d2674
+size 78944
diff --git a/js/package-lock.json b/js/package-lock.json
index 952d248..7e84458 100644
--- a/js/package-lock.json
+++ b/js/package-lock.json
@@ -21,7 +21,7 @@
"gl-matrix": "~3.3.0",
"pub-sub-es": "~3.0.0",
"regl": "~2.1.0",
- "regl-scatterplot": "~1.11.3"
+ "regl-scatterplot": "~1.12.0"
},
"devDependencies": {
"@biomejs/biome": "^1.9.4",
@@ -1146,9 +1146,9 @@
}
},
"node_modules/regl-scatterplot": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/regl-scatterplot/-/regl-scatterplot-1.11.3.tgz",
- "integrity": "sha512-mmNUOOmyN5XKLnDVH4UxgcuU8tHhsRhiWo2nQt8wbnStkstSoiRUP3pp+xf01mcElDzmAebEOo5O6nQI7zW9Uw==",
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/regl-scatterplot/-/regl-scatterplot-1.12.0.tgz",
+ "integrity": "sha512-fvPYfdgtm8Y7UFbpCc6TJQw2mhdHKBCl/OVNEiyuHm/QG6rb2Agukj5CPtTQo2I78uWPxtj1UaDlQm+jK1qjUA==",
"license": "MIT",
"dependencies": {
"@flekschas/utils": "^0.32.2",
diff --git a/js/package.json b/js/package.json
index 1f69318..572b461 100644
--- a/js/package.json
+++ b/js/package.json
@@ -29,7 +29,7 @@
"gl-matrix": "~3.3.0",
"pub-sub-es": "~3.0.0",
"regl": "~2.1.0",
- "regl-scatterplot": "~1.11.3"
+ "regl-scatterplot": "~1.12.0"
},
"devDependencies": {
"@biomejs/biome": "^1.9.4",
diff --git a/js/src/index.js b/js/src/index.js
index 1776e0d..02367e5 100644
--- a/js/src/index.js
+++ b/js/src/index.js
@@ -1,4 +1,10 @@
-import { debounce, getD3FormatSpecifier, max, min } from '@flekschas/utils';
+import {
+ debounce,
+ getD3FormatSpecifier,
+ max,
+ min,
+ nextAnimationFrame,
+} from '@flekschas/utils';
import { globalPubSub } from 'pub-sub-es';
import createScatterplot, { createRenderer } from 'regl-scatterplot';
@@ -244,13 +250,26 @@ class JupyterScatterView {
Math.random().toString(36).substring(2, 5);
this.model.set('dom_element_id', this.randomStr);
+ this.fullscreenContainer = document.createElement('div');
+ this.fullscreenContainer.setAttribute('id', this.randomStr);
+ this.fullscreenContainer.style.position = 'relative';
+ this.fullscreenContainer.style.display = 'flex';
+ this.fullscreenContainer.style.flexDirection = 'column';
+ this.fullscreenContainer.style.justifyContent = 'center';
+ this.fullscreenContainer.style.alignItems = 'center';
+ this.fullscreenContainer.style.width =
+ this.width === 'auto' ? '100%' : `${this.width}px`;
+ this.fullscreenContainer.style.height = `${this.model.get('height')}px`;
+ this.fullscreenContainer.style.background = 'var(--jp-layout-color0)';
+ this.el.appendChild(this.fullscreenContainer);
+
this.container = document.createElement('div');
this.container.setAttribute('id', this.randomStr);
this.container.style.position = 'relative';
this.container.style.width =
this.width === 'auto' ? '100%' : `${this.width}px`;
this.container.style.height = `${this.model.get('height')}px`;
- this.el.appendChild(this.container);
+ this.fullscreenContainer.appendChild(this.container);
this.canvasWrapper = document.createElement('div');
this.canvasWrapper.style.position = 'absolute';
@@ -262,6 +281,18 @@ class JupyterScatterView {
this.canvas.style.height = '100%';
this.canvasWrapper.appendChild(this.canvas);
+ this.grandParentElement = this.el.parentElement?.parentElement;
+ this.greatGrandParentElement = this.grandParentElement?.parentElement;
+ this.fullscreenButtonIcon =
+ this.grandParentElement?.children?.[0].querySelector(
+ '[title="Full Screen"]',
+ )?.children?.[0]?.children?.[0];
+ this.fullscreenChangeHandlerBound = this.fullscreenChangeHandler.bind(this);
+ this.greatGrandParentElement?.addEventListener(
+ 'fullscreenchange',
+ this.fullscreenChangeHandlerBound,
+ );
+
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Will refactor this later
window.requestAnimationFrame(() => {
const initialOptions = {
@@ -319,6 +350,25 @@ class JupyterScatterView {
this.externalViewChangeHandler.bind(this);
this.viewChangeHandlerBound = this.viewChangeHandler.bind(this);
this.resizeHandlerBound = this.resizeHandler.bind(this);
+ this.fullscreenFullWidthHeightChangeHandlerBound =
+ this.fullscreenFullWidthHeightChangeHandler.bind(this);
+ this.fullscreenWidthChangeHandlerBound =
+ this.fullscreenWidthChangeHandler.bind(this);
+ this.fullscreenHeightChangeHandlerBound =
+ this.fullscreenHeightChangeHandler.bind(this);
+ this.fullscreenExportScaleChangeHandlerBound =
+ this.fullscreenExportScaleChangeHandler.bind(this);
+ this.fullscreenDownloadBound = this.fullscreenDownload.bind(this);
+ this.fullscreenWidthChangeHandlerDebounced = debounce(
+ this.fullscreenWidthChangeHandlerBound,
+ 500,
+ );
+ this.fullscreenHeightChangeHandlerDebounced = debounce(
+ this.fullscreenHeightChangeHandlerBound,
+ 500,
+ );
+ this.fullscreenSizePanelToggleBound =
+ this.fullscreenSizePanelToggle.bind(this);
this.scatterplot.subscribe('pointover', this.pointoverHandlerBound);
this.scatterplot.subscribe('pointout', this.pointoutHandlerBound);
@@ -437,7 +487,9 @@ class JupyterScatterView {
}
if (event.type === this.eventTypes.VIEW_DOWNLOAD) {
- this.viewDownload(event.transparentBackgroundColor);
+ this.viewDownload({
+ transparentBackgroundColor: event.transparentBackgroundColor,
+ });
return;
}
@@ -465,6 +517,31 @@ class JupyterScatterView {
this.viewSave(event.transparentBackgroundColor);
return;
}
+
+ if (event.type === this.eventTypes.FULL_SCREEN) {
+ this.toggleFullscreen();
+ return;
+ }
+ }
+
+ getWidth() {
+ if (document.fullscreenElement) {
+ if (this.fullscreenFullWidthHeight) {
+ return 'auto';
+ }
+ return this.fullscreenWidth;
+ }
+ return this.model.get('width');
+ }
+
+ getHeight() {
+ if (document.fullscreenElement) {
+ if (this.fullscreenFullWidthHeight) {
+ return 'auto';
+ }
+ return this.fullscreenHeight;
+ }
+ return this.model.get('height');
}
getOuterDimensions() {
@@ -476,17 +553,18 @@ class JupyterScatterView {
yPadding = this.getYPadding();
}
- const outerWidth =
- this.model.get('width') === 'auto'
- ? this.container.getBoundingClientRect().width
- : this.model.get('width') + xPadding;
+ const bBox = this.container.getBoundingClientRect();
+
+ const width = this.getWidth();
+ const outerWidth = width === 'auto' ? bBox.width : width + xPadding;
- const outerHeight = this.model.get('height') + yPadding;
+ const height = this.getHeight();
+ const outerHeight = height === 'auto' ? bBox.height : height + yPadding;
- this.outerWidth = outerWidth;
- this.outerHeight = outerHeight;
+ this.outerWidth = Math.max(1, outerWidth);
+ this.outerHeight = Math.max(1, outerHeight);
- return [Math.max(1, outerWidth), Math.max(1, outerHeight)];
+ return [this.outerWidth, this.outerHeight];
}
createAxes() {
@@ -1842,8 +1920,8 @@ class JupyterScatterView {
}
updateContainerDimensions() {
- const width = this.model.get('width');
- const height = this.model.get('height');
+ const width = this.getWidth();
+ const height = this.getHeight();
let xPadding = 0;
let yPadding = 0;
@@ -1853,9 +1931,19 @@ class JupyterScatterView {
yPadding = this.getYPadding();
}
- this.container.style.width =
- width === 'auto' ? '100%' : `${width + xPadding}px`;
- this.container.style.height = `${height + yPadding}px`;
+ const widthCss = width === 'auto' ? '100%' : `${width + xPadding}px`;
+ const heightCss = height === 'auto' ? '100%' : `${height + yPadding}px`;
+
+ if (document.fullscreenElement) {
+ this.fullscreenContainer.style.width = '100%';
+ this.fullscreenContainer.style.height = '100%';
+ } else {
+ this.fullscreenContainer.style.width = widthCss;
+ this.fullscreenContainer.style.height = heightCss;
+ }
+
+ this.container.style.width = widthCss;
+ this.container.style.height = heightCss;
window.requestAnimationFrame(() => {
this.resizeHandlerBound();
@@ -1895,8 +1983,8 @@ class JupyterScatterView {
this.updateLegendWrapperPosition();
- this.withPropertyChangeHandler('width', this.model.get('width') || 'auto');
- this.withPropertyChangeHandler('height', this.model.get('height'));
+ this.withPropertyChangeHandler('width', this.getWidth);
+ this.withPropertyChangeHandler('height', this.getHeight);
// Render grid
if (this.model.get('axes_grid')) {
@@ -1935,6 +2023,11 @@ class JupyterScatterView {
this.scatterplot.unsubscribe('view', this.viewChangeHandlerBound);
this.showTooltipDebounced.cancel();
this.scatterplot.destroy();
+ this.greatGrandParentElement?.removeEventListener(
+ 'fullscreenchange',
+ this.fullscreenChangeHandlerBound,
+ );
+ this.fullscreenObserver?.disconnect();
}
// Helper
@@ -2613,14 +2706,27 @@ class JupyterScatterView {
this.zoomToHandler(this.model.get('zoom_to'));
}
- viewDownload(transparentBackgroundColor) {
- const image = this.scatterplot.export();
- const finalImage = transparentBackgroundColor
- ? image
- : addBackgroundColor(image, this.backgroundColor);
- imageDataToCanvas(finalImage).toBlob((blob) => {
- downloadBlob(blob, 'scatter.png');
- });
+ viewDownload(options) {
+ (async () => {
+ try {
+ const image = await this.scatterplot.export({
+ scale: options?.scale,
+ antiAliasing: 1,
+ pixelAligned: true,
+ });
+
+ const finalImage = options?.transparentBackgroundColor
+ ? image
+ : addBackgroundColor(image, this.backgroundColor);
+
+ imageDataToCanvas(finalImage).toBlob((blob) => {
+ downloadBlob(blob, 'jupyter-scatter.png');
+ });
+ } catch (e) {
+ // biome-ignore lint/suspicious/noConsole: We want to inform the knowledgeable user of the failure
+ console.error('Failed to export image', e);
+ }
+ })();
}
viewSave(transparentBackgroundColor) {
@@ -2632,6 +2738,423 @@ class JupyterScatterView {
this.model.save_changes();
}
+ toggleFullscreen() {
+ if (document.fullscreenElement) {
+ document.exitFullscreen();
+ } else if (this.greatGrandParentElement) {
+ this.greatGrandParentElement.requestFullscreen();
+ } else {
+ this.grandParentElement = this.el.parentElement?.parentElement;
+ this.greatGrandParentElement = this.grandParentElement?.parentElement;
+ this.greatGrandParentElement?.addEventListener(
+ 'fullscreenchange',
+ this.fullscreenChangeHandlerBound,
+ );
+ this.greatGrandParentElement?.requestFullscreen();
+ }
+ }
+
+ fullscreenContainerStyle() {
+ if (this.fullscreenFullWidthHeight) {
+ this.container.style.outline = null;
+ this.container.style.boxShadow = null;
+ } else {
+ this.container.style.outline = '1px solid var(--jp-border-color2)';
+ this.container.style.boxShadow = '0 0.1rem 1rem 0 rgba(0, 0, 0, .2)';
+ }
+ }
+
+ fullscreenFullWidthHeightChangeHandler(event) {
+ this.fullscreenFullWidthHeight = event.target.checked;
+ this.fullscreenWidthInput.disabled = this.fullscreenFullWidthHeight;
+ this.fullscreenHeightInput.disabled = this.fullscreenFullWidthHeight;
+ this.updateContainerDimensions();
+ this.fullscreenContainerStyle();
+ this.fullscreenSizePanelUpdateDownloadLabel();
+
+ if (this.fullscreenFullWidthHeight) {
+ this.fullscreenWidthLabel.style.color = 'var(--jp-content-font-color2)';
+ this.fullscreenHeightLabel.style.color = 'var(--jp-content-font-color2)';
+ this.fullscreenWidthInput.style.color = 'var(--jp-content-font-color3)';
+ this.fullscreenHeightInput.style.color = 'var(--jp-content-font-color3)';
+ } else {
+ this.fullscreenWidthLabel.style.color = 'var(--jp-content-font-color)';
+ this.fullscreenHeightLabel.style.color = 'var(--jp-content-font-color)';
+ this.fullscreenWidthInput.style.color = 'var(--jp-content-font-color)';
+ this.fullscreenHeightInput.style.color = 'var(--jp-content-font-color)';
+ }
+
+ if (!this.fullscreenFullWidthHeight) {
+ this.fullscreenWidthInput.focus();
+ }
+ }
+
+ fullscreenWidthChangeHandler(event) {
+ const newWidth = Number(event.target.value);
+ this.fullscreenWidth = Math.max(
+ 1,
+ Math.min(this.fullscreenWidthMax, newWidth),
+ );
+ this.fullscreenWidthInput.value = this.fullscreenWidth;
+ this.updateContainerDimensions();
+ this.fullscreenSizePanelUpdateDownloadLabel();
+ }
+
+ fullscreenHeightChangeHandler(event) {
+ const newHeight = Number(event.target.value);
+ this.fullscreenHeight = Math.max(
+ 1,
+ Math.min(this.fullscreenHeightMax, newHeight),
+ );
+ this.fullscreenHeightInput.value = this.fullscreenHeight;
+ this.updateContainerDimensions();
+ this.fullscreenSizePanelUpdateDownloadLabel();
+ }
+
+ fullscreenExportScaleChangeHandler(event) {
+ const newScale = Number(event.target.value);
+ this.fullscreenExportScale = newScale;
+ this.fullscreenSizePanelUpdateDownloadLabel();
+ }
+
+ fullscreenSizePanelToggle() {
+ this.fullscreenSizePanelVisible = !this.fullscreenSizePanelVisible;
+
+ if (this.fullscreenSizePanelVisible) {
+ this.fullscreenSizePanelToggleButtonIcon.classList.remove('fa-angle-up');
+ this.fullscreenSizePanelToggleButtonIcon.classList.add('fa-angle-down');
+ this.fullscreenSizePanel.style.height = '3rem';
+ } else {
+ this.fullscreenSizePanelToggleButtonIcon.classList.remove(
+ 'fa-angle-down',
+ );
+ this.fullscreenSizePanelToggleButtonIcon.classList.add('fa-angle-up');
+ this.fullscreenSizePanel.style.height = '0';
+ if (!this.fullscreenFullWidthHeight) {
+ this.fullscreenFullWidthHeightInput.click();
+ }
+ }
+ }
+
+ fullscreenSizePanelUpdateDownloadLabel() {
+ const { width, height } = this.canvas;
+ const w = width * this.fullscreenExportScale;
+ const h = height * this.fullscreenExportScale;
+ this.fullscreenDownload.textContent = `Download as PNG at ${w}×${h} px`;
+ this.fullscreenDownload.title = `Download as PNG at ${w}×${h} pixels`;
+ }
+
+ fullscreenDownload() {
+ this.viewDownload({ scale: this.fullscreenExportScale });
+ }
+
+ createFullscreenSizePanel() {
+ if (this.fullscreenSizePanel) {
+ this.destroyFullscreenResizePanel();
+ }
+
+ const panel = document.createElement('div');
+ panel.id = 'jscatter-fullscreen-size-panel';
+ panel.style.position = 'relative';
+ panel.style.height = '0';
+ panel.style.transition = 'height 250ms ease';
+ this.fullscreenSizePanel = panel;
+
+ const toggleButton = document.createElement('button');
+ toggleButton.classList.add(
+ 'jupyter-widgets',
+ 'jupyter-button',
+ 'widget-button',
+ );
+ toggleButton.style.position = 'absolute';
+ toggleButton.style.left = '0';
+ toggleButton.style.bottom = '100%';
+ toggleButton.style.width = '36px';
+ toggleButton.style.height = '18px';
+ toggleButton.style.margin = '0 2px';
+ toggleButton.style.display = 'flex';
+ toggleButton.style.justifyContent = 'center';
+ toggleButton.style.alignItems = 'center';
+ toggleButton.style.borderBottomLeftRadius = '0';
+ toggleButton.style.borderBottomRightRadius = '0';
+ toggleButton.addEventListener('click', this.fullscreenSizePanelToggleBound);
+ panel.append(toggleButton);
+ this.fullscreenSizePanelToggleButton = toggleButton;
+
+ const toggleButtonIcon = document.createElement('i');
+ toggleButtonIcon.classList.add('fa', 'fa-angle-up');
+ toggleButtonIcon.ariaHidden = 'true';
+ toggleButton.append(toggleButtonIcon);
+ this.fullscreenSizePanelToggleButtonIcon = toggleButtonIcon;
+
+ const container = document.createElement('div');
+ container.style.position = 'relative';
+ container.style.display = 'flex';
+ container.style.alignItems = 'center';
+ container.style.gap = '0 1rem';
+ container.style.padding = '0.5rem 2px';
+ container.style.borderTop = '2px solid var(--jp-layout-color2)';
+ panel.append(container);
+
+ const bBox = this.el.getBoundingClientRect();
+
+ const hasAxes = this.model.get('axes');
+ const xPadding = hasAxes ? this.getXPadding() : 0;
+ const yPadding = hasAxes ? this.getYPadding() : 0;
+
+ const fullWidthHeight = document.createElement('label');
+ fullWidthHeight.textContent = 'Full Width & Height';
+ fullWidthHeight.style.display = 'flex';
+ fullWidthHeight.style.alignItems = 'center';
+ fullWidthHeight.style.gap = '0 0.25rem';
+ fullWidthHeight.style.userSelect = 'none';
+ container.append(fullWidthHeight);
+
+ this.fullscreenFullWidthHeight = true;
+ const fullWidthHeightInput = document.createElement('input');
+ fullWidthHeightInput.type = 'checkbox';
+ fullWidthHeightInput.checked = this.fullscreenFullWidthHeight;
+ fullWidthHeightInput.addEventListener(
+ 'change',
+ this.fullscreenFullWidthHeightChangeHandlerBound,
+ );
+ this.fullscreenFullWidthHeightInput = fullWidthHeightInput;
+ fullWidthHeight.append(fullWidthHeightInput);
+
+ const width = document.createElement('label');
+ width.textContent = 'Width';
+ width.style.display = 'flex';
+ width.style.alignItems = 'center';
+ width.style.gap = '0 0.25rem';
+ width.style.userSelect = 'none';
+ width.style.color = 'var(--jp-content-font-color2)';
+ this.fullscreenWidthLabel = width;
+ container.append(width);
+
+ this.fullscreenWidthMax = bBox.width - xPadding;
+ this.fullscreenWidth = this.fullscreenWidthMax;
+ const widthInput = document.createElement('input');
+ widthInput.type = 'number';
+ widthInput.value = `${this.fullscreenWidth}`;
+ widthInput.disabled = true;
+ widthInput.step = '1';
+ widthInput.min = '1';
+ widthInput.max = `${this.fullscreenWidthMax}`;
+ widthInput.style.userSelect = 'auto';
+ widthInput.style.color = 'var(--jp-content-font-color3)';
+ widthInput.style.border = 'var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color)';
+ widthInput.style.backgroundColor = 'var(--jp-widgets-input-background-color)';
+ widthInput.addEventListener(
+ 'change',
+ this.fullscreenWidthChangeHandlerBound,
+ );
+ widthInput.addEventListener(
+ 'input',
+ this.fullscreenWidthChangeHandlerDebounced,
+ );
+ this.fullscreenWidthInput = widthInput;
+ width.append(widthInput);
+
+ const height = document.createElement('label');
+ height.textContent = 'Height';
+ height.style.display = 'flex';
+ height.style.alignItems = 'center';
+ height.style.gap = '0 0.25rem';
+ height.style.userSelect = 'none';
+ height.style.color = 'var(--jp-content-font-color2)';
+ this.fullscreenHeightLabel = height;
+ container.append(height);
+
+ this.fullscreenHeightMax = bBox.height - yPadding - remToPx(3);
+ this.fullscreenHeight = this.fullscreenHeightMax;
+ const heightInput = document.createElement('input');
+ heightInput.type = 'number';
+ heightInput.value = `${this.fullscreenHeight}`;
+ heightInput.disabled = true;
+ heightInput.step = '1';
+ heightInput.min = '1';
+ heightInput.max = `${this.fullscreenHeightMax}`;
+ heightInput.style.userSelect = 'auto';
+ heightInput.style.color = 'var(--jp-content-font-color3)';
+ heightInput.style.border = 'var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color)';
+ heightInput.style.backgroundColor = 'var(--jp-widgets-input-background-color)';
+ heightInput.addEventListener(
+ 'change',
+ this.fullscreenHeightChangeHandlerBound,
+ );
+ heightInput.addEventListener(
+ 'input',
+ this.fullscreenHeightChangeHandlerDebounced,
+ );
+ this.fullscreenHeightInput = heightInput;
+ height.append(heightInput);
+
+ const divider = document.createElement('div');
+ divider.style.width = '2px';
+ divider.style.height = '2rem';
+ divider.style.background = 'var(--jp-border-color2)';
+ container.append(divider);
+
+ const scale = document.createElement('label');
+ scale.textContent = 'Scale';
+ scale.style.display = 'flex';
+ scale.style.alignItems = 'center';
+ scale.style.gap = '0 0.25rem';
+ scale.style.userSelect = 'none';
+ container.append(scale);
+
+ const scaleSelect = document.createElement('select');
+ scaleSelect.style.backgroundColor = 'var(--jp-widgets-input-background-color)';
+ scaleSelect.style.color = 'var(--jp-widgets-input-color)';
+ this.fullscreenExportScale = 1;
+ scaleSelect.addEventListener(
+ 'change',
+ this.fullscreenExportScaleChangeHandlerBound,
+ );
+ this.fullscreenScaleSelect = scaleSelect;
+ scale.append(scaleSelect);
+
+ const scales = Array.from({ length: 3 }, (_, i) => i + 1);
+ for (const s of scales) {
+ const scaleOption = document.createElement('option');
+ scaleOption.textContent = s;
+ scaleOption.value = s;
+ scaleOption.selected = s === this.fullscreenExportScale;
+ scaleSelect.append(scaleOption);
+ }
+
+ const dpr = document.createElement('label');
+ dpr.textContent = 'DPR';
+ dpr.title = 'Device Pixel Ratio';
+ dpr.style.display = 'flex';
+ dpr.style.alignItems = 'center';
+ dpr.style.gap = '0 0.25rem';
+ dpr.style.userSelect = 'none';
+ dpr.style.color = 'var(--jp-content-font-color2)';
+ container.append(dpr);
+
+ const dprInput = document.createElement('input');
+ dprInput.type = 'number';
+ dprInput.min = '1';
+ dprInput.max = '10';
+ dprInput.step = '1';
+ dprInput.value = window.devicePixelRatio;
+ dprInput.disabled = true;
+ dprInput.style.color = 'var(--jp-content-font-color3)';
+ dprInput.style.border = 'var(--jp-widgets-input-border-width) solid var(--jp-widgets-input-border-color)';
+ dprInput.style.backgroundColor = 'var(--jp-widgets-input-background-color)';
+ dpr.append(dprInput);
+
+ const download = document.createElement('button');
+ download.classList.add(
+ 'jupyter-widgets',
+ 'jupyter-button',
+ 'widget-button',
+ );
+ download.textContent = 'Download as PNG';
+ download.style.width = 'auto';
+ download.addEventListener('click', this.fullscreenDownloadBound);
+ this.fullscreenDownload = download;
+ this.fullscreenSizePanelUpdateDownloadLabel();
+ container.append(download);
+
+ this.greatGrandParentElement.append(panel);
+ }
+
+ destroyFullscreenResizePanel() {
+ this.fullscreenFullWidthHeightInput.removeEventListener(
+ 'change',
+ this.fullscreenFullWidthHeightChangeHandlerBound,
+ );
+ this.fullscreenWidthInput.removeEventListener(
+ 'change',
+ this.fullscreenWidthChangeHandlerBound,
+ );
+ this.fullscreenWidthInput.removeEventListener(
+ 'input',
+ this.fullscreenWidthChangeHandlerDebounced,
+ );
+ this.fullscreenHeightInput.removeEventListener(
+ 'change',
+ this.fullscreenHeightChangeHandlerBound,
+ );
+ this.fullscreenHeightInput.removeEventListener(
+ 'input',
+ this.fullscreenHeightChangeHandlerDebounced,
+ );
+ this.fullscreenSizePanelToggleButton.removeEventListener(
+ 'click',
+ this.fullscreenSizePanelToggleBound,
+ );
+ this.fullscreenScaleSelect.removeEventListener(
+ 'change',
+ this.fullscreenExportScaleChangeHandlerBound,
+ );
+ this.fullscreenDownload.removeEventListener(
+ 'click',
+ this.fullscreenDownloadBound,
+ );
+ if (this.fullscreenSizePanel) {
+ this.greatGrandParentElement.removeChild(this.fullscreenSizePanel);
+ this.fullscreenSizePanel = undefined;
+ }
+ }
+
+ fullscreenChangeHandler() {
+ if (document.fullscreenElement) {
+ this.fullscreenObserver = new ResizeObserver(() => {
+ nextAnimationFrame(2).then(() => {
+ setTimeout(() => {
+ this.createFullscreenSizePanel();
+ this.updateContainerDimensions();
+ }, 0);
+ });
+ });
+ this.fullscreenObserver.observe(document.fullscreenElement);
+
+ this.grandParentElementFlexGrow = this.grandParentElement.style.flexGrow;
+ this.grandParentElement.style.flexGrow = 1;
+ this.greatGrandParentElementBackground =
+ this.greatGrandParentElement.style.background;
+ this.greatGrandParentElement.style.background = 'var(--jp-layout-color0)';
+ this.el.style.height = '100%';
+ this.fullscreenButtonIcon?.classList.remove('fa-expand');
+ this.fullscreenButtonIcon?.classList.add('fa-compress');
+ this.scatterplot.set({
+ lassoInitiatorParentElement: document.fullscreenElement,
+ lassoLongPressIndicatorParentElement: document.fullscreenElement,
+ });
+ this.fullscreenFullWidthHeight = true;
+ } else {
+ this.fullscreenObserver?.disconnect();
+ this.fullscreenObserver = undefined;
+
+ this.grandParentElement.style.flexGrow = this.grandParentElementFlexGrow;
+ this.greatGrandParentElement.style.background =
+ this.greatGrandParentElementBackground;
+ this.fullscreenButtonIcon?.classList.add('fa-expand');
+ this.fullscreenButtonIcon?.classList.remove('fa-compress');
+ this.el.style.height = null;
+ this.container.style.outline = null;
+ this.container.style.boxShadow = null;
+ this.scatterplot.set({
+ lassoInitiatorParentElement: document.body,
+ lassoLongPressIndicatorParentElement: document.body,
+ });
+ this.destroyFullscreenResizePanel();
+ nextAnimationFrame(2).then(() => {
+ setTimeout(() => {
+ this.updateContainerDimensions();
+ }, 0);
+ });
+ }
+
+ this.scatterplot.set({
+ width: this.getWidth(),
+ height: this.getHeight(),
+ });
+ }
+
optionsHandler(newOptions) {
this.scatterplot.set(newOptions);
}
diff --git a/js/src/utils.js b/js/src/utils.js
index e8d35c7..a4daefd 100644
--- a/js/src/utils.js
+++ b/js/src/utils.js
@@ -241,12 +241,12 @@ export function addBackgroundColor(imageData, backgroundColor) {
const bg = toRgba(backgroundColor);
for (let i = 0; i < newData.length; i += 4) {
- const bgAlpha = 1 - imageData.data[i + 3];
- const fgAlpha = imageData.data[i + 3];
+ const bgAlpha = 1 - imageData.data[i + 3] / 255;
+ const fgAlpha = imageData.data[i + 3] / 255;
newData[i] = bg[0] * bgAlpha + imageData.data[i] * fgAlpha;
newData[i + 1] = bg[1] * bgAlpha + imageData.data[i + 1] * fgAlpha;
newData[i + 2] = bg[2] * bgAlpha + imageData.data[i + 2] * fgAlpha;
- newData[i + 3] = bg[3] * bgAlpha + imageData.data[i + 3] * fgAlpha;
+ newData[i + 3] = 255;
}
return new ImageData(newData, imageData.width, imageData.height);
diff --git a/jscatter/jscatter.py b/jscatter/jscatter.py
index 083ef79..de6b35f 100644
--- a/jscatter/jscatter.py
+++ b/jscatter/jscatter.py
@@ -50,7 +50,9 @@
TooltipPreviewImagePosition,
TooltipPreviewImageSize,
SizeScaleFunction,
+ UNDEF,
Undefined,
+ WidgetButtons,
)
COMPONENT_CONNECT = 4
@@ -64,9 +66,6 @@
DEFAULT_HISTOGRAM_BINS = 20
DEFAULT_TRANSITION_POINTS_DURATION = 3000
-# An "undefined" value
-UNDEF = Undefined()
-
default_background_color = 'white'
visual_properties = [
@@ -4598,10 +4597,22 @@ def get_axes_labels(self):
return self._axes_labels
- def show(self):
+ def show(self, buttons: Optional[Union[List[WidgetButtons], Undefined]] = UNDEF):
"""
Show the scatter plot widget
+ Parameters
+ ----------
+ buttons : WidgetButtons, optional
+ The buttons to show in the widget. Can be one of the following:
+ - `"pan_zoom"`: Button to activate the pan and zoom mode.
+ - `"lasso"`: Button to activate the lasso mode.
+ - `"full_screen"`: Button to enter full screen mode.
+ - `"save"`: Button to save the current view in `scatter.widget.view_data`.
+ - `"download"`: Button to download the current view as a PNG image.
+ - `"reset"`: Button to reset the view.
+ - `"divider"`: Not a button, but a divider between buttons.
+
Returns
-------
widget
@@ -4611,7 +4622,7 @@ def show(self):
--------
>>> scatter.show()
"""
- return self.widget.show()
+ return self.widget.show(buttons)
def show_tooltip(self, pointIdx: int):
"""
diff --git a/jscatter/types.py b/jscatter/types.py
index a025285..b0ef57e 100644
--- a/jscatter/types.py
+++ b/jscatter/types.py
@@ -10,6 +10,9 @@
TooltipPreviewImagePosition = Literal['top', 'bottom', 'left', 'right', 'center']
TooltipPreviewImageSize = Literal['contain', 'cover']
SizeScaleFunction = Literal['asinh', 'linear', 'constant']
+WidgetButtons = Literal[
+ 'pan_zoom', 'lasso', 'full_screen', 'screenshot', 'download', 'reset', 'divider'
+]
# To distinguish between None and an undefined (optional) argument, where None
# is used for unsetting and Undefined is used for skipping.
@@ -19,6 +22,9 @@
{'__str__': lambda s: 'Undefined', '__repr__': lambda s: 'Undefined'},
)
+# An "undefined" value
+UNDEF = Undefined()
+
class Scales(Enum):
LINEAR = 'linear'
diff --git a/jscatter/widget.py b/jscatter/widget.py
index 9bb22ca..bd368d9 100644
--- a/jscatter/widget.py
+++ b/jscatter/widget.py
@@ -3,6 +3,7 @@
import anywidget
import pandas as pd
import pathlib
+import typing as t
from traitlets import Bool, Dict, Enum, Float, Int, List, Unicode, Union
from traittypes import Array
@@ -14,15 +15,27 @@
Rect,
serialization as annotation_serialization,
)
+from .types import UNDEF, Undefined, WidgetButtons
SELECTION_DTYPE = 'uint32'
EVENT_TYPES = {
+ 'FULL_SCREEN': 'full_screen',
'TOOLTIP': 'tooltip',
'VIEW_DOWNLOAD': 'view_download',
'VIEW_RESET': 'view_reset',
'VIEW_SAVE': 'view_save',
}
+divider = widgets.Box(
+ children=[],
+ layout=widgets.Layout(
+ margin='10px 0',
+ width='100%',
+ height='0',
+ border='1px solid var(--jp-layout-color2)',
+ ),
+)
+
def component_idx_to_name(idx):
if idx == 2:
@@ -431,6 +444,20 @@ def click_handler(event):
button.on_click(click_handler)
return button
+ def create_full_screen_button(self, icon_only=True, width=36):
+ button = Button(
+ description='' if icon_only else 'Full Screen',
+ icon='expand',
+ tooltip='Full Screen',
+ width=width,
+ )
+
+ def click_handler(event):
+ self.send({'type': EVENT_TYPES['FULL_SCREEN']})
+
+ button.on_click(click_handler)
+ return button
+
def create_mouse_mode_toggle_button(
self,
mouse_mode,
@@ -458,7 +485,9 @@ def change_handler(change):
button.on_click(click_handler)
return button
- def show(self):
+ def show(
+ self, buttons: t.Optional[t.Union[t.List[WidgetButtons], Undefined]] = UNDEF
+ ):
button_pan_zoom = self.create_mouse_mode_toggle_button(
mouse_mode='panZoom',
icon='arrows',
@@ -480,25 +509,36 @@ def show(self):
button_view_save = self.create_save_view_button()
button_view_download = self.create_download_view_button()
button_view_reset = self.create_reset_view_button()
+ button_full_screen = self.create_full_screen_button()
+
+ button_map = {
+ 'pan_zoom': button_pan_zoom,
+ 'lasso': button_lasso,
+ 'save': button_view_save,
+ 'download': button_view_download,
+ 'reset': button_view_reset,
+ 'full_screen': button_full_screen,
+ 'divider': divider,
+ }
- buttons = widgets.VBox(
- children=[
+ if buttons is not UNDEF:
+ button_widgets = [
+ button_map[button] for button in buttons if button in button_map
+ ]
+ else:
+ button_widgets = [
button_pan_zoom,
button_lasso,
# button_rotate,
- widgets.Box(
- children=[],
- layout=widgets.Layout(
- margin='10px 0',
- width='100%',
- height='0',
- border='1px solid var(--jp-layout-color2)',
- ),
- ),
+ divider,
+ button_full_screen,
button_view_save,
button_view_download,
button_view_reset,
- ],
+ ]
+
+ buttons = widgets.VBox(
+ children=button_widgets,
layout=widgets.Layout(
display='flex', flex_flow='column', align_items='stretch', width='40px'
),
@@ -513,7 +553,7 @@ def camera_is_fixed_change_handler(change):
self.observe(camera_is_fixed_change_handler, names=['camera_is_fixed'])
- return widgets.HBox([buttons, plots])
+ return widgets.VBox([widgets.HBox([buttons, plots])])
class Button(anywidget.AnyWidget):
diff --git a/tests/test_jscatter.py b/tests/test_jscatter.py
index 08a380a..9f9a785 100644
--- a/tests/test_jscatter.py
+++ b/tests/test_jscatter.py
@@ -569,7 +569,7 @@ def test_point_size_scale(df: pd.DataFrame):
def test_camera_is_fixed(df: pd.DataFrame):
scatter = Scatter(data=df, x='a', y='b')
- pan_zoom_button = scatter.show().children[0].children[0]
+ pan_zoom_button = scatter.show().children[0].children[0].children[0]
# Check that by default, the camera is not fixed
assert scatter.widget.camera_is_fixed == False