solara-ui 1.44.1__tar.gz → 1.45.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 (657) hide show
  1. {solara_ui-1.44.1 → solara_ui-1.45.0}/PKG-INFO +2 -1
  2. {solara_ui-1.44.1 → solara_ui-1.45.0}/pyproject.toml +4 -1
  3. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/__init__.py +1 -1
  4. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/dataframe.py +3 -3
  5. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/file_drop.py +1 -1
  6. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/kernel.py +4 -2
  7. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/kernel_context.py +1 -0
  8. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/starlette.py +23 -6
  9. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/solara_bootstrap.py +1 -1
  10. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/tasks.py +31 -5
  11. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/test/pytest_plugin.py +139 -69
  12. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/toestand.py +47 -43
  13. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/__init__.py +2 -4
  14. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/ipycanvas.py +1 -1
  15. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/lifecycle_test.py +2 -2
  16. solara_ui-1.45.0/tests/titanic.csv +1310 -0
  17. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  18. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  19. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  20. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  21. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-changed-reference.png +0 -0
  22. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-reference.png +0 -0
  23. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-changed-reference.png +0 -0
  24. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-reference.png +0 -0
  25. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-7-reference.png +0 -0
  26. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-8-reference.png +0 -0
  27. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-7-reference.png +0 -0
  28. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-8-reference.png +0 -0
  29. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  30. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  31. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-7-reference.png +0 -0
  32. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-8-reference.png +0 -0
  33. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  34. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  35. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-win32-reference.png +0 -0
  36. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-win32-reference.png +0 -0
  37. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-win32-reference.png +0 -0
  38. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-win32-reference.png +0 -0
  39. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-win32-reference.png +0 -0
  40. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  41. solara_ui-1.45.0/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  42. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/autorouting_test.py +3 -0
  43. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/cache_test.py +4 -0
  44. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/cross_filter_component_test.py +19 -9
  45. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/cross_filter_test.py +18 -4
  46. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/dataframe_test.py +3 -0
  47. solara_ui-1.45.0/tests/unit/datatable_test.py +53 -0
  48. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/pivottable_test.py +3 -0
  49. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/task_test.py +64 -0
  50. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/toestand_test.py +1 -1
  51. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  52. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  53. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  54. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  55. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-changed-reference.png +0 -0
  56. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-reference.png +0 -0
  57. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-changed-reference.png +0 -0
  58. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-reference.png +0 -0
  59. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-7-reference.png +0 -0
  60. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-8-reference.png +0 -0
  61. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-7-reference.png +0 -0
  62. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-8-reference.png +0 -0
  63. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  64. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  65. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-7-reference.png +0 -0
  66. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-8-reference.png +0 -0
  67. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  68. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  69. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-win32-reference.png +0 -0
  70. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-win32-reference.png +0 -0
  71. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-win32-reference.png +0 -0
  72. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-win32-reference.png +0 -0
  73. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-win32-reference.png +0 -0
  74. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  75. solara_ui-1.44.1/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  76. solara_ui-1.44.1/tests/unit/datatable_test.py +0 -20
  77. {solara_ui-1.44.1 → solara_ui-1.45.0}/.gitignore +0 -0
  78. {solara_ui-1.44.1 → solara_ui-1.45.0}/LICENSE +0 -0
  79. {solara_ui-1.44.1 → solara_ui-1.45.0}/README.md +0 -0
  80. {solara_ui-1.44.1 → solara_ui-1.45.0}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  81. {solara_ui-1.44.1 → solara_ui-1.45.0}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  82. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/__main__.py +0 -0
  83. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/_stores.py +0 -0
  84. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/alias.py +0 -0
  85. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/autorouting.py +0 -0
  86. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/cache.py +0 -0
  87. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/checks.html +0 -0
  88. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/checks.py +0 -0
  89. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/comm.py +0 -0
  90. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/__init__.py +0 -0
  91. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/alert.py +0 -0
  92. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/applayout.py +0 -0
  93. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/button.py +0 -0
  94. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/card.py +0 -0
  95. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/checkbox.py +0 -0
  96. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/code_highlight_css.py +0 -0
  97. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/code_highlight_css.vue +0 -0
  98. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/columns.py +0 -0
  99. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/component_vue.py +0 -0
  100. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/cross_filter.py +0 -0
  101. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/datatable.py +0 -0
  102. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/datatable.vue +0 -0
  103. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/details.py +0 -0
  104. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/download.vue +0 -0
  105. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/echarts.py +0 -0
  106. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/echarts.vue +0 -0
  107. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/figure_altair.py +0 -0
  108. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/file_browser.py +0 -0
  109. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/file_download.py +0 -0
  110. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/file_drop.vue +0 -0
  111. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/file_list_widget.vue +0 -0
  112. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/head.py +0 -0
  113. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/head_tag.py +0 -0
  114. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/head_tag.vue +0 -0
  115. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/image.py +0 -0
  116. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/input.py +0 -0
  117. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/input_text_area.py +0 -0
  118. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/link.py +0 -0
  119. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/markdown.py +0 -0
  120. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/markdown_editor.py +0 -0
  121. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/markdown_editor.vue +0 -0
  122. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/matplotlib.py +0 -0
  123. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/meta.py +0 -0
  124. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/misc.py +0 -0
  125. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/pivot_table.py +0 -0
  126. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/pivot_table.vue +0 -0
  127. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/progress.py +0 -0
  128. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/select.py +0 -0
  129. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/select.vue +0 -0
  130. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/slider.py +0 -0
  131. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/slider_date.vue +0 -0
  132. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/spinner-solara.vue +0 -0
  133. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/spinner.py +0 -0
  134. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/sql_code.py +0 -0
  135. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/sql_code.vue +0 -0
  136. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/style.py +0 -0
  137. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/switch.py +0 -0
  138. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/tab_navigation.py +0 -0
  139. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/title.py +0 -0
  140. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/title.vue +0 -0
  141. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/togglebuttons.py +0 -0
  142. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/components/tooltip.py +0 -0
  143. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/core.py +0 -0
  144. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/datatypes.py +0 -0
  145. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/express.py +0 -0
  146. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/hooks/__init__.py +0 -0
  147. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/hooks/dataframe.py +0 -0
  148. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/hooks/misc.py +0 -0
  149. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/hooks/use_reactive.py +0 -0
  150. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/hooks/use_thread.py +0 -0
  151. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/kitchensink.py +0 -0
  152. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/__init__.py +0 -0
  153. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/__init__.py +0 -0
  154. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/chat.py +0 -0
  155. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/confirmation_dialog.py +0 -0
  156. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/cross_filter.py +0 -0
  157. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/input_date.py +0 -0
  158. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/input_time.py +0 -0
  159. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/menu.py +0 -0
  160. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/menu.vue +0 -0
  161. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/tabs.py +0 -0
  162. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/theming.py +0 -0
  163. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/components/theming.vue +0 -0
  164. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/hooks/__init__.py +0 -0
  165. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/hooks/dataframe.py +0 -0
  166. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/toestand.py +0 -0
  167. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/utils/__init__.py +0 -0
  168. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/utils/cookies.py +0 -0
  169. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/utils/dataframe.py +0 -0
  170. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lab/utils/headers.py +0 -0
  171. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/layout.py +0 -0
  172. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/lifecycle.py +0 -0
  173. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/minisettings.py +0 -0
  174. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/py.typed +0 -0
  175. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/reactive.py +0 -0
  176. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/routing.py +0 -0
  177. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/scope/__init__.py +0 -0
  178. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/scope/types.py +0 -0
  179. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/__init__.py +0 -0
  180. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/app.py +0 -0
  181. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/custom.css +0 -0
  182. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/custom.js +0 -0
  183. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/favicon.png +0 -0
  184. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/favicon.svg +0 -0
  185. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/style.css +0 -0
  186. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/theme-dark.css +0 -0
  187. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/theme-light.css +0 -0
  188. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/assets/theme.js +0 -0
  189. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/cdn_helper.py +0 -0
  190. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/esm.py +0 -0
  191. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/fastapi.py +0 -0
  192. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/flask.py +0 -0
  193. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/jupyter/__init__.py +0 -0
  194. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/jupyter/cdn_handler.py +0 -0
  195. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/jupyter/server_extension.py +0 -0
  196. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/jupyter/solara.py +0 -0
  197. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/jupytertools.py +0 -0
  198. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/patch.py +0 -0
  199. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/pyinstaller/__init__.py +0 -0
  200. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/pyinstaller/hook-ipyreact.py +0 -0
  201. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/pyinstaller/hook-ipyvuetify.py +0 -0
  202. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/pyinstaller/hook-solara.py +0 -0
  203. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/qt.py +0 -0
  204. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/reload.py +0 -0
  205. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/server.py +0 -0
  206. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/settings.py +0 -0
  207. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/shell.py +0 -0
  208. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/ansi.js +0 -0
  209. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/highlight-dark.css +0 -0
  210. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/highlight.css +0 -0
  211. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/main-vuetify.js +0 -0
  212. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/main.js +0 -0
  213. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/sun.svg +0 -0
  214. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/static/webworker.js +0 -0
  215. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/telemetry.py +0 -0
  216. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/index.html.j2 +0 -0
  217. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/loader-plain.css +0 -0
  218. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/loader-plain.html +0 -0
  219. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/loader-solara.css +0 -0
  220. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/loader-solara.html +0 -0
  221. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/plain.html +0 -0
  222. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/templates/solara.html.j2 +0 -0
  223. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/threaded.py +0 -0
  224. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/utils.py +0 -0
  225. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/server/websocket.py +0 -0
  226. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/settings.py +0 -0
  227. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/button.py +0 -0
  228. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/markdown.py +0 -0
  229. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/.flake8 +0 -0
  230. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/.pre-commit-config.yaml +0 -0
  231. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/LICENSE +0 -0
  232. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/Procfile +0 -0
  233. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/mypy.ini +0 -0
  234. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/pyproject.toml +0 -0
  235. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/__init__.py +0 -0
  236. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  237. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/components/article.py +0 -0
  238. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/components/data.py +0 -0
  239. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/components/header.py +0 -0
  240. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/components/layout.py +0 -0
  241. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  242. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  243. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/data.py +0 -0
  244. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  245. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  246. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  247. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  248. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  249. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/test/__init__.py +0 -0
  250. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/util.py +0 -0
  251. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/validate_hooks.py +0 -0
  252. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/__init__.py +0 -0
  253. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/assets/custom.css +0 -0
  254. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/assets/images/logo-small.png +0 -0
  255. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/assets/images/logo.svg +0 -0
  256. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/assets/images/logo_white.svg +0 -0
  257. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/assets/theme.js +0 -0
  258. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/__init__.py +0 -0
  259. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/algolia.py +0 -0
  260. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/algolia.vue +0 -0
  261. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/algolia_api.vue +0 -0
  262. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/breadcrumbs.py +0 -0
  263. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/contact.py +0 -0
  264. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/docs.py +0 -0
  265. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/header.py +0 -0
  266. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/mailchimp.py +0 -0
  267. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/mailchimp.vue +0 -0
  268. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/markdown.py +0 -0
  269. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/markdown_nav.vue +0 -0
  270. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/notebook.py +0 -0
  271. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/components/sidebar.py +0 -0
  272. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/about/__init__.py +0 -0
  273. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/about/about.md +0 -0
  274. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/__init__.py +0 -0
  275. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/authorization/__init__.py +0 -0
  276. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/authorization/admin.py +0 -0
  277. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/authorization/users.py +0 -0
  278. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  279. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/layout-demo.py +0 -0
  280. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/multipage/__init__.py +0 -0
  281. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/multipage/page1.py +0 -0
  282. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/multipage/page2.py +0 -0
  283. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/scatter.py +0 -0
  284. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/scrolling.py +0 -0
  285. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  286. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/careers/__init__.py +0 -0
  287. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/changelog/__init__.py +0 -0
  288. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/changelog/changelog.md +0 -0
  289. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/contact/__init__.py +0 -0
  290. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/doc_use_download.py +0 -0
  291. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/__init__.py +0 -0
  292. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  293. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  294. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  295. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  296. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  297. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -0
  298. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  299. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -0
  300. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  301. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  302. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  303. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +0 -0
  304. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  305. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  306. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  307. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  308. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  309. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  310. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  311. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  312. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  313. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  314. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  315. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  316. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  317. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  318. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -0
  319. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -0
  320. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  321. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -0
  322. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -0
  323. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  324. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  325. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  326. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/__init__.py +0 -0
  327. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  328. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  329. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  330. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  331. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  332. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  333. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  334. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  335. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  336. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  337. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  338. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  339. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  340. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  341. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  342. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  343. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  344. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_thread.md +0 -0
  345. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  346. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  347. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  348. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  349. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  350. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  351. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/route.py +0 -0
  352. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  353. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  354. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  355. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  356. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  357. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  358. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  359. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  360. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  361. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  362. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  363. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  364. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/__init__.py +0 -0
  365. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  366. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  367. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  368. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  369. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/common.py +0 -0
  370. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  371. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  372. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/data/pivot_table.py +0 -0
  373. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  374. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  375. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  376. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  377. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/button.py +0 -0
  378. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  379. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
  380. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  381. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/input.py +0 -0
  382. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/select.py +0 -0
  383. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/slider.py +0 -0
  384. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/switch.py +0 -0
  385. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  386. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  387. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  388. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  389. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  390. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  391. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/input_time.py +0 -0
  392. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  393. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  394. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  395. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/task.py +0 -0
  396. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  397. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  398. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  399. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  400. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  401. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  402. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/card.py +0 -0
  403. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  404. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/column.py +0 -0
  405. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  406. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  407. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/details.py +0 -0
  408. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  409. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  410. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  411. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/row.py +0 -0
  412. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  413. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  414. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  415. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  416. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/html.py +0 -0
  417. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/image.py +0 -0
  418. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  419. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  420. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/sql_code.py +0 -0
  421. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  422. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  423. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/page/head.py +0 -0
  424. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/page/title.py +0 -0
  425. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  426. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/error.py +0 -0
  427. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/info.py +0 -0
  428. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/progress.py +0 -0
  429. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  430. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/success.py +0 -0
  431. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/status/warning.py +0 -0
  432. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  433. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  434. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  435. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  436. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  437. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  438. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/__init__.py +0 -0
  439. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  440. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
  441. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  442. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  443. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  444. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  445. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  446. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  447. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  448. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  449. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  450. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  451. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  452. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  453. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  454. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  455. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  456. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  457. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  458. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
  459. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  460. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
  461. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
  462. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
  463. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
  464. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  465. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  466. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
  467. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  468. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  469. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
  470. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
  471. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  472. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/faq/__init__.py +0 -0
  473. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  474. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  475. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
  476. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  477. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  478. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  479. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  480. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  481. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  482. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  483. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  484. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  485. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  486. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
  487. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -0
  488. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  489. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -0
  490. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -0
  491. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  492. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -0
  493. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  494. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  495. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  496. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/docutils.py +0 -0
  497. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/home.vue +0 -0
  498. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/our_team/__init__.py +0 -0
  499. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/pricing/__init__.py +0 -0
  500. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/roadmap/__init__.py +0 -0
  501. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/roadmap/roadmap.md +0 -0
  502. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/scale_ipywidgets.py +0 -0
  503. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/__init__.py +0 -0
  504. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  505. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/planeto_tessa.py +0 -0
  506. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/solara_dev.py +0 -0
  507. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  508. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  509. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  510. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  511. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/pages/showcase/wanderlust.py +0 -0
  512. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/public/beach.jpeg +0 -0
  513. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/public/logo.svg +0 -0
  514. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/public/social/discord.svg +0 -0
  515. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/public/social/github.svg +0 -0
  516. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/public/social/twitter.svg +0 -0
  517. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/public/success.html +0 -0
  518. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/templates/index.html.j2 +0 -0
  519. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/website/utils.py +0 -0
  520. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/widgets/__init__.py +0 -0
  521. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/widgets/vue/gridlayout.vue +0 -0
  522. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/widgets/vue/html.vue +0 -0
  523. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/widgets/vue/navigator.vue +0 -0
  524. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/widgets/vue/vegalite.vue +0 -0
  525. {solara_ui-1.44.1 → solara_ui-1.45.0}/solara/widgets/widgets.py +0 -0
  526. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/__init__.py +0 -0
  527. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/conftest.py +0 -0
  528. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  529. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  530. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  531. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  532. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  533. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/__init__.py +0 -0
  534. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/api_test.py +0 -0
  535. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/app_widget.py +0 -0
  536. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/apps/not-allowed +0 -0
  537. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/apps/public/test.txt +0 -0
  538. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/apps/secure/app.py +0 -0
  539. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets/assets1/common.js +0 -0
  540. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets/assets1/unique1.js +0 -0
  541. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets/assets2/common.js +0 -0
  542. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets/assets2/custom.css +0 -0
  543. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets/assets2/custom.js +0 -0
  544. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets/assets2/unique2.js +0 -0
  545. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/assets_test.py +0 -0
  546. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/async_test.py +0 -0
  547. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/cdn_test.py +0 -0
  548. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/cmdline_test.py +0 -0
  549. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/conftest.py +0 -0
  550. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/create_test.py +0 -0
  551. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/enterprise/__init__.py +0 -0
  552. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/enterprise/oauth_test.py +0 -0
  553. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/error_test.py +0 -0
  554. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/esm_test.py +0 -0
  555. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/file_download_test.py +0 -0
  556. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/flask_test.py +0 -0
  557. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/input_date_test.py +0 -0
  558. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/latex_test.py +0 -0
  559. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/markdown_test.py +0 -0
  560. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/memleak_test.py +0 -0
  561. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/menu_test.py +0 -0
  562. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/popout_test.py +0 -0
  563. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/reconnect_test.py +0 -0
  564. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/reload/apps.py +0 -0
  565. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/router_test.py +0 -0
  566. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/server_test.py +0 -0
  567. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/ssg_test.py +0 -0
  568. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/starlette_test.py +0 -0
  569. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/test.vue +0 -0
  570. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/testapp.py +0 -0
  571. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/integration/widget_test.py +0 -0
  572. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/pyinstaller/__init__.py +0 -0
  573. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/pyinstaller/pyinstaller_test.py +0 -0
  574. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
  575. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
  576. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
  577. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
  578. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  579. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  580. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
  581. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
  582. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  583. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  584. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
  585. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
  586. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
  587. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
  588. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
  589. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
  590. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  591. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
  592. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  593. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/__init__.py +0 -0
  594. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/app_test.py +0 -0
  595. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/applayout_test.py +0 -0
  596. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/cdn_helper_test.py +0 -0
  597. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/chat_test.py +0 -0
  598. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/checkbox_test.py +0 -0
  599. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/common.py +0 -0
  600. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/component_frontend_test.py +0 -0
  601. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/component_vue_test.vue +0 -0
  602. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/confirmation_dialog_test.py +0 -0
  603. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/conftest.py +0 -0
  604. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/display_test.py +0 -0
  605. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/express_test.py +0 -0
  606. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/file_browser_test.py +0 -0
  607. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/file_download_test.py +0 -0
  608. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/hook_use_invalid_test.py +0 -0
  609. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/hooks_test.py +0 -0
  610. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/input_date_test.py +0 -0
  611. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/input_test.py +0 -0
  612. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/input_time_test.py +0 -0
  613. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/kernel_test.py +0 -0
  614. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/lab/__init__.py +0 -0
  615. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/lifecycle_test.py +0 -0
  616. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/matplotlib_test.py +0 -0
  617. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/no_solara_test.py +0 -0
  618. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/output_widget_test.py +0 -0
  619. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/patch_test.py +0 -0
  620. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/reload_test.py +0 -0
  621. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/router_test.py +0 -0
  622. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/select_test.py +0 -0
  623. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/settings_test.py +0 -0
  624. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/shell_test.py +0 -0
  625. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/slider_test.py +0 -0
  626. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/__init__.py +0 -0
  627. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/food/__init__.py +0 -0
  628. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/food/food.py +0 -0
  629. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/food/index.py +0 -0
  630. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  631. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  632. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  633. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  634. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  635. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  636. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  637. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
  638. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  639. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  640. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  641. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  642. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  643. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  644. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  645. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  646. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
  647. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
  648. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  649. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  650. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/single_file.py +0 -0
  651. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  652. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  653. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/switch_test.py +0 -0
  654. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/tabs_test.py +0 -0
  655. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/telemetry_tests.py +0 -0
  656. {solara_ui-1.44.1 → solara_ui-1.45.0}/tests/unit/toestand_computed_reload.py +0 -0
  657. {solara_ui-1.44.1 → solara_ui-1.45.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.44.1
3
+ Version: 1.45.0
4
4
  Dynamic: Summary
5
5
  Project-URL: Home, https://www.github.com/widgetti/solara
6
6
  Project-URL: Documentation, https://solara.dev
@@ -27,6 +27,7 @@ License: The MIT License (MIT)
27
27
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28
28
  THE SOFTWARE.
29
29
  Classifier: License :: OSI Approved :: MIT License
30
+ Requires-Python: >=3.7
30
31
  Requires-Dist: humanize
31
32
  Requires-Dist: ipyvue>=1.9.0
32
33
  Requires-Dist: ipyvuetify>=1.6.10
@@ -8,6 +8,7 @@ name = "solara-ui"
8
8
  readme = "README.md"
9
9
  authors = [{name = "Maarten A. Breddels", email = "maartenbreddels@gmail.com"}]
10
10
  license = {file = "LICENSE"}
11
+ requires-python = ">=3.7"
11
12
  classifiers = ["License :: OSI Approved :: MIT License"]
12
13
  dynamic = ["version", "description"]
13
14
  packages = [
@@ -93,7 +94,9 @@ line-length = 160
93
94
  [tool.pytest.ini_options]
94
95
  addopts = "--ignore=tests/integration/app_widget.py --ignore=tests/unit/solara_test_apps"
95
96
  timeout = 180
96
-
97
+ filterwarnings = [
98
+ 'ignore:.*pyzmq now works with default tornado and asyncio eventloops.*:DeprecationWarning',
99
+ ]
97
100
 
98
101
  [tool.codespell]
99
102
  skip='equis-in-vidi.md,substiterat-vati.md,.*,solara/website/build,*.svg,highlight-dark.css,packages/**/dist/*,node_modules,packages/solara-assets,package*.json,tsconfig.tsbuildinfo,*.csv'
@@ -1,6 +1,6 @@
1
1
  """Build webapps using IPywidgets"""
2
2
 
3
- __version__ = "1.44.1"
3
+ __version__ = "1.45.0"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -76,7 +76,7 @@ def Table(df, n=5):
76
76
  output_real.outputs = tuple()
77
77
  output_real.append_display_data(df)
78
78
 
79
- solara.use_side_effect(output)
79
+ solara.use_effect(output)
80
80
  return output_c
81
81
 
82
82
 
@@ -204,7 +204,7 @@ def ScatterCard(df, x=None, y=None, color=None):
204
204
  dff = df
205
205
  if filter:
206
206
  dff = df[filter]
207
- columns = df.get_column_names()
207
+ columns = use_df_column_names(df)
208
208
  max_points = 1000
209
209
  floats = [k for k in columns if df[k].dtype == float]
210
210
  # flots = df.get_column_names()
@@ -353,7 +353,7 @@ def HeatmapCard(df, x=None, y=None, debounce=True):
353
353
  selection = filter
354
354
  # print("unfiltered", dff is df)
355
355
 
356
- items = df.get_column_names()
356
+ items = use_df_column_names(df)
357
357
  floats = [k for k in items if df[k].dtype == float]
358
358
 
359
359
  with v.Card(elevation=2, height=cardheight) as main:
@@ -58,7 +58,7 @@ def _FileDrop(
58
58
 
59
59
  set_wired_files(cast(typing.List[FileInfo], real.get_files()))
60
60
 
61
- solara.use_side_effect(wire_files, [file_info])
61
+ solara.use_effect(wire_files, [file_info])
62
62
 
63
63
  def handle_file(cancel: threading.Event):
64
64
  if not wired_files:
@@ -227,8 +227,10 @@ def send_websockets(websockets: Set[websocket.WebsocketWrapper], binary_msg):
227
227
  logger.exception("Error sending message: %s, closing websocket", e)
228
228
  try:
229
229
  ws.close()
230
- except Exception as e: # noqa
231
- logger.exception("Error closing websocket: %s", e)
230
+ except websocket.WebSocketDisconnect:
231
+ pass # was already closed, which triggered the original exception
232
+ except Exception as e2: # noqa
233
+ logger.exception("Error closing websocket: %s %s", e, e2)
232
234
  try:
233
235
  # websocket can be modified by another thread
234
236
  websockets.remove(ws)
@@ -77,6 +77,7 @@ class VirtualKernelContext:
77
77
  closed_event: threading.Event = dataclasses.field(default_factory=threading.Event)
78
78
  _on_close_callbacks: List[Callable[[], None]] = dataclasses.field(default_factory=list)
79
79
  lock: threading.RLock = dataclasses.field(default_factory=threading.RLock)
80
+ event_loop: asyncio.AbstractEventLoop = dataclasses.field(default_factory=asyncio.get_event_loop)
80
81
 
81
82
  def __post_init__(self):
82
83
  with self:
@@ -132,29 +132,46 @@ class WebsocketWrapper(websocket.WebsocketWrapper):
132
132
  # and re-raise it as a websocket.WebSocketDisconnect
133
133
  try:
134
134
  await self.ws.send_bytes(data)
135
- except (websockets.exceptions.ConnectionClosed, starlette.websockets.WebSocketDisconnect, RuntimeError) as e:
135
+ except RuntimeError as e:
136
136
  # starlette throws a RuntimeError once you call send after the connection is closed
137
- if isinstance(e, RuntimeError) and "close message" in repr(e):
137
+ # or RuntimeError: Unexpected ASGI message 'websocket.send', after sending 'websocket.close' or response already completed.
138
+ # from uvicorn.protocols.websockets.websockets_impl.py
139
+ if "close message" in repr(e) or "websocket.close" in repr(e):
138
140
  raise websocket.WebSocketDisconnect() from e
139
141
  else:
140
142
  raise
143
+ except (websockets.exceptions.ConnectionClosed, starlette.websockets.WebSocketDisconnect, RuntimeError) as e:
144
+ raise websocket.WebSocketDisconnect() from e
141
145
 
142
146
  async def _send_text_exc(self, data: str):
143
147
  # make sures we catch the starlette/websockets specific exception
144
148
  # and re-raise it as a websocket.WebSocketDisconnect
145
149
  try:
146
150
  await self.ws.send_text(data)
147
- except (websockets.exceptions.ConnectionClosed, starlette.websockets.WebSocketDisconnect, RuntimeError) as e:
148
- if isinstance(e, RuntimeError) and "close message" in repr(e):
151
+ except RuntimeError as e:
152
+ if "close message" in repr(e) or "websocket.close" in repr(e):
149
153
  raise websocket.WebSocketDisconnect() from e
150
154
  else:
151
155
  raise
156
+ except (websockets.exceptions.ConnectionClosed, starlette.websockets.WebSocketDisconnect, RuntimeError) as e:
157
+ raise websocket.WebSocketDisconnect() from e
152
158
 
153
159
  def close(self):
160
+ async def _close_exc():
161
+ try:
162
+ await self.ws.close()
163
+ except RuntimeError as e:
164
+ if "close message" in repr(e) or "websocket.close" in repr(e):
165
+ raise websocket.WebSocketDisconnect() from e
166
+ else:
167
+ raise
168
+ except (websockets.exceptions.ConnectionClosed, starlette.websockets.WebSocketDisconnect, RuntimeError) as e:
169
+ raise websocket.WebSocketDisconnect() from e
170
+
154
171
  if self.portal is None:
155
- asyncio.ensure_future(self.ws.close())
172
+ asyncio.ensure_future(_close_exc())
156
173
  else:
157
- self.portal.call(self.ws.close)
174
+ self.portal.call(_close_exc)
158
175
 
159
176
  def send_text(self, data: str) -> None:
160
177
  if self.portal is None:
@@ -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.44.1-py2.py3-none-any.whl", keep_going=True)
122
+ await micropip.install("/wheels/solara-1.45.0-py2.py3-none-any.whl", keep_going=True)
123
123
  import solara
124
124
 
125
125
  el = solara.Warning("lala")
@@ -25,6 +25,7 @@ import typing_extensions
25
25
  import solara
26
26
  import solara.util
27
27
  from solara.toestand import Singleton
28
+ from solara import _using_solara_server
28
29
 
29
30
  from .toestand import Ref as ref
30
31
 
@@ -41,6 +42,24 @@ P = typing_extensions.ParamSpec("P")
41
42
  logger = logging.getLogger("solara.task")
42
43
 
43
44
  has_threads = solara.util.has_threads
45
+ _main_event_loop: Optional[asyncio.AbstractEventLoop] = None
46
+ try:
47
+ # this will be the event loop in Jupyter/IPython
48
+ # on Python >=3.12, get_running_loop() is preferred
49
+ if sys.version_info >= (3, 12):
50
+ _main_event_loop = asyncio.get_running_loop()
51
+ else:
52
+ _main_event_loop = asyncio.get_event_loop()
53
+ except RuntimeError:
54
+ pass
55
+
56
+
57
+ def _get_current_task():
58
+ # asyncio.current_task() is not available in Python 3.6
59
+ if sys.version_info >= (3, 7):
60
+ return asyncio.current_task()
61
+ else:
62
+ return asyncio.Task.current_task()
44
63
 
45
64
 
46
65
  class TaskState(Enum):
@@ -201,7 +220,6 @@ class TaskAsyncio(Task[P, R]):
201
220
  raise RuntimeError("Cannot retry task, never started")
202
221
 
203
222
  def __call__(self, *args: P.args, **kwargs: P.kwargs) -> None:
204
- self.current_future = future = asyncio.Future[R]()
205
223
  self._last_progress = None
206
224
  current_task: asyncio.Task[None]
207
225
  if self.current_task:
@@ -214,7 +232,7 @@ class TaskAsyncio(Task[P, R]):
214
232
  event_loop = current_task.get_loop()
215
233
  # cancel after cancel is a no-op
216
234
  self._cancel = lambda: None
217
- if asyncio.current_task() == current_task:
235
+ if _get_current_task() == current_task:
218
236
  if event_loop == asyncio.get_event_loop():
219
237
  # we got called in our own task and event loop
220
238
  raise _CancelledErrorInOurTask()
@@ -227,7 +245,15 @@ class TaskAsyncio(Task[P, R]):
227
245
 
228
246
  self._cancel = cancel
229
247
  self._retry = retry
230
- call_event_loop = asyncio.get_event_loop()
248
+ if _using_solara_server():
249
+ import solara.server.kernel_context
250
+
251
+ context = solara.server.kernel_context.get_current_context()
252
+ call_event_loop = context.event_loop
253
+ else:
254
+ call_event_loop = _main_event_loop or asyncio.get_event_loop()
255
+
256
+ self.current_future = future = call_event_loop.create_future()
231
257
 
232
258
  if self.run_in_thread:
233
259
  thread_event_loop = asyncio.new_event_loop()
@@ -253,12 +279,12 @@ class TaskAsyncio(Task[P, R]):
253
279
  def is_current(self):
254
280
  running_task = self.current_task
255
281
  assert running_task is not None
256
- return (self.current_task == asyncio.current_task()) and not running_task.cancelled()
282
+ return (self.current_task == _get_current_task()) and not running_task.cancelled()
257
283
 
258
284
  async def _async_run(self, call_event_loop: asyncio.AbstractEventLoop, future: asyncio.Future, args, kwargs) -> None:
259
285
  self._start_event.wait()
260
286
 
261
- task_for_this_call = asyncio.current_task()
287
+ task_for_this_call = _get_current_task()
262
288
  assert task_for_this_call is not None
263
289
 
264
290
  if self.is_current():
@@ -9,11 +9,12 @@ import sys
9
9
  import textwrap
10
10
  import threading
11
11
  import typing
12
+ import tempfile
12
13
  import urllib.parse
13
14
  import uuid
14
15
  from io import BytesIO
15
16
  from pathlib import Path
16
- from typing import Any, Callable, Dict, Generator, List, Union
17
+ from typing import Any, Callable, Dict, Generator, List, Union, cast
17
18
 
18
19
  import ipywidgets as widgets
19
20
  import pytest
@@ -55,74 +56,143 @@ def solara_server(pytestconfig: Any, request):
55
56
  webserver.stop_serving()
56
57
 
57
58
 
58
- @pytest.fixture(scope="session")
59
- def context_session(
60
- browser: "playwright.sync_api.Browser",
61
- browser_context_args: Dict,
62
- pytestconfig: Any,
63
- request: pytest.FixtureRequest,
64
- ) -> Generator["playwright.sync_api.BrowserContext", None, None]:
65
- from playwright.sync_api import Error, Page
66
- from pytest_playwright.pytest_playwright import _build_artifact_test_folder
67
- from slugify import slugify # type: ignore
68
-
69
- pages: List[Page] = []
70
- context = browser.new_context(**browser_context_args)
71
- context.on("page", lambda page: pages.append(page))
72
-
73
- tracing_option = pytestconfig.getoption("--tracing")
74
- capture_trace = tracing_option in ["on", "retain-on-failure"]
75
- if capture_trace:
76
- context.tracing.start(
77
- title=slugify(request.node.nodeid),
78
- screenshots=True,
79
- snapshots=True,
80
- sources=True,
81
- )
82
-
83
- # decrease timeout from 30s to 10s
84
- context.set_default_timeout(TIMEOUT * 1000)
85
- yield context
86
-
87
- # If request.node is missing rep_call, then some error happened during execution
88
- # that prevented teardown, but should still be counted as a failure
89
- failed = request.node.rep_call.failed if hasattr(request.node, "rep_call") else True
90
-
91
- if capture_trace:
92
- retain_trace = tracing_option == "on" or (failed and tracing_option == "retain-on-failure")
93
- if retain_trace:
94
- trace_path = _build_artifact_test_folder(pytestconfig, request, "trace.zip")
95
- context.tracing.stop(path=trace_path)
96
- else:
97
- context.tracing.stop()
98
-
99
- screenshot_option = pytestconfig.getoption("--screenshot")
100
- capture_screenshot = screenshot_option == "on" or (failed and screenshot_option == "only-on-failure")
101
- if capture_screenshot:
102
- for index, page in enumerate(pages):
103
- human_readable_status = "failed" if failed else "finished"
104
- screenshot_path = _build_artifact_test_folder(pytestconfig, request, f"test-{human_readable_status}-{index + 1}.png")
105
- try:
106
- page.screenshot(timeout=5000, path=screenshot_path)
107
- except Error:
108
- pass
109
-
110
- context.close()
111
-
112
- video_option = pytestconfig.getoption("--video")
113
- preserve_video = video_option == "on" or (failed and video_option == "retain-on-failure")
114
- if preserve_video:
115
- for page in pages:
116
- video = page.video
117
- if not video:
118
- continue
119
- try:
120
- video_path = video.path()
121
- file_name = os.path.basename(video_path)
122
- video.save_as(path=_build_artifact_test_folder(pytestconfig, request, file_name))
123
- except Error:
124
- # Silent catch empty videos.
125
- pass
59
+ try:
60
+ from pytest_playwright.pytest_playwright import connect_options # noqa
61
+
62
+ has_pytest_070 = True
63
+ except ImportError:
64
+ has_pytest_070 = False
65
+
66
+
67
+ if has_pytest_070:
68
+ # pytest-playwright >= 0.7.0
69
+ from pytest_playwright.pytest_playwright import Browser, CreateContextCallback, BrowserContext, Playwright, ArtifactsRecorder, _truncate_file_name
70
+ from slugify import slugify
71
+
72
+ @pytest.fixture(scope="session")
73
+ def output_path_session(pytestconfig: Any, request: pytest.FixtureRequest) -> str:
74
+ output_dir = Path(pytestconfig.getoption("--output")).absolute()
75
+ return os.path.join(output_dir, _truncate_file_name(slugify(request.node.nodeid)))
76
+
77
+ @pytest.fixture(scope="session")
78
+ def _artifacts_recorder_session(
79
+ request: pytest.FixtureRequest,
80
+ output_path_session: str,
81
+ playwright: Playwright,
82
+ pytestconfig: Any,
83
+ _pw_artifacts_folder: tempfile.TemporaryDirectory,
84
+ ) -> Generator["ArtifactsRecorder", None, None]:
85
+ artifacts_recorder = ArtifactsRecorder(pytestconfig, request, output_path_session, playwright, _pw_artifacts_folder)
86
+ yield artifacts_recorder
87
+ # If request.node is missing rep_call, then some error happened during execution
88
+ # that prevented teardown, but should still be counted as a failure
89
+ failed = request.node.rep_call.failed if hasattr(request.node, "rep_call") else True
90
+ artifacts_recorder.did_finish_test(failed)
91
+
92
+ @pytest.fixture(scope="session")
93
+ def new_context_session(
94
+ browser: Browser,
95
+ browser_context_args: Dict,
96
+ _artifacts_recorder_session: "ArtifactsRecorder",
97
+ request: pytest.FixtureRequest,
98
+ ) -> Generator[CreateContextCallback, None, None]:
99
+ browser_context_args = browser_context_args.copy()
100
+ context_args_marker = next(request.node.iter_markers("browser_context_args"), None)
101
+ additional_context_args = context_args_marker.kwargs if context_args_marker else {}
102
+ browser_context_args.update(additional_context_args)
103
+ contexts: List[BrowserContext] = []
104
+
105
+ def _new_context(**kwargs: Any) -> BrowserContext:
106
+ context = browser.new_context(**browser_context_args, **kwargs)
107
+ original_close = context.close
108
+
109
+ def _close_wrapper(*args: Any, **kwargs: Any) -> None:
110
+ contexts.remove(context)
111
+ _artifacts_recorder_session.on_will_close_browser_context(context)
112
+ original_close(*args, **kwargs)
113
+
114
+ context.close = _close_wrapper
115
+ contexts.append(context)
116
+ _artifacts_recorder_session.on_did_create_browser_context(context)
117
+ return context
118
+
119
+ yield cast(CreateContextCallback, _new_context)
120
+ for context in contexts.copy():
121
+ context.close()
122
+
123
+ @pytest.fixture(scope="session")
124
+ def context_session(new_context_session):
125
+ return new_context_session()
126
+ else:
127
+
128
+ @pytest.fixture(scope="session")
129
+ def context_session(
130
+ browser: "playwright.sync_api.Browser",
131
+ browser_context_args: Dict,
132
+ pytestconfig: Any,
133
+ request: pytest.FixtureRequest,
134
+ ) -> Generator["playwright.sync_api.BrowserContext", None, None]:
135
+ from playwright.sync_api import Error, Page
136
+ from pytest_playwright.pytest_playwright import _build_artifact_test_folder
137
+ from slugify import slugify # type: ignore
138
+
139
+ pages: List[Page] = []
140
+ context = browser.new_context(**browser_context_args)
141
+ context.on("page", lambda page: pages.append(page))
142
+
143
+ tracing_option = pytestconfig.getoption("--tracing")
144
+ capture_trace = tracing_option in ["on", "retain-on-failure"]
145
+ if capture_trace:
146
+ context.tracing.start(
147
+ title=slugify(request.node.nodeid),
148
+ screenshots=True,
149
+ snapshots=True,
150
+ sources=True,
151
+ )
152
+
153
+ # decrease timeout from 30s to 10s
154
+ context.set_default_timeout(TIMEOUT * 1000)
155
+ yield context
156
+
157
+ # If request.node is missing rep_call, then some error happened during execution
158
+ # that prevented teardown, but should still be counted as a failure
159
+ failed = request.node.rep_call.failed if hasattr(request.node, "rep_call") else True
160
+
161
+ if capture_trace:
162
+ retain_trace = tracing_option == "on" or (failed and tracing_option == "retain-on-failure")
163
+ if retain_trace:
164
+ trace_path = _build_artifact_test_folder(pytestconfig, request, "trace.zip")
165
+ context.tracing.stop(path=trace_path)
166
+ else:
167
+ context.tracing.stop()
168
+
169
+ screenshot_option = pytestconfig.getoption("--screenshot")
170
+ capture_screenshot = screenshot_option == "on" or (failed and screenshot_option == "only-on-failure")
171
+ if capture_screenshot:
172
+ for index, page in enumerate(pages):
173
+ human_readable_status = "failed" if failed else "finished"
174
+ screenshot_path = _build_artifact_test_folder(pytestconfig, request, f"test-{human_readable_status}-{index + 1}.png")
175
+ try:
176
+ page.screenshot(timeout=5000, path=screenshot_path)
177
+ except Error:
178
+ pass
179
+
180
+ context.close()
181
+
182
+ video_option = pytestconfig.getoption("--video")
183
+ preserve_video = video_option == "on" or (failed and video_option == "retain-on-failure")
184
+ if preserve_video:
185
+ for page in pages:
186
+ video = page.video
187
+ if not video:
188
+ continue
189
+ try:
190
+ video_path = video.path()
191
+ file_name = os.path.basename(video_path)
192
+ video.save_as(path=_build_artifact_test_folder(pytestconfig, request, file_name))
193
+ except Error:
194
+ # Silent catch empty videos.
195
+ pass
126
196
 
127
197
 
128
198
  # page fixture that keeps open all the time, is faster
@@ -44,6 +44,7 @@ _DEBUG = False
44
44
 
45
45
  class ThreadLocal(threading.local):
46
46
  reactive_used: Optional[Set["ValueBase"]] = None
47
+ reactive_watch: Optional[Callable[["ValueBase"], None]] = None
47
48
 
48
49
 
49
50
  thread_local = ThreadLocal()
@@ -542,6 +543,8 @@ class Reactive(ValueBase[S]):
542
543
  warnings.warn("add_watch is deprecated, use .peek()", DeprecationWarning)
543
544
  if thread_local.reactive_used is not None:
544
545
  thread_local.reactive_used.add(self)
546
+ if thread_local.reactive_watch is not None:
547
+ thread_local.reactive_watch(self)
545
548
  # peek to avoid parents also adding themselves to the reactive_used set
546
549
  return self._storage.peek()
547
550
 
@@ -741,6 +744,8 @@ class ReactiveField(Reactive[T]):
741
744
  warnings.warn("add_watch is deprecated, use .peek()", DeprecationWarning)
742
745
  if thread_local.reactive_used is not None:
743
746
  thread_local.reactive_used.add(self)
747
+ if thread_local.reactive_watch is not None:
748
+ thread_local.reactive_watch(self)
744
749
  # peek to avoid parents also adding themselves to the reactive_used set
745
750
  return self._field.peek()
746
751
 
@@ -864,35 +869,43 @@ class AutoSubscribeContextManagerBase:
864
869
  # a render loop might trigger a new render loop of a differtent render context
865
870
  # so we want to save, and restore the current reactive_used
866
871
  reactive_used: Optional[Set[ValueBase]] = None
867
- reactive_added_previous_run: Optional[Set[ValueBase]] = None
868
872
  subscribed: Dict[ValueBase, Callable]
873
+ subscribed_previous_run: Dict[ValueBase, Callable]
874
+ on_change: Callable[[], None]
875
+ previous_reactive_watch: Optional[Callable[["ValueBase"], None]] = None
869
876
 
870
877
  def __init__(self):
871
878
  self.subscribed = {}
872
-
873
- def update_subscribers(self, change_handler):
874
- assert self.reactive_used is not None
875
- reactive_used = self.reactive_used
876
- # remove subfields for which we already listen to it's root reactive value
877
- reactive_used_subfields = {k for k in reactive_used if isinstance(k, ValueSubField)}
878
- reactive_used = reactive_used - reactive_used_subfields
879
- # only add subfield for which we don't listen to it's parent
880
- for reactive_used_subfield in reactive_used_subfields:
881
- if reactive_used_subfield._root not in reactive_used:
882
- reactive_used.add(reactive_used_subfield)
883
- added = reactive_used - (self.reactive_added_previous_run or set())
884
-
885
- removed = (self.reactive_added_previous_run or set()) - reactive_used
886
-
887
- for reactive in added:
888
- if reactive not in self.subscribed:
889
- unsubscribe = reactive.subscribe_change(change_handler)
890
- self.subscribed[reactive] = unsubscribe
891
- for reactive in removed:
892
- unsubscribe = self.subscribed[reactive]
893
- unsubscribe()
894
- del self.subscribed[reactive]
895
- self.reactive_added_previous_run = added
879
+ self.subscribed_previous_run = {}
880
+ self.on_change = lambda: None
881
+
882
+ def unsubscribe_previous(self):
883
+ removed = set(self.subscribed_previous_run or set()) - set(self.subscribed)
884
+ if removed:
885
+ for reactive in removed:
886
+ unsubscribe = self.subscribed_previous_run[reactive]
887
+ unsubscribe()
888
+ del self.subscribed_previous_run[reactive]
889
+
890
+ def add(self, reactive: ValueBase):
891
+ relevant_reactive = reactive
892
+ if isinstance(reactive, ValueSubField):
893
+ root = reactive._root
894
+ if root in self.subscribed or root in self.subscribed_previous_run:
895
+ # we already subscribed to this reactive's root
896
+ return
897
+ else:
898
+ # we are subscribing to this reactive's root
899
+ pass
900
+
901
+ # TODO: we could see if we are the root of any of the subscribed fields,
902
+ # and remove that field.
903
+ if relevant_reactive not in self.subscribed:
904
+ if relevant_reactive not in self.subscribed_previous_run:
905
+ unsubscribe = relevant_reactive.subscribe_change(lambda *args: self.on_change())
906
+ self.subscribed[relevant_reactive] = unsubscribe
907
+ else:
908
+ self.subscribed[relevant_reactive] = self.subscribed_previous_run[relevant_reactive]
896
909
 
897
910
  def unsubscribe_all(self):
898
911
  for reactive in self.subscribed:
@@ -900,12 +913,17 @@ class AutoSubscribeContextManagerBase:
900
913
  unsubscribe()
901
914
 
902
915
  def __enter__(self):
916
+ self.subscribed = {}
903
917
  self.reactive_used_before = thread_local.reactive_used
918
+ self.previous_reactive_watch = thread_local.reactive_watch
919
+ thread_local.reactive_watch = self.add
904
920
  self.reactive_used = thread_local.reactive_used = set()
905
- assert thread_local.reactive_used is self.reactive_used, f"{hex(id(thread_local.reactive_used))} vs {hex(id(self.reactive_used))}"
906
921
 
907
922
  def __exit__(self, exc_type, exc_val, exc_tb):
908
923
  thread_local.reactive_used = self.reactive_used_before
924
+ thread_local.reactive_watch = self.previous_reactive_watch
925
+ self.unsubscribe_previous()
926
+ self.subscribed_previous_run = self.subscribed.copy()
909
927
 
910
928
 
911
929
  class Context:
@@ -925,6 +943,7 @@ class Context:
925
943
  res1 = self.render_context.__exit__(exc_type, exc_val, exc_tb)
926
944
  else:
927
945
  res1 = None
946
+
928
947
  # pop the current context from the stack
929
948
  res2 = self.kernel_context.__exit__(exc_type, exc_val, exc_tb)
930
949
  return res1 or res2
@@ -949,20 +968,15 @@ class AutoSubscribeContextManagerReacton(AutoSubscribeContextManagerBase):
949
968
  def __enter__(self):
950
969
  _, set_counter = solara.use_state(0, key="auto_subscribe_force_update_counter")
951
970
 
952
- def force_update(new_value, old_value):
971
+ def force_update():
953
972
  # can we do just x+1 to collapse multiple updates into one?
954
973
  set_counter(lambda x: x + 1)
955
974
 
956
975
  super().__enter__()
957
-
958
- def update_subscribers():
959
- self.update_subscribers(force_update)
960
-
961
- solara.use_effect(update_subscribers, None)
976
+ self.on_change = force_update
962
977
 
963
978
  def on_close():
964
979
  def cleanup():
965
- assert self.reactive_added_previous_run is not None
966
980
  self.unsubscribe_all()
967
981
 
968
982
  return cleanup
@@ -971,20 +985,10 @@ class AutoSubscribeContextManagerReacton(AutoSubscribeContextManagerBase):
971
985
 
972
986
 
973
987
  class AutoSubscribeContextManager(AutoSubscribeContextManagerBase):
974
- on_change: Callable[[], None]
975
-
976
988
  def __init__(self, on_change: Callable[[], None]):
977
989
  super().__init__()
978
990
  self.on_change = on_change
979
991
 
980
- def __enter__(self):
981
- super().__enter__()
982
-
983
- def __exit__(self, exc_type, exc_val, exc_tb):
984
- value = super().__exit__(exc_type, exc_val, exc_tb)
985
- self.update_subscribers(self.on_change)
986
- return value
987
-
988
992
 
989
993
  # alias for compatibility
990
994
  State = Reactive