solara-ui 1.31.0__tar.gz → 1.32.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {solara_ui-1.31.0 → solara_ui-1.32.1}/.gitignore +2 -2
- {solara_ui-1.31.0 → solara_ui-1.32.1}/PKG-INFO +2 -2
- {solara_ui-1.31.0 → solara_ui-1.32.1}/README.md +1 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/__init__.py +1 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/applayout.py +6 -2
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/datatable.py +5 -12
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/markdown.py +38 -27
- solara_ui-1.32.1/solara/lab/hooks/dataframe.py +1 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/utils/dataframe.py +40 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/minisettings.py +13 -5
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/flask.py +3 -5
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/kernel_context.py +110 -60
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/server.py +8 -4
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/settings.py +23 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/starlette.py +4 -5
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/main-vuetify.js +3 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/solara_bootstrap.py +1 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/solara.html.j2 +4 -4
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/tasks.py +19 -10
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/toestand.py +22 -13
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/assets/custom.css +13 -0
- solara_ui-1.32.1/solara/website/components/algolia.py +6 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/algolia_api.vue +2 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/header.py +9 -17
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/notebook.py +1 -1
- solara_ui-1.32.1/solara/website/components/sidebar.py +91 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/__init__.py +25 -67
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/changelog/__init__.py +2 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/changelog/changelog.md +25 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/contact/__init__.py +2 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/__init__.py +2 -88
- solara_ui-1.32.1/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +413 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +36 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +4 -4
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +11 -2
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +1 -1
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/faq/content/99-faq.md +27 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/02-installing.md +2 -2
- solara_ui-1.32.1/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +65 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +20 -4
- solara_ui-1.32.1/tests/docs/docs_howto_event_with_future_test.py +46 -0
- solara_ui-1.32.1/tests/docs/docs_howto_event_with_polling_test.py +35 -0
- solara_ui-1.32.1/tests/docs/docs_howto_no_browser_api_find_testing_test.py +32 -0
- solara_ui-1.32.1/tests/docs/docs_howto_no_browser_testing_test.py +23 -0
- solara_ui-1.32.1/tests/docs/docs_howto_no_browser_threaded_test.py +34 -0
- solara_ui-1.32.1/tests/integration/assets/assets1/common.js +1 -0
- solara_ui-1.32.1/tests/integration/assets/assets1/unique1.js +1 -0
- solara_ui-1.32.1/tests/integration/assets/assets2/common.js +1 -0
- solara_ui-1.32.1/tests/integration/assets/assets2/custom.css +3 -0
- solara_ui-1.32.1/tests/integration/assets/assets2/custom.js +1 -0
- solara_ui-1.32.1/tests/integration/assets/assets2/unique2.js +1 -0
- solara_ui-1.32.1/tests/integration/assets_test.py +76 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/lifecycle_test.py +1 -10
- solara_ui-1.32.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/file_browser_test.py +3 -3
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/lifecycle_test.py +6 -5
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/task_test.py +5 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/toestand_test.py +29 -0
- solara_ui-1.31.0/solara/lab/hooks/dataframe.py +0 -12
- solara_ui-1.31.0/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -162
- solara_ui-1.31.0/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -64
- solara_ui-1.31.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/LICENSE +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/pyproject.toml +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/__main__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/alias.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/autorouting.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/cache.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/checks.html +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/checks.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/comm.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/alert.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/button.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/card.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/checkbox.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/code_highlight_css.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/code_highlight_css.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/columns.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/component_vue.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/cross_filter.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/dataframe.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/datatable.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/details.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/download.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/echarts.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/echarts.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/figure_altair.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/file_browser.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/file_download.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/file_drop.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/file_drop.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/file_list_widget.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/head.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/head_tag.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/head_tag.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/image.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/input.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/link.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/markdown_editor.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/markdown_editor.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/matplotlib.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/meta.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/misc.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/pivot_table.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/pivot_table.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/progress.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/select.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/select.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/slider.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/slider_date.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/spinner-solara.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/spinner.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/sql_code.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/sql_code.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/style.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/switch.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/tab_navigation.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/title.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/title.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/togglebuttons.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/components/tooltip.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/datatypes.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/express.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/hooks/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/hooks/dataframe.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/hooks/misc.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/hooks/use_reactive.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/hooks/use_thread.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/kitchensink.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/chat.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/confirmation_dialog.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/cross_filter.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/input_date.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/menu.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/menu.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/tabs.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/theming.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/components/theming.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/hooks/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/toestand.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/utils/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/utils/cookies.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lab/utils/headers.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/layout.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/lifecycle.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/py.typed +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/reactive.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/routing.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/scope/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/scope/types.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/app.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/custom.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/custom.js +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/favicon.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/favicon.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/style.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/theme-dark.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/theme-light.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/assets/theme.js +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/cdn_helper.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/esm.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/fastapi.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/jupyter/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/jupyter/cdn_handler.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/jupyter/server_extension.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/jupytertools.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/kernel.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/patch.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/reload.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/shell.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/ansi.js +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/highlight-dark.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/highlight.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/main.js +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/sun.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/static/webworker.js +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/telemetry.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/index.html.j2 +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/loader-plain.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/loader-plain.html +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/loader-solara.css +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/loader-solara.html +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/templates/plain.html +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/threaded.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/utils.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/server/websocket.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/settings.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/button.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/markdown.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/.flake8 +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/.pre-commit-config.yaml +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/LICENSE +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/Procfile +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/mypy.ini +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/pyproject.toml +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/components/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/components/article.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/components/data.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/components/header.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/components/layout.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/data.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/test/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/test/pytest_plugin.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/util.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/assets/images/logo-small.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/assets/images/logo.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/assets/images/logo_white.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/assets/theme.js +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/algolia.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/docs.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/hero.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/mailchimp.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/mailchimp.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/components/markdown.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/authorization/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/authorization/admin.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/authorization/users.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/layout-demo.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/multipage/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/multipage/page1.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/multipage/page2.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/scatter.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/scrolling.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/contact/contact.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/doc_use_download.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_thread.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/route.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/display.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/advanced/link.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/advanced/style.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/common.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/data/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/data/pivot_table.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/button.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/input.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/select.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/slider.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/switch.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/chat.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/menu.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/tab.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/task.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/theming.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/card.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/column.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/columns.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/row.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/file_download.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/html.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/image.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/markdown.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/sql_code.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/page/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/page/head.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/page/title.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/error.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/info.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/progress.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/spinner.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/success.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/status/warning.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/viz/altair.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/faq/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/docutils.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/domino_code_assist.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/planeto_tessa.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/solara_dev.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/pages/showcase/wanderlust.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/public/beach.jpeg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/public/logo.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/public/social/discord.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/public/social/github.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/public/social/twitter.svg +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/public/success.html +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/templates/index.html.j2 +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/website/utils.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/widgets/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/widgets/vue/gridlayout.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/widgets/vue/html.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/widgets/vue/navigator.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/widgets/vue/vegalite.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/solara/widgets/widgets.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/conftest.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/api_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/app_widget.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/async_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/cdn_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/cmdline_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/conftest.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/create_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/enterprise/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/enterprise/oauth_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/error_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/esm_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/file_download_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/flask_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/input_date_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/latex_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/markdown_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/menu_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/popout_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/reconnect_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/reload/apps.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/router_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/server_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/ssg_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/starlette_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/test.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/testapp.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/integration/widget_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/app_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/applayout_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/autorouting_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/cache_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/cdn_helper_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/chat_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/checkbox_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/common.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/component_frontend_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/component_vue_test.vue +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/confirmation_dialog_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/conftest.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/cross_filter_component_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/cross_filter_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/dataframe_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/datatable_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/display_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/express_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/file_download_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/hooks_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/input_date_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/input_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/kernel_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/lab/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/matplotlib_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/no_solara_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/output_widget_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/patch_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/pivottable_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/reload_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/router_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/select_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/settings_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/shell_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/slider_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/food/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/food/food.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/food/index.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/kernel_start.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/single_file.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/switch_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/tabs_test.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/telemetry_tests.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/toestand_computed_reload.py +0 -0
- {solara_ui-1.31.0 → solara_ui-1.32.1}/tests/unit/toggle_button_test.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: solara-ui
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.32.1
|
|
4
4
|
Dynamic: Summary
|
|
5
5
|
Project-URL: Home, https://www.github.com/widgetti/solara
|
|
6
6
|
Project-URL: Documentation, https://solara.dev
|
|
@@ -152,7 +152,7 @@ By building on top of ipywidgets, we automatically leverage an existing ecosyste
|
|
|
152
152
|
|
|
153
153
|
Visit our main website or jump directly to the introduction
|
|
154
154
|
|
|
155
|
-
[](https://solara.dev/documentation)
|
|
155
|
+
[](https://solara.dev/documentation/getting_started/introduction)
|
|
156
156
|
[](https://solara.dev/documentation/getting_started)
|
|
157
157
|
|
|
158
158
|
*Note that the solara.dev website is created using Solara*
|
|
@@ -100,7 +100,7 @@ By building on top of ipywidgets, we automatically leverage an existing ecosyste
|
|
|
100
100
|
|
|
101
101
|
Visit our main website or jump directly to the introduction
|
|
102
102
|
|
|
103
|
-
[](https://solara.dev/documentation)
|
|
103
|
+
[](https://solara.dev/documentation/getting_started/introduction)
|
|
104
104
|
[](https://solara.dev/documentation/getting_started)
|
|
105
105
|
|
|
106
106
|
*Note that the solara.dev website is created using Solara*
|
|
@@ -310,8 +310,12 @@ def AppLayout(
|
|
|
310
310
|
if title or children_appbartitle:
|
|
311
311
|
v.ToolbarTitle(children=children_appbartitle or [title])
|
|
312
312
|
v.Spacer()
|
|
313
|
-
for child in children_appbar:
|
|
314
|
-
|
|
313
|
+
for i, child in enumerate(children_appbar):
|
|
314
|
+
# if the user already provided a key, don't override it
|
|
315
|
+
if child._key is None:
|
|
316
|
+
solara.display(child.key(f"app-layout-appbar-user-child-{i}"))
|
|
317
|
+
else:
|
|
318
|
+
solara.display(child)
|
|
315
319
|
solara.Button(icon_name="mdi-fullscreen", on_click=lambda: set_fullscreen(True), icon=True, dark=False)
|
|
316
320
|
with v.Row(no_gutters=False, class_="solara-content-main"):
|
|
317
321
|
v.Col(cols=12, children=children_content)
|
|
@@ -11,7 +11,7 @@ import solara.hooks.dataframe
|
|
|
11
11
|
import solara.lab
|
|
12
12
|
import traitlets
|
|
13
13
|
from solara.lab.hooks.dataframe import use_df_column_names
|
|
14
|
-
from solara.lab.utils.dataframe import
|
|
14
|
+
from solara.lab.utils.dataframe import df_len, df_records, df_slice
|
|
15
15
|
|
|
16
16
|
from .. import CellAction, ColumnAction
|
|
17
17
|
|
|
@@ -89,7 +89,7 @@ def DataTable(
|
|
|
89
89
|
on_column_header_hover: Optional[Callable[[Optional[str]], None]] = None,
|
|
90
90
|
column_header_info: Optional[solara.Element] = None,
|
|
91
91
|
):
|
|
92
|
-
total_length =
|
|
92
|
+
total_length = df_len(df)
|
|
93
93
|
options = {"descending": False, "page": page + 1, "itemsPerPage": items_per_page, "sortBy": [], "totalItems": total_length}
|
|
94
94
|
options, set_options = solara.use_state(options, key="options")
|
|
95
95
|
format = format or format_default
|
|
@@ -102,19 +102,12 @@ def DataTable(
|
|
|
102
102
|
columns = use_df_column_names(df)
|
|
103
103
|
|
|
104
104
|
items = []
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if df_type(df) == "pandas":
|
|
109
|
-
column_data = dfs[columns].to_dict("records")
|
|
110
|
-
elif df_type(df) == "polars":
|
|
111
|
-
column_data = dfs[columns].to_dicts()
|
|
112
|
-
else:
|
|
113
|
-
column_data = dfs[columns].to_records()
|
|
105
|
+
dfs = df_slice(df, i1, i2)
|
|
106
|
+
records = df_records(dfs)
|
|
114
107
|
for i in range(i2 - i1):
|
|
115
108
|
item = {"__row__": i + i1} # special key for the row number
|
|
116
109
|
for column in columns:
|
|
117
|
-
item[column] = format(dfs, column, i + i1,
|
|
110
|
+
item[column] = format(dfs, column, i + i1, records[i][column])
|
|
118
111
|
items.append(item)
|
|
119
112
|
|
|
120
113
|
headers = [{"text": name, "value": name, "sortable": False} for name in columns]
|
|
@@ -341,34 +341,45 @@ def Markdown(md_text: str, unsafe_solara_execute=False, style: Union[str, Dict,
|
|
|
341
341
|
logger.exception("Error highlighting code: %s", src)
|
|
342
342
|
return repr(e)
|
|
343
343
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
"
|
|
344
|
+
if has_pymdownx:
|
|
345
|
+
return markdown.Markdown( # type: ignore
|
|
346
|
+
extensions=[
|
|
347
|
+
"pymdownx.highlight",
|
|
348
|
+
"pymdownx.superfences",
|
|
349
|
+
"pymdownx.emoji",
|
|
350
|
+
"toc", # so we get anchors for h1 h2 etc
|
|
351
|
+
"tables",
|
|
352
|
+
],
|
|
353
|
+
extension_configs={
|
|
354
|
+
"pymdownx.emoji": {
|
|
355
|
+
"emoji_index": _no_deep_copy_emojione,
|
|
356
|
+
},
|
|
357
|
+
"pymdownx.superfences": {
|
|
358
|
+
"custom_fences": [
|
|
359
|
+
{
|
|
360
|
+
"name": "mermaid",
|
|
361
|
+
"class": "mermaid",
|
|
362
|
+
"format": pymdownx.superfences.fence_div_format,
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"name": "solara",
|
|
366
|
+
"class": "",
|
|
367
|
+
"format": highlight,
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
},
|
|
355
371
|
},
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
},
|
|
368
|
-
],
|
|
369
|
-
},
|
|
370
|
-
},
|
|
371
|
-
)
|
|
372
|
+
)
|
|
373
|
+
else:
|
|
374
|
+
logger.warning("Pymdownx not installed, using default markdown. For a better experience, install pymdownx.")
|
|
375
|
+
return markdown.Markdown( # type: ignore
|
|
376
|
+
extensions=[
|
|
377
|
+
"fenced_code",
|
|
378
|
+
"codehilite",
|
|
379
|
+
"toc",
|
|
380
|
+
"tables",
|
|
381
|
+
],
|
|
382
|
+
)
|
|
372
383
|
|
|
373
384
|
md = solara.use_memo(make_markdown_object, dependencies=[unsafe_solara_execute])
|
|
374
385
|
html = md.convert(md_text)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from ..utils.dataframe import df_columns as use_df_column_names # noqa: F401
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
def get_pandas_major():
|
|
2
5
|
import pandas as pd
|
|
3
6
|
|
|
@@ -8,6 +11,43 @@ def df_type(df):
|
|
|
8
11
|
return df.__class__.__module__.split(".")[0]
|
|
9
12
|
|
|
10
13
|
|
|
14
|
+
def df_len(df) -> int:
|
|
15
|
+
"""Return the number of rows in a dataframe."""
|
|
16
|
+
return len(df)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def df_columns(df) -> List[str]:
|
|
20
|
+
"""Return a list of column names from a dataframe."""
|
|
21
|
+
if df_type(df) == "vaex":
|
|
22
|
+
return df.get_column_names()
|
|
23
|
+
elif df_type(df) == "pandas":
|
|
24
|
+
return df.columns.tolist()
|
|
25
|
+
elif df_type(df) == "polars":
|
|
26
|
+
return df.columns
|
|
27
|
+
else:
|
|
28
|
+
raise TypeError(f"{type(df)} not supported")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def df_slice(df, start: int, stop: int):
|
|
32
|
+
"""Return a subset of rows from a dataframe."""
|
|
33
|
+
if df_type(df) == "pandas":
|
|
34
|
+
return df.iloc[start:stop]
|
|
35
|
+
else:
|
|
36
|
+
return df[start:stop]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def df_records(df) -> List[dict]:
|
|
40
|
+
"""A list of records from a dataframe."""
|
|
41
|
+
if df_type(df) == "pandas":
|
|
42
|
+
return df.to_dict("records")
|
|
43
|
+
elif df_type(df) == "polars":
|
|
44
|
+
return df.to_dicts()
|
|
45
|
+
elif df_type(df) == "vaex":
|
|
46
|
+
return df.to_records()
|
|
47
|
+
else:
|
|
48
|
+
raise TypeError(f"{type(df)} not supported")
|
|
49
|
+
|
|
50
|
+
|
|
11
51
|
def df_unique(df, column, limit=None):
|
|
12
52
|
if df_type(df) == "vaex":
|
|
13
53
|
return df.unique(column, limit=limit + 1 if limit else None, limit_raise=False)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import inspect
|
|
1
2
|
import os
|
|
2
3
|
from pathlib import Path
|
|
3
|
-
from typing import Any, Optional
|
|
4
|
+
from typing import Any, Optional, List, Type
|
|
4
5
|
|
|
5
6
|
# similar API to pydantic/pydantic-settings but we prefer not to have a dependency on pydantic
|
|
6
7
|
# since we cannot be compatible with pydantic1 and 2
|
|
@@ -61,11 +62,16 @@ class _Field:
|
|
|
61
62
|
|
|
62
63
|
|
|
63
64
|
def convert(annotation, value: str) -> Any:
|
|
64
|
-
|
|
65
|
-
for
|
|
66
|
-
if annotation == Optional[
|
|
67
|
-
annotation =
|
|
65
|
+
check_sub_types: List[Type] = [str, int, float, bool, Path]
|
|
66
|
+
for sub_type in check_sub_types:
|
|
67
|
+
if annotation == Optional[sub_type]:
|
|
68
|
+
annotation = sub_type
|
|
68
69
|
return convert(annotation, value)
|
|
70
|
+
for sub_type in check_sub_types:
|
|
71
|
+
if annotation == List[sub_type]: # type: ignore
|
|
72
|
+
annotation = sub_type
|
|
73
|
+
values = value.split(",")
|
|
74
|
+
return [convert(sub_type, k) for k in values]
|
|
69
75
|
if annotation == str:
|
|
70
76
|
return value
|
|
71
77
|
elif annotation == int:
|
|
@@ -120,6 +126,8 @@ class BaseSettings:
|
|
|
120
126
|
if key == "Config":
|
|
121
127
|
continue
|
|
122
128
|
if not isinstance(field, _Field):
|
|
129
|
+
if inspect.isfunction(field):
|
|
130
|
+
continue
|
|
123
131
|
field = Field(field)
|
|
124
132
|
setattr(cls, key, field)
|
|
125
133
|
field.__set_name__(cls, key)
|
|
@@ -162,8 +162,8 @@ def kernels_connection(ws: simple_websocket.Server, kernel_id: str, name: str):
|
|
|
162
162
|
@blueprint.route("/_solara/api/close/<kernel_id>", methods=["GET", "POST"])
|
|
163
163
|
def close(kernel_id: str):
|
|
164
164
|
page_id = request.args["session_id"]
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
context = kernel_context.contexts.get(kernel_id, None)
|
|
166
|
+
if context is not None:
|
|
167
167
|
context.page_close(page_id)
|
|
168
168
|
return ""
|
|
169
169
|
|
|
@@ -184,9 +184,7 @@ def public(path):
|
|
|
184
184
|
def assets(path):
|
|
185
185
|
if not allowed():
|
|
186
186
|
abort(401)
|
|
187
|
-
|
|
188
|
-
default = server.solara_static.parent / "assets"
|
|
189
|
-
directories = [*overrides, default]
|
|
187
|
+
directories = server.asset_directories()
|
|
190
188
|
for directory in directories:
|
|
191
189
|
file = directory / path
|
|
192
190
|
if file.exists():
|
|
@@ -73,6 +73,7 @@ class VirtualKernelContext:
|
|
|
73
73
|
_last_kernel_cull_task: "Optional[asyncio.Future[None]]" = None
|
|
74
74
|
closed_event: threading.Event = dataclasses.field(default_factory=threading.Event)
|
|
75
75
|
_on_close_callbacks: List[Callable[[], None]] = dataclasses.field(default_factory=list)
|
|
76
|
+
lock: threading.RLock = dataclasses.field(default_factory=threading.RLock)
|
|
76
77
|
|
|
77
78
|
def __post_init__(self):
|
|
78
79
|
with self:
|
|
@@ -108,14 +109,15 @@ class VirtualKernelContext:
|
|
|
108
109
|
current_context[key] = local.kernel_context_stack.pop()
|
|
109
110
|
|
|
110
111
|
def close(self):
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
with self, self.lock:
|
|
113
|
+
for key in self.page_status:
|
|
114
|
+
self.page_status[key] = PageStatus.CLOSED
|
|
115
|
+
if self.closed_event.is_set():
|
|
116
|
+
logger.error("Tried to close a kernel context that is already closed: %s", self.id)
|
|
117
|
+
return
|
|
118
|
+
logger.info("Shut down virtual kernel: %s", self.id)
|
|
116
119
|
for f in reversed(self._on_close_callbacks):
|
|
117
120
|
f()
|
|
118
|
-
with self:
|
|
119
121
|
if self.app_object is not None:
|
|
120
122
|
if isinstance(self.app_object, reacton.core._RenderContext):
|
|
121
123
|
try:
|
|
@@ -128,9 +130,9 @@ class VirtualKernelContext:
|
|
|
128
130
|
# import gc
|
|
129
131
|
# gc.collect()
|
|
130
132
|
self.kernel.session.close()
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
if self.id in contexts:
|
|
134
|
+
del contexts[self.id]
|
|
135
|
+
self.closed_event.set()
|
|
134
136
|
|
|
135
137
|
def _state_reset(self):
|
|
136
138
|
state_directory = Path(".") / "states"
|
|
@@ -157,77 +159,125 @@ class VirtualKernelContext:
|
|
|
157
159
|
|
|
158
160
|
def page_connect(self, page_id: str):
|
|
159
161
|
logger.info("Connect page %s for kernel %s", page_id, self.id)
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
self.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
Returns a future that is set when the kernel cull is done.
|
|
171
|
-
The scheduled kernel cull can be cancelled when a new page connects, a new disconnect is scheduled,
|
|
172
|
-
or a page if explicitly closed.
|
|
173
|
-
"""
|
|
174
|
-
logger.info("Disconnect page %s for kernel %s", page_id, self.id)
|
|
175
|
-
future: "asyncio.Future[None]" = asyncio.Future()
|
|
176
|
-
self.page_status[page_id] = PageStatus.DISCONNECTED
|
|
177
|
-
current_event_loop = asyncio.get_event_loop()
|
|
162
|
+
with self.lock:
|
|
163
|
+
if self.closed_event.is_set():
|
|
164
|
+
raise RuntimeError("Cannot connect a page to a closed kernel")
|
|
165
|
+
if page_id in self.page_status and self.page_status.get(page_id) == PageStatus.CLOSED:
|
|
166
|
+
raise RuntimeError("Cannot connect a page that is already closed")
|
|
167
|
+
self.page_status[page_id] = PageStatus.CONNECTED
|
|
168
|
+
if self._last_kernel_cull_task:
|
|
169
|
+
logger.info("Cancelling previous kernel cull task for virtual kernel %s", self.id)
|
|
170
|
+
self._last_kernel_cull_task.cancel()
|
|
178
171
|
|
|
172
|
+
def _bump_kernel_cull(self):
|
|
179
173
|
async def kernel_cull():
|
|
180
174
|
try:
|
|
181
175
|
cull_timeout_sleep_seconds = solara.util.parse_timedelta(solara.server.settings.kernel.cull_timeout)
|
|
182
176
|
logger.info("Scheduling kernel cull, will wait for max %s before shutting down the virtual kernel %s", cull_timeout_sleep_seconds, self.id)
|
|
183
177
|
await asyncio.sleep(cull_timeout_sleep_seconds)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
178
|
+
logger.info("Timeout reached, checking if we should be shutting down virtual kernel %s", self.id)
|
|
179
|
+
with self.lock:
|
|
180
|
+
has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
|
|
181
|
+
if has_connected_pages:
|
|
182
|
+
logger.info("We have (re)connected pages, keeping the virtual kernel %s alive", self.id)
|
|
183
|
+
else:
|
|
184
|
+
logger.info("No connected pages, and timeout reached, shutting down virtual kernel %s", self.id)
|
|
185
|
+
self.close()
|
|
186
|
+
if current_event_loop is not None and future is not None:
|
|
187
|
+
current_event_loop.call_soon_threadsafe(future.set_result, None)
|
|
191
188
|
except asyncio.CancelledError:
|
|
192
|
-
if
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
189
|
+
if current_event_loop is not None and future is not None:
|
|
190
|
+
if sys.version_info >= (3, 9):
|
|
191
|
+
current_event_loop.call_soon_threadsafe(future.cancel, "cancelled because a new cull task was scheduled")
|
|
192
|
+
else:
|
|
193
|
+
current_event_loop.call_soon_threadsafe(future.cancel)
|
|
196
194
|
raise
|
|
197
195
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
#
|
|
196
|
+
async def create_task():
|
|
197
|
+
task = asyncio.create_task(kernel_cull())
|
|
198
|
+
# create a reference to the task so we can cancel it later
|
|
199
|
+
self._last_kernel_cull_task = task
|
|
200
|
+
await task
|
|
201
|
+
|
|
202
|
+
with self.lock:
|
|
203
|
+
future: "Optional[asyncio.Future[None]]" = None
|
|
204
|
+
current_event_loop: Optional[asyncio.AbstractEventLoop] = None
|
|
205
|
+
try:
|
|
206
|
+
future = asyncio.Future()
|
|
207
|
+
current_event_loop = asyncio.get_event_loop()
|
|
208
|
+
except RuntimeError:
|
|
209
|
+
pass
|
|
201
210
|
if self._last_kernel_cull_task:
|
|
211
|
+
logger.info("Cancelling previous kernel cull tas for virtual kernel %s", self.id)
|
|
202
212
|
self._last_kernel_cull_task.cancel()
|
|
203
213
|
|
|
204
|
-
|
|
205
|
-
task = asyncio.create_task(kernel_cull())
|
|
206
|
-
# create a reference to the task so we can cancel it later
|
|
207
|
-
self._last_kernel_cull_task = task
|
|
208
|
-
await task
|
|
209
|
-
|
|
214
|
+
logger.info("Scheduling kernel cull for virtual kernel %s", self.id)
|
|
210
215
|
asyncio.run_coroutine_threadsafe(create_task(), keep_alive_event_loop)
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
216
|
+
return future
|
|
217
|
+
|
|
218
|
+
def page_disconnect(self, page_id: str) -> "Optional[asyncio.Future[None]]":
|
|
219
|
+
"""Signal that a page has disconnected, and schedule a kernel cull if needed.
|
|
220
|
+
|
|
221
|
+
During the kernel reconnect window, we will keep the kernel alive, even if all pages have disconnected.
|
|
222
|
+
|
|
223
|
+
Will return a future that is set when the kernel cull is done, when an event loop is available.
|
|
224
|
+
The scheduled kernel cull can be cancelled when a new page connects, a new disconnect is scheduled,
|
|
225
|
+
or a page if explicitly closed.
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
logger.info("Disconnect page %s for kernel %s", page_id, self.id)
|
|
229
|
+
future: "asyncio.Future[None]" = asyncio.Future()
|
|
230
|
+
with self.lock:
|
|
231
|
+
if self.page_status[page_id] == PageStatus.CLOSED:
|
|
232
|
+
# this happens when the close beackon call happens before the websocket disconnect
|
|
233
|
+
logger.info("Page %s already closed for kernel %s", page_id, self.id)
|
|
234
|
+
future.set_result(None)
|
|
235
|
+
return future
|
|
236
|
+
assert self.page_status[page_id] == PageStatus.CONNECTED, "cannot disconnect a page that is in state: %r" % self.page_status[page_id]
|
|
237
|
+
self.page_status[page_id] = PageStatus.DISCONNECTED
|
|
238
|
+
has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
|
|
239
|
+
if not has_connected_pages:
|
|
240
|
+
# when we have no connected pages, we will schedule a kernel cull
|
|
241
|
+
future = self._bump_kernel_cull()
|
|
242
|
+
else:
|
|
243
|
+
logger.info("Still have connected pages, do nothing for kernel %s", self.id)
|
|
244
|
+
future.set_result(None)
|
|
245
|
+
return future
|
|
214
246
|
|
|
215
247
|
def page_close(self, page_id: str):
|
|
216
|
-
"""Signal that a page has closed,
|
|
248
|
+
"""Signal that a page has closed, close the context if needed and schedule a kernel cull if needed.
|
|
217
249
|
|
|
218
250
|
Closing the browser tab or a page navigation means an explicit close, which is
|
|
219
251
|
different from a websocket/page disconnect, which we might want to recover from.
|
|
220
252
|
|
|
221
253
|
"""
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
254
|
+
future: "Optional[asyncio.Future[None]]" = None
|
|
255
|
+
|
|
256
|
+
try:
|
|
257
|
+
future = asyncio.Future()
|
|
258
|
+
except RuntimeError:
|
|
259
|
+
pass
|
|
260
|
+
else:
|
|
261
|
+
future.set_result(None)
|
|
262
|
+
with self.lock:
|
|
263
|
+
if self.page_status[page_id] == PageStatus.CLOSED:
|
|
264
|
+
logger.info("Page %s already closed for kernel %s", page_id, self.id)
|
|
265
|
+
return
|
|
266
|
+
self.page_status[page_id] = PageStatus.CLOSED
|
|
267
|
+
logger.info("Close page %s for kernel %s", page_id, self.id)
|
|
268
|
+
has_connected_pages = PageStatus.CONNECTED in self.page_status.values()
|
|
269
|
+
has_disconnected_pages = PageStatus.DISCONNECTED in self.page_status.values()
|
|
270
|
+
# if we have disconnected pages, we may have cancelled the kernel cull task
|
|
271
|
+
# if we still have connected pages, it will go to a disconnected state again
|
|
272
|
+
# which will also trigger a new kernel cull
|
|
273
|
+
if has_disconnected_pages:
|
|
274
|
+
future = self._bump_kernel_cull()
|
|
275
|
+
if not (has_connected_pages or has_disconnected_pages):
|
|
276
|
+
logger.info("No connected or disconnected pages, shutting down virtual kernel %s", self.id)
|
|
277
|
+
self.close()
|
|
278
|
+
else:
|
|
279
|
+
logger.info("Still have connected or disconnected pages, keeping virtual kernel %s alive", self.id)
|
|
280
|
+
return future
|
|
231
281
|
|
|
232
282
|
|
|
233
283
|
try:
|
|
@@ -258,6 +258,13 @@ def process_kernel_messages(kernel: Kernel, msg: Dict) -> bool:
|
|
|
258
258
|
return False
|
|
259
259
|
|
|
260
260
|
|
|
261
|
+
def asset_directories():
|
|
262
|
+
application = [app.directory.parent / "assets" for app in app.apps.values()]
|
|
263
|
+
extra_paths = settings.assets.extra_paths()
|
|
264
|
+
solara_assets = solara_static.parent / "assets"
|
|
265
|
+
return [*application, *extra_paths, solara_assets]
|
|
266
|
+
|
|
267
|
+
|
|
261
268
|
def read_root(
|
|
262
269
|
path: str,
|
|
263
270
|
root_path: str = "",
|
|
@@ -292,10 +299,7 @@ def read_root(
|
|
|
292
299
|
directories = [default_app.directory.parent / "public"]
|
|
293
300
|
filename = path[len("/static/public/") :]
|
|
294
301
|
elif path.startswith("/static/assets/"):
|
|
295
|
-
directories =
|
|
296
|
-
default_app.directory.parent / "assets",
|
|
297
|
-
solara_static.parent / "assets",
|
|
298
|
-
]
|
|
302
|
+
directories = asset_directories()
|
|
299
303
|
filename = path[len("/static/assets/") :]
|
|
300
304
|
elif path.startswith("/static/"):
|
|
301
305
|
directories = [solara_static.parent / "static"]
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import importlib
|
|
2
3
|
import re
|
|
3
4
|
import site
|
|
4
5
|
import sys
|
|
@@ -6,7 +7,7 @@ import uuid
|
|
|
6
7
|
import warnings
|
|
7
8
|
from enum import Enum
|
|
8
9
|
from pathlib import Path
|
|
9
|
-
from typing import Optional
|
|
10
|
+
from typing import Optional, List
|
|
10
11
|
|
|
11
12
|
try:
|
|
12
13
|
from filelock import FileLock
|
|
@@ -79,6 +80,23 @@ class Assets(BaseSettings):
|
|
|
79
80
|
proxy_cache_dir: Path = Path(prefix + "/share/solara/cdn/")
|
|
80
81
|
fontawesome_enabled: bool = True
|
|
81
82
|
fontawesome_path: str = "/font-awesome@4.5.0/css/font-awesome.min.css"
|
|
83
|
+
extra_locations: List[str] = []
|
|
84
|
+
|
|
85
|
+
def extra_paths(self) -> List[Path]:
|
|
86
|
+
# translate locations (packages, directories) into list of paths
|
|
87
|
+
paths = []
|
|
88
|
+
for location in self.extra_locations:
|
|
89
|
+
if Path(location).exists():
|
|
90
|
+
paths.append(Path(location))
|
|
91
|
+
else:
|
|
92
|
+
try:
|
|
93
|
+
package = importlib.import_module(location)
|
|
94
|
+
except ModuleNotFoundError:
|
|
95
|
+
raise RuntimeError(f"Could not find {location} as a file or package (SOLARA_ASSETS_EXTRA_LOCATION={self.extra_locations!r}) ")
|
|
96
|
+
if not hasattr(package, "__path__"):
|
|
97
|
+
raise RuntimeError(f"{location} is not a package (SOLARA_ASSETS_EXTRA_LOCATION={self.extra_locations!r}) ")
|
|
98
|
+
paths.append(Path(package.__path__[0]))
|
|
99
|
+
return paths
|
|
82
100
|
|
|
83
101
|
class Config:
|
|
84
102
|
env_prefix = "solara_assets_"
|
|
@@ -213,3 +231,7 @@ if oauth.client_id:
|
|
|
213
231
|
# for the test accounts, this is fine
|
|
214
232
|
if session.https_only is None:
|
|
215
233
|
session.https_only = False
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
# call early so a misconfiguration fails early
|
|
237
|
+
assets.extra_paths()
|
|
@@ -311,8 +311,8 @@ async def _kernel_connection(ws: starlette.websockets.WebSocket):
|
|
|
311
311
|
def close(request: Request):
|
|
312
312
|
kernel_id = request.path_params["kernel_id"]
|
|
313
313
|
page_id = request.query_params["session_id"]
|
|
314
|
-
|
|
315
|
-
|
|
314
|
+
context = kernel_context.contexts.get(kernel_id, None)
|
|
315
|
+
if context is not None:
|
|
316
316
|
context.page_close(page_id)
|
|
317
317
|
response = HTMLResponse(content="", status_code=200)
|
|
318
318
|
return response
|
|
@@ -439,9 +439,8 @@ class StaticAssets(StaticFilesOptionalAuth):
|
|
|
439
439
|
) -> List[Union[str, "os.PathLike[str]"]]:
|
|
440
440
|
# we only know the .directory at runtime (after startup)
|
|
441
441
|
# which means we cannot pass the directory to the StaticFiles constructor
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
return cast(List[Union[str, "os.PathLike[str]"]], [*overrides, default])
|
|
442
|
+
directories = server.asset_directories()
|
|
443
|
+
return cast(List[Union[str, "os.PathLike[str]"]], directories)
|
|
445
444
|
|
|
446
445
|
|
|
447
446
|
class StaticCdn(StaticFilesOptionalAuth):
|
|
@@ -138,7 +138,9 @@ async function solaraInit(mountId, appName) {
|
|
|
138
138
|
});
|
|
139
139
|
|
|
140
140
|
window.addEventListener('solara.router', function (event) {
|
|
141
|
-
|
|
141
|
+
if(kernel.status == 'busy') {
|
|
142
|
+
app.$data.loadingPage = true;
|
|
143
|
+
}
|
|
142
144
|
});
|
|
143
145
|
kernel.statusChanged.connect(() => {
|
|
144
146
|
// the first idle after a loadingPage == true (a router event)
|
|
@@ -119,7 +119,7 @@ async def main():
|
|
|
119
119
|
]
|
|
120
120
|
for dep in requirements:
|
|
121
121
|
await micropip.install(dep, keep_going=True)
|
|
122
|
-
await micropip.install("/wheels/solara-1.
|
|
122
|
+
await micropip.install("/wheels/solara-1.32.1-py2.py3-none-any.whl", keep_going=True)
|
|
123
123
|
import solara
|
|
124
124
|
|
|
125
125
|
el = solara.Warning("lala")
|