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,22 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Select components
|
|
3
|
+
|
|
4
|
+
Select comes in two flavours:
|
|
5
|
+
|
|
6
|
+
* `Select` for a singular selection
|
|
7
|
+
* `SelectMultiple` which allows for multiple selections
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import solara
|
|
13
|
+
from solara.website.components import NoPage
|
|
14
|
+
from solara.website.utils import apidoc
|
|
15
|
+
|
|
16
|
+
Page = NoPage
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__doc__ += "# Select"
|
|
20
|
+
__doc__ += apidoc(solara.Select.f) # type: ignore
|
|
21
|
+
__doc__ += "# SelectMultiple"
|
|
22
|
+
__doc__ += apidoc(solara.SelectMultiple.f) # type: ignore
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Sliders
|
|
3
|
+
|
|
4
|
+
To support proper typechecks, we have multiple slider (all wrapping the ipyvuetify sliders).
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import solara
|
|
10
|
+
from solara.website.components import NoPage
|
|
11
|
+
from solara.website.utils import apidoc
|
|
12
|
+
|
|
13
|
+
Page = NoPage
|
|
14
|
+
|
|
15
|
+
__doc__ += "# SliderInt"
|
|
16
|
+
__doc__ += apidoc(solara.SliderInt.f) # type: ignore
|
|
17
|
+
__doc__ += "# SliderRangeInt"
|
|
18
|
+
__doc__ += apidoc(solara.SliderRangeInt.f) # type: ignore
|
|
19
|
+
|
|
20
|
+
__doc__ += "# SliderFloat"
|
|
21
|
+
__doc__ += apidoc(solara.SliderFloat.f) # type: ignore
|
|
22
|
+
__doc__ += "# SliderRangeFloat"
|
|
23
|
+
__doc__ += apidoc(solara.SliderRangeFloat.f) # type: ignore
|
|
24
|
+
|
|
25
|
+
__doc__ += "# SliderValue"
|
|
26
|
+
__doc__ += apidoc(solara.SliderValue.f) # type: ignore
|
|
27
|
+
|
|
28
|
+
__doc__ += "# SliderDate"
|
|
29
|
+
__doc__ += apidoc(solara.SliderDate.f) # type: ignore
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# ToggleButtons
|
|
3
|
+
|
|
4
|
+
ToggleButtons are in two flavours, for single, and for multiple selections.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import solara
|
|
10
|
+
from solara.website.components import NoPage
|
|
11
|
+
from solara.website.utils import apidoc
|
|
12
|
+
|
|
13
|
+
title = "ToggleButtons"
|
|
14
|
+
|
|
15
|
+
Page = NoPage
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__doc__ += "# ToggleButtonsSingle"
|
|
19
|
+
__doc__ += apidoc(solara.ToggleButtonsSingle.f) # type: ignore
|
|
20
|
+
__doc__ += "# ToggleButtonsMultiple"
|
|
21
|
+
__doc__ += apidoc(solara.ToggleButtonsMultiple.f) # type: ignore
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Chat Components
|
|
3
|
+
|
|
4
|
+
These are the components available in Solara to build chat interfaces.
|
|
5
|
+
Although they can be used together to create a pre-built chat interface, inserting custom components is also possible.
|
|
6
|
+
For an example of how to use a custom message component, see the bottom of the page.
|
|
7
|
+
|
|
8
|
+
Also check out the [Chatbot](/documentation/examples/ai/chatbot) example.
|
|
9
|
+
|
|
10
|
+
# ChatBox
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import solara
|
|
14
|
+
from solara.website.components import NoPage
|
|
15
|
+
from solara.website.utils import apidoc
|
|
16
|
+
|
|
17
|
+
title = "Chat Components"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__doc__ += apidoc(solara.lab.components.chat.ChatBox.f) # type: ignore
|
|
21
|
+
__doc__ += "# ChatInput"
|
|
22
|
+
__doc__ += apidoc(solara.lab.components.chat.ChatInput.f) # type: ignore
|
|
23
|
+
__doc__ += "# ChatMessage"
|
|
24
|
+
__doc__ += apidoc(solara.lab.components.chat.ChatMessage.f) # type: ignore
|
|
25
|
+
__doc__ += """## Different Message Styles
|
|
26
|
+
|
|
27
|
+
The `ChatMessage` component has a few different styles available. These are shown below.
|
|
28
|
+
|
|
29
|
+
```solara
|
|
30
|
+
import solara
|
|
31
|
+
|
|
32
|
+
@solara.component
|
|
33
|
+
def Page():
|
|
34
|
+
with solara.Column():
|
|
35
|
+
solara.lab.ChatMessage(["Default"])
|
|
36
|
+
solara.lab.ChatMessage(["`color`"], color="#ff991f")
|
|
37
|
+
solara.lab.ChatMessage(["`avatar_background_color`"], avatar_background_color="success")
|
|
38
|
+
solara.lab.ChatMessage(["`border_radius='20px'`"], border_radius="20px")
|
|
39
|
+
solara.lab.ChatMessage(["`notch=True`"], notch=True)
|
|
40
|
+
```
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
__doc__ += """
|
|
44
|
+
# A Basic Example
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
```solara
|
|
48
|
+
import solara
|
|
49
|
+
|
|
50
|
+
messages = solara.reactive([])
|
|
51
|
+
name = solara.reactive("User")
|
|
52
|
+
|
|
53
|
+
def send(new_message):
|
|
54
|
+
messages.set([
|
|
55
|
+
*messages.value,
|
|
56
|
+
{"user": True, "name": name.value, "message": new_message,},
|
|
57
|
+
])
|
|
58
|
+
|
|
59
|
+
@solara.component
|
|
60
|
+
def Page():
|
|
61
|
+
solara.InputText("username", value=name)
|
|
62
|
+
with solara.Column(style={"min-height": "50vh"}):
|
|
63
|
+
with solara.lab.ChatBox():
|
|
64
|
+
for item in messages.value:
|
|
65
|
+
with solara.lab.ChatMessage(
|
|
66
|
+
user=item["user"],
|
|
67
|
+
name=item["name"],
|
|
68
|
+
):
|
|
69
|
+
solara.Markdown(item["message"])
|
|
70
|
+
solara.lab.ChatInput(send_callback=send)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
# A Custom Message Component
|
|
74
|
+
|
|
75
|
+
```solara
|
|
76
|
+
import solara
|
|
77
|
+
|
|
78
|
+
messages = solara.reactive([])
|
|
79
|
+
|
|
80
|
+
def send(new_message):
|
|
81
|
+
messages.set([
|
|
82
|
+
*messages.value,
|
|
83
|
+
{"name": "User", "message": new_message},
|
|
84
|
+
])
|
|
85
|
+
|
|
86
|
+
@solara.component
|
|
87
|
+
def CustomMessage(
|
|
88
|
+
message,
|
|
89
|
+
name = "User",
|
|
90
|
+
):
|
|
91
|
+
with solara.Column(gap=0):
|
|
92
|
+
with solara.Row():
|
|
93
|
+
solara.Markdown(f"**{name}**: {message}")
|
|
94
|
+
solara.v.Divider(style_="margin: 0;")
|
|
95
|
+
|
|
96
|
+
@solara.component
|
|
97
|
+
def Page():
|
|
98
|
+
with solara.Column(style={"min-height": "50vh"}):
|
|
99
|
+
with solara.lab.ChatBox():
|
|
100
|
+
for item in messages.value:
|
|
101
|
+
CustomMessage(
|
|
102
|
+
message=item["message"],
|
|
103
|
+
name=item["name"],
|
|
104
|
+
)
|
|
105
|
+
solara.lab.ChatInput(send_callback=send)
|
|
106
|
+
```
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
Page = NoPage
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# ConfirmationDialog
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import Union
|
|
7
|
+
|
|
8
|
+
import solara
|
|
9
|
+
from solara.lab.components.confirmation_dialog import ConfirmationDialog
|
|
10
|
+
from solara.website.utils import apidoc
|
|
11
|
+
|
|
12
|
+
title = "ConfirmationDialog"
|
|
13
|
+
users = solara.reactive("Alice Bob Cindy Dirk Eve Fred".split())
|
|
14
|
+
user_to_be_deleted: solara.Reactive[Union[str, None]] = solara.reactive(None)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def ask_to_delete_user(user):
|
|
18
|
+
user_to_be_deleted.value = user
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def clear_user_to_be_deleted():
|
|
22
|
+
user_to_be_deleted.value = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def delete_user():
|
|
26
|
+
users.set([u for u in users.value if u != user_to_be_deleted.value])
|
|
27
|
+
clear_user_to_be_deleted()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@solara.component
|
|
31
|
+
def Page():
|
|
32
|
+
"""Create a list of users with a button to delete them.
|
|
33
|
+
|
|
34
|
+
A confirmation dialog will pop up first before deletion."""
|
|
35
|
+
solara.Markdown("#### Users:")
|
|
36
|
+
with solara.Column(style={"max-width": "300px"}):
|
|
37
|
+
for user in users.value:
|
|
38
|
+
with solara.Row(style={"align-items": "center"}):
|
|
39
|
+
solara.Text(user)
|
|
40
|
+
solara.v.Spacer()
|
|
41
|
+
solara.Button(icon_name="mdi-delete", on_click=lambda user=user: ask_to_delete_user(user), icon=True)
|
|
42
|
+
if not users.value:
|
|
43
|
+
solara.Text("(no users left)")
|
|
44
|
+
|
|
45
|
+
with ConfirmationDialog(
|
|
46
|
+
user_to_be_deleted.value is not None,
|
|
47
|
+
on_ok=delete_user,
|
|
48
|
+
on_close=clear_user_to_be_deleted,
|
|
49
|
+
ok="Ok, Delete",
|
|
50
|
+
title="Delete user",
|
|
51
|
+
):
|
|
52
|
+
solara.Markdown(f"Are you sure you want to delete user **{user_to_be_deleted.value}**?")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
__doc__ += apidoc(solara.lab.components.confirmation_dialog.ConfirmationDialog.f) # type: ignore
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Cookies and Headers
|
|
3
|
+
|
|
4
|
+
## Cookies
|
|
5
|
+
|
|
6
|
+
Solara provides access to cookies through `solara.lab.cookies`.
|
|
7
|
+
|
|
8
|
+
```python
|
|
9
|
+
cookies: Reactive[Optional[Dict[str, str]]] = reactive(cast(Optional[Dict[str, str]], None))
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
This is a reactive object that can be used to read the cookies transferred with the the initial request sent to the server by the client.
|
|
13
|
+
Thus it is possible to access also HTTPOnly cookies. The cookies will be updated whenever the client sends a new request to the server,
|
|
14
|
+
i.e. only when the client connects to a kernel.
|
|
15
|
+
|
|
16
|
+
The cookies are read into a dictionary with the cookie names as keys and the cookie values as values.
|
|
17
|
+
|
|
18
|
+
## Headers
|
|
19
|
+
|
|
20
|
+
Solara provides access to headers in the form of `solara.lab.headers`.
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
headers: Reactive[Optional[Dict[str, List[str]]]] = reactive(cast(Optional[Dict[str, List[str]]], None))
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`headers` concatenates the values of multiple header fields with the same name into a list of strings. However, it is still possible that multiple
|
|
27
|
+
values are present in one field already in the request, in which case one string will contain multiple values. Unfortunately reversing this is
|
|
28
|
+
highly non-trivial.
|
|
29
|
+
|
|
30
|
+
Note that the header field names are all lower-case.
|
|
31
|
+
|
|
32
|
+
```solara
|
|
33
|
+
import solara
|
|
34
|
+
from solara.lab import headers
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@solara.component
|
|
38
|
+
def Page():
|
|
39
|
+
solara.Markdown(f"Your 'user-agent' is: {headers.value['user-agent']}")
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
from solara.website.components import NoPage
|
|
46
|
+
|
|
47
|
+
title = "Cookies and Headers"
|
|
48
|
+
Page = NoPage
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# InputDate
|
|
3
|
+
|
|
4
|
+
This page contains the two variants of datepickers available in solara
|
|
5
|
+
|
|
6
|
+
# InputDate
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import solara
|
|
10
|
+
from solara.website.components import NoPage
|
|
11
|
+
from solara.website.utils import apidoc
|
|
12
|
+
|
|
13
|
+
title = "InputDate"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__doc__ += apidoc(solara.lab.components.input_date.InputDate.f) # type: ignore
|
|
17
|
+
__doc__ += "# InputDateRange"
|
|
18
|
+
__doc__ += apidoc(solara.lab.components.input_date.InputDateRange.f) # type: ignore
|
|
19
|
+
|
|
20
|
+
Page = NoPage
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# InputTime
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import solara
|
|
6
|
+
from solara.website.components import NoPage
|
|
7
|
+
from solara.website.utils import apidoc
|
|
8
|
+
|
|
9
|
+
title = "InputTime"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__doc__ += apidoc(solara.lab.components.input_time.InputTime.f) # type: ignore
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Page = NoPage
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Menus
|
|
3
|
+
|
|
4
|
+
This page contains the various kinds of menu elements available to use in solara
|
|
5
|
+
|
|
6
|
+
# Menu
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import solara
|
|
10
|
+
from solara.website.components import NoPage
|
|
11
|
+
from solara.website.utils import apidoc
|
|
12
|
+
|
|
13
|
+
title = "Menus"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__doc__ += apidoc(solara.lab.components.menu.Menu.f) # type: ignore
|
|
17
|
+
__doc__ += "# ClickMenu"
|
|
18
|
+
__doc__ += apidoc(solara.lab.components.menu.ClickMenu.f) # type: ignore
|
|
19
|
+
__doc__ += "# ContextMenu"
|
|
20
|
+
__doc__ += apidoc(solara.lab.components.menu.ContextMenu.f) # type: ignore
|
|
21
|
+
|
|
22
|
+
Page = NoPage
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Tab
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
import solara.lab
|
|
8
|
+
from solara.website.utils import apidoc
|
|
9
|
+
|
|
10
|
+
disabled = solara.reactive(False)
|
|
11
|
+
icon = solara.reactive(True)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@solara.component
|
|
15
|
+
def Page():
|
|
16
|
+
solara.Checkbox(label="Disable Tab 2", value=disabled)
|
|
17
|
+
solara.Checkbox(label="Show icon", value=icon)
|
|
18
|
+
with solara.lab.Tabs():
|
|
19
|
+
with solara.lab.Tab("Tab 1"):
|
|
20
|
+
solara.Markdown("Hello")
|
|
21
|
+
with solara.lab.Tab("Tab 2", disabled=disabled.value, icon_name="mdi-home" if icon.value else None):
|
|
22
|
+
solara.Markdown("World")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
__doc__ += apidoc(solara.lab.Tab.f) # type: ignore
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Tabs
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
import solara.lab
|
|
8
|
+
from solara.website.utils import apidoc
|
|
9
|
+
|
|
10
|
+
disabled = solara.reactive(False)
|
|
11
|
+
align = solara.reactive("center")
|
|
12
|
+
grow = solara.reactive(False)
|
|
13
|
+
vertical = solara.reactive(False)
|
|
14
|
+
dark = solara.reactive(False)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@solara.component
|
|
18
|
+
def Page():
|
|
19
|
+
with solara.Card("Controls"):
|
|
20
|
+
with solara.Row():
|
|
21
|
+
solara.Checkbox(label="Grow", value=grow)
|
|
22
|
+
solara.Checkbox(label="Vertical", value=vertical)
|
|
23
|
+
solara.Checkbox(label="Dark", value=dark)
|
|
24
|
+
if vertical.value:
|
|
25
|
+
align.value = "start"
|
|
26
|
+
else:
|
|
27
|
+
if not grow.value:
|
|
28
|
+
with solara.Row(style={"align-items": "center"}):
|
|
29
|
+
solara.Text("Align:")
|
|
30
|
+
solara.ToggleButtonsSingle(value=align, values=["start", "center", "end"], dense=True)
|
|
31
|
+
with solara.lab.Tabs(
|
|
32
|
+
vertical=vertical.value,
|
|
33
|
+
grow=grow.value,
|
|
34
|
+
align=align.value,
|
|
35
|
+
dark=dark.value,
|
|
36
|
+
background_color="primary" if dark.value else None,
|
|
37
|
+
slider_color="secondary" if dark.value else None,
|
|
38
|
+
):
|
|
39
|
+
with solara.lab.Tab("Tab 1"):
|
|
40
|
+
solara.Markdown("Hello")
|
|
41
|
+
with solara.lab.Tab("Tab 2"):
|
|
42
|
+
solara.Markdown("World")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
__doc__ += apidoc(solara.lab.Tabs.f) # type: ignore
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Themes in Solara
|
|
3
|
+
|
|
4
|
+
Theming is provided to Solara through the [`ipyvuetify`](https://solara.dev/docs/understanding/ipyvuetify) package.
|
|
5
|
+
Two themes are provided by default: light and dark.
|
|
6
|
+
Control over the theme variant (light, dark, or auto) can be provided to the user through the `ThemeToggle` component. Developers can
|
|
7
|
+
control theming through the `solara.lab.theme` object.
|
|
8
|
+
|
|
9
|
+
## Themes
|
|
10
|
+
|
|
11
|
+
The default themes can be customized through altering `solara.lab.theme`. The
|
|
12
|
+
[theme options of vuetify](https://v2.vuetifyjs.com/en/features/theme/#customizing)
|
|
13
|
+
are available as `solara.lab.theme.themes.light` and `solara.lab.theme.themes.dark`. The different properties of the theme can be set through, for example
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
solara.lab.theme.themes.light.primary = "#3f51b5"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Dark theme can be enabled/disabled through `solara.lab.theme.dark = True` / `False` / `None`. When set to `None`, the theme is set to auto,
|
|
20
|
+
which will follow the system theme if the user's browser supports detecting it.
|
|
21
|
+
|
|
22
|
+
When using solara server, the default theme variant can be set in the server settings through the command line interface. See
|
|
23
|
+
[here](https://solara.dev/docs/understanding/solara-server) for more information.
|
|
24
|
+
|
|
25
|
+
The active theme can be detected through `solara.lab.theme.dark_effective`, which is set to `True` or `False` depending on
|
|
26
|
+
whether dark theme is enabled or not.
|
|
27
|
+
|
|
28
|
+
## Example
|
|
29
|
+
|
|
30
|
+
**Note**: Light and dark theme colors have to be set separately.
|
|
31
|
+
|
|
32
|
+
```solara
|
|
33
|
+
import solara
|
|
34
|
+
import solara.lab
|
|
35
|
+
from solara.lab import theme as theme
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def change_color(colors):
|
|
39
|
+
if "purple" in colors:
|
|
40
|
+
theme.themes.light.info = theme.themes.dark.info = "#8617c2"
|
|
41
|
+
else:
|
|
42
|
+
theme.themes.light.info = theme.themes.dark.info = "#2196f3"
|
|
43
|
+
|
|
44
|
+
if "green" in colors:
|
|
45
|
+
theme.themes.light.error = theme.themes.dark.error = "#33bd65"
|
|
46
|
+
else:
|
|
47
|
+
theme.themes.light.error = theme.themes.dark.error = "#ff5252"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@solara.component
|
|
51
|
+
def Page():
|
|
52
|
+
solara.Info("Info message")
|
|
53
|
+
solara.Error("Error message")
|
|
54
|
+
|
|
55
|
+
with solara.ToggleButtonsMultiple(on_value=change_color):
|
|
56
|
+
solara.Button("Change Info", value="purple")
|
|
57
|
+
solara.Button("Change Error", value="green")
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A more advanced example can be found at [the scatter app demo](https://solara.dev/apps/scatter) where
|
|
61
|
+
we set a plotly theme based on dark/light theme, and also set the app bar color to its default so it
|
|
62
|
+
responds to the theme variant change.
|
|
63
|
+
|
|
64
|
+
## ThemeToggle
|
|
65
|
+
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
import solara
|
|
69
|
+
from solara.website.components import NoPage
|
|
70
|
+
from solara.website.utils import apidoc
|
|
71
|
+
|
|
72
|
+
title = "Themes"
|
|
73
|
+
Page = NoPage
|
|
74
|
+
__doc__ += apidoc(solara.lab.ThemeToggle) # type: ignore
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""# use_task"""
|
|
2
|
+
|
|
3
|
+
import solara
|
|
4
|
+
import solara.autorouting
|
|
5
|
+
import solara.lab
|
|
6
|
+
from solara.website.components import NoPage
|
|
7
|
+
from solara.website.utils import apidoc
|
|
8
|
+
|
|
9
|
+
title = "use_task"
|
|
10
|
+
Page = NoPage
|
|
11
|
+
__doc__ += apidoc(solara.lab.use_task) # type: ignore
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# AppBar
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
import solara.lab
|
|
8
|
+
from solara.website.components import NoPage
|
|
9
|
+
from solara.website.utils import apidoc
|
|
10
|
+
|
|
11
|
+
title = "AppBar"
|
|
12
|
+
|
|
13
|
+
Page = NoPage
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__doc__ += apidoc(solara.AppBar.f) # type: ignore
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# AppBarTitle
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
import solara.lab
|
|
8
|
+
from solara.website.components import NoPage
|
|
9
|
+
from solara.website.utils import apidoc
|
|
10
|
+
|
|
11
|
+
title = "AppBarTitle"
|
|
12
|
+
|
|
13
|
+
Page = NoPage
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__doc__ += apidoc(solara.AppBarTitle.f) # type: ignore
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# AppLayout
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
import solara.lab
|
|
8
|
+
from solara.website.utils import apidoc
|
|
9
|
+
|
|
10
|
+
title = "AppLayout"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@solara.component
|
|
14
|
+
def Page():
|
|
15
|
+
return solara.Markdown(
|
|
16
|
+
"""
|
|
17
|
+
An example cannot be shown embedded in this page, Visit the [AppLayout page](/apps/scatter) to see an example.
|
|
18
|
+
|
|
19
|
+
[](/apps/scatter)
|
|
20
|
+
"""
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
__doc__ += apidoc(solara.AppLayout.f) # type: ignore
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# CardActions
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
import solara.lab
|
|
8
|
+
from solara.website.components import NoPage
|
|
9
|
+
from solara.website.utils import apidoc
|
|
10
|
+
|
|
11
|
+
title = "CardActions"
|
|
12
|
+
|
|
13
|
+
Page = NoPage
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__doc__ += apidoc(solara.CardActions.f) # type: ignore
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# Column
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import solara
|
|
6
|
+
import solara.lab
|
|
7
|
+
from solara.website.utils import apidoc
|
|
8
|
+
|
|
9
|
+
gap_size = solara.reactive("12px")
|
|
10
|
+
align = solara.reactive("stretch")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@solara.component
|
|
14
|
+
def Page():
|
|
15
|
+
with solara.Card("Column demo") as main:
|
|
16
|
+
with solara.Column():
|
|
17
|
+
solara.Text("Align:")
|
|
18
|
+
solara.ToggleButtonsSingle(align, values=["start", "center", "end", "stretch"])
|
|
19
|
+
solara.Select(
|
|
20
|
+
label="Gap size",
|
|
21
|
+
values=["0px", "4px", "8px", "12px", "16px", "20px", "24px"],
|
|
22
|
+
).connect(gap_size)
|
|
23
|
+
with solara.Column(gap=gap_size.value, align=align.value):
|
|
24
|
+
colors = "green red orange brown yellow pink".split()
|
|
25
|
+
for color in colors:
|
|
26
|
+
solara.Button("Solara", color=color)
|
|
27
|
+
return main
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__doc__ += apidoc(solara.Column.f) # type: ignore
|