solara-ui 1.45.0__py3-none-any.whl
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.
- prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
- prefix/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
- solara/__init__.py +124 -0
- solara/__main__.py +765 -0
- solara/_stores.py +297 -0
- solara/alias.py +6 -0
- solara/autorouting.py +555 -0
- solara/cache.py +305 -0
- solara/checks.html +71 -0
- solara/checks.py +227 -0
- solara/comm.py +28 -0
- solara/components/__init__.py +77 -0
- solara/components/alert.py +155 -0
- solara/components/applayout.py +397 -0
- solara/components/button.py +85 -0
- solara/components/card.py +87 -0
- solara/components/checkbox.py +50 -0
- solara/components/code_highlight_css.py +11 -0
- solara/components/code_highlight_css.vue +63 -0
- solara/components/columns.py +159 -0
- solara/components/component_vue.py +134 -0
- solara/components/cross_filter.py +335 -0
- solara/components/dataframe.py +546 -0
- solara/components/datatable.py +214 -0
- solara/components/datatable.vue +175 -0
- solara/components/details.py +56 -0
- solara/components/download.vue +35 -0
- solara/components/echarts.py +86 -0
- solara/components/echarts.vue +139 -0
- solara/components/figure_altair.py +39 -0
- solara/components/file_browser.py +181 -0
- solara/components/file_download.py +199 -0
- solara/components/file_drop.py +159 -0
- solara/components/file_drop.vue +83 -0
- solara/components/file_list_widget.vue +78 -0
- solara/components/head.py +27 -0
- solara/components/head_tag.py +49 -0
- solara/components/head_tag.vue +60 -0
- solara/components/image.py +173 -0
- solara/components/input.py +456 -0
- solara/components/input_text_area.py +86 -0
- solara/components/link.py +55 -0
- solara/components/markdown.py +441 -0
- solara/components/markdown_editor.py +33 -0
- solara/components/markdown_editor.vue +359 -0
- solara/components/matplotlib.py +74 -0
- solara/components/meta.py +47 -0
- solara/components/misc.py +333 -0
- solara/components/pivot_table.py +258 -0
- solara/components/pivot_table.vue +158 -0
- solara/components/progress.py +47 -0
- solara/components/select.py +182 -0
- solara/components/select.vue +27 -0
- solara/components/slider.py +442 -0
- solara/components/slider_date.vue +56 -0
- solara/components/spinner-solara.vue +105 -0
- solara/components/spinner.py +45 -0
- solara/components/sql_code.py +41 -0
- solara/components/sql_code.vue +125 -0
- solara/components/style.py +105 -0
- solara/components/switch.py +71 -0
- solara/components/tab_navigation.py +37 -0
- solara/components/title.py +90 -0
- solara/components/title.vue +38 -0
- solara/components/togglebuttons.py +200 -0
- solara/components/tooltip.py +61 -0
- solara/core.py +42 -0
- solara/datatypes.py +143 -0
- solara/express.py +241 -0
- solara/hooks/__init__.py +4 -0
- solara/hooks/dataframe.py +99 -0
- solara/hooks/misc.py +263 -0
- solara/hooks/use_reactive.py +151 -0
- solara/hooks/use_thread.py +129 -0
- solara/kitchensink.py +8 -0
- solara/lab/__init__.py +34 -0
- solara/lab/components/__init__.py +7 -0
- solara/lab/components/chat.py +215 -0
- solara/lab/components/confirmation_dialog.py +163 -0
- solara/lab/components/cross_filter.py +7 -0
- solara/lab/components/input_date.py +339 -0
- solara/lab/components/input_time.py +133 -0
- solara/lab/components/menu.py +181 -0
- solara/lab/components/menu.vue +38 -0
- solara/lab/components/tabs.py +274 -0
- solara/lab/components/theming.py +98 -0
- solara/lab/components/theming.vue +72 -0
- solara/lab/hooks/__init__.py +0 -0
- solara/lab/hooks/dataframe.py +2 -0
- solara/lab/toestand.py +3 -0
- solara/lab/utils/__init__.py +2 -0
- solara/lab/utils/cookies.py +5 -0
- solara/lab/utils/dataframe.py +165 -0
- solara/lab/utils/headers.py +5 -0
- solara/layout.py +44 -0
- solara/lifecycle.py +46 -0
- solara/minisettings.py +141 -0
- solara/py.typed +0 -0
- solara/reactive.py +99 -0
- solara/routing.py +268 -0
- solara/scope/__init__.py +88 -0
- solara/scope/types.py +55 -0
- solara/server/__init__.py +0 -0
- solara/server/app.py +527 -0
- solara/server/assets/custom.css +1 -0
- solara/server/assets/custom.js +1 -0
- solara/server/assets/favicon.png +0 -0
- solara/server/assets/favicon.svg +5 -0
- solara/server/assets/style.css +1681 -0
- solara/server/assets/theme-dark.css +437 -0
- solara/server/assets/theme-light.css +420 -0
- solara/server/assets/theme.js +3 -0
- solara/server/cdn_helper.py +91 -0
- solara/server/esm.py +71 -0
- solara/server/fastapi.py +5 -0
- solara/server/flask.py +297 -0
- solara/server/jupyter/__init__.py +2 -0
- solara/server/jupyter/cdn_handler.py +28 -0
- solara/server/jupyter/server_extension.py +40 -0
- solara/server/jupyter/solara.py +91 -0
- solara/server/jupytertools.py +46 -0
- solara/server/kernel.py +388 -0
- solara/server/kernel_context.py +467 -0
- solara/server/patch.py +564 -0
- solara/server/pyinstaller/__init__.py +9 -0
- solara/server/pyinstaller/hook-ipyreact.py +5 -0
- solara/server/pyinstaller/hook-ipyvuetify.py +5 -0
- solara/server/pyinstaller/hook-solara.py +9 -0
- solara/server/qt.py +113 -0
- solara/server/reload.py +251 -0
- solara/server/server.py +484 -0
- solara/server/settings.py +249 -0
- solara/server/shell.py +269 -0
- solara/server/starlette.py +770 -0
- solara/server/static/ansi.js +270 -0
- solara/server/static/highlight-dark.css +82 -0
- solara/server/static/highlight.css +43 -0
- solara/server/static/main-vuetify.js +272 -0
- solara/server/static/main.js +163 -0
- solara/server/static/solara_bootstrap.py +129 -0
- solara/server/static/sun.svg +23 -0
- solara/server/static/webworker.js +42 -0
- solara/server/telemetry.py +212 -0
- solara/server/templates/index.html.j2 +1 -0
- solara/server/templates/loader-plain.css +11 -0
- solara/server/templates/loader-plain.html +20 -0
- solara/server/templates/loader-solara.css +111 -0
- solara/server/templates/loader-solara.html +40 -0
- solara/server/templates/plain.html +82 -0
- solara/server/templates/solara.html.j2 +486 -0
- solara/server/threaded.py +84 -0
- solara/server/utils.py +44 -0
- solara/server/websocket.py +45 -0
- solara/settings.py +86 -0
- solara/tasks.py +893 -0
- solara/template/button.py +16 -0
- solara/template/markdown.py +42 -0
- solara/template/portal/.flake8 +6 -0
- solara/template/portal/.pre-commit-config.yaml +28 -0
- solara/template/portal/LICENSE +21 -0
- solara/template/portal/Procfile +7 -0
- solara/template/portal/mypy.ini +3 -0
- solara/template/portal/pyproject.toml +26 -0
- solara/template/portal/solara_portal/__init__.py +4 -0
- solara/template/portal/solara_portal/components/__init__.py +2 -0
- solara/template/portal/solara_portal/components/article.py +28 -0
- solara/template/portal/solara_portal/components/data.py +28 -0
- solara/template/portal/solara_portal/components/header.py +6 -0
- solara/template/portal/solara_portal/components/layout.py +6 -0
- solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
- solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
- solara/template/portal/solara_portal/data.py +60 -0
- solara/template/portal/solara_portal/pages/__init__.py +67 -0
- solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
- solara/template/portal/solara_portal/pages/tabular.py +29 -0
- solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
- solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
- solara/test/__init__.py +0 -0
- solara/test/pytest_plugin.py +783 -0
- solara/toestand.py +998 -0
- solara/util.py +348 -0
- solara/validate_hooks.py +258 -0
- solara/website/__init__.py +0 -0
- solara/website/assets/custom.css +444 -0
- solara/website/assets/images/logo-small.png +0 -0
- solara/website/assets/images/logo.svg +17 -0
- solara/website/assets/images/logo_white.svg +50 -0
- solara/website/assets/theme.js +8 -0
- solara/website/components/__init__.py +5 -0
- solara/website/components/algolia.py +6 -0
- solara/website/components/algolia.vue +24 -0
- solara/website/components/algolia_api.vue +202 -0
- solara/website/components/breadcrumbs.py +28 -0
- solara/website/components/contact.py +144 -0
- solara/website/components/docs.py +143 -0
- solara/website/components/header.py +75 -0
- solara/website/components/mailchimp.py +12 -0
- solara/website/components/mailchimp.vue +47 -0
- solara/website/components/markdown.py +99 -0
- solara/website/components/markdown_nav.vue +34 -0
- solara/website/components/notebook.py +171 -0
- solara/website/components/sidebar.py +105 -0
- solara/website/pages/__init__.py +370 -0
- solara/website/pages/about/__init__.py +9 -0
- solara/website/pages/about/about.md +3 -0
- solara/website/pages/apps/__init__.py +16 -0
- solara/website/pages/apps/authorization/__init__.py +119 -0
- solara/website/pages/apps/authorization/admin.py +12 -0
- solara/website/pages/apps/authorization/users.py +12 -0
- solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
- solara/website/pages/apps/layout-demo.py +40 -0
- solara/website/pages/apps/multipage/__init__.py +38 -0
- solara/website/pages/apps/multipage/page1.py +26 -0
- solara/website/pages/apps/multipage/page2.py +34 -0
- solara/website/pages/apps/scatter.py +136 -0
- solara/website/pages/apps/scrolling.py +63 -0
- solara/website/pages/apps/tutorial-streamlit.py +18 -0
- solara/website/pages/careers/__init__.py +27 -0
- solara/website/pages/changelog/__init__.py +10 -0
- solara/website/pages/changelog/changelog.md +372 -0
- solara/website/pages/contact/__init__.py +34 -0
- solara/website/pages/doc_use_download.py +85 -0
- solara/website/pages/documentation/__init__.py +90 -0
- solara/website/pages/documentation/advanced/__init__.py +9 -0
- solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
- solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
- solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
- solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
- solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +417 -0
- solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
- solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +50 -0
- solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
- solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
- solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
- solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +72 -0
- solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
- solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
- solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
- solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
- solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
- solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
- solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
- solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
- solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
- solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
- solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
- solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +192 -0
- solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
- solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
- solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +256 -0
- solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +108 -0
- solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
- solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +7 -0
- solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +187 -0
- solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
- solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
- solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
- solara/website/pages/documentation/api/__init__.py +19 -0
- solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
- solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +22 -0
- solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +20 -0
- solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +20 -0
- solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +20 -0
- solara/website/pages/documentation/api/hooks/__init__.py +9 -0
- solara/website/pages/documentation/api/hooks/use_cross_filter.py +23 -0
- solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
- solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
- solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
- solara/website/pages/documentation/api/hooks/use_exception.py +31 -0
- solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
- solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
- solara/website/pages/documentation/api/hooks/use_previous.py +30 -0
- solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
- solara/website/pages/documentation/api/hooks/use_state.py +10 -0
- solara/website/pages/documentation/api/hooks/use_state_or_update.py +66 -0
- solara/website/pages/documentation/api/hooks/use_thread.md +64 -0
- solara/website/pages/documentation/api/hooks/use_thread.py +42 -0
- solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
- solara/website/pages/documentation/api/routing/__init__.py +9 -0
- solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
- solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
- solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
- solara/website/pages/documentation/api/routing/route.py +29 -0
- solara/website/pages/documentation/api/routing/use_route.py +76 -0
- solara/website/pages/documentation/api/routing/use_router.py +16 -0
- solara/website/pages/documentation/api/utilities/__init__.py +9 -0
- solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
- solara/website/pages/documentation/api/utilities/computed.py +16 -0
- solara/website/pages/documentation/api/utilities/display.py +16 -0
- solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
- solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
- solara/website/pages/documentation/api/utilities/memoize.py +35 -0
- solara/website/pages/documentation/api/utilities/on_kernel_start.py +44 -0
- solara/website/pages/documentation/api/utilities/reactive.py +16 -0
- solara/website/pages/documentation/api/utilities/widget.py +104 -0
- solara/website/pages/documentation/components/__init__.py +12 -0
- solara/website/pages/documentation/components/advanced/__init__.py +9 -0
- solara/website/pages/documentation/components/advanced/link.py +25 -0
- solara/website/pages/documentation/components/advanced/meta.py +17 -0
- solara/website/pages/documentation/components/advanced/style.py +43 -0
- solara/website/pages/documentation/components/common.py +9 -0
- solara/website/pages/documentation/components/data/__init__.py +9 -0
- solara/website/pages/documentation/components/data/dataframe.py +44 -0
- solara/website/pages/documentation/components/data/pivot_table.py +81 -0
- solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
- solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
- solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
- solara/website/pages/documentation/components/input/__init__.py +9 -0
- solara/website/pages/documentation/components/input/button.py +23 -0
- solara/website/pages/documentation/components/input/checkbox.py +10 -0
- solara/website/pages/documentation/components/input/file_browser.py +30 -0
- solara/website/pages/documentation/components/input/file_drop.py +76 -0
- solara/website/pages/documentation/components/input/input.py +43 -0
- solara/website/pages/documentation/components/input/select.py +22 -0
- solara/website/pages/documentation/components/input/slider.py +29 -0
- solara/website/pages/documentation/components/input/switch.py +10 -0
- solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
- solara/website/pages/documentation/components/lab/__init__.py +9 -0
- solara/website/pages/documentation/components/lab/chat.py +109 -0
- solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
- solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
- solara/website/pages/documentation/components/lab/input_date.py +20 -0
- solara/website/pages/documentation/components/lab/input_time.py +15 -0
- solara/website/pages/documentation/components/lab/menu.py +22 -0
- solara/website/pages/documentation/components/lab/tab.py +25 -0
- solara/website/pages/documentation/components/lab/tabs.py +45 -0
- solara/website/pages/documentation/components/lab/task.py +11 -0
- solara/website/pages/documentation/components/lab/theming.py +74 -0
- solara/website/pages/documentation/components/lab/use_task.py +11 -0
- solara/website/pages/documentation/components/layout/__init__.py +9 -0
- solara/website/pages/documentation/components/layout/app_bar.py +16 -0
- solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
- solara/website/pages/documentation/components/layout/app_layout.py +24 -0
- solara/website/pages/documentation/components/layout/card.py +15 -0
- solara/website/pages/documentation/components/layout/card_actions.py +16 -0
- solara/website/pages/documentation/components/layout/column.py +30 -0
- solara/website/pages/documentation/components/layout/columns.py +27 -0
- solara/website/pages/documentation/components/layout/columns_responsive.py +66 -0
- solara/website/pages/documentation/components/layout/details.py +13 -0
- solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
- solara/website/pages/documentation/components/layout/gridfixed.py +19 -0
- solara/website/pages/documentation/components/layout/hbox.py +18 -0
- solara/website/pages/documentation/components/layout/row.py +30 -0
- solara/website/pages/documentation/components/layout/sidebar.py +24 -0
- solara/website/pages/documentation/components/layout/vbox.py +19 -0
- solara/website/pages/documentation/components/output/__init__.py +9 -0
- solara/website/pages/documentation/components/output/file_download.py +11 -0
- solara/website/pages/documentation/components/output/html.py +19 -0
- solara/website/pages/documentation/components/output/image.py +11 -0
- solara/website/pages/documentation/components/output/markdown.py +57 -0
- solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
- solara/website/pages/documentation/components/output/sql_code.py +83 -0
- solara/website/pages/documentation/components/output/tooltip.py +11 -0
- solara/website/pages/documentation/components/page/__init__.py +9 -0
- solara/website/pages/documentation/components/page/head.py +15 -0
- solara/website/pages/documentation/components/page/title.py +25 -0
- solara/website/pages/documentation/components/status/__init__.py +9 -0
- solara/website/pages/documentation/components/status/error.py +39 -0
- solara/website/pages/documentation/components/status/info.py +39 -0
- solara/website/pages/documentation/components/status/progress.py +10 -0
- solara/website/pages/documentation/components/status/spinner.py +11 -0
- solara/website/pages/documentation/components/status/success.py +40 -0
- solara/website/pages/documentation/components/status/warning.py +47 -0
- solara/website/pages/documentation/components/viz/__init__.py +9 -0
- solara/website/pages/documentation/components/viz/altair.py +42 -0
- solara/website/pages/documentation/components/viz/echarts.py +77 -0
- solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
- solara/website/pages/documentation/components/viz/plotly.py +63 -0
- solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
- solara/website/pages/documentation/examples/__init__.py +54 -0
- solara/website/pages/documentation/examples/ai/__init__.py +11 -0
- solara/website/pages/documentation/examples/ai/chatbot.py +113 -0
- solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
- solara/website/pages/documentation/examples/basics/__init__.py +10 -0
- solara/website/pages/documentation/examples/basics/sine.py +28 -0
- solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
- solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
- solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
- solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
- solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
- solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
- solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
- solara/website/pages/documentation/examples/general/__init__.py +10 -0
- solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
- solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
- solara/website/pages/documentation/examples/general/live_update.py +32 -0
- solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
- solara/website/pages/documentation/examples/general/mycard.vue +58 -0
- solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
- solara/website/pages/documentation/examples/general/vue_component.py +50 -0
- solara/website/pages/documentation/examples/ipycanvas.py +49 -0
- solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
- solara/website/pages/documentation/examples/libraries/altair.py +65 -0
- solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
- solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
- solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
- solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
- solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
- solara/website/pages/documentation/examples/utilities/countdown_timer.py +62 -0
- solara/website/pages/documentation/examples/utilities/todo.py +196 -0
- solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
- solara/website/pages/documentation/examples/visualization/annotator.py +67 -0
- solara/website/pages/documentation/examples/visualization/linked_views.py +81 -0
- solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
- solara/website/pages/documentation/faq/__init__.py +12 -0
- solara/website/pages/documentation/faq/content/99-faq.md +112 -0
- solara/website/pages/documentation/getting_started/__init__.py +9 -0
- solara/website/pages/documentation/getting_started/content/00-quickstart.md +107 -0
- solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
- solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +65 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
- solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1021 -0
- solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
- solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +228 -0
- solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +278 -0
- solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
- solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +305 -0
- solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
- solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
- solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
- solara/website/pages/docutils.py +38 -0
- solara/website/pages/home.vue +1199 -0
- solara/website/pages/our_team/__init__.py +83 -0
- solara/website/pages/pricing/__init__.py +31 -0
- solara/website/pages/roadmap/__init__.py +11 -0
- solara/website/pages/roadmap/roadmap.md +47 -0
- solara/website/pages/scale_ipywidgets.py +45 -0
- solara/website/pages/showcase/__init__.py +105 -0
- solara/website/pages/showcase/domino_code_assist.py +60 -0
- solara/website/pages/showcase/planeto_tessa.py +19 -0
- solara/website/pages/showcase/solara_dev.py +54 -0
- solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
- solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
- solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
- solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
- solara/website/pages/showcase/wanderlust.py +27 -0
- solara/website/public/beach.jpeg +0 -0
- solara/website/public/logo.svg +6 -0
- solara/website/public/social/discord.svg +1 -0
- solara/website/public/social/github.svg +1 -0
- solara/website/public/social/twitter.svg +3 -0
- solara/website/public/success.html +25 -0
- solara/website/templates/index.html.j2 +117 -0
- solara/website/utils.py +51 -0
- solara/widgets/__init__.py +1 -0
- solara/widgets/vue/gridlayout.vue +107 -0
- solara/widgets/vue/html.vue +4 -0
- solara/widgets/vue/navigator.vue +134 -0
- solara/widgets/vue/vegalite.vue +130 -0
- solara/widgets/widgets.py +74 -0
- solara_ui-1.45.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
- solara_ui-1.45.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
- solara_ui-1.45.0.dist-info/METADATA +162 -0
- solara_ui-1.45.0.dist-info/RECORD +464 -0
- solara_ui-1.45.0.dist-info/WHEEL +4 -0
- solara_ui-1.45.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# on_kernel_start
|
|
3
|
+
|
|
4
|
+
Run a function when a virtual kernel (re)starts and optionally run a cleanup function on shutdown.
|
|
5
|
+
|
|
6
|
+
```python
|
|
7
|
+
def on_kernel_start(f: Callable[[], Optional[Callable[[], None]]]) -> Callable[[], None]:
|
|
8
|
+
...
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`f` will be called on each virtual kernel (re)start. This (usually) happens each time a browser tab connects to the server
|
|
12
|
+
[see solara server for more details](https://solara.dev/docs/understanding/solara-server).
|
|
13
|
+
The (optional) function returned by `f` will be called on kernel shutdown.
|
|
14
|
+
|
|
15
|
+
Note that the cleanup functions are called in reverse order with respect to the order in which they were registered
|
|
16
|
+
(e.g. the cleanup function of the last call to `on_kernel_start` will be called first on kernel shutdown).
|
|
17
|
+
|
|
18
|
+
The return value of on_kernel_start is a cleanup function that will remove the callback from the list of callbacks to be called on kernel start.
|
|
19
|
+
|
|
20
|
+
During hot reload, the callbacks that are added from scripts or modules that will be reloaded will be removed before the app is loaded
|
|
21
|
+
again. This can cause the order of the callbacks to be different than at first run.
|
|
22
|
+
|
|
23
|
+
## Example
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
import solara
|
|
27
|
+
import solara.lab
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@solara.lab.on_kernel_start
|
|
31
|
+
def on_kernel_start():
|
|
32
|
+
id = solara.get_kernel_id()
|
|
33
|
+
print("Kernel started", id)
|
|
34
|
+
def cleanup():
|
|
35
|
+
print("Kernel stopped", id)
|
|
36
|
+
return cleanup # this function will be called on kernel shutdown
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
from solara.website.components import NoPage
|
|
42
|
+
|
|
43
|
+
title = "on_kernel_start"
|
|
44
|
+
Page = NoPage
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
# Component.widget
|
|
4
|
+
|
|
5
|
+
Create a classic ipywidget from a component.
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
def widget(self, **kwargs):
|
|
9
|
+
...
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
This will create a widget from the component. The widget will be a
|
|
14
|
+
subclass of `ipywidgets.VBox` and `ipywidgets.ValueWidget`.
|
|
15
|
+
|
|
16
|
+
Example
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
import solara
|
|
20
|
+
widget = solara.FileDownload.widget(data="some text data", filename="solara-demo.txt")
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This is very useful if you are migrating your application from a classic
|
|
24
|
+
ipywidget to solara. See [also the ipywidgets tutorial](/documentation/getting_started/tutorials/ipywidgets).
|
|
25
|
+
|
|
26
|
+
The `ipywidgets.ValueWidget` is used to enable the use of the widget in
|
|
27
|
+
interact, or interactive. The `ipywidgets.VBox` is used to enable
|
|
28
|
+
nesting of widgets.
|
|
29
|
+
|
|
30
|
+
All keyword arguments will be passed to the component.
|
|
31
|
+
Each argument pair of `on_<name>` and `<name>` will
|
|
32
|
+
be added as a trait in the widget.
|
|
33
|
+
|
|
34
|
+
For example,
|
|
35
|
+
|
|
36
|
+
```solara
|
|
37
|
+
import solara
|
|
38
|
+
import ipywidgets as widgets
|
|
39
|
+
import random
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
countries_demo_data = {
|
|
43
|
+
"Netherlands": ["Amsterdam", "Rotterdam", "The Hague"],
|
|
44
|
+
"Germany": ["Berlin", "Hamburg", "Munich"],
|
|
45
|
+
"France": ["Paris", "Marseille", "Lyon"],
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# this component can be used in a component three, but ...
|
|
50
|
+
@solara.component
|
|
51
|
+
def LocationSelect(value, on_value, countries=countries_demo_data):
|
|
52
|
+
country, city = value
|
|
53
|
+
cities = countries.get(country, [])
|
|
54
|
+
# reset to None if not in the list of countries
|
|
55
|
+
if city not in cities:
|
|
56
|
+
city = None
|
|
57
|
+
# update the state if we changed/reset city
|
|
58
|
+
on_value((country, city))
|
|
59
|
+
|
|
60
|
+
with solara.Card("Location"):
|
|
61
|
+
solara.Select(label="country",
|
|
62
|
+
values=list(countries),
|
|
63
|
+
value=country,
|
|
64
|
+
on_value=lambda country: on_value((country, city)),
|
|
65
|
+
)
|
|
66
|
+
solara.Select(label="city",
|
|
67
|
+
values=cities,
|
|
68
|
+
value=city,
|
|
69
|
+
on_value=lambda city: on_value((country, city)),
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Using .widget(...) we can create a widget from it.
|
|
74
|
+
# For use with interact:
|
|
75
|
+
@widgets.interact(location=LocationSelect.widget(value=("Netherlands", "Amsterdam")))
|
|
76
|
+
def f(size=3.4, location=None):
|
|
77
|
+
print(size, location)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# Or to add to your VBox:
|
|
81
|
+
widgets.VBox(
|
|
82
|
+
[LocationSelect.widget(value=("Netherlands", "Amsterdam"))]
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# this is how you'd use it as a component
|
|
86
|
+
@solara.component
|
|
87
|
+
def Page():
|
|
88
|
+
value, set_value = solara.use_state(("Netherlands", "Amsterdam"))
|
|
89
|
+
def pick():
|
|
90
|
+
country = random.choice(list(countries_demo_data))
|
|
91
|
+
city = random.choice(countries_demo_data[country])
|
|
92
|
+
set_value((country, city))
|
|
93
|
+
|
|
94
|
+
LocationSelect(value=value, on_value=set_value)
|
|
95
|
+
solara.Button("Pick random place", on_click=pick)
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
from solara.website.components import NoPage
|
|
102
|
+
|
|
103
|
+
Page = NoPage
|
|
104
|
+
title = "widget"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""# Link"""
|
|
2
|
+
|
|
3
|
+
import solara
|
|
4
|
+
from solara.website.utils import apidoc
|
|
5
|
+
|
|
6
|
+
routes = [
|
|
7
|
+
solara.Route(path="/"),
|
|
8
|
+
solara.Route(path="kiwi"),
|
|
9
|
+
solara.Route(path="banana"),
|
|
10
|
+
solara.Route(path="apple"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@solara.component
|
|
15
|
+
def Page():
|
|
16
|
+
route_current, routes = solara.use_route()
|
|
17
|
+
solara.Info("Note the address bar in the browser. It should change to the path of the link.")
|
|
18
|
+
with solara.Row():
|
|
19
|
+
for route in routes:
|
|
20
|
+
with solara.Link(route):
|
|
21
|
+
current = route_current is route
|
|
22
|
+
solara.Button(f"Go to {route.path}", color="red" if current else None)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
__doc__ += apidoc(solara.Link.f) # type: ignore
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""# Meta"""
|
|
2
|
+
|
|
3
|
+
import solara
|
|
4
|
+
from solara.website.utils import apidoc
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@solara.component
|
|
8
|
+
def Page():
|
|
9
|
+
solara.Info("Nothing to see here, only in this page's source code, or by looking at the google search results for this page.")
|
|
10
|
+
with solara.Head():
|
|
11
|
+
solara.Meta(
|
|
12
|
+
name="description",
|
|
13
|
+
content="The Meta component can be used to set the description of a page. This is useful for SEO, or crawlers that index your page.",
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__doc__ += apidoc(solara.Meta.f) # type: ignore
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Style
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
from solara.website.utils import apidoc
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@solara.component
|
|
11
|
+
def Page():
|
|
12
|
+
insert_css, set_insert_css = solara.use_state(True)
|
|
13
|
+
|
|
14
|
+
css = """
|
|
15
|
+
.mybutton {
|
|
16
|
+
font-family: Serif;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* this selector has to be very specific to override the vuetify style */
|
|
20
|
+
.v-btn.mybutton {
|
|
21
|
+
color: #4CAF50; /* Green */
|
|
22
|
+
}
|
|
23
|
+
/* vuetify's background color css has very high CSS-specificity, so we use !important */
|
|
24
|
+
.mybutton {
|
|
25
|
+
background-color: #FF9800 !important; /* Orange */
|
|
26
|
+
}
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
solara.Checkbox(label="Use CSS", value=insert_css, on_value=set_insert_css)
|
|
30
|
+
solara.Markdown(
|
|
31
|
+
f"""
|
|
32
|
+
## CSS Example that styles the button below
|
|
33
|
+
```css
|
|
34
|
+
{css}
|
|
35
|
+
```
|
|
36
|
+
"""
|
|
37
|
+
)
|
|
38
|
+
if insert_css:
|
|
39
|
+
solara.Style(css)
|
|
40
|
+
solara.Button(label="Advanced users might want to style this", icon_name="mdi-thumb-up", classes=["mybutton"])
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
__doc__ += apidoc(solara.Style.f) # type: ignore
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# DataFrame
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import Any, Dict, Optional, cast
|
|
7
|
+
|
|
8
|
+
import plotly
|
|
9
|
+
|
|
10
|
+
import solara
|
|
11
|
+
from solara.website.utils import apidoc
|
|
12
|
+
|
|
13
|
+
df = plotly.data.iris()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@solara.component
|
|
17
|
+
def Page():
|
|
18
|
+
column, set_column = solara.use_state(cast(Optional[str], None))
|
|
19
|
+
cell, set_cell = solara.use_state(cast(Dict[str, Any], {}))
|
|
20
|
+
|
|
21
|
+
def on_action_column(column):
|
|
22
|
+
set_column(column)
|
|
23
|
+
|
|
24
|
+
def on_action_cell(column, row_index):
|
|
25
|
+
set_cell(dict(column=column, row_index=row_index))
|
|
26
|
+
|
|
27
|
+
column_actions = [solara.ColumnAction(icon="mdi-sunglasses", name="User column action", on_click=on_action_column)]
|
|
28
|
+
cell_actions = [solara.CellAction(icon="mdi-white-balance-sunny", name="User cell action", on_click=on_action_cell)]
|
|
29
|
+
solara.Markdown(
|
|
30
|
+
f"""
|
|
31
|
+
## Demo
|
|
32
|
+
|
|
33
|
+
Below we show display the titanic dataset, and demonstrate a user column and cell action. Try clicking on the triple icon when hovering
|
|
34
|
+
above a column or cell. And see the following values changes:
|
|
35
|
+
|
|
36
|
+
* Column action on: `{column}`
|
|
37
|
+
* Cell action on: `{cell}`
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
)
|
|
41
|
+
solara.DataFrame(df, column_actions=column_actions, cell_actions=cell_actions)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
__doc__ += apidoc(solara.DataFrame.f) # type: ignore
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# PivotTable
|
|
3
|
+
|
|
4
|
+
Interactive [Pivot Table](https://en.wikipedia.org/wiki/Pivot_table) showing aggregated data in groups.
|
|
5
|
+
|
|
6
|
+
We provide three version of the pivot table
|
|
7
|
+
|
|
8
|
+
* PivotTableView: Takes already aggregated data as input
|
|
9
|
+
* PivotTable: Takes a dataframe as input and aggregates it for you.
|
|
10
|
+
* PivotTableCard: Similar to PivotTable but with a card layout, and configuration options.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import solara
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
import vaex.datasets
|
|
18
|
+
|
|
19
|
+
df = vaex.datasets.titanic()
|
|
20
|
+
except Exception:
|
|
21
|
+
df = None
|
|
22
|
+
vaex = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@solara.component
|
|
26
|
+
def View():
|
|
27
|
+
# select on the 2nd x axis, index=3, which means (pclass=2, survived=true)
|
|
28
|
+
# Note: the indices refer to the header_x and header_y
|
|
29
|
+
selected, on_selected = solara.use_state({"x": [1, 3]})
|
|
30
|
+
data = solara.PivotTableData(
|
|
31
|
+
{
|
|
32
|
+
"x": ["pclass", "survived"],
|
|
33
|
+
"y": ["sex"],
|
|
34
|
+
"agg": "count",
|
|
35
|
+
"values": [["5", "118"], ["139", "61"], ["12", "146"], ["94", "25"], ["110", "418"], ["106", "75"]],
|
|
36
|
+
"values_x": ["123", "200", "158", "119", "528", "181"],
|
|
37
|
+
"values_y": ["466", "843"],
|
|
38
|
+
"headers_x": [["1", "1", "2", "2", "3", "3"], ["false", "true", "false", "true", "false", "true"]],
|
|
39
|
+
"headers_y": [["female", "male"]],
|
|
40
|
+
"counts_x": 6,
|
|
41
|
+
"counts_y": 2,
|
|
42
|
+
"total": "1,309",
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
with solara.VBox() as main:
|
|
46
|
+
solara.Markdown(f"`selected = {selected}`")
|
|
47
|
+
solara.PivotTableView(data=data, selected=selected, on_selected=on_selected)
|
|
48
|
+
return main
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@solara.component
|
|
52
|
+
def Page():
|
|
53
|
+
if vaex is None:
|
|
54
|
+
return solara.Markdown("This example requires vaex, please install it with `pip install vaex`")
|
|
55
|
+
with solara.Div() as main:
|
|
56
|
+
solara.Markdown("# Titanic")
|
|
57
|
+
selected, on_selected = solara.use_state({"x": [0, 0]}) # noqa: SH101
|
|
58
|
+
solara.provide_cross_filter()
|
|
59
|
+
with solara.VBox():
|
|
60
|
+
type, set_type = solara.use_state("view") # noqa: SH101
|
|
61
|
+
with solara.ToggleButtonsSingle(type, on_value=set_type):
|
|
62
|
+
solara.Button("PivotTableView", value="view")
|
|
63
|
+
solara.Button("PivotTable", value="df")
|
|
64
|
+
solara.Button("PivotTableCard", value="card")
|
|
65
|
+
if type == "view":
|
|
66
|
+
solara.Markdown("# PivotTableView\nThis component will take aggregates data as input")
|
|
67
|
+
View()
|
|
68
|
+
elif type == "df":
|
|
69
|
+
solara.Markdown("# PivotTable\nThis component aggregates the dataframe for you")
|
|
70
|
+
solara.Markdown(f"`selected = {selected}`")
|
|
71
|
+
solara.PivotTable(df, ["pclass"], ["sex"], selected=selected, on_selected=on_selected)
|
|
72
|
+
elif type == "card":
|
|
73
|
+
solara.Markdown("# PivotTable\nThis component aggregates the dataframe for you, and gives a UI to configure the component")
|
|
74
|
+
solara.Markdown(f"`selected = {selected}`")
|
|
75
|
+
solara.PivotTableCard(df, ["pclass"], ["sex"], selected=selected, on_selected=on_selected)
|
|
76
|
+
return main
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
Component = Page
|
|
80
|
+
App = Component
|
|
81
|
+
app = Page()
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Avatar
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from types import ModuleType
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
auth: Optional[ModuleType]
|
|
10
|
+
try:
|
|
11
|
+
from solara_enterprise import auth
|
|
12
|
+
except ImportError:
|
|
13
|
+
auth = None
|
|
14
|
+
from solara.website.components import NoPage
|
|
15
|
+
from solara.website.utils import apidoc
|
|
16
|
+
|
|
17
|
+
title = "Avatar"
|
|
18
|
+
|
|
19
|
+
Page = NoPage
|
|
20
|
+
|
|
21
|
+
if auth:
|
|
22
|
+
__doc__ += apidoc(auth.Avatar.f) # type: ignore
|
|
23
|
+
else:
|
|
24
|
+
__doc__ += "solara-enterprise not installed."
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# AvatarMenu
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from types import ModuleType
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
auth: Optional[ModuleType]
|
|
10
|
+
try:
|
|
11
|
+
from solara_enterprise import auth
|
|
12
|
+
except ImportError:
|
|
13
|
+
auth = None
|
|
14
|
+
from solara.website.components import NoPage
|
|
15
|
+
from solara.website.utils import apidoc
|
|
16
|
+
|
|
17
|
+
title = "AvatarMenu"
|
|
18
|
+
|
|
19
|
+
Page = NoPage
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if auth:
|
|
23
|
+
__doc__ += apidoc(auth.AvatarMenu.f) # type: ignore
|
|
24
|
+
else:
|
|
25
|
+
__doc__ += "solara-enterprise not installed."
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Button
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
from solara.website.utils import apidoc
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@solara.component
|
|
11
|
+
def Page():
|
|
12
|
+
count, set_count = solara.use_state(0)
|
|
13
|
+
|
|
14
|
+
def increment():
|
|
15
|
+
set_count(count + 1)
|
|
16
|
+
|
|
17
|
+
with solara.VBox() as main:
|
|
18
|
+
with solara.HBox():
|
|
19
|
+
solara.Button(label=f"Clicked {count} times", on_click=increment, icon_name="mdi-thumb-up")
|
|
20
|
+
return main
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
__doc__ += apidoc(solara.Button.f) # type: ignore
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""# FileBrowser"""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Optional, cast
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
from solara.website.utils import apidoc
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@solara.component
|
|
11
|
+
def Page():
|
|
12
|
+
file, set_file = solara.use_state(cast(Optional[Path], None))
|
|
13
|
+
path, set_path = solara.use_state(cast(Optional[Path], None))
|
|
14
|
+
directory, set_directory = solara.use_state(Path("~").expanduser())
|
|
15
|
+
|
|
16
|
+
can_select = solara.ui_checkbox("Enable select")
|
|
17
|
+
|
|
18
|
+
def reset_path():
|
|
19
|
+
set_path(None)
|
|
20
|
+
set_file(None)
|
|
21
|
+
|
|
22
|
+
# reset path and file when can_select changes
|
|
23
|
+
solara.use_memo(reset_path, [can_select])
|
|
24
|
+
solara.FileBrowser(directory, on_directory_change=set_directory, on_path_select=set_path, on_file_open=set_file, can_select=can_select)
|
|
25
|
+
solara.Info(f"You are in directory: {directory}")
|
|
26
|
+
solara.Info(f"You selected path: {path}")
|
|
27
|
+
solara.Info(f"You opened file: {file}")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__doc__ += apidoc(solara.FileBrowser.f) # type: ignore
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# FileDrop components
|
|
3
|
+
|
|
4
|
+
FileDrop comes in two flavours:
|
|
5
|
+
|
|
6
|
+
* `FileDrop` for a single file upload
|
|
7
|
+
* `FileDropMultiple` which allows for multiple file upload
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import textwrap
|
|
13
|
+
from typing import List, cast
|
|
14
|
+
|
|
15
|
+
import solara
|
|
16
|
+
from solara.components.file_drop import FileInfo
|
|
17
|
+
from solara.website.utils import apidoc
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@solara.component
|
|
21
|
+
def FileDropMultipleDemo():
|
|
22
|
+
content, set_content = solara.use_state(cast(List[bytes], []))
|
|
23
|
+
filename, set_filename = solara.use_state(cast(List[str], []))
|
|
24
|
+
size, set_size = solara.use_state(cast(List[int], []))
|
|
25
|
+
|
|
26
|
+
def on_file(files: List[FileInfo]):
|
|
27
|
+
set_filename([f["name"] for f in files])
|
|
28
|
+
set_size([f["size"] for f in files])
|
|
29
|
+
set_content([f["file_obj"].read(100) for f in files])
|
|
30
|
+
|
|
31
|
+
solara.FileDropMultiple(
|
|
32
|
+
label="Drag and drop files(s) here to read the first 100 bytes.",
|
|
33
|
+
on_file=on_file,
|
|
34
|
+
lazy=True, # We will only read the first 100 bytes
|
|
35
|
+
)
|
|
36
|
+
if content:
|
|
37
|
+
solara.Info(f"Number of uploaded files: {len(filename)}")
|
|
38
|
+
for f, s, c in zip(filename, size, content):
|
|
39
|
+
solara.Info(f"File {f} has total length: {s}\n, first 100 bytes:")
|
|
40
|
+
solara.Preformatted("\n".join(textwrap.wrap(repr(c))))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@solara.component
|
|
44
|
+
def FileDropDemo():
|
|
45
|
+
content, set_content = solara.use_state(b"")
|
|
46
|
+
filename, set_filename = solara.use_state("")
|
|
47
|
+
size, set_size = solara.use_state(0)
|
|
48
|
+
|
|
49
|
+
def on_file(f: FileInfo):
|
|
50
|
+
set_filename(f["name"])
|
|
51
|
+
set_size(f["size"])
|
|
52
|
+
set_content(f["file_obj"].read(100))
|
|
53
|
+
|
|
54
|
+
solara.FileDrop(
|
|
55
|
+
label="Drag and drop a file here to read the first 100 bytes.",
|
|
56
|
+
on_file=on_file,
|
|
57
|
+
lazy=True, # We will only read the first 100 bytes
|
|
58
|
+
)
|
|
59
|
+
if content:
|
|
60
|
+
solara.Info(f"File {filename} has total length: {size}\n, first 100 bytes:")
|
|
61
|
+
solara.Preformatted("\n".join(textwrap.wrap(repr(content))))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@solara.component
|
|
65
|
+
def Page():
|
|
66
|
+
with solara.Row():
|
|
67
|
+
with solara.Card(title="FileDrop"):
|
|
68
|
+
FileDropDemo()
|
|
69
|
+
with solara.Card(title="FileDropMultiple"):
|
|
70
|
+
FileDropMultipleDemo()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
__doc__ += "# FileDrop"
|
|
74
|
+
__doc__ += apidoc(solara.FileDrop.f) # type: ignore
|
|
75
|
+
__doc__ += "# FileDropMultiple"
|
|
76
|
+
__doc__ += apidoc(solara.FileDropMultiple.f) # type: ignore
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""# Input fields
|
|
2
|
+
|
|
3
|
+
This page contains all the input fields available in Solara.
|
|
4
|
+
|
|
5
|
+
# InputText
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import solara
|
|
9
|
+
from solara.website.components import NoPage
|
|
10
|
+
from solara.website.utils import apidoc
|
|
11
|
+
|
|
12
|
+
Page = NoPage
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__doc__ += apidoc(solara.InputText.f) # type: ignore
|
|
16
|
+
__doc__ += "# InputTextArea"
|
|
17
|
+
__doc__ += apidoc(solara.InputTextArea.f) # type: ignore
|
|
18
|
+
__doc__ += "# InputFloat"
|
|
19
|
+
__doc__ += apidoc(solara.InputFloat.f) # type: ignore
|
|
20
|
+
__doc__ += "# InputInt"
|
|
21
|
+
__doc__ += apidoc(solara.InputInt.f) # type: ignore
|
|
22
|
+
|
|
23
|
+
__doc__ += """
|
|
24
|
+
# Autofocus Example
|
|
25
|
+
|
|
26
|
+
```solara
|
|
27
|
+
import solara
|
|
28
|
+
import solara.lab
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@solara.component
|
|
32
|
+
def Page():
|
|
33
|
+
show_dialog = solara.use_reactive(False)
|
|
34
|
+
show_conditional = solara.use_reactive(False)
|
|
35
|
+
with solara.Row():
|
|
36
|
+
solara.Button("Show dialog", on_click=lambda: show_dialog.set(True))
|
|
37
|
+
solara.Button("Show conditionally rendered element", on_click=lambda: show_conditional.set(not show_conditional.value))
|
|
38
|
+
with solara.lab.ConfirmationDialog(open=show_dialog):
|
|
39
|
+
solara.InputFloat("Float here", autofocus=True)
|
|
40
|
+
if show_conditional.value:
|
|
41
|
+
solara.InputFloat("Float here", autofocus=True)
|
|
42
|
+
```
|
|
43
|
+
"""
|