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,215 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from typing import Callable, Dict, List, Optional, Union
|
|
3
|
+
|
|
4
|
+
from typing_extensions import Literal
|
|
5
|
+
|
|
6
|
+
import solara
|
|
7
|
+
from solara.components.input import use_change
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@solara.component
|
|
11
|
+
def ChatBox(
|
|
12
|
+
children: List[solara.Element] = [],
|
|
13
|
+
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
14
|
+
classes: List[str] = [],
|
|
15
|
+
):
|
|
16
|
+
"""
|
|
17
|
+
The ChatBox component is a container for ChatMessage components.
|
|
18
|
+
Its primary use is to ensure the proper ordering of messages,
|
|
19
|
+
using `flex-direction: column-reverse` together with `reversed(messages)`.
|
|
20
|
+
|
|
21
|
+
# Arguments
|
|
22
|
+
|
|
23
|
+
* `children`: A list of child components.
|
|
24
|
+
* `style`: CSS styles to apply to the component. Either a string or a dictionary.
|
|
25
|
+
* `classes`: A list of CSS classes to apply to the component.
|
|
26
|
+
"""
|
|
27
|
+
style_flat = solara.util._flatten_style(style)
|
|
28
|
+
if "flex-grow" not in style_flat:
|
|
29
|
+
style_flat += " flex-grow: 1;"
|
|
30
|
+
if "flex-direction" not in style_flat:
|
|
31
|
+
style_flat += " flex-direction: column-reverse;"
|
|
32
|
+
if "overflow-y" not in style_flat:
|
|
33
|
+
style_flat += " overflow-y: auto;"
|
|
34
|
+
|
|
35
|
+
classes = [*classes, "chat-box"]
|
|
36
|
+
with solara.Column(
|
|
37
|
+
style=style_flat,
|
|
38
|
+
classes=classes,
|
|
39
|
+
):
|
|
40
|
+
for child in list(reversed(children)):
|
|
41
|
+
solara.display(child)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@solara.component
|
|
45
|
+
def ChatInput(
|
|
46
|
+
send_callback: Optional[Callable[[str], None]] = None,
|
|
47
|
+
disabled: bool = False,
|
|
48
|
+
disabled_input: bool = False,
|
|
49
|
+
disabled_send: bool = False,
|
|
50
|
+
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
51
|
+
autofocus: bool = False,
|
|
52
|
+
input_text_style: Optional[Union[str, Dict[str, str]]] = None,
|
|
53
|
+
classes: List[str] = [],
|
|
54
|
+
input_text_classes: List[str] = [],
|
|
55
|
+
):
|
|
56
|
+
"""
|
|
57
|
+
The ChatInput component renders a text input together with a send button.
|
|
58
|
+
|
|
59
|
+
# Arguments
|
|
60
|
+
|
|
61
|
+
* `send_callback`: A callback function for when the user presses enter or clicks the send button taking the message as an argument.
|
|
62
|
+
* `disabled`: disable both input and send.
|
|
63
|
+
* `disabled_input`: Whether the input should be disabled. Useful for disabling messages while a chatbot is replying.
|
|
64
|
+
* `disabled_send`: Whether the send button should be disabled. Useful for disabling sending further messages while a chatbot is replying.
|
|
65
|
+
* `style`: CSS styles to apply to the `solara.Row` containing the input field and submit button. Either a string or a dictionary.
|
|
66
|
+
* `autofocus`: Determines if a component is to be autofocused or not (Default is False). Autofocus will occur during page load and only one component per page can have autofocus active.
|
|
67
|
+
* `input_text_style`: CSS styles to apply to the `InputText` part of the component. Either a string or a dictionary.
|
|
68
|
+
* `classes`: A list of CSS classes to apply to the component. Also applied to the container.
|
|
69
|
+
* `input_text_classes`: A list of CSS classes to apply to the `InputText` part of the component.
|
|
70
|
+
"""
|
|
71
|
+
message, set_message = solara.use_state("") # type: ignore
|
|
72
|
+
style_flat = solara.util._flatten_style(style)
|
|
73
|
+
input_text_style_flat = solara.util._flatten_style(input_text_style)
|
|
74
|
+
|
|
75
|
+
if "align-items" not in style_flat:
|
|
76
|
+
style_flat += " align-items: center;"
|
|
77
|
+
|
|
78
|
+
with solara.Row(style=style_flat, classes=classes):
|
|
79
|
+
|
|
80
|
+
def send(*ignore_args):
|
|
81
|
+
if message != "" and send_callback is not None:
|
|
82
|
+
send_callback(message)
|
|
83
|
+
set_message("")
|
|
84
|
+
|
|
85
|
+
message_input = solara.v.TextField(
|
|
86
|
+
label="Type a message...",
|
|
87
|
+
v_model=message,
|
|
88
|
+
on_v_model=set_message,
|
|
89
|
+
rounded=True,
|
|
90
|
+
filled=True,
|
|
91
|
+
hide_details=True,
|
|
92
|
+
autofocus=autofocus,
|
|
93
|
+
style_="flex-grow: 1;" + input_text_style_flat,
|
|
94
|
+
disabled=disabled or disabled_input,
|
|
95
|
+
class_=" ".join(input_text_classes),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
use_change(message_input, send, update_events=["keyup.enter"])
|
|
99
|
+
|
|
100
|
+
button = solara.v.Btn(color="primary", icon=True, children=[solara.v.Icon(children=["mdi-send"])], disabled=message == "" or disabled or disabled_send)
|
|
101
|
+
|
|
102
|
+
use_change(button, send, update_events=["click"])
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@solara.component
|
|
106
|
+
def ChatMessage(
|
|
107
|
+
children: Union[List[solara.Element], str] = [],
|
|
108
|
+
user: bool = False,
|
|
109
|
+
avatar: Union[solara.Element, str, Literal[False], None] = None,
|
|
110
|
+
name: Optional[str] = None,
|
|
111
|
+
color: Optional[str] = "rgba(0,0,0,.06)",
|
|
112
|
+
avatar_background_color: Optional[str] = None,
|
|
113
|
+
border_radius: Optional[str] = None,
|
|
114
|
+
notch: bool = False,
|
|
115
|
+
style: Optional[Union[str, Dict[str, str]]] = None,
|
|
116
|
+
classes: List[str] = [],
|
|
117
|
+
):
|
|
118
|
+
"""
|
|
119
|
+
The ChatMessage component renders a message. Messages with `user=True` are rendered on the right side of the screen,
|
|
120
|
+
all others on the left.
|
|
121
|
+
|
|
122
|
+
# Arguments
|
|
123
|
+
|
|
124
|
+
* `children`: A list of child components.
|
|
125
|
+
* `user`: Whether the message is from the current user or not.
|
|
126
|
+
* `avatar`: An avatar to display next to the message. Can be a string representation of a URL or Material design icon name,
|
|
127
|
+
a solara Element, False to disable avatars altogether, or None to display initials based on `name`.
|
|
128
|
+
* `name`: The name of the user who sent the message.
|
|
129
|
+
* `color`: The background color of the message. Defaults to `rgba(0,0,0,.06)`. Can be any valid CSS color.
|
|
130
|
+
* `avatar_background_color`: The background color of the avatar. Defaults to `color` if left as `None`.
|
|
131
|
+
* `border_radius`: Sets the roundness of the corners of the message. Defaults to `None`,
|
|
132
|
+
which applies the default border radius of a `solara.Column`, i.e. `4px`.
|
|
133
|
+
* `notch`: Whether to display a speech bubble style notch on the side of the message.
|
|
134
|
+
* `style`: CSS styles to apply to the component. Either a string or a dictionary. Applied to the container of the message.
|
|
135
|
+
* `classes`: A list of CSS classes to apply to the component. Applied to the same container.
|
|
136
|
+
"""
|
|
137
|
+
style_flat = solara.util._flatten_style(style)
|
|
138
|
+
|
|
139
|
+
if "border-radius" not in style_flat:
|
|
140
|
+
style_flat += f" border-radius: {border_radius if border_radius is not None else ''};"
|
|
141
|
+
if f"border-top-{'right' if user else 'left'}-radius" not in style_flat:
|
|
142
|
+
style_flat += f" border-top-{'right' if user else 'left'}-radius: 0;"
|
|
143
|
+
if "padding" not in style_flat:
|
|
144
|
+
style_flat += " padding: .5em 1.5em;"
|
|
145
|
+
|
|
146
|
+
msg_uuid = solara.use_memo(lambda: str(uuid.uuid4()), dependencies=[])
|
|
147
|
+
with solara.Row(
|
|
148
|
+
justify="end" if user else "start",
|
|
149
|
+
style={"flex-direction": "row-reverse" if user else "row", "padding": "5px"},
|
|
150
|
+
):
|
|
151
|
+
if avatar is not False:
|
|
152
|
+
with solara.v.Avatar(color=avatar_background_color if avatar_background_color is not None else color):
|
|
153
|
+
if avatar is None and name is not None:
|
|
154
|
+
initials = "".join([word[:1] for word in name.split(" ")])
|
|
155
|
+
solara.HTML(tag="span", unsafe_innerHTML=initials, classes=["headline"])
|
|
156
|
+
elif isinstance(avatar, solara.Element):
|
|
157
|
+
solara.display(avatar)
|
|
158
|
+
elif isinstance(avatar, str) and avatar.startswith("mdi-"):
|
|
159
|
+
solara.v.Icon(children=[avatar])
|
|
160
|
+
else:
|
|
161
|
+
solara.HTML(tag="img", attributes={"src": avatar, "width": "100%"})
|
|
162
|
+
classes_new = classes + ["chat-message-" + msg_uuid, "right" if user else "left"]
|
|
163
|
+
with solara.Column(
|
|
164
|
+
classes=classes_new,
|
|
165
|
+
gap=0,
|
|
166
|
+
style=style_flat,
|
|
167
|
+
):
|
|
168
|
+
if name is not None:
|
|
169
|
+
solara.Text(name, style="font-weight: bold;", classes=["message-name", "right" if user else "left"])
|
|
170
|
+
for child in children:
|
|
171
|
+
if isinstance(child, solara.Element):
|
|
172
|
+
solara.display(child)
|
|
173
|
+
else:
|
|
174
|
+
solara.Markdown(child)
|
|
175
|
+
# we use the uuid to generate 'scoped' CSS, i.e. css that only applies to the component instance.
|
|
176
|
+
extra_styles = (
|
|
177
|
+
f""".chat-message-{msg_uuid}:before{{
|
|
178
|
+
content: '';
|
|
179
|
+
position: absolute;
|
|
180
|
+
width: 0;
|
|
181
|
+
height: 0;
|
|
182
|
+
border: 6px solid;
|
|
183
|
+
top: 0;
|
|
184
|
+
}}
|
|
185
|
+
.chat-message-{msg_uuid}.left:before{{
|
|
186
|
+
left: -12px;
|
|
187
|
+
border-color: var(--color) var(--color) transparent transparent;
|
|
188
|
+
}}
|
|
189
|
+
.chat-message-{msg_uuid}.right:before{{
|
|
190
|
+
right: -12px;
|
|
191
|
+
border-color: var(--color) transparent transparent var(--color);
|
|
192
|
+
}}"""
|
|
193
|
+
if notch
|
|
194
|
+
else ""
|
|
195
|
+
)
|
|
196
|
+
solara.Style(
|
|
197
|
+
f"""
|
|
198
|
+
.chat-message-{msg_uuid}{{
|
|
199
|
+
--color: {color};
|
|
200
|
+
max-width: 75%;
|
|
201
|
+
position: relative;
|
|
202
|
+
}}
|
|
203
|
+
.chat-message-{msg_uuid}.left{{
|
|
204
|
+
border-top-left-radius: 0;
|
|
205
|
+
background-color:var(--color);
|
|
206
|
+
{"margin-left: 10px !important;" if notch else ""}
|
|
207
|
+
}}
|
|
208
|
+
.chat-message-{msg_uuid}.right{{
|
|
209
|
+
border-top-right-radius: 0;
|
|
210
|
+
background-color:var(--color);
|
|
211
|
+
{"margin-right: 10px !important;" if notch else ""}
|
|
212
|
+
}}
|
|
213
|
+
{extra_styles}
|
|
214
|
+
"""
|
|
215
|
+
)
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
from typing import Callable, List, Union, overload
|
|
2
|
+
|
|
3
|
+
import reacton.ipyvuetify as v
|
|
4
|
+
|
|
5
|
+
import solara
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@overload
|
|
9
|
+
def ConfirmationDialog(
|
|
10
|
+
open: solara.Reactive[bool],
|
|
11
|
+
*,
|
|
12
|
+
on_close: Union[None, Callable[[], None]] = None,
|
|
13
|
+
content: Union[str, solara.Element] = "",
|
|
14
|
+
title: str = "Confirm action",
|
|
15
|
+
ok: Union[str, solara.Element] = "OK",
|
|
16
|
+
on_ok: Callable[[], None] = lambda: None,
|
|
17
|
+
cancel: Union[str, solara.Element] = "Cancel",
|
|
18
|
+
on_cancel: Callable[[], None] = lambda: None,
|
|
19
|
+
children: List[solara.Element] = [],
|
|
20
|
+
max_width: Union[int, str] = 500,
|
|
21
|
+
persistent: bool = False,
|
|
22
|
+
): ...
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# when open is a boolean, on_close should be given, otherwise a dialog can never be closed
|
|
26
|
+
# TODO: copy this pattern to many other components
|
|
27
|
+
@overload
|
|
28
|
+
def ConfirmationDialog(
|
|
29
|
+
open: bool,
|
|
30
|
+
*,
|
|
31
|
+
on_close: Callable[[], None],
|
|
32
|
+
content: Union[str, solara.Element] = "",
|
|
33
|
+
title: str = "Confirm action",
|
|
34
|
+
ok: Union[str, solara.Element] = "OK",
|
|
35
|
+
on_ok: Callable[[], None] = lambda: None,
|
|
36
|
+
cancel: Union[str, solara.Element] = "Cancel",
|
|
37
|
+
on_cancel: Callable[[], None] = lambda: None,
|
|
38
|
+
children: List[solara.Element] = [],
|
|
39
|
+
max_width: Union[int, str] = 500,
|
|
40
|
+
persistent: bool = False,
|
|
41
|
+
): ...
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@solara.component
|
|
45
|
+
def ConfirmationDialog(
|
|
46
|
+
open: Union[solara.Reactive[bool], bool],
|
|
47
|
+
*,
|
|
48
|
+
on_close: Union[None, Callable[[], None]] = None,
|
|
49
|
+
content: Union[str, solara.Element] = "",
|
|
50
|
+
title: str = "Confirm action",
|
|
51
|
+
ok: Union[str, solara.Element] = "OK",
|
|
52
|
+
on_ok: Callable[[], None] = lambda: None,
|
|
53
|
+
cancel: Union[str, solara.Element] = "Cancel",
|
|
54
|
+
on_cancel: Callable[[], None] = lambda: None,
|
|
55
|
+
children: List[solara.Element] = [],
|
|
56
|
+
max_width: Union[int, str] = 500,
|
|
57
|
+
persistent: bool = False,
|
|
58
|
+
):
|
|
59
|
+
"""A dialog used to confirm a user action.
|
|
60
|
+
|
|
61
|
+
(*Note: [This component is experimental and its API may change in the future](/documentation/getting_started/what-is-lab).*)
|
|
62
|
+
|
|
63
|
+
By default, has a title, a text explaining the
|
|
64
|
+
decision to be made, and two buttons "OK" and "Cancel".
|
|
65
|
+
|
|
66
|
+
## Basic examples
|
|
67
|
+
|
|
68
|
+
```solara
|
|
69
|
+
import solara
|
|
70
|
+
|
|
71
|
+
open_delete_confirmation = solara.reactive(False)
|
|
72
|
+
|
|
73
|
+
def delete_user():
|
|
74
|
+
# put your code to perform the action here
|
|
75
|
+
print("User being deleted...")
|
|
76
|
+
|
|
77
|
+
@solara.component
|
|
78
|
+
def Page():
|
|
79
|
+
solara.Button(label="Delete user", on_click=lambda: open_delete_confirmation.set(True))
|
|
80
|
+
solara.lab.ConfirmationDialog(open_delete_confirmation, ok="Ok, Delete", on_ok=delete_user, content="Are you sure you want to delete this user?")
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Arguments
|
|
84
|
+
|
|
85
|
+
* `open`: Indicates whether the dialog is being shown or not.
|
|
86
|
+
* `on_open`: Callback to call when the dialog opens of closes.
|
|
87
|
+
* `content`: Message that is displayed.
|
|
88
|
+
* `title`: Title of the dialog.
|
|
89
|
+
* `ok`: If a string, this text will be displayed on the confirmation button (default is "OK"). If a Button, it will be used instead of the default button.
|
|
90
|
+
* `on_ok`: Callback to be called when the OK button is clicked.
|
|
91
|
+
* `cancel`: If a string, this text will be displayed on the cancellation button (default is "Cancel"). If a Button, it will be used instead of the default
|
|
92
|
+
button.
|
|
93
|
+
* `on_cancel`: Callback to be called when the Cancel button is clicked. When persistent is False, clicking outside of the element or pressing esc key will
|
|
94
|
+
also trigger cancel.
|
|
95
|
+
* `children`: Additional components that will be shown under the dialog message, but before the buttons.
|
|
96
|
+
* `max_width`: Maximum width of the dialog window.
|
|
97
|
+
* `persistent`: When False (the default), clicking outside of the element or pressing esc key will trigger cancel.
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
def on_open(open_value):
|
|
102
|
+
if not open_value:
|
|
103
|
+
if on_close:
|
|
104
|
+
on_close()
|
|
105
|
+
|
|
106
|
+
open_reactive = solara.use_reactive(open, on_open)
|
|
107
|
+
del open
|
|
108
|
+
|
|
109
|
+
def close():
|
|
110
|
+
open_reactive.set(False)
|
|
111
|
+
|
|
112
|
+
user_on_click_ok = None
|
|
113
|
+
user_on_click_cancel = None
|
|
114
|
+
|
|
115
|
+
def perform_ok():
|
|
116
|
+
if user_on_click_ok:
|
|
117
|
+
user_on_click_ok()
|
|
118
|
+
on_ok()
|
|
119
|
+
close()
|
|
120
|
+
|
|
121
|
+
def perform_cancel():
|
|
122
|
+
if user_on_click_cancel:
|
|
123
|
+
user_on_click_cancel()
|
|
124
|
+
on_cancel()
|
|
125
|
+
close()
|
|
126
|
+
|
|
127
|
+
def on_v_model(value):
|
|
128
|
+
if not value:
|
|
129
|
+
on_cancel()
|
|
130
|
+
open_reactive.set(value)
|
|
131
|
+
|
|
132
|
+
with v.Dialog(
|
|
133
|
+
v_model=open_reactive.value,
|
|
134
|
+
on_v_model=on_v_model,
|
|
135
|
+
persistent=persistent,
|
|
136
|
+
max_width=max_width,
|
|
137
|
+
):
|
|
138
|
+
with solara.v.Card():
|
|
139
|
+
solara.v.CardTitle(children=[title])
|
|
140
|
+
with solara.v.CardText(style_="min-height: 64px"):
|
|
141
|
+
if isinstance(content, str):
|
|
142
|
+
solara.Text(content)
|
|
143
|
+
else:
|
|
144
|
+
solara.display(content)
|
|
145
|
+
if children:
|
|
146
|
+
solara.display(*children)
|
|
147
|
+
with solara.v.CardActions(class_="justify-end"):
|
|
148
|
+
if isinstance(cancel, str):
|
|
149
|
+
solara.Button(label=cancel, on_click=perform_cancel, text=True, classes=["grey--text", "text--darken-2"])
|
|
150
|
+
else:
|
|
151
|
+
# the user may have passed in on_click already
|
|
152
|
+
user_on_click_cancel = cancel.kwargs.get("on_click")
|
|
153
|
+
# override or add our own on_click handler
|
|
154
|
+
cancel.kwargs = {**cancel.kwargs, "on_click": perform_cancel}
|
|
155
|
+
solara.display(cancel)
|
|
156
|
+
|
|
157
|
+
# similar as cancel
|
|
158
|
+
if isinstance(ok, str):
|
|
159
|
+
solara.Button(label=ok, on_click=perform_ok, dark=True, color="primary", elevation=0)
|
|
160
|
+
else:
|
|
161
|
+
user_on_click_ok = ok.kwargs.get("on_click")
|
|
162
|
+
ok.kwargs = {**ok.kwargs, "on_click": perform_ok}
|
|
163
|
+
solara.display(ok)
|