solara-ui 1.37.2__tar.gz → 1.38.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. {solara_ui-1.37.2 → solara_ui-1.38.0}/PKG-INFO +1 -1
  2. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/__init__.py +1 -1
  3. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/cross_filter.py +2 -2
  4. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/minisettings.py +5 -5
  5. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/flask.py +1 -1
  6. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/starlette.py +82 -4
  7. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/solara_bootstrap.py +1 -1
  8. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/utils.py +8 -1
  9. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/test/pytest_plugin.py +17 -7
  10. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/toestand.py +0 -1
  11. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/doc_use_download.py +1 -1
  12. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +3 -3
  13. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +11 -11
  14. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +56 -39
  15. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +3 -3
  16. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets_test.py +5 -5
  17. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/cmdline_test.py +4 -3
  18. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/input_date_test.py +4 -4
  19. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-changed-reference.png +0 -0
  20. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-reference.png +0 -0
  21. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-changed-reference.png +0 -0
  22. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-reference.png +0 -0
  23. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-7-reference.png +0 -0
  24. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-8-reference.png +0 -0
  25. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-7-reference.png +0 -0
  26. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-8-reference.png +0 -0
  27. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  28. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  29. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-7-reference.png +0 -0
  30. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-8-reference.png +0 -0
  31. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  32. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  33. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-win32-reference.png +0 -0
  34. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-win32-reference.png +0 -0
  35. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-win32-reference.png +0 -0
  36. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-win32-reference.png +0 -0
  37. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-win32-reference.png +0 -0
  38. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  39. solara_ui-1.38.0/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  40. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +1 -0
  41. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +5 -1
  42. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/notebookapp_component.ipynb +1 -0
  43. {solara_ui-1.37.2 → solara_ui-1.38.0}/.gitignore +0 -0
  44. {solara_ui-1.37.2 → solara_ui-1.38.0}/LICENSE +0 -0
  45. {solara_ui-1.37.2 → solara_ui-1.38.0}/README.md +0 -0
  46. {solara_ui-1.37.2 → solara_ui-1.38.0}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  47. {solara_ui-1.37.2 → solara_ui-1.38.0}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  48. {solara_ui-1.37.2 → solara_ui-1.38.0}/pyproject.toml +0 -0
  49. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/__main__.py +0 -0
  50. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/alias.py +0 -0
  51. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/autorouting.py +0 -0
  52. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/cache.py +0 -0
  53. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/checks.html +0 -0
  54. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/checks.py +0 -0
  55. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/comm.py +0 -0
  56. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/__init__.py +0 -0
  57. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/alert.py +0 -0
  58. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/applayout.py +0 -0
  59. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/button.py +0 -0
  60. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/card.py +0 -0
  61. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/checkbox.py +0 -0
  62. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/code_highlight_css.py +0 -0
  63. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/code_highlight_css.vue +0 -0
  64. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/columns.py +0 -0
  65. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/component_vue.py +0 -0
  66. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/dataframe.py +0 -0
  67. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/datatable.py +0 -0
  68. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/datatable.vue +0 -0
  69. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/details.py +0 -0
  70. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/download.vue +0 -0
  71. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/echarts.py +0 -0
  72. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/echarts.vue +0 -0
  73. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/figure_altair.py +0 -0
  74. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/file_browser.py +0 -0
  75. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/file_download.py +0 -0
  76. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/file_drop.py +0 -0
  77. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/file_drop.vue +0 -0
  78. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/file_list_widget.vue +0 -0
  79. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/head.py +0 -0
  80. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/head_tag.py +0 -0
  81. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/head_tag.vue +0 -0
  82. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/image.py +0 -0
  83. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/input.py +0 -0
  84. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/link.py +0 -0
  85. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/markdown.py +0 -0
  86. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/markdown_editor.py +0 -0
  87. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/markdown_editor.vue +0 -0
  88. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/matplotlib.py +0 -0
  89. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/meta.py +0 -0
  90. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/misc.py +0 -0
  91. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/pivot_table.py +0 -0
  92. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/pivot_table.vue +0 -0
  93. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/progress.py +0 -0
  94. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/select.py +0 -0
  95. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/select.vue +0 -0
  96. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/slider.py +0 -0
  97. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/slider_date.vue +0 -0
  98. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/spinner-solara.vue +0 -0
  99. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/spinner.py +0 -0
  100. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/sql_code.py +0 -0
  101. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/sql_code.vue +0 -0
  102. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/style.py +0 -0
  103. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/switch.py +0 -0
  104. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/tab_navigation.py +0 -0
  105. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/title.py +0 -0
  106. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/title.vue +0 -0
  107. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/togglebuttons.py +0 -0
  108. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/components/tooltip.py +0 -0
  109. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/core.py +0 -0
  110. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/datatypes.py +0 -0
  111. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/express.py +0 -0
  112. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/hooks/__init__.py +0 -0
  113. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/hooks/dataframe.py +0 -0
  114. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/hooks/misc.py +0 -0
  115. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/hooks/use_reactive.py +0 -0
  116. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/hooks/use_thread.py +0 -0
  117. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/kitchensink.py +0 -0
  118. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/__init__.py +0 -0
  119. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/__init__.py +0 -0
  120. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/chat.py +0 -0
  121. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/confirmation_dialog.py +0 -0
  122. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/cross_filter.py +0 -0
  123. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/input_date.py +0 -0
  124. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/menu.py +0 -0
  125. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/menu.vue +0 -0
  126. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/tabs.py +0 -0
  127. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/theming.py +0 -0
  128. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/components/theming.vue +0 -0
  129. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/hooks/__init__.py +0 -0
  130. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/hooks/dataframe.py +0 -0
  131. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/toestand.py +0 -0
  132. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/utils/__init__.py +0 -0
  133. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/utils/cookies.py +0 -0
  134. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/utils/dataframe.py +0 -0
  135. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lab/utils/headers.py +0 -0
  136. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/layout.py +0 -0
  137. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/lifecycle.py +0 -0
  138. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/py.typed +0 -0
  139. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/reactive.py +0 -0
  140. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/routing.py +0 -0
  141. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/scope/__init__.py +0 -0
  142. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/scope/types.py +0 -0
  143. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/__init__.py +0 -0
  144. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/app.py +0 -0
  145. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/custom.css +0 -0
  146. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/custom.js +0 -0
  147. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/favicon.png +0 -0
  148. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/favicon.svg +0 -0
  149. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/style.css +0 -0
  150. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/theme-dark.css +0 -0
  151. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/theme-light.css +0 -0
  152. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/assets/theme.js +0 -0
  153. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/cdn_helper.py +0 -0
  154. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/esm.py +0 -0
  155. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/fastapi.py +0 -0
  156. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/jupyter/__init__.py +0 -0
  157. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/jupyter/cdn_handler.py +0 -0
  158. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/jupyter/server_extension.py +0 -0
  159. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/jupytertools.py +0 -0
  160. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/kernel.py +0 -0
  161. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/kernel_context.py +0 -0
  162. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/patch.py +0 -0
  163. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/reload.py +0 -0
  164. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/server.py +0 -0
  165. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/settings.py +0 -0
  166. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/shell.py +0 -0
  167. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/ansi.js +0 -0
  168. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/highlight-dark.css +0 -0
  169. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/highlight.css +0 -0
  170. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/main-vuetify.js +0 -0
  171. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/main.js +0 -0
  172. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/sun.svg +0 -0
  173. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/static/webworker.js +0 -0
  174. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/telemetry.py +0 -0
  175. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/index.html.j2 +0 -0
  176. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/loader-plain.css +0 -0
  177. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/loader-plain.html +0 -0
  178. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/loader-solara.css +0 -0
  179. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/loader-solara.html +0 -0
  180. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/plain.html +0 -0
  181. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/templates/solara.html.j2 +0 -0
  182. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/threaded.py +0 -0
  183. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/server/websocket.py +0 -0
  184. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/settings.py +0 -0
  185. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/tasks.py +0 -0
  186. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/button.py +0 -0
  187. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/markdown.py +0 -0
  188. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/.flake8 +0 -0
  189. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/.pre-commit-config.yaml +0 -0
  190. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/LICENSE +0 -0
  191. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/Procfile +0 -0
  192. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/mypy.ini +0 -0
  193. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/pyproject.toml +0 -0
  194. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/__init__.py +0 -0
  195. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  196. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/components/article.py +0 -0
  197. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/components/data.py +0 -0
  198. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/components/header.py +0 -0
  199. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/components/layout.py +0 -0
  200. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  201. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  202. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/data.py +0 -0
  203. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  204. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  205. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  206. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  207. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  208. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/test/__init__.py +0 -0
  209. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/util.py +0 -0
  210. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/validate_hooks.py +0 -0
  211. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/__init__.py +0 -0
  212. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/assets/custom.css +0 -0
  213. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/assets/images/logo-small.png +0 -0
  214. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/assets/images/logo.svg +0 -0
  215. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/assets/images/logo_white.svg +0 -0
  216. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/assets/theme.js +0 -0
  217. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/__init__.py +0 -0
  218. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/algolia.py +0 -0
  219. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/algolia.vue +0 -0
  220. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/algolia_api.vue +0 -0
  221. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/docs.py +0 -0
  222. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/header.py +0 -0
  223. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/hero.py +0 -0
  224. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/mailchimp.py +0 -0
  225. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/mailchimp.vue +0 -0
  226. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/markdown.py +0 -0
  227. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/notebook.py +0 -0
  228. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/components/sidebar.py +0 -0
  229. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/__init__.py +0 -0
  230. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/__init__.py +0 -0
  231. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/authorization/__init__.py +0 -0
  232. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/authorization/admin.py +0 -0
  233. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/authorization/users.py +0 -0
  234. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  235. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/layout-demo.py +0 -0
  236. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/multipage/__init__.py +0 -0
  237. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/multipage/page1.py +0 -0
  238. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/multipage/page2.py +0 -0
  239. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/scatter.py +0 -0
  240. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/scrolling.py +0 -0
  241. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  242. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/changelog/__init__.py +0 -0
  243. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/changelog/changelog.md +0 -0
  244. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/contact/__init__.py +0 -0
  245. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/contact/contact.md +0 -0
  246. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/__init__.py +0 -0
  247. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  248. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  249. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  250. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  251. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  252. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -0
  253. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  254. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -0
  255. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  256. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  257. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  258. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +0 -0
  259. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  260. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  261. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  262. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  263. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  264. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  265. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  266. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  267. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  268. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  269. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  270. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  271. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  272. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  273. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -0
  274. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -0
  275. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  276. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -0
  277. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  278. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  279. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  280. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/__init__.py +0 -0
  281. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  282. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  283. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  284. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  285. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  286. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  287. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  288. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  289. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  290. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  291. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  292. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  293. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  294. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  295. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  296. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  297. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  298. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_thread.md +0 -0
  299. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  300. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  301. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  302. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  303. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  304. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  305. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/route.py +0 -0
  306. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  307. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  308. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  309. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  310. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  311. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  312. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  313. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  314. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  315. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  316. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  317. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  318. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/__init__.py +0 -0
  319. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  320. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  321. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  322. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  323. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/common.py +0 -0
  324. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  325. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  326. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/data/pivot_table.py +0 -0
  327. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  328. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  329. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  330. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  331. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/button.py +0 -0
  332. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  333. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
  334. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  335. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/input.py +0 -0
  336. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/select.py +0 -0
  337. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/slider.py +0 -0
  338. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/switch.py +0 -0
  339. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  340. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  341. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  342. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  343. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  344. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  345. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  346. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  347. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  348. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/task.py +0 -0
  349. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  350. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  351. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  352. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  353. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  354. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  355. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/card.py +0 -0
  356. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  357. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/column.py +0 -0
  358. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  359. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  360. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/details.py +0 -0
  361. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  362. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  363. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  364. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/row.py +0 -0
  365. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  366. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  367. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  368. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  369. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/html.py +0 -0
  370. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/image.py +0 -0
  371. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  372. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  373. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/sql_code.py +0 -0
  374. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  375. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  376. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/page/head.py +0 -0
  377. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/page/title.py +0 -0
  378. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  379. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/error.py +0 -0
  380. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/info.py +0 -0
  381. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/progress.py +0 -0
  382. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  383. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/success.py +0 -0
  384. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/status/warning.py +0 -0
  385. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  386. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  387. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  388. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  389. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  390. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  391. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/__init__.py +0 -0
  392. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  393. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
  394. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  395. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  396. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  397. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  398. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  399. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  400. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  401. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  402. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  403. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  404. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  405. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  406. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  407. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  408. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  409. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  410. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  411. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
  412. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
  413. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  414. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
  415. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
  416. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
  417. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
  418. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  419. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  420. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
  421. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  422. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  423. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
  424. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
  425. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  426. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/faq/__init__.py +0 -0
  427. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  428. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  429. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
  430. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  431. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  432. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  433. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  434. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  435. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  436. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  437. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  438. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  439. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  440. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  441. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -0
  442. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -0
  443. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  444. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  445. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  446. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  447. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/docutils.py +0 -0
  448. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/__init__.py +0 -0
  449. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  450. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/planeto_tessa.py +0 -0
  451. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/solara_dev.py +0 -0
  452. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  453. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  454. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  455. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  456. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/pages/showcase/wanderlust.py +0 -0
  457. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/public/beach.jpeg +0 -0
  458. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/public/logo.svg +0 -0
  459. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/public/social/discord.svg +0 -0
  460. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/public/social/github.svg +0 -0
  461. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/public/social/twitter.svg +0 -0
  462. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/public/success.html +0 -0
  463. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/templates/index.html.j2 +0 -0
  464. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/website/utils.py +0 -0
  465. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/widgets/__init__.py +0 -0
  466. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/widgets/vue/gridlayout.vue +0 -0
  467. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/widgets/vue/html.vue +0 -0
  468. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/widgets/vue/navigator.vue +0 -0
  469. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/widgets/vue/vegalite.vue +0 -0
  470. {solara_ui-1.37.2 → solara_ui-1.38.0}/solara/widgets/widgets.py +0 -0
  471. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/__init__.py +0 -0
  472. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/conftest.py +0 -0
  473. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  474. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  475. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  476. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  477. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  478. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/__init__.py +0 -0
  479. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/api_test.py +0 -0
  480. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/app_widget.py +0 -0
  481. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/apps/not-allowed +0 -0
  482. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/apps/public/test.txt +0 -0
  483. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/apps/secure/app.py +0 -0
  484. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets/assets1/common.js +0 -0
  485. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets/assets1/unique1.js +0 -0
  486. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets/assets2/common.js +0 -0
  487. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets/assets2/custom.css +0 -0
  488. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets/assets2/custom.js +0 -0
  489. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/assets/assets2/unique2.js +0 -0
  490. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/async_test.py +0 -0
  491. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/cdn_test.py +0 -0
  492. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/conftest.py +0 -0
  493. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/create_test.py +0 -0
  494. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/enterprise/__init__.py +0 -0
  495. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/enterprise/oauth_test.py +0 -0
  496. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/error_test.py +0 -0
  497. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/esm_test.py +0 -0
  498. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/file_download_test.py +0 -0
  499. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/flask_test.py +0 -0
  500. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/latex_test.py +0 -0
  501. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/lifecycle_test.py +0 -0
  502. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/markdown_test.py +0 -0
  503. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/menu_test.py +0 -0
  504. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/popout_test.py +0 -0
  505. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/reconnect_test.py +0 -0
  506. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/reload/apps.py +0 -0
  507. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/router_test.py +0 -0
  508. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/server_test.py +0 -0
  509. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/ssg_test.py +0 -0
  510. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/starlette_test.py +0 -0
  511. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/test.vue +0 -0
  512. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/testapp.py +0 -0
  513. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/integration/widget_test.py +0 -0
  514. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  515. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  516. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  517. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  518. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
  519. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
  520. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
  521. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
  522. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  523. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  524. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
  525. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
  526. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  527. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  528. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
  529. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
  530. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
  531. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
  532. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
  533. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
  534. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  535. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
  536. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  537. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/__init__.py +0 -0
  538. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/app_test.py +0 -0
  539. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/applayout_test.py +0 -0
  540. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/autorouting_test.py +0 -0
  541. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/cache_test.py +0 -0
  542. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/cdn_helper_test.py +0 -0
  543. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/chat_test.py +0 -0
  544. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/checkbox_test.py +0 -0
  545. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/common.py +0 -0
  546. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/component_frontend_test.py +0 -0
  547. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/component_vue_test.vue +0 -0
  548. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/confirmation_dialog_test.py +0 -0
  549. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/conftest.py +0 -0
  550. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/cross_filter_component_test.py +0 -0
  551. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/cross_filter_test.py +0 -0
  552. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/dataframe_test.py +0 -0
  553. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/datatable_test.py +0 -0
  554. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/display_test.py +0 -0
  555. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/express_test.py +0 -0
  556. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/file_browser_test.py +0 -0
  557. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/file_download_test.py +0 -0
  558. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/hook_use_invalid_test.py +0 -0
  559. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/hooks_test.py +0 -0
  560. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/input_date_test.py +0 -0
  561. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/input_test.py +0 -0
  562. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/kernel_test.py +0 -0
  563. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/lab/__init__.py +0 -0
  564. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/lifecycle_test.py +0 -0
  565. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/matplotlib_test.py +0 -0
  566. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/no_solara_test.py +0 -0
  567. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/output_widget_test.py +0 -0
  568. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/patch_test.py +0 -0
  569. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/pivottable_test.py +0 -0
  570. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/reload_test.py +0 -0
  571. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/router_test.py +0 -0
  572. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/select_test.py +0 -0
  573. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/settings_test.py +0 -0
  574. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/shell_test.py +0 -0
  575. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/slider_test.py +0 -0
  576. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/__init__.py +0 -0
  577. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/food/__init__.py +0 -0
  578. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/food/food.py +0 -0
  579. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/food/index.py +0 -0
  580. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  581. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  582. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  583. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  584. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  585. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  586. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  587. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  588. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  589. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  590. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  591. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  592. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  593. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  594. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  595. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  596. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  597. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/single_file.py +0 -0
  598. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  599. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  600. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/switch_test.py +0 -0
  601. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/tabs_test.py +0 -0
  602. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/task_test.py +0 -0
  603. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/telemetry_tests.py +0 -0
  604. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/toestand_computed_reload.py +0 -0
  605. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/toestand_test.py +0 -0
  606. {solara_ui-1.37.2 → solara_ui-1.38.0}/tests/unit/toggle_button_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: solara-ui
3
- Version: 1.37.2
3
+ Version: 1.38.0
4
4
  Dynamic: Summary
5
5
  Project-URL: Home, https://www.github.com/widgetti/solara
6
6
  Project-URL: Documentation, https://solara.dev
@@ -1,6 +1,6 @@
1
1
  """Build webapps using IPywidgets"""
2
2
 
3
- __version__ = "1.37.2"
3
+ __version__ = "1.38.0"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -275,14 +275,14 @@ def CrossFilterSlider(
275
275
  with solara.HBox(align_items="center"):
276
276
  label = f"Select {column} {mode} " if not invert else f"Drop {column} {mode} "
277
277
 
278
- if py_types[column] == int:
278
+ if py_types[column] is int:
279
279
  if isinstance(filter_value, int):
280
280
  solara.SliderInt(label=label, value=filter_value, min=vmin, max=vmax, on_value=set_filter_value, disabled=not enable, thumb_label=False)
281
281
  else:
282
282
  solara.Error(f"Filter value is not an integer type, but {type(filter_value)} (value = {filter_value})")
283
283
  if filter_value is not None:
284
284
  solara.Text(f"{filter_value:,}")
285
- elif py_types[column] == float:
285
+ elif py_types[column] is float:
286
286
  if isinstance(filter_value, float):
287
287
  solara.SliderFloat(label=label, value=filter_value, min=vmin, max=vmax, on_value=set_filter_value, disabled=not enable, thumb_label=False)
288
288
  else:
@@ -14,7 +14,7 @@ def _get_type(annotation):
14
14
  if annotation == Optional[check_type]:
15
15
  return check_type
16
16
  if hasattr(annotation, "__origin__"):
17
- if annotation.__origin__ == dict:
17
+ if annotation.__origin__ is dict:
18
18
  return dict
19
19
  return annotation
20
20
 
@@ -72,13 +72,13 @@ def convert(annotation, value: str) -> Any:
72
72
  annotation = sub_type
73
73
  values = value.split(",")
74
74
  return [convert(sub_type, k) for k in values]
75
- if annotation == str:
75
+ if annotation is str:
76
76
  return value
77
- elif annotation == int:
77
+ elif annotation is int:
78
78
  return int(value)
79
- elif annotation == float:
79
+ elif annotation is float:
80
80
  return float(value)
81
- elif annotation == bool:
81
+ elif annotation is bool:
82
82
  if value in ("True", "true", "1"):
83
83
  return True
84
84
  elif value in ("False", "false", "0"):
@@ -199,7 +199,7 @@ def nbext(dir, filename):
199
199
  for directory in server.nbextensions_directories:
200
200
  file = directory / dir / filename
201
201
  if file.exists():
202
- return send_from_directory(directory, dir + os.path.sep + filename)
202
+ return send_from_directory(directory, dir + "/" + filename)
203
203
  return flask.Response("not found", status=404)
204
204
 
205
205
 
@@ -9,6 +9,7 @@ import threading
9
9
  import typing
10
10
  from typing import Any, Dict, List, Optional, Set, Union, cast
11
11
  from uuid import uuid4
12
+ import warnings
12
13
 
13
14
  import anyio
14
15
  import starlette.websockets
@@ -85,7 +86,11 @@ prefix = ""
85
86
  # Since starlette seems to accept really large values for http, lets do the same for websockets
86
87
  # An arbitrarily large value we settled on for now is 32kb
87
88
  # If we don't do this, users with many cookies will fail to get a websocket connection.
88
- websockets.legacy.http.MAX_LINE = 1024 * 32
89
+ ws_version = tuple(map(int, websockets.__version__.split(".")))
90
+ if ws_version[0] >= 13:
91
+ websockets.legacy.http.MAX_LINE_LENGTH = int(os.environ.get("WEBSOCKETS_MAX_LINE_LENGTH", str(1024 * 32))) # type: ignore
92
+ else:
93
+ websockets.legacy.http.MAX_LINE = 1024 * 32 # type: ignore
89
94
 
90
95
 
91
96
  class WebsocketDebugInfo:
@@ -322,17 +327,45 @@ def close(request: Request):
322
327
 
323
328
 
324
329
  async def root(request: Request, fullpath: str = ""):
330
+ forwarded_host = request.headers.get("x-forwarded-host")
331
+ forwarded_proto = request.headers.get("x-forwarded-proto")
332
+ host = request.headers.get("host")
333
+ if forwarded_proto and forwarded_proto != request.scope["scheme"]:
334
+ warnings.warn(f"""Header x-forwarded-proto={forwarded_proto!r} does not match scheme={request.scope['scheme']!r} as given by the asgi framework (probably uvicorn)
335
+
336
+ This might be a configuration mismatch behind a reverse proxy and can cause issues with redirect urls, and auth.
337
+
338
+ Most likely, you need to trust your reverse proxy server, see:
339
+ https://solara.dev/documentation/getting_started/deploying/self-hosted
340
+
341
+ If you use uvicorn (the default when you use `solara run`), make sure you
342
+ configure the following environment variables for uvicorn correctly:
343
+ UVICORN_PROXY_HEADERS=1 # only needed for uvicorn < 0.10, since it is the default after 0.10
344
+ FORWARDED_ALLOW_IPS="127.0.0.1" # 127.0.0.1 is the default, replace this by the ip of the proxy server
345
+
346
+ Make sure you replace the IP with the correct IP of the reverse proxy server (instead of 127.0.0.1).
347
+
348
+ If you are sure that only the reverse proxy can reach the solara server, you can consider setting:
349
+ FORWARDED_ALLOW_IPS="*" # This can be a security risk, only use when you know what you are doing
350
+ """)
325
351
  if settings.oauth.private and not has_auth_support:
326
352
  raise RuntimeError("SOLARA_OAUTH_PRIVATE requires solara-enterprise")
327
353
  root_path = settings.main.root_path or ""
328
354
  if not settings.main.base_url:
355
+ # Note:
356
+ # starlette does not respect x-forwarded-host, and therefore
357
+ # base_url and expected_origin below could be different
358
+ # x-forwarded-host should only be considered if the same criteria in
359
+ # uvicorn's ProxyHeadersMiddleware accepts x-forwarded-proto
329
360
  settings.main.base_url = str(request.base_url)
330
361
  # if not explicltly set,
362
+ configured_root_path = settings.main.root_path
363
+ scope = request.scope
364
+ root_path_asgi = scope.get("route_root_path", scope.get("root_path", ""))
331
365
  if settings.main.root_path is None:
332
366
  # use the default root path from the app, which seems to also include the path
333
367
  # if we are mounted under a path
334
- scope = request.scope
335
- root_path = scope.get("route_root_path", scope.get("root_path", ""))
368
+ root_path = root_path_asgi
336
369
  logger.debug("root_path: %s", root_path)
337
370
  # or use the script-name header, for instance when running under a reverse proxy
338
371
  script_name = request.headers.get("script-name")
@@ -345,6 +378,51 @@ async def root(request: Request, fullpath: str = ""):
345
378
  root_path = script_name
346
379
  settings.main.root_path = root_path
347
380
 
381
+ # lets be flexible about the trailing slash
382
+ # TODO: maybe we should be more strict about the trailing slash
383
+ naked_root_path = settings.main.root_path.rstrip("/")
384
+ naked_base_url = settings.main.base_url.rstrip("/")
385
+ if not naked_base_url.endswith(naked_root_path):
386
+ msg = f"""base url {naked_base_url!r} does not end with root path {naked_root_path!r}
387
+
388
+ This could be a configuration mismatch behind a reverse proxy and can cause issues with redirect urls, and auth.
389
+
390
+ See also https://solara.dev/documentation/getting_started/deploying/self-hosted
391
+ """
392
+ if "script-name" in request.headers:
393
+ msg += f"""It looks like the reverse proxy sets the script-name header to {request.headers['script-name']!r}
394
+ """
395
+ if "x-script-name" in request.headers:
396
+ msg += f"""It looks like the reverse proxy sets the x-script-name header to {request.headers['x-script-name']!r}
397
+ """
398
+ if configured_root_path:
399
+ msg += f"""It looks like the root path was configured to {configured_root_path!r} in the settings
400
+ """
401
+ if root_path_asgi:
402
+ msg += f"""It looks like the root path set by the asgi framework was configured to {root_path_asgi!r}
403
+ """
404
+ warnings.warn(msg)
405
+ if host and forwarded_host and forwarded_proto:
406
+ port = request.base_url.port
407
+ ports = {"http": 80, "https": 443}
408
+ expected_origin = f"{forwarded_proto}://{forwarded_host}"
409
+ if port and port != ports[forwarded_proto]:
410
+ expected_origin += f":{port}"
411
+ starlette_origin = settings.main.base_url
412
+ # strip off trailing / because we compare to the naked root path
413
+ starlette_origin = starlette_origin.rstrip("/")
414
+ if naked_root_path:
415
+ # take off the root path
416
+ starlette_origin = starlette_origin[: -len(naked_root_path)]
417
+ if starlette_origin != expected_origin:
418
+ warnings.warn(f"""Origin as determined by starlette ({starlette_origin!r}) does not match expected origin ({expected_origin!r}) based on x-forwarded-proto ({forwarded_proto!r}) and x-forwarded-host ({forwarded_host!r}) headers.
419
+
420
+ This might be a configuration mismatch behind a reverse proxy and can cause issues with redirect urls, and auth.
421
+ Most likely your proxy server sets the host header incorrectly (value for this request was {host!r})
422
+
423
+ See also https://solara.dev/documentation/getting_started/deploying/self-hosted
424
+ """)
425
+
348
426
  request_path = request.url.path
349
427
  if request_path.startswith(root_path):
350
428
  request_path = request_path[len(root_path) :]
@@ -370,7 +448,7 @@ async def root(request: Request, fullpath: str = ""):
370
448
  # however, samesite=none requires Secure https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
371
449
  # when hosted on the localhost domain we can always set the Secure flag
372
450
  # to allow samesite https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies
373
- if request.headers.get("x-forwarded-proto", "http") == "https" or request.base_url.hostname == "localhost":
451
+ if request.scope["scheme"] == "https" or request.headers.get("x-forwarded-proto", "http") == "https" or request.base_url.hostname == "localhost":
374
452
  samesite = "none"
375
453
  secure = True
376
454
  response.set_cookie(
@@ -119,7 +119,7 @@ async def main():
119
119
  ]
120
120
  for dep in requirements:
121
121
  await micropip.install(dep, keep_going=True)
122
- await micropip.install("/wheels/solara-1.37.2-py2.py3-none-any.whl", keep_going=True)
122
+ await micropip.install("/wheels/solara-1.38.0-py2.py3-none-any.whl", keep_going=True)
123
123
  import solara
124
124
 
125
125
  el = solara.Warning("lala")
@@ -3,6 +3,7 @@ import logging
3
3
  import os
4
4
  from pathlib import Path
5
5
  import pdb
6
+ import sys
6
7
  import traceback
7
8
 
8
9
  from rich import print
@@ -20,7 +21,13 @@ def start_error(title, msg, exception: Exception = None):
20
21
  def path_is_child_of(path: Path, parent: Path) -> bool:
21
22
  # We use os.path.normpath() because we do not want to follow symlinks
22
23
  # in editable installs, since some packages are symlinked
23
- return os.path.normpath(path).startswith(os.path.normpath(parent))
24
+ path_string = os.path.normpath(path)
25
+ parent_string = os.path.normpath(parent)
26
+ if sys.platform == "win32":
27
+ # on windows, we sometimes get different casing (only seen on CI)
28
+ path_string = path_string.lower()
29
+ parent_string = parent_string.lower()
30
+ return path_string.startswith(parent_string)
24
31
 
25
32
 
26
33
  @contextlib.contextmanager
@@ -38,6 +38,7 @@ TEST_PORT_START = int(os.environ.get("PORT", "18765")) + 100 # do not interfere
38
38
  TEST_HOST = solara.server.settings.main.host
39
39
  TIMEOUT = float(os.environ.get("SOLARA_PW_TIMEOUT", "18"))
40
40
  PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT = int(os.environ.get("PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT", "10"))
41
+ runners = os.environ.get("SOLARA_TEST_RUNNERS", "solara,voila,jupyter_lab,jupyter_notebook").split(",")
41
42
 
42
43
 
43
44
  @pytest.fixture(scope="session")
@@ -264,10 +265,13 @@ class ServerVoila(ServerBase):
264
265
  raise RuntimeError("Jupyter server already running, use lsof -i :{self.port} to find the process and kill it")
265
266
  cmd = (
266
267
  "voila --no-browser --VoilaTest.log_level=DEBUG --Voila.port_retries=0 --VoilaExecutor.timeout=240"
267
- f" --Voila.port={self.port} --show_tracebacks=True {self.notebook_path} --enable_nbextensions=True"
268
+ f' --Voila.port={self.port} --show_tracebacks=True "{self.notebook_path}" --enable_nbextensions=True'
268
269
  )
269
270
  logger.info(f"Starting Voila server at {self.base_url} with command {cmd}")
270
- args = shlex.split(cmd)
271
+ if sys.platform == "win32":
272
+ args = cmd
273
+ else:
274
+ args = shlex.split(cmd)
271
275
  self.popen = subprocess.Popen(args, shell=False, stdout=sys.stdout, stderr=sys.stderr, stdin=None)
272
276
  self.started.set()
273
277
 
@@ -294,15 +298,21 @@ class ServerJupyter(ServerBase):
294
298
  def serve(self):
295
299
  if self.has_started():
296
300
  raise RuntimeError(f"Jupyter server already running, use lsof -i :{self.port} to find the process and kill it")
297
- cmd = f'jupyter lab --port={self.port} --no-browser --ServerApp.token="" --port-retries=0 {self.notebook_path}'
301
+ cmd = f'jupyter lab --port={self.port} --no-browser --ServerApp.token="" --port-retries=0 "{self.notebook_path}"'
298
302
  logger.info(f"Starting Jupyter (lab) server at {self.base_url} with command {cmd}")
299
- args = shlex.split(cmd)
303
+ if sys.platform == "win32":
304
+ args = cmd
305
+ else:
306
+ args = shlex.split(cmd)
300
307
  self.popen = subprocess.Popen(args, shell=False, stdout=sys.stdout, stderr=sys.stderr, stdin=None)
301
308
  self.started.set()
302
309
 
303
310
 
304
311
  @pytest.fixture(scope="session")
305
312
  def voila_server(pytestconfig: Any, notebook_path):
313
+ if "voila" not in runners:
314
+ yield None
315
+ return
306
316
  port = pytestconfig.getoption("--voila-port")
307
317
  host = pytestconfig.getoption("--solara-host")
308
318
  write_notebook(["print('hello')"], notebook_path)
@@ -317,6 +327,9 @@ def voila_server(pytestconfig: Any, notebook_path):
317
327
 
318
328
  @pytest.fixture(scope="session")
319
329
  def jupyter_server(pytestconfig: Any, notebook_path):
330
+ if "jupyter_lab" not in runners and "jupyter_notebook" not in runners:
331
+ yield None
332
+ return
320
333
  port = pytestconfig.getoption("--jupyter-port")
321
334
  host = pytestconfig.getoption("--solara-host")
322
335
  write_notebook(["print('hello')"], notebook_path)
@@ -520,9 +533,6 @@ def create_runner_solara(solara_server, solara_app, page_session: "playwright.sy
520
533
  yield run
521
534
 
522
535
 
523
- runners = os.environ.get("SOLARA_TEST_RUNNERS", "solara,voila,jupyter_lab,jupyter_notebook").split(",")
524
-
525
-
526
536
  @pytest.fixture(params=runners)
527
537
  def ipywidgets_runner(
528
538
  solara_server,
@@ -144,7 +144,6 @@ class ValueBase(Generic[T]):
144
144
  for listener2, scope in self.listeners2[scope_id].copy():
145
145
  if scope is not None:
146
146
  scopes.add(scope)
147
- stack = contextlib.ExitStack()
148
147
  with contextlib.ExitStack() as stack:
149
148
  for scope in scopes:
150
149
  stack.enter_context(scope)
@@ -20,7 +20,7 @@ def DownloadFile(file_path=file_path, url=url, expected_size=expected_size, on_d
20
20
  status = "Done 🎉"
21
21
  else:
22
22
  MEGABYTES = 2.0**20.0
23
- status = "Downloading {}... ({:6.2f}/{:6.2f} MB)".format(file_path, downloaded_size / MEGABYTES, expected_size / MEGABYTES)
23
+ status = f"Downloading {file_path}... ({downloaded_size / MEGABYTES:6.2f}/{expected_size / MEGABYTES:6.2f} MB)"
24
24
  # status = "hi"
25
25
  # return MarkdownIt(f'{status}')
26
26
  assert download.progress is not None
@@ -170,13 +170,13 @@ Please note that Python 3.6 is not supported for Solara OAuth.
170
170
 
171
171
  ### Wrong redirection
172
172
 
173
- If the redirection back to solara return to the wrong address, it might be due to solara not choosing the right default for `SOLARA_BASE_URL`. For instance this variable could be set to `SOLARA_BASE_URL=https://solara.dev` for the solara.dev server. If you application runs behind a subpath, e.g. `/myapp`, you might have to set `SOLARA_ROOT_PATH=/myapp`.
173
+ If the redirection back to solara return to the wrong address, it might be due to solara not choosing the right default for `SOLARA_BASE_URL`. This can happen in a situation where you have multiple reverse proxies that communicate via https and therefore need to set the Host header. For instance this variable could be set to `SOLARA_BASE_URL=https://solara.dev` for the solara.dev server. If you application runs behind a subpath, e.g. `/myapp`, you might have to set `SOLARA_ROOT_PATH=/myapp`.
174
174
 
175
175
 
176
176
  ### Wrong schema detected for redirect URL
177
177
 
178
- Solara needs to give the OAuth providers a redirect URL to get back to your Solara application after navigating to the OAuth provider website. For our documentation server, we ask the OAuth provider to redirect to `https://solara.dev/_solara/auth/authorize`. The protocol part (`https`) and the domain name part (`solara.dev`) or this URL is constructed from the request URL (what the browser sends to the server).
178
+ Solara needs to give the OAuth providers a redirect URL to get back to your Solara application after navigating to the OAuth provider website. For our documentation server, we ask the OAuth provider to redirect to `https://solara.dev/_solara/auth/authorize`. The protocol part (`https`) and the domain name part (`solara.dev`) of this URL is constructed from the request (what the browser sends to the server).
179
179
 
180
- If you are running Solara behind a reverse proxy server (like nginx), make sure that the `X-Forwarded-Proto` and `Host` headers are forwarded correctly so Solara can construct the correct redirect URL to send to the OAuth provider.
180
+ If you are running Solara behind a reverse proxy server (like nginx), make sure that the `X-Forwarded-Proto` and `Host` headers are forwarded correctly, and the proxy server is trusted by uvicorn (by configuring the `FORWARDED_ALLOW_IPS` environment variable) so Solara can construct the correct redirect URL to send to the OAuth provider.
181
181
 
182
182
  See our [self hosted deployment](https://solara.dev/documentation/getting_started/deploying/self-hosted) for more information on how to configure your reverse proxy server.
@@ -69,7 +69,7 @@
69
69
  "\n",
70
70
  "\n",
71
71
  "df = px.data.iris()\n",
72
- "df\n"
72
+ "df"
73
73
  ]
74
74
  },
75
75
  {
@@ -163,6 +163,7 @@
163
163
  "columns = list(df.columns)\n",
164
164
  "x_axis = solara.reactive(\"sepal_length\")\n",
165
165
  "\n",
166
+ "\n",
166
167
  "@solara.component\n",
167
168
  "def Page():\n",
168
169
  " # Create a scatter plot by passing \"x_axis.value\" to px.scatter\n",
@@ -170,10 +171,10 @@
170
171
  " # and re-execute this function when x_axis value changes\n",
171
172
  " fig = px.scatter(df, x_axis.value, \"sepal_width\")\n",
172
173
  " solara.FigurePlotly(fig)\n",
173
- " \n",
174
+ "\n",
174
175
  " # Pass x_axis to Select component\n",
175
176
  " # The select will control the x_axis reactive variable\n",
176
- " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n"
177
+ " solara.Select(label=\"X-axis\", value=x_axis, values=columns)"
177
178
  ]
178
179
  },
179
180
  {
@@ -219,12 +220,13 @@
219
220
  "source": [
220
221
  "y_axis = solara.reactive(\"sepal_width\")\n",
221
222
  "\n",
223
+ "\n",
222
224
  "@solara.component\n",
223
225
  "def Page():\n",
224
226
  " fig = px.scatter(df, x_axis.value, y_axis.value)\n",
225
227
  " solara.FigurePlotly(fig)\n",
226
228
  " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
227
- " solara.Select(label=\"Y-axis\", value=y_axis, values=columns) "
229
+ " solara.Select(label=\"Y-axis\", value=y_axis, values=columns)"
228
230
  ]
229
231
  },
230
232
  {
@@ -267,8 +269,7 @@
267
269
  " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
268
270
  " solara.Select(label=\"Y-axis\", value=y_axis, values=columns)\n",
269
271
  " # display it pre-formatted using the backticks `` using Markdown\n",
270
- " solara.Markdown(f\"`{click_data}`\")\n",
271
- " "
272
+ " solara.Markdown(f\"`{click_data}`\")"
272
273
  ]
273
274
  },
274
275
  {
@@ -319,7 +320,7 @@
319
320
  " row_index = click_data.value[\"points\"][\"point_indexes\"][0]\n",
320
321
  " x = click_data.value[\"points\"][\"xs\"][0]\n",
321
322
  " y = click_data.value[\"points\"][\"ys\"][0]\n",
322
- " solara.Markdown(f\"`Click on index={row_index} x={x} y={y}`\")\n"
323
+ " solara.Markdown(f\"`Click on index={row_index} x={x} y={y}`\")"
323
324
  ]
324
325
  },
325
326
  {
@@ -373,8 +374,8 @@
373
374
  "\n",
374
375
  "def find_nearest_neighbours(df, xcol, ycol, x, y, n=10):\n",
375
376
  " df = df.copy()\n",
376
- " df[\"distance\"] = ((df[xcol] - x)**2 + (df[ycol] - y)**2)**0.5\n",
377
- " return df.sort_values('distance')[1:n+1]\n",
377
+ " df[\"distance\"] = ((df[xcol] - x) ** 2 + (df[ycol] - y) ** 2) ** 0.5\n",
378
+ " return df.sort_values(\"distance\")[1 : n + 1]\n",
378
379
  "\n",
379
380
  "\n",
380
381
  "@solara.component\n",
@@ -385,13 +386,12 @@
385
386
  " x = click_data.value[\"points\"][\"xs\"][0]\n",
386
387
  " y = click_data.value[\"points\"][\"ys\"][0]\n",
387
388
  "\n",
388
- " # add an indicator \n",
389
+ " # add an indicator\n",
389
390
  " fig.add_trace(px.scatter(x=[x], y=[y], text=[\"⭐️\"]).data[0])\n",
390
391
  " df_nearest = find_nearest_neighbours(df, x_axis.value, y_axis.value, x, y, n=3)\n",
391
392
  " else:\n",
392
393
  " df_nearest = None\n",
393
394
  "\n",
394
- "\n",
395
395
  " solara.FigurePlotly(fig, on_click=click_data.set)\n",
396
396
  " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
397
397
  " solara.Select(label=\"Y-axis\", value=y_axis, values=columns)\n",
@@ -348,8 +348,8 @@
348
348
  "from pathlib import Path\n",
349
349
  "import solara\n",
350
350
  "\n",
351
- "ROOT = Path(solara.__file__).parent / 'website' / 'pages' / 'docs' / 'content' / '04-tutorial'\n",
352
- "path = ROOT / Path('SF_crime_sample.csv.gz')\n",
351
+ "ROOT = Path(solara.__file__).parent / \"website\" / \"pages\" / \"docs\" / \"content\" / \"04-tutorial\"\n",
352
+ "path = ROOT / Path(\"SF_crime_sample.csv.gz\")\n",
353
353
  "url = \"https://raw.githubusercontent.com/widgetti/solara/master/solara/website/pages/docs/content/04-tutorial/SF_crime_sample.csv\"\n",
354
354
  "\n",
355
355
  "if path.exists():\n",
@@ -357,7 +357,7 @@
357
357
  "else:\n",
358
358
  " df_crime = pd.read_csv(url)\n",
359
359
  "\n",
360
- "df_crime\n"
360
+ "df_crime"
361
361
  ]
362
362
  },
363
363
  {
@@ -666,9 +666,9 @@
666
666
  }
667
667
  ],
668
668
  "source": [
669
- "df_crime['Category'] = df_crime['Category'].str.title()\n",
670
- "df_crime['PdDistrict'] = df_crime['PdDistrict'].str.title()\n",
671
- "df_crime\n"
669
+ "df_crime[\"Category\"] = df_crime[\"Category\"].str.title()\n",
670
+ "df_crime[\"PdDistrict\"] = df_crime[\"PdDistrict\"].str.title()\n",
671
+ "df_crime"
672
672
  ]
673
673
  },
674
674
  {
@@ -687,12 +687,12 @@
687
687
  "outputs": [],
688
688
  "source": [
689
689
  "def crime_filter(df, district_values, category_values):\n",
690
- " df_dist = df.loc[df['PdDistrict'].isin(district_values)]\n",
691
- " df_category = df_dist.loc[df_dist['Category'].isin(category_values)]\n",
690
+ " df_dist = df.loc[df[\"PdDistrict\"].isin(district_values)]\n",
691
+ " df_category = df_dist.loc[df_dist[\"Category\"].isin(category_values)]\n",
692
692
  " return df_category\n",
693
693
  "\n",
694
694
  "\n",
695
- "dff_crime = crime_filter(df_crime, ['Bayview', 'Northern'], ['Vandalism', 'Assault', 'Robbery'])\n"
695
+ "dff_crime = crime_filter(df_crime, [\"Bayview\", \"Northern\"], [\"Vandalism\", \"Assault\", \"Robbery\"])"
696
696
  ]
697
697
  },
698
698
  {
@@ -723,24 +723,26 @@
723
723
  "source": [
724
724
  "import matplotlib.pyplot as plt\n",
725
725
  "\n",
726
+ "\n",
726
727
  "def crime_charts(df):\n",
727
- " cat_unique = df['Category'].value_counts()\n",
728
+ " cat_unique = df[\"Category\"].value_counts()\n",
728
729
  " cat_unique = cat_unique.reset_index()\n",
729
- " \n",
730
- " dist_unique = df['PdDistrict'].value_counts()\n",
730
+ "\n",
731
+ " dist_unique = df[\"PdDistrict\"].value_counts()\n",
731
732
  " dist_unique = dist_unique.reset_index()\n",
732
- " \n",
733
- " fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20,10))\n",
734
733
  "\n",
735
- " ax1.bar(cat_unique['Category'], cat_unique['count'])\n",
736
- " ax1.set_title('Amount of Criminal Case Based on Category')\n",
737
- " ax2.bar(dist_unique['PdDistrict'], dist_unique['count'])\n",
738
- " ax2.set_title('Amount of Criminal Case in Selected District')\n",
734
+ " fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 10))\n",
735
+ "\n",
736
+ " ax1.bar(cat_unique[\"Category\"], cat_unique[\"count\"])\n",
737
+ " ax1.set_title(\"Amount of Criminal Case Based on Category\")\n",
738
+ " ax2.bar(dist_unique[\"PdDistrict\"], dist_unique[\"count\"])\n",
739
+ " ax2.set_title(\"Amount of Criminal Case in Selected District\")\n",
739
740
  "\n",
740
741
  " display(fig)\n",
741
742
  " plt.close(fig)\n",
742
743
  "\n",
743
- "crime_charts(dff_crime)\n"
744
+ "\n",
745
+ "crime_charts(dff_crime)"
744
746
  ]
745
747
  },
746
748
  {
@@ -767,22 +769,28 @@
767
769
  "def crime_map(df):\n",
768
770
  " latitude = 37.77\n",
769
771
  " longitude = -122.42\n",
770
- " \n",
772
+ "\n",
771
773
  " sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n",
772
774
  "\n",
773
775
  " incidents = folium.plugins.MarkerCluster().add_to(sanfran_map)\n",
774
776
  "\n",
775
777
  " # loop through the dataframe and add each data point to the mark cluster\n",
776
- " for lat, lng, label, in zip(df.Y, df.X, df.Category):\n",
778
+ " for (\n",
779
+ " lat,\n",
780
+ " lng,\n",
781
+ " label,\n",
782
+ " ) in zip(df.Y, df.X, df.Category):\n",
777
783
  " folium.Marker(\n",
778
- " location=[lat, lng],\n",
779
- " icon=None,\n",
780
- " popup=label,\n",
784
+ " location=[lat, lng],\n",
785
+ " icon=None,\n",
786
+ " popup=label,\n",
781
787
  " ).add_to(incidents)\n",
782
- " \n",
788
+ "\n",
783
789
  " # show map\n",
784
790
  " display(sanfran_map)\n",
785
- "crime_map(dff_crime.iloc[0:50, :])\n"
791
+ "\n",
792
+ "\n",
793
+ "crime_map(dff_crime.iloc[0:50, :])"
786
794
  ]
787
795
  },
788
796
  {
@@ -805,9 +813,12 @@
805
813
  "outputs": [],
806
814
  "source": [
807
815
  "import solara\n",
808
- "districts = solara.reactive(['Bayview', 'Northern'],)\n",
809
- "categories = solara.reactive(['Vandalism', 'Assault', 'Robbery'])\n",
810
- "limit = solara.reactive(100)\n"
816
+ "\n",
817
+ "districts = solara.reactive(\n",
818
+ " [\"Bayview\", \"Northern\"],\n",
819
+ ")\n",
820
+ "categories = solara.reactive([\"Vandalism\", \"Assault\", \"Robbery\"])\n",
821
+ "limit = solara.reactive(100)"
811
822
  ]
812
823
  },
813
824
  {
@@ -833,12 +844,14 @@
833
844
  " row_count = len(dff)\n",
834
845
  " if row_count > limit.value:\n",
835
846
  " solara.Warning(f\"Only showing the first {limit.value} of {row_count:,} crimes on map\")\n",
836
- " crime_map(dff.iloc[:limit.value])\n",
847
+ " crime_map(dff.iloc[: limit.value])\n",
837
848
  " if row_count > 0:\n",
838
849
  " crime_charts(dff)\n",
839
850
  " else:\n",
840
851
  " solara.Warning(\"You filtered out all the data, no charts shown\")\n",
841
- "View()\n"
852
+ "\n",
853
+ "\n",
854
+ "View()"
842
855
  ]
843
856
  },
844
857
  {
@@ -857,7 +870,7 @@
857
870
  "outputs": [],
858
871
  "source": [
859
872
  "limit.value = 70\n",
860
- "districts.value = ['Soutern', 'Northern']\n"
873
+ "districts.value = [\"Soutern\", \"Northern\"]"
861
874
  ]
862
875
  },
863
876
  {
@@ -885,7 +898,7 @@
885
898
  "metadata": {},
886
899
  "outputs": [],
887
900
  "source": [
888
- "solara.SelectMultiple('District', all_values=[str(k) for k in df_crime['PdDistrict'].unique().tolist()], values=districts)\n"
901
+ "solara.SelectMultiple(\"District\", all_values=[str(k) for k in df_crime[\"PdDistrict\"].unique().tolist()], values=districts)"
889
902
  ]
890
903
  },
891
904
  {
@@ -907,11 +920,13 @@
907
920
  "source": [
908
921
  "@solara.component\n",
909
922
  "def Controls():\n",
910
- " solara.SelectMultiple('District', all_values=[str(k) for k in df_crime['PdDistrict'].unique().tolist()], values=districts)\n",
911
- " solara.SelectMultiple('Category', all_values=[str(k) for k in df_crime['Category'].unique().tolist()], values=categories)\n",
923
+ " solara.SelectMultiple(\"District\", all_values=[str(k) for k in df_crime[\"PdDistrict\"].unique().tolist()], values=districts)\n",
924
+ " solara.SelectMultiple(\"Category\", all_values=[str(k) for k in df_crime[\"Category\"].unique().tolist()], values=categories)\n",
912
925
  " solara.Text(\"Maximum number of rows to show on map\")\n",
913
- " solara.SliderInt('', value=limit, min=1, max=1000)\n",
914
- "Controls()\n"
926
+ " solara.SliderInt(\"\", value=limit, min=1, max=1000)\n",
927
+ "\n",
928
+ "\n",
929
+ "Controls()"
915
930
  ]
916
931
  },
917
932
  {
@@ -930,7 +945,7 @@
930
945
  "outputs": [],
931
946
  "source": [
932
947
  "# Note that we can read AND write reactive variables\n",
933
- "categories.value = [*categories.value, 'Warrants']\n"
948
+ "categories.value = [*categories.value, \"Warrants\"]"
934
949
  ]
935
950
  },
936
951
  {
@@ -957,7 +972,9 @@
957
972
  " with solara.Sidebar():\n",
958
973
  " Controls()\n",
959
974
  " View()\n",
960
- "Page()\n"
975
+ "\n",
976
+ "\n",
977
+ "Page()"
961
978
  ]
962
979
  },
963
980
  {