solara 1.30.1__py2.py3-none-any.whl → 1.31.0__py2.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.
- {solara-1.30.1.dist-info → solara-1.31.0.dist-info}/METADATA +7 -42
- solara-1.31.0.dist-info/RECORD +5 -0
- {solara-1.30.1.dist-info → solara-1.31.0.dist-info}/WHEEL +1 -1
- {solara/template/portal → solara-1.31.0.dist-info/licenses}/LICENSE +1 -1
- solara/__init__.py +0 -123
- solara/__main__.py +0 -734
- solara/alias.py +0 -6
- solara/autorouting.py +0 -545
- solara/cache.py +0 -294
- solara/checks.html +0 -71
- solara/checks.py +0 -224
- solara/comm.py +0 -28
- solara/components/__init__.py +0 -59
- solara/components/alert.py +0 -155
- solara/components/applayout.py +0 -393
- solara/components/button.py +0 -85
- solara/components/card.py +0 -87
- solara/components/checkbox.py +0 -50
- solara/components/code_highlight_css.py +0 -11
- solara/components/code_highlight_css.vue +0 -63
- solara/components/columns.py +0 -159
- solara/components/component_vue.py +0 -110
- solara/components/cross_filter.py +0 -335
- solara/components/dataframe.py +0 -546
- solara/components/datatable.py +0 -221
- solara/components/datatable.vue +0 -175
- solara/components/details.py +0 -21
- solara/components/download.vue +0 -35
- solara/components/echarts.py +0 -75
- solara/components/echarts.vue +0 -128
- solara/components/figure_altair.py +0 -39
- solara/components/file_browser.py +0 -182
- solara/components/file_download.py +0 -199
- solara/components/file_drop.py +0 -139
- solara/components/file_drop.vue +0 -83
- solara/components/file_list_widget.vue +0 -78
- solara/components/head.py +0 -27
- solara/components/head_tag.py +0 -49
- solara/components/head_tag.vue +0 -60
- solara/components/image.py +0 -173
- solara/components/input.py +0 -440
- solara/components/link.py +0 -55
- solara/components/markdown.py +0 -371
- solara/components/markdown_editor.py +0 -25
- solara/components/markdown_editor.vue +0 -362
- solara/components/matplotlib.py +0 -74
- solara/components/meta.py +0 -47
- solara/components/misc.py +0 -333
- solara/components/pivot_table.py +0 -258
- solara/components/pivot_table.vue +0 -158
- solara/components/progress.py +0 -47
- solara/components/select.py +0 -186
- solara/components/select.vue +0 -27
- solara/components/slider.py +0 -442
- solara/components/slider_date.vue +0 -56
- solara/components/spinner-solara.vue +0 -105
- solara/components/spinner.py +0 -30
- solara/components/sql_code.py +0 -33
- solara/components/sql_code.vue +0 -128
- solara/components/style.py +0 -105
- solara/components/switch.py +0 -68
- solara/components/tab_navigation.py +0 -37
- solara/components/title.py +0 -90
- solara/components/title.vue +0 -38
- solara/components/togglebuttons.py +0 -202
- solara/components/tooltip.py +0 -61
- solara/datatypes.py +0 -143
- solara/express.py +0 -241
- solara/hooks/__init__.py +0 -4
- solara/hooks/dataframe.py +0 -99
- solara/hooks/misc.py +0 -263
- solara/hooks/use_reactive.py +0 -129
- solara/hooks/use_thread.py +0 -129
- solara/kitchensink.py +0 -8
- solara/lab/__init__.py +0 -34
- solara/lab/components/__init__.py +0 -6
- solara/lab/components/chat.py +0 -203
- solara/lab/components/confirmation_dialog.py +0 -165
- solara/lab/components/cross_filter.py +0 -7
- solara/lab/components/input_date.py +0 -298
- solara/lab/components/menu.py +0 -181
- solara/lab/components/menu.vue +0 -38
- solara/lab/components/tabs.py +0 -274
- solara/lab/components/theming.py +0 -98
- solara/lab/components/theming.vue +0 -72
- solara/lab/hooks/__init__.py +0 -0
- solara/lab/hooks/dataframe.py +0 -12
- solara/lab/toestand.py +0 -3
- solara/lab/utils/__init__.py +0 -2
- solara/lab/utils/cookies.py +0 -5
- solara/lab/utils/dataframe.py +0 -115
- solara/lab/utils/headers.py +0 -5
- solara/layout.py +0 -44
- solara/minisettings.py +0 -133
- solara/py.typed +0 -0
- solara/reactive.py +0 -93
- solara/routing.py +0 -268
- solara/scope/__init__.py +0 -88
- solara/scope/types.py +0 -55
- solara/server/__init__.py +0 -0
- solara/server/app.py +0 -490
- solara/server/assets/custom.css +0 -1
- solara/server/assets/custom.js +0 -1
- solara/server/assets/favicon.png +0 -0
- solara/server/assets/favicon.svg +0 -5
- solara/server/assets/style.css +0 -1665
- solara/server/assets/theme-dark.css +0 -437
- solara/server/assets/theme-light.css +0 -420
- solara/server/assets/theme.js +0 -3
- solara/server/cdn_helper.py +0 -77
- solara/server/esm.py +0 -69
- solara/server/fastapi.py +0 -5
- solara/server/flask.py +0 -286
- solara/server/jupyter/__init__.py +0 -2
- solara/server/jupyter/cdn_handler.py +0 -28
- solara/server/jupyter/server_extension.py +0 -29
- solara/server/jupytertools.py +0 -46
- solara/server/kernel.py +0 -319
- solara/server/kernel_context.py +0 -396
- solara/server/patch.py +0 -552
- solara/server/reload.py +0 -242
- solara/server/server.py +0 -437
- solara/server/settings.py +0 -212
- solara/server/shell.py +0 -240
- solara/server/starlette.py +0 -597
- solara/server/static/ansi.js +0 -270
- solara/server/static/highlight-dark.css +0 -82
- solara/server/static/highlight.css +0 -43
- solara/server/static/main-vuetify.js +0 -260
- solara/server/static/main.js +0 -163
- solara/server/static/solara_bootstrap.py +0 -129
- solara/server/static/sun.svg +0 -23
- solara/server/static/webworker.js +0 -42
- solara/server/telemetry.py +0 -212
- solara/server/templates/index.html.j2 +0 -1
- solara/server/templates/loader-plain.css +0 -11
- solara/server/templates/loader-plain.html +0 -20
- solara/server/templates/loader-solara.css +0 -111
- solara/server/templates/loader-solara.html +0 -40
- solara/server/templates/plain.html +0 -82
- solara/server/templates/solara.html.j2 +0 -446
- solara/server/threaded.py +0 -75
- solara/server/utils.py +0 -30
- solara/server/websocket.py +0 -44
- solara/settings.py +0 -56
- solara/tasks.py +0 -847
- solara/template/button.py +0 -16
- solara/template/markdown.py +0 -42
- solara/template/portal/.flake8 +0 -6
- solara/template/portal/.pre-commit-config.yaml +0 -28
- solara/template/portal/Procfile +0 -7
- solara/template/portal/mypy.ini +0 -3
- solara/template/portal/pyproject.toml +0 -26
- solara/template/portal/solara_portal/__init__.py +0 -3
- solara/template/portal/solara_portal/components/__init__.py +0 -2
- solara/template/portal/solara_portal/components/article.py +0 -28
- solara/template/portal/solara_portal/components/data.py +0 -28
- solara/template/portal/solara_portal/components/header.py +0 -6
- solara/template/portal/solara_portal/components/layout.py +0 -6
- solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -85
- solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -70
- solara/template/portal/solara_portal/data.py +0 -60
- solara/template/portal/solara_portal/pages/__init__.py +0 -67
- solara/template/portal/solara_portal/pages/article/__init__.py +0 -26
- solara/template/portal/solara_portal/pages/tabular.py +0 -29
- solara/template/portal/solara_portal/pages/viz/__init__.py +0 -69
- solara/template/portal/solara_portal/pages/viz/overview.py +0 -14
- solara/test/__init__.py +0 -0
- solara/test/pytest_plugin.py +0 -698
- solara/toestand.py +0 -772
- solara/util.py +0 -308
- solara/website/__init__.py +0 -0
- solara/website/assets/custom.css +0 -462
- solara/website/assets/images/logo-small.png +0 -0
- solara/website/assets/images/logo.svg +0 -17
- solara/website/assets/images/logo_white.svg +0 -50
- solara/website/assets/theme.js +0 -8
- solara/website/components/__init__.py +0 -5
- solara/website/components/algolia.vue +0 -24
- solara/website/components/algolia_api.vue +0 -157
- solara/website/components/docs.py +0 -118
- solara/website/components/header.py +0 -72
- solara/website/components/hero.py +0 -15
- solara/website/components/mailchimp.py +0 -12
- solara/website/components/mailchimp.vue +0 -47
- solara/website/components/markdown.py +0 -30
- solara/website/components/notebook.py +0 -172
- solara/website/pages/__init__.py +0 -575
- solara/website/pages/apps/__init__.py +0 -16
- solara/website/pages/apps/authorization/__init__.py +0 -118
- solara/website/pages/apps/authorization/admin.py +0 -12
- solara/website/pages/apps/authorization/users.py +0 -12
- solara/website/pages/apps/jupyter-dashboard-1.py +0 -116
- solara/website/pages/apps/layout-demo.py +0 -40
- solara/website/pages/apps/multipage/__init__.py +0 -38
- solara/website/pages/apps/multipage/page1.py +0 -26
- solara/website/pages/apps/multipage/page2.py +0 -34
- solara/website/pages/apps/scatter.py +0 -136
- solara/website/pages/apps/scrolling.py +0 -63
- solara/website/pages/apps/tutorial-streamlit.py +0 -18
- solara/website/pages/changelog/__init__.py +0 -8
- solara/website/pages/changelog/changelog.md +0 -195
- solara/website/pages/contact/__init__.py +0 -8
- solara/website/pages/contact/contact.md +0 -17
- solara/website/pages/doc_use_download.py +0 -85
- solara/website/pages/documentation/__init__.py +0 -184
- solara/website/pages/documentation/advanced/__init__.py +0 -9
- solara/website/pages/documentation/advanced/content/00-overview.md +0 -1
- solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -6
- solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -196
- solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -125
- solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -154
- solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -69
- solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -49
- solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -124
- solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -10
- solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -35
- solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -42
- solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -28
- solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -108
- solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -23
- solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -7
- solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -166
- solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -18
- solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -240
- solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -86
- solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -12
- solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -1
- solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -171
- solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
- solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -45
- solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -76
- solara/website/pages/documentation/api/__init__.py +0 -19
- solara/website/pages/documentation/api/cross_filter/__init__.py +0 -9
- solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -23
- solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -22
- solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -22
- solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -22
- solara/website/pages/documentation/api/hooks/__init__.py +0 -9
- solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -25
- solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -13
- solara/website/pages/documentation/api/hooks/use_effect.md +0 -43
- solara/website/pages/documentation/api/hooks/use_effect.py +0 -9
- solara/website/pages/documentation/api/hooks/use_exception.py +0 -33
- solara/website/pages/documentation/api/hooks/use_memo.md +0 -16
- solara/website/pages/documentation/api/hooks/use_memo.py +0 -9
- solara/website/pages/documentation/api/hooks/use_previous.py +0 -32
- solara/website/pages/documentation/api/hooks/use_reactive.py +0 -15
- solara/website/pages/documentation/api/hooks/use_state.py +0 -11
- solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -68
- solara/website/pages/documentation/api/hooks/use_thread.md +0 -58
- solara/website/pages/documentation/api/hooks/use_thread.py +0 -44
- solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -13
- solara/website/pages/documentation/api/routing/__init__.py +0 -9
- solara/website/pages/documentation/api/routing/generate_routes.py +0 -11
- solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -11
- solara/website/pages/documentation/api/routing/resolve_path.py +0 -36
- solara/website/pages/documentation/api/routing/route.py +0 -32
- solara/website/pages/documentation/api/routing/use_route.py +0 -80
- solara/website/pages/documentation/api/routing/use_router.py +0 -15
- solara/website/pages/documentation/api/utilities/__init__.py +0 -9
- solara/website/pages/documentation/api/utilities/component_vue.py +0 -11
- solara/website/pages/documentation/api/utilities/computed.py +0 -16
- solara/website/pages/documentation/api/utilities/display.py +0 -15
- solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -16
- solara/website/pages/documentation/api/utilities/get_session_id.py +0 -16
- solara/website/pages/documentation/api/utilities/memoize.py +0 -36
- solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -27
- solara/website/pages/documentation/api/utilities/reactive.py +0 -15
- solara/website/pages/documentation/api/utilities/widget.py +0 -104
- solara/website/pages/documentation/components/__init__.py +0 -12
- solara/website/pages/documentation/components/advanced/__init__.py +0 -9
- solara/website/pages/documentation/components/advanced/link.py +0 -28
- solara/website/pages/documentation/components/advanced/meta.py +0 -21
- solara/website/pages/documentation/components/advanced/style.py +0 -44
- solara/website/pages/documentation/components/common.py +0 -9
- solara/website/pages/documentation/components/data/__init__.py +0 -9
- solara/website/pages/documentation/components/data/dataframe.py +0 -44
- solara/website/pages/documentation/components/data/pivot_table.py +0 -81
- solara/website/pages/documentation/components/enterprise/__init__.py +0 -9
- solara/website/pages/documentation/components/enterprise/avatar.py +0 -19
- solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -20
- solara/website/pages/documentation/components/input/__init__.py +0 -9
- solara/website/pages/documentation/components/input/button.py +0 -22
- solara/website/pages/documentation/components/input/checkbox.py +0 -12
- solara/website/pages/documentation/components/input/file_browser.py +0 -33
- solara/website/pages/documentation/components/input/file_drop.py +0 -75
- solara/website/pages/documentation/components/input/input.py +0 -18
- solara/website/pages/documentation/components/input/select.py +0 -21
- solara/website/pages/documentation/components/input/slider.py +0 -28
- solara/website/pages/documentation/components/input/switch.py +0 -12
- solara/website/pages/documentation/components/input/togglebuttons.py +0 -20
- solara/website/pages/documentation/components/lab/__init__.py +0 -9
- solara/website/pages/documentation/components/lab/chat.py +0 -108
- solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -55
- solara/website/pages/documentation/components/lab/cookies_headers.py +0 -48
- solara/website/pages/documentation/components/lab/input_date.py +0 -19
- solara/website/pages/documentation/components/lab/menu.py +0 -21
- solara/website/pages/documentation/components/lab/tab.py +0 -24
- solara/website/pages/documentation/components/lab/tabs.py +0 -44
- solara/website/pages/documentation/components/lab/task.py +0 -12
- solara/website/pages/documentation/components/lab/theming.py +0 -72
- solara/website/pages/documentation/components/lab/use_task.py +0 -12
- solara/website/pages/documentation/components/layout/__init__.py +0 -9
- solara/website/pages/documentation/components/layout/app_bar.py +0 -15
- solara/website/pages/documentation/components/layout/app_bar_title.py +0 -15
- solara/website/pages/documentation/components/layout/app_layout.py +0 -23
- solara/website/pages/documentation/components/layout/card.py +0 -14
- solara/website/pages/documentation/components/layout/card_actions.py +0 -15
- solara/website/pages/documentation/components/layout/column.py +0 -29
- solara/website/pages/documentation/components/layout/columns.py +0 -26
- solara/website/pages/documentation/components/layout/columns_responsive.py +0 -67
- solara/website/pages/documentation/components/layout/griddraggable.py +0 -61
- solara/website/pages/documentation/components/layout/gridfixed.py +0 -21
- solara/website/pages/documentation/components/layout/hbox.py +0 -17
- solara/website/pages/documentation/components/layout/row.py +0 -29
- solara/website/pages/documentation/components/layout/sidebar.py +0 -23
- solara/website/pages/documentation/components/layout/vbox.py +0 -19
- solara/website/pages/documentation/components/output/__init__.py +0 -9
- solara/website/pages/documentation/components/output/file_download.py +0 -12
- solara/website/pages/documentation/components/output/html.py +0 -22
- solara/website/pages/documentation/components/output/image.py +0 -12
- solara/website/pages/documentation/components/output/markdown.py +0 -59
- solara/website/pages/documentation/components/output/markdown_editor.py +0 -53
- solara/website/pages/documentation/components/output/sql_code.py +0 -84
- solara/website/pages/documentation/components/output/tooltip.py +0 -12
- solara/website/pages/documentation/components/page/__init__.py +0 -9
- solara/website/pages/documentation/components/page/head.py +0 -19
- solara/website/pages/documentation/components/page/title.py +0 -28
- solara/website/pages/documentation/components/status/__init__.py +0 -9
- solara/website/pages/documentation/components/status/error.py +0 -40
- solara/website/pages/documentation/components/status/info.py +0 -40
- solara/website/pages/documentation/components/status/progress.py +0 -10
- solara/website/pages/documentation/components/status/spinner.py +0 -10
- solara/website/pages/documentation/components/status/success.py +0 -40
- solara/website/pages/documentation/components/status/warning.py +0 -47
- solara/website/pages/documentation/components/viz/__init__.py +0 -9
- solara/website/pages/documentation/components/viz/altair.py +0 -44
- solara/website/pages/documentation/components/viz/echarts.py +0 -78
- solara/website/pages/documentation/components/viz/matplotlib.py +0 -32
- solara/website/pages/documentation/components/viz/plotly.py +0 -63
- solara/website/pages/documentation/components/viz/plotly_express.py +0 -41
- solara/website/pages/documentation/examples/__init__.py +0 -52
- solara/website/pages/documentation/examples/ai/__init__.py +0 -10
- solara/website/pages/documentation/examples/ai/chatbot.py +0 -96
- solara/website/pages/documentation/examples/ai/tokenizer.py +0 -106
- solara/website/pages/documentation/examples/basics/__init__.py +0 -2
- solara/website/pages/documentation/examples/basics/sine.py +0 -28
- solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -9
- solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -3
- solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -3
- solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -3
- solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -3
- solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -3
- solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -3
- solara/website/pages/documentation/examples/general/__init__.py +0 -9
- solara/website/pages/documentation/examples/general/custom_storage.py +0 -69
- solara/website/pages/documentation/examples/general/deploy_model.py +0 -114
- solara/website/pages/documentation/examples/general/live_update.py +0 -38
- solara/website/pages/documentation/examples/general/login_oauth.py +0 -76
- solara/website/pages/documentation/examples/general/mycard.vue +0 -58
- solara/website/pages/documentation/examples/general/pokemon_search.py +0 -51
- solara/website/pages/documentation/examples/general/vue_component.py +0 -50
- solara/website/pages/documentation/examples/ipycanvas.py +0 -49
- solara/website/pages/documentation/examples/libraries/__init__.py +0 -9
- solara/website/pages/documentation/examples/libraries/altair.py +0 -63
- solara/website/pages/documentation/examples/libraries/bqplot.py +0 -39
- solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -32
- solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -65
- solara/website/pages/documentation/examples/utilities/__init__.py +0 -9
- solara/website/pages/documentation/examples/utilities/calculator.py +0 -157
- solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -64
- solara/website/pages/documentation/examples/utilities/todo.py +0 -195
- solara/website/pages/documentation/examples/visualization/__init__.py +0 -6
- solara/website/pages/documentation/examples/visualization/annotator.py +0 -68
- solara/website/pages/documentation/examples/visualization/linked_views.py +0 -84
- solara/website/pages/documentation/examples/visualization/plotly.py +0 -43
- solara/website/pages/documentation/faq/__init__.py +0 -12
- solara/website/pages/documentation/faq/content/99-faq.md +0 -76
- solara/website/pages/documentation/getting_started/__init__.py +0 -9
- solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -89
- solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -125
- solara/website/pages/documentation/getting_started/content/02-installing.md +0 -85
- solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -14
- solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -13
- solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -89
- solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -124
- solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -146
- solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -144
- solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -64
- 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 +0 -445
- solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -1000
- solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -11
- solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -223
- solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -88
- solara/website/pages/documentation/getting_started/content/06-reference/00-overview.md +0 -3
- solara/website/pages/documentation/getting_started/content/06-reference/40-static_files.md +0 -31
- solara/website/pages/documentation/getting_started/content/06-reference/41-asset-files.md +0 -36
- solara/website/pages/documentation/getting_started/content/06-reference/60-static-site-generation.md +0 -59
- solara/website/pages/documentation/getting_started/content/06-reference/70-search.md +0 -34
- solara/website/pages/documentation/getting_started/content/06-reference/80-reloading.md +0 -34
- solara/website/pages/documentation/getting_started/content/06-reference/90-notebook-support.md +0 -7
- solara/website/pages/documentation/getting_started/content/06-reference/95-caching.md +0 -148
- solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -7
- solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -273
- solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -80
- solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -7
- solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -26
- solara/website/pages/docutils.py +0 -38
- solara/website/pages/showcase/__init__.py +0 -105
- solara/website/pages/showcase/domino_code_assist.py +0 -60
- solara/website/pages/showcase/planeto_tessa.py +0 -19
- solara/website/pages/showcase/solara_dev.py +0 -54
- solara/website/pages/showcase/solarathon_2023_team_2.py +0 -22
- solara/website/pages/showcase/solarathon_2023_team_4.py +0 -22
- solara/website/pages/showcase/solarathon_2023_team_5.py +0 -23
- solara/website/pages/showcase/solarathon_2023_team_6.py +0 -34
- solara/website/pages/showcase/wanderlust.py +0 -27
- solara/website/public/beach.jpeg +0 -0
- solara/website/public/logo.svg +0 -6
- solara/website/public/social/discord.svg +0 -1
- solara/website/public/social/github.svg +0 -1
- solara/website/public/social/twitter.svg +0 -3
- solara/website/public/success.html +0 -25
- solara/website/templates/index.html.j2 +0 -117
- solara/website/utils.py +0 -51
- solara/widgets/__init__.py +0 -1
- solara/widgets/vue/gridlayout.vue +0 -110
- solara/widgets/vue/html.vue +0 -4
- solara/widgets/vue/navigator.vue +0 -104
- solara/widgets/vue/vegalite.vue +0 -115
- solara/widgets/widgets.py +0 -65
- solara-1.30.1.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -7
- solara-1.30.1.data/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -7
- solara-1.30.1.dist-info/RECORD +0 -437
- solara-1.30.1.dist-info/entry_points.txt +0 -5
- /solara-1.30.1.dist-info/licenses/LICENSE → /LICENSE +0 -0
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"""# Pokemon search
|
|
2
|
-
|
|
3
|
-
This example shows to to dynamically fetch data and render the results in a table when done, and show an error on failure.
|
|
4
|
-
|
|
5
|
-
It also shows an optional filter to narrow down the results.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import solara
|
|
9
|
-
from solara import use_fetch
|
|
10
|
-
from solara.alias import rv
|
|
11
|
-
|
|
12
|
-
github_url = solara.util.github_url(__file__)
|
|
13
|
-
|
|
14
|
-
json_url = "https://jherr-pokemon.s3.us-west-1.amazonaws.com/index.json"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@solara.component
|
|
18
|
-
def Page():
|
|
19
|
-
data = use_fetch(json_url)
|
|
20
|
-
json = solara.use_json_load(data)
|
|
21
|
-
filter, set_filter = solara.use_state("")
|
|
22
|
-
|
|
23
|
-
with solara.Div() as main:
|
|
24
|
-
if json.error:
|
|
25
|
-
solara.Error(f"Error {json.error}")
|
|
26
|
-
solara.Button("Retry", on_click=data.retry)
|
|
27
|
-
else:
|
|
28
|
-
if json.value:
|
|
29
|
-
solara.InputText(label="Filter pokemons by name", value=filter, on_value=set_filter, continuous_update=True)
|
|
30
|
-
pokemons = json.value
|
|
31
|
-
if filter:
|
|
32
|
-
pokemons = [k for k in pokemons if filter.lower() in k["name"].lower()]
|
|
33
|
-
if len(pokemons) == 0:
|
|
34
|
-
solara.Warning("No pokemons found, try a different filter")
|
|
35
|
-
else:
|
|
36
|
-
solara.Info(f"{len(pokemons)} pokemons found")
|
|
37
|
-
else:
|
|
38
|
-
solara.Info(f"{len(pokemons)} pokemons in total")
|
|
39
|
-
with solara.GridFixed(columns=4, align_items="end", justify_items="stretch"):
|
|
40
|
-
for pokemon in pokemons[:20]:
|
|
41
|
-
with solara.Div():
|
|
42
|
-
name = pokemon["name"]
|
|
43
|
-
url = "https://jherr-pokemon.s3.us-west-1.amazonaws.com/" + pokemon["image"]
|
|
44
|
-
# TODO: how to do this with solara
|
|
45
|
-
rv.Img(src=url, contain=True, max_height="200px")
|
|
46
|
-
solara.Text(name)
|
|
47
|
-
else:
|
|
48
|
-
with solara.Div():
|
|
49
|
-
solara.Text("Loading...")
|
|
50
|
-
rv.ProgressCircular(indeterminate=True, class_="solara-progress")
|
|
51
|
-
return main
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"""Demonstrates how to use Vue components in Solara.
|
|
2
|
-
|
|
3
|
-
Although many components can be made from the Python side, sometimes it is easier to write components using Vue directly.
|
|
4
|
-
It can also be beneficial for performance, since instead of creating many widgets from the Python side we only send data to
|
|
5
|
-
the frontend. If event handling is also done on the frontend, this reduces latency and makes you app feel much smoother.
|
|
6
|
-
|
|
7
|
-
See [the API documentation on component_vue](/documentation/api/utilities/component_vue) for more information.
|
|
8
|
-
|
|
9
|
-
This example is based on [the vuetify docs](https://v2.vuetifyjs.com/en/components/sparklines/#custom-labels),
|
|
10
|
-
Note that the "Go to report" button does not do anything yet.
|
|
11
|
-
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from typing import Callable
|
|
15
|
-
|
|
16
|
-
import numpy as np
|
|
17
|
-
import solara
|
|
18
|
-
|
|
19
|
-
seed = solara.reactive(42)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@solara.component_vue("mycard.vue")
|
|
23
|
-
def MyCard(
|
|
24
|
-
event_goto_report: Callable[[dict], None],
|
|
25
|
-
value=[1, 10, 30, 20, 3],
|
|
26
|
-
caption="My Card",
|
|
27
|
-
color="red",
|
|
28
|
-
):
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@solara.component
|
|
33
|
-
def Page():
|
|
34
|
-
gen = np.random.RandomState(seed=seed.value)
|
|
35
|
-
sales_data = np.floor(np.cumsum(gen.random(7) - 0.5) * 100 + 100)
|
|
36
|
-
show_report = solara.use_reactive(False)
|
|
37
|
-
|
|
38
|
-
with solara.Column(style={"min-width": "600px"}):
|
|
39
|
-
if show_report.value:
|
|
40
|
-
with solara.Card("Report"):
|
|
41
|
-
solara.Markdown("Lorum ipsum dolor sit amet")
|
|
42
|
-
solara.Button("Go back", on_click=lambda: show_report.set(False))
|
|
43
|
-
else:
|
|
44
|
-
|
|
45
|
-
def new_seed():
|
|
46
|
-
seed.value = np.random.randint(0, 100)
|
|
47
|
-
|
|
48
|
-
solara.Button("Generate new data", on_click=new_seed)
|
|
49
|
-
|
|
50
|
-
MyCard(value=sales_data.tolist(), color="green", caption="Sales Last 7 Days", event_goto_report=lambda data: show_report.set(True))
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# Disabled, sometimes crashes the webpage.
|
|
2
|
-
# import ipycanvas
|
|
3
|
-
# import numpy as np
|
|
4
|
-
# import solara
|
|
5
|
-
# from reacton import ipycanvas as c
|
|
6
|
-
# from reacton import ipywidgets as w
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# def polygon(canvas, x, y, radius1, radius2, n_points):
|
|
10
|
-
# index = np.arange(n_points)
|
|
11
|
-
# angles = (2 * np.pi / n_points) * index
|
|
12
|
-
|
|
13
|
-
# radius = np.where(index % 2, radius1, radius2)
|
|
14
|
-
# v_x = x + np.cos(angles) * radius
|
|
15
|
-
# v_y = y + np.sin(angles) * radius
|
|
16
|
-
|
|
17
|
-
# points = np.stack((v_x, v_y), axis=1)
|
|
18
|
-
|
|
19
|
-
# canvas.fill_polygon(points)
|
|
20
|
-
# canvas.stroke_polygon(points)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# @solara.component
|
|
24
|
-
# def Page():
|
|
25
|
-
# width, height = 800, 800
|
|
26
|
-
# view_count, set_view_count = solara.use_state(0)
|
|
27
|
-
# with w.ViewcountVBox(set_view_count) as main:
|
|
28
|
-
# fill = w.color("#63934e", "fill color")
|
|
29
|
-
# stroke = w.color("#4e6393", "stroke color")
|
|
30
|
-
# line_width = w.slider_int(4, description="line width", min=0, max=30)
|
|
31
|
-
# n_points = w.slider_int(5, "Points", min=1, max=8) * 2
|
|
32
|
-
# radius_inner = w.slider_float(30, "Inner radius", min=0, max=100)
|
|
33
|
-
# radius_outer = w.slider_float(80, "Outer radius", min=0, max=100)
|
|
34
|
-
|
|
35
|
-
# def real_drawing():
|
|
36
|
-
# canvas: ipycanvas.Canvas = solara.core.get_widget(canvas_element)
|
|
37
|
-
|
|
38
|
-
# with ipycanvas.hold_canvas(canvas):
|
|
39
|
-
# canvas.clear()
|
|
40
|
-
# canvas.fill_style = fill
|
|
41
|
-
# canvas.stroke_style = stroke
|
|
42
|
-
# canvas.line_width = line_width
|
|
43
|
-
# radius = width // 3
|
|
44
|
-
# polygon(canvas, width // 2, height // 2, radius * radius_inner / 100, radius * radius_outer / 100, n_points)
|
|
45
|
-
|
|
46
|
-
# solara.use_side_effect(real_drawing, [fill, stroke, line_width, n_points, view_count, radius_inner, radius_outer])
|
|
47
|
-
# canvas_element = c.Canvas(width=width, height=height)
|
|
48
|
-
|
|
49
|
-
# return main
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"""# Altair
|
|
2
|
-
|
|
3
|
-
[Altair](https://altair-viz.github.io/index.html) is a declarative statistical visualization library for Python.
|
|
4
|
-
|
|
5
|
-
This example show how to use the [on_click handler](/documentation/components/viz/altair) to display data for a specific day in the chart.
|
|
6
|
-
|
|
7
|
-
Based on [an Altair example](https://altair-viz.github.io/gallery/annual_weather_heatmap.html)
|
|
8
|
-
|
|
9
|
-
"""
|
|
10
|
-
import altair as alt
|
|
11
|
-
import pandas as pd
|
|
12
|
-
import solara
|
|
13
|
-
from vega_datasets import data
|
|
14
|
-
|
|
15
|
-
# title = "Altair visualization"
|
|
16
|
-
source = data.seattle_weather()
|
|
17
|
-
|
|
18
|
-
selected_datum = solara.reactive(None)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@solara.component
|
|
22
|
-
def Page():
|
|
23
|
-
def on_click(datum):
|
|
24
|
-
selected_datum.value = datum
|
|
25
|
-
|
|
26
|
-
chart = (
|
|
27
|
-
alt.Chart(source, title="Daily Max Temperatures (C) in Seattle, WA")
|
|
28
|
-
.mark_rect()
|
|
29
|
-
.encode(
|
|
30
|
-
alt.X("date(date):O").title("Day").axis(format="%e", labelAngle=0),
|
|
31
|
-
alt.Y("month(date):O").title("Month"),
|
|
32
|
-
alt.Color("max(temp_max)").title(None),
|
|
33
|
-
tooltip=[
|
|
34
|
-
alt.Tooltip("monthdate(date)", title="Date"),
|
|
35
|
-
alt.Tooltip("max(temp_max)", title="Max Temp"),
|
|
36
|
-
],
|
|
37
|
-
)
|
|
38
|
-
.configure_view(step=13, strokeWidth=0)
|
|
39
|
-
.configure_axis(domain=False)
|
|
40
|
-
)
|
|
41
|
-
with solara.Card("Annual Weather Heatmap for Seattle, WA"):
|
|
42
|
-
solara.AltairChart(chart, on_click=on_click)
|
|
43
|
-
df = source
|
|
44
|
-
if selected_datum.value:
|
|
45
|
-
month_date = selected_datum.value["monthdate_date_end"]
|
|
46
|
-
dt = pd.to_datetime(month_date)
|
|
47
|
-
df = df[(df["date"].dt.month == dt.month) & (df["date"].dt.day == dt.day)]
|
|
48
|
-
solara.Markdown(f"Day of year: {dt.month_name()} - {dt.day}")
|
|
49
|
-
solara.Button("Clear selection", on_click=lambda: selected_datum.set(None))
|
|
50
|
-
solara.display(df)
|
|
51
|
-
|
|
52
|
-
with solara.Details("Click data"):
|
|
53
|
-
solara.Markdown(
|
|
54
|
-
f"""
|
|
55
|
-
Click data:
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
{selected_datum.value}
|
|
59
|
-
```
|
|
60
|
-
"""
|
|
61
|
-
)
|
|
62
|
-
else:
|
|
63
|
-
solara.Markdown("Click on the chart to see data for a specific day")
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
# bqplot
|
|
3
|
-
|
|
4
|
-
[bqplot](https://github.com/bqplot/bqplot) is a 2-D visualization system for Jupyter, based on the constructs of the Grammar of Graphics.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import numpy as np
|
|
8
|
-
import reacton.bqplot as bqplot
|
|
9
|
-
|
|
10
|
-
import solara
|
|
11
|
-
|
|
12
|
-
x0 = np.linspace(0, 2, 100)
|
|
13
|
-
|
|
14
|
-
exponent = solara.reactive(1.0)
|
|
15
|
-
log_scale = solara.reactive(False)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@solara.component
|
|
19
|
-
def Page(x=x0, ymax=5):
|
|
20
|
-
y = x**exponent.value
|
|
21
|
-
color = "red"
|
|
22
|
-
display_legend = True
|
|
23
|
-
label = "bqplot graph"
|
|
24
|
-
|
|
25
|
-
solara.SliderFloat(value=exponent, min=0.1, max=3, label="Exponent")
|
|
26
|
-
solara.Checkbox(value=log_scale, label="Log scale")
|
|
27
|
-
|
|
28
|
-
x_scale = bqplot.LinearScale()
|
|
29
|
-
if log_scale.value:
|
|
30
|
-
y_scale = bqplot.LogScale(min=0.1, max=ymax)
|
|
31
|
-
else:
|
|
32
|
-
y_scale = bqplot.LinearScale(min=0, max=ymax)
|
|
33
|
-
|
|
34
|
-
lines = bqplot.Lines(x=x, y=y, scales={"x": x_scale, "y": y_scale}, stroke_width=3, colors=[color], display_legend=display_legend, labels=[label])
|
|
35
|
-
x_axis = bqplot.Axis(scale=x_scale)
|
|
36
|
-
y_axis = bqplot.Axis(scale=y_scale, orientation="vertical")
|
|
37
|
-
bqplot.Figure(axes=[x_axis, y_axis], marks=[lines], scale_x=x_scale, scale_y=y_scale, layout={"min_width": "800px"})
|
|
38
|
-
|
|
39
|
-
# return main
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
# ipyleaflet
|
|
3
|
-
Map visualization using [ipyleaflet](https://ipyleaflet.readthedocs.io/), a ipywidgets wrapper for [leaflet.js](https://leafletjs.com/)
|
|
4
|
-
"""
|
|
5
|
-
import ipyleaflet
|
|
6
|
-
|
|
7
|
-
import solara
|
|
8
|
-
|
|
9
|
-
zoom = solara.reactive(5)
|
|
10
|
-
center = solara.reactive((53.2305799, 6.5323552))
|
|
11
|
-
bounds = solara.reactive(None)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@solara.component
|
|
15
|
-
def Page():
|
|
16
|
-
# Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
|
|
17
|
-
with solara.Column(style={"min-width": "500px", "height": "500px", "isolation": "isolate"}):
|
|
18
|
-
# solara components support reactive variables
|
|
19
|
-
solara.SliderInt(label="Zoom level", value=zoom, min=1, max=20)
|
|
20
|
-
# using 3rd party widget library require wiring up the events manually
|
|
21
|
-
# using zoom.value and zoom.set
|
|
22
|
-
ipyleaflet.Map.element( # type: ignore
|
|
23
|
-
zoom=zoom.value,
|
|
24
|
-
on_zoom=zoom.set,
|
|
25
|
-
center=center.value,
|
|
26
|
-
on_center=center.set,
|
|
27
|
-
on_bounds=bounds.set,
|
|
28
|
-
scroll_wheel_zoom=True,
|
|
29
|
-
)
|
|
30
|
-
solara.Text(f"Zoom: {zoom.value}")
|
|
31
|
-
solara.Text(f"Center: {center.value}")
|
|
32
|
-
solara.Text(f"Bounds: {bounds.value}")
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
# ipyleaflet advanced
|
|
3
|
-
|
|
4
|
-
Extends the [basic ipyleaflet example](/documentation/examples/libraries/ipyleaflet) with a marker that can be dragged around, and a
|
|
5
|
-
dropdown to select the map style. Two buttons allow to reset the map to the default zoom and center and to zoom
|
|
6
|
-
to the marker.
|
|
7
|
-
"""
|
|
8
|
-
import ipyleaflet
|
|
9
|
-
|
|
10
|
-
import solara
|
|
11
|
-
|
|
12
|
-
center_default = (53.2305799, 6.5323552)
|
|
13
|
-
zoom_default = 5
|
|
14
|
-
maps = {
|
|
15
|
-
"OpenStreetMap.Mapnik": ipyleaflet.basemaps.OpenStreetMap.Mapnik,
|
|
16
|
-
"OpenTopoMap": ipyleaflet.basemaps.OpenTopoMap,
|
|
17
|
-
"Esri.WorldTopoMap": ipyleaflet.basemaps.Esri.WorldTopoMap,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
zoom = solara.reactive(zoom_default)
|
|
21
|
-
center = solara.reactive(center_default)
|
|
22
|
-
marker_location = solara.reactive(center_default)
|
|
23
|
-
|
|
24
|
-
map_name = solara.reactive(list(maps)[0])
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@solara.component
|
|
28
|
-
def Page():
|
|
29
|
-
def location_changed(location):
|
|
30
|
-
# do things with the location
|
|
31
|
-
marker_location.set(location)
|
|
32
|
-
|
|
33
|
-
with solara.Column(style={"min-width": "500px", "height": "500px"}):
|
|
34
|
-
solara.Markdown(f"Market set to: {marker_location.value}", style={"color": "#6e6e6e"})
|
|
35
|
-
|
|
36
|
-
map = maps[map_name.value]
|
|
37
|
-
url = map.build_url()
|
|
38
|
-
|
|
39
|
-
def goto_marker():
|
|
40
|
-
center.value = marker_location.value
|
|
41
|
-
zoom.value = 13
|
|
42
|
-
|
|
43
|
-
def reset_view():
|
|
44
|
-
center.value = center_default
|
|
45
|
-
zoom.value = zoom_default
|
|
46
|
-
|
|
47
|
-
solara.Select(label="Map", value=map_name, values=list(maps))
|
|
48
|
-
solara.SliderInt(label="Zoom level", value=zoom, min=1, max=20)
|
|
49
|
-
with solara.Row():
|
|
50
|
-
solara.Button(label="Zoom to marker", on_click=goto_marker)
|
|
51
|
-
solara.Button(label="Reset view", on_click=reset_view)
|
|
52
|
-
|
|
53
|
-
# Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
|
|
54
|
-
with solara.Column(style={"isolation": "isolate"}):
|
|
55
|
-
ipyleaflet.Map.element( # type: ignore
|
|
56
|
-
zoom=zoom.value,
|
|
57
|
-
on_zoom=zoom.set,
|
|
58
|
-
center=center.value,
|
|
59
|
-
on_center=center.set,
|
|
60
|
-
scroll_wheel_zoom=True,
|
|
61
|
-
layers=[
|
|
62
|
-
ipyleaflet.TileLayer.element(url=url),
|
|
63
|
-
ipyleaflet.Marker.element(location=marker_location.value, draggable=True, on_location=location_changed),
|
|
64
|
-
],
|
|
65
|
-
)
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
"""# Calculator
|
|
2
|
-
|
|
3
|
-
This shows how to use `use_reducer` to implement a simple calculator.
|
|
4
|
-
|
|
5
|
-
Note that the `reducer` implements all the logic of the calculator, and the `Calculator` component is just a thin wrapper around it.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import ast
|
|
12
|
-
import dataclasses
|
|
13
|
-
import operator
|
|
14
|
-
from typing import Any, Optional
|
|
15
|
-
|
|
16
|
-
import solara
|
|
17
|
-
|
|
18
|
-
DEBUG = False
|
|
19
|
-
operator_map = {
|
|
20
|
-
"x": operator.mul,
|
|
21
|
-
"/": operator.truediv,
|
|
22
|
-
"+": operator.add,
|
|
23
|
-
"-": operator.sub,
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@dataclasses.dataclass(frozen=True)
|
|
28
|
-
class CalculatorState:
|
|
29
|
-
input: str = ""
|
|
30
|
-
output: str = ""
|
|
31
|
-
left: float = 0
|
|
32
|
-
right: Optional[float] = None
|
|
33
|
-
operator: Any = operator.add
|
|
34
|
-
error: str = ""
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
initial_state = CalculatorState()
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def calculate(state: CalculatorState):
|
|
41
|
-
result = state.operator(state.left, state.right)
|
|
42
|
-
return dataclasses.replace(state, left=result)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def calculator_reducer(state: CalculatorState, action):
|
|
46
|
-
action_type, payload = action
|
|
47
|
-
if DEBUG:
|
|
48
|
-
print("reducer", state, action_type, payload) # noqa
|
|
49
|
-
state = dataclasses.replace(state, error="")
|
|
50
|
-
|
|
51
|
-
if action_type == "digit":
|
|
52
|
-
digit = payload
|
|
53
|
-
input = state.input + digit
|
|
54
|
-
return dataclasses.replace(state, input=input, output=input)
|
|
55
|
-
elif action_type == "percent":
|
|
56
|
-
if state.input:
|
|
57
|
-
try:
|
|
58
|
-
value = ast.literal_eval(state.input)
|
|
59
|
-
except Exception as e:
|
|
60
|
-
return dataclasses.replace(state, error=str(e))
|
|
61
|
-
state = dataclasses.replace(state, right=value / 100)
|
|
62
|
-
state = calculate(state)
|
|
63
|
-
output = f"{value / 100:,}"
|
|
64
|
-
return dataclasses.replace(state, output=output, input="")
|
|
65
|
-
else:
|
|
66
|
-
output = f"{state.left / 100:,}"
|
|
67
|
-
return dataclasses.replace(state, left=state.left / 100, output=output)
|
|
68
|
-
elif action_type == "negate":
|
|
69
|
-
if state.input:
|
|
70
|
-
input = state.output
|
|
71
|
-
input = input[1:] if input[0] == "-" else "-" + input
|
|
72
|
-
output = input
|
|
73
|
-
return dataclasses.replace(state, input=input, output=output)
|
|
74
|
-
else:
|
|
75
|
-
output = f"{-state.left:,}"
|
|
76
|
-
return dataclasses.replace(state, left=-state.left, output=output)
|
|
77
|
-
elif action_type == "clear":
|
|
78
|
-
return dataclasses.replace(state, input="", output="")
|
|
79
|
-
elif action_type == "reset":
|
|
80
|
-
return initial_state
|
|
81
|
-
elif action_type == "calculate":
|
|
82
|
-
if state.input:
|
|
83
|
-
try:
|
|
84
|
-
value = ast.literal_eval(state.input)
|
|
85
|
-
except Exception as e:
|
|
86
|
-
return dataclasses.replace(state, error=str(e))
|
|
87
|
-
state = dataclasses.replace(state, right=value)
|
|
88
|
-
state = calculate(state)
|
|
89
|
-
output = f"{state.left:,}"
|
|
90
|
-
state = dataclasses.replace(state, output=output, input="")
|
|
91
|
-
return state
|
|
92
|
-
elif action_type == "operator":
|
|
93
|
-
if state.input:
|
|
94
|
-
state = calculator_reducer(state, ("calculate", None))
|
|
95
|
-
state = dataclasses.replace(state, operator=payload, input="")
|
|
96
|
-
else:
|
|
97
|
-
# e.g. 2+3=*= should give 5,25
|
|
98
|
-
state = dataclasses.replace(state, operator=payload, right=state.left)
|
|
99
|
-
return state
|
|
100
|
-
else:
|
|
101
|
-
print("invalid action", action) # noqa
|
|
102
|
-
return state
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
@solara.component
|
|
106
|
-
def Calculator():
|
|
107
|
-
state, dispatch = solara.use_reducer(calculator_reducer, initial_state)
|
|
108
|
-
if DEBUG:
|
|
109
|
-
print("->", state) # noqa
|
|
110
|
-
with solara.Card("Calculator", elevation=10, classes=["ma-4"]) as main:
|
|
111
|
-
with solara.VBox(grow=False):
|
|
112
|
-
solara.Text(state.error or state.output or "0")
|
|
113
|
-
class_ = "pa-0 ma-1"
|
|
114
|
-
|
|
115
|
-
with solara.HBox(grow=False):
|
|
116
|
-
if state.input:
|
|
117
|
-
solara.Button("C", on_click=lambda: dispatch(("clear", None)), dark=True, class_=class_)
|
|
118
|
-
else:
|
|
119
|
-
solara.Button("AC", on_click=lambda: dispatch(("reset", None)), dark=True, class_=class_)
|
|
120
|
-
solara.Button("+/-", on_click=lambda: dispatch(("negate", None)), dark=True, class_=class_)
|
|
121
|
-
solara.Button("%", on_click=lambda: dispatch(("percent", None)), dark=True, class_=class_)
|
|
122
|
-
solara.Button("/", color="primary", on_click=lambda: dispatch(("operator", operator_map["/"])), class_=class_)
|
|
123
|
-
|
|
124
|
-
column_op = ["x", "-", "+"]
|
|
125
|
-
for i in range(3):
|
|
126
|
-
with solara.HBox(grow=False):
|
|
127
|
-
for j in range(3):
|
|
128
|
-
digit = str(j + (2 - i) * 3 + 1)
|
|
129
|
-
|
|
130
|
-
def on_click(digit=digit):
|
|
131
|
-
dispatch(("digit", digit))
|
|
132
|
-
|
|
133
|
-
solara.Button(digit, on_click=on_click, class_=class_)
|
|
134
|
-
op_symbol = column_op[i]
|
|
135
|
-
op = operator_map[op_symbol]
|
|
136
|
-
|
|
137
|
-
def on_click_op(op=op):
|
|
138
|
-
dispatch(("operator", op))
|
|
139
|
-
|
|
140
|
-
solara.Button(op_symbol, color="primary", on_click=on_click_op, class_=class_)
|
|
141
|
-
with solara.HBox(grow=False):
|
|
142
|
-
|
|
143
|
-
def boom():
|
|
144
|
-
print("boom") # noqa
|
|
145
|
-
raise ValueError("lala")
|
|
146
|
-
|
|
147
|
-
solara.Button("?", on_click=boom, class_=class_)
|
|
148
|
-
|
|
149
|
-
solara.Button("0", on_click=lambda: dispatch(("digit", "0")), class_=class_)
|
|
150
|
-
solara.Button(".", on_click=lambda: dispatch(("digit", ".")), class_=class_)
|
|
151
|
-
|
|
152
|
-
solara.Button("=", color="primary", on_click=lambda: dispatch(("calculate", None)), class_=class_)
|
|
153
|
-
|
|
154
|
-
return main
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
Page = Calculator
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"""# Countdown timer.
|
|
2
|
-
|
|
3
|
-
This example shows how to use [use_thread](/documentation/api/hooks/use_thread) to create a countdown timer.
|
|
4
|
-
|
|
5
|
-
The UI code demonstrates a lot of conditional rendering.
|
|
6
|
-
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import time
|
|
10
|
-
|
|
11
|
-
import solara
|
|
12
|
-
from solara.alias import rv
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@solara.component
|
|
16
|
-
def Page():
|
|
17
|
-
seconds, set_seconds = solara.use_state(5)
|
|
18
|
-
running, set_running = solara.use_state(False)
|
|
19
|
-
duration, set_duration = solara.use_state(seconds)
|
|
20
|
-
|
|
21
|
-
def on_duration(duration):
|
|
22
|
-
try:
|
|
23
|
-
set_duration(int(duration))
|
|
24
|
-
set_seconds(int(duration))
|
|
25
|
-
except ValueError:
|
|
26
|
-
pass
|
|
27
|
-
|
|
28
|
-
def run_timer():
|
|
29
|
-
if running:
|
|
30
|
-
time_start = time.time()
|
|
31
|
-
next_tick = time_start + 1
|
|
32
|
-
i = seconds
|
|
33
|
-
while i:
|
|
34
|
-
# instead of sleeping for 1 second, we sleep until the next second
|
|
35
|
-
# this takes into account overhead and makes the timer more accurate
|
|
36
|
-
time.sleep(max(0, next_tick - time.time()))
|
|
37
|
-
i -= 1
|
|
38
|
-
set_seconds(i)
|
|
39
|
-
next_tick += 1
|
|
40
|
-
set_running(False)
|
|
41
|
-
|
|
42
|
-
solara.use_thread(run_timer, dependencies=[duration, running])
|
|
43
|
-
|
|
44
|
-
with solara.VBox() as main:
|
|
45
|
-
if not running:
|
|
46
|
-
if duration < 1:
|
|
47
|
-
solara.Error("Duration must be at least 1 second")
|
|
48
|
-
else:
|
|
49
|
-
solara.Markdown(f"# Timer set to {seconds} seconds")
|
|
50
|
-
else:
|
|
51
|
-
if seconds:
|
|
52
|
-
solara.Markdown(f"# {seconds} seconds left")
|
|
53
|
-
else:
|
|
54
|
-
solara.solara.Markdown("# Time's up!")
|
|
55
|
-
rv.TextField(type="number", v_model=duration, on_v_model=on_duration, disabled=running)
|
|
56
|
-
with solara.HBox():
|
|
57
|
-
if running:
|
|
58
|
-
solara.Button("Stop", on_click=lambda: set_running(False), icon_name="mdi-stop")
|
|
59
|
-
else:
|
|
60
|
-
if duration != seconds:
|
|
61
|
-
solara.Button("Reset", on_click=lambda: set_seconds(duration), icon_name="mdi-restart")
|
|
62
|
-
else:
|
|
63
|
-
solara.Button("Start", on_click=lambda: set_running(True), icon_name="mdi-play", disabled=seconds < 1)
|
|
64
|
-
return main
|