solara-ui 1.56.0__tar.gz → 1.57.1__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 (633) hide show
  1. {solara_ui-1.56.0 → solara_ui-1.57.1}/.gitignore +1 -0
  2. {solara_ui-1.56.0 → solara_ui-1.57.1}/PKG-INFO +1 -1
  3. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/__init__.py +1 -1
  4. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/figure_altair.py +9 -5
  5. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/file_browser.py +50 -3
  6. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/solara_bootstrap.py +1 -1
  7. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/changelog/changelog.md +83 -0
  8. solara_ui-1.57.1/tests/unit/figure_altair_test.py +75 -0
  9. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/file_browser_test.py +195 -0
  10. {solara_ui-1.56.0 → solara_ui-1.57.1}/LICENSE +0 -0
  11. {solara_ui-1.56.0 → solara_ui-1.57.1}/README.md +0 -0
  12. {solara_ui-1.56.0 → solara_ui-1.57.1}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  13. {solara_ui-1.56.0 → solara_ui-1.57.1}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  14. {solara_ui-1.56.0 → solara_ui-1.57.1}/pyproject.toml +0 -0
  15. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/__main__.py +0 -0
  16. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/_stores.py +0 -0
  17. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/alias.py +0 -0
  18. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/autorouting.py +0 -0
  19. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/cache.py +0 -0
  20. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/checks.html +0 -0
  21. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/checks.py +0 -0
  22. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/comm.py +0 -0
  23. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/__init__.py +0 -0
  24. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/alert.py +0 -0
  25. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/applayout.py +0 -0
  26. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/button.py +0 -0
  27. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/card.py +0 -0
  28. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/checkbox.py +0 -0
  29. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/code_highlight_css.py +0 -0
  30. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/code_highlight_css.vue +0 -0
  31. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/columns.py +0 -0
  32. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/component_vue.py +0 -0
  33. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/cross_filter.py +0 -0
  34. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/dataframe.py +0 -0
  35. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/datatable.py +0 -0
  36. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/datatable.vue +0 -0
  37. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/details.py +0 -0
  38. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/download.vue +0 -0
  39. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/echarts.py +0 -0
  40. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/echarts.vue +0 -0
  41. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/file_download.py +0 -0
  42. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/file_drop.py +0 -0
  43. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/file_drop.vue +0 -0
  44. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/file_list_widget.vue +0 -0
  45. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/head.py +0 -0
  46. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/head_tag.py +0 -0
  47. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/head_tag.vue +0 -0
  48. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/image.py +0 -0
  49. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/input.py +0 -0
  50. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/input_text_area.py +0 -0
  51. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/link.py +0 -0
  52. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/markdown.py +0 -0
  53. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/markdown_editor.py +0 -0
  54. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/markdown_editor.vue +0 -0
  55. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/matplotlib.py +0 -0
  56. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/meta.py +0 -0
  57. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/misc.py +0 -0
  58. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/pivot_table.py +0 -0
  59. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/pivot_table.vue +0 -0
  60. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/progress.py +0 -0
  61. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/select.py +0 -0
  62. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/select.vue +0 -0
  63. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/slider.py +0 -0
  64. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/slider_date.vue +0 -0
  65. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/spinner-solara.vue +0 -0
  66. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/spinner.py +0 -0
  67. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/sql_code.py +0 -0
  68. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/sql_code.vue +0 -0
  69. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/style.py +0 -0
  70. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/switch.py +0 -0
  71. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/tab_navigation.py +0 -0
  72. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/title.py +0 -0
  73. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/title.vue +0 -0
  74. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/togglebuttons.py +0 -0
  75. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/components/tooltip.py +0 -0
  76. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/core.py +0 -0
  77. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/datatypes.py +0 -0
  78. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/express.py +0 -0
  79. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/hooks/__init__.py +0 -0
  80. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/hooks/dataframe.py +0 -0
  81. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/hooks/misc.py +0 -0
  82. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/hooks/use_reactive.py +0 -0
  83. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/hooks/use_thread.py +0 -0
  84. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/kitchensink.py +0 -0
  85. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/__init__.py +0 -0
  86. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/__init__.py +0 -0
  87. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/chat.py +0 -0
  88. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/confirmation_dialog.py +0 -0
  89. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/cross_filter.py +0 -0
  90. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/input_date.py +0 -0
  91. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/input_time.py +0 -0
  92. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/menu.py +0 -0
  93. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/menu.vue +0 -0
  94. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/tabs.py +0 -0
  95. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/theming.py +0 -0
  96. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/components/theming.vue +0 -0
  97. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/hooks/__init__.py +0 -0
  98. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/hooks/dataframe.py +0 -0
  99. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/toestand.py +0 -0
  100. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/utils/__init__.py +0 -0
  101. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/utils/cookies.py +0 -0
  102. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/utils/dataframe.py +0 -0
  103. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lab/utils/headers.py +0 -0
  104. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/layout.py +0 -0
  105. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/lifecycle.py +0 -0
  106. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/minisettings.py +0 -0
  107. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/py.typed +0 -0
  108. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/reactive.py +0 -0
  109. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/routing.py +0 -0
  110. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/scope/__init__.py +0 -0
  111. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/scope/types.py +0 -0
  112. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/__init__.py +0 -0
  113. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/app.py +0 -0
  114. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/custom.css +0 -0
  115. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/custom.js +0 -0
  116. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/favicon.png +0 -0
  117. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/favicon.svg +0 -0
  118. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/style.css +0 -0
  119. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/theme-dark.css +0 -0
  120. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/theme-light.css +0 -0
  121. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/assets/theme.js +0 -0
  122. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/cdn_helper.py +0 -0
  123. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/esm.py +0 -0
  124. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/fastapi.py +0 -0
  125. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/flask.py +0 -0
  126. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/jupyter/__init__.py +0 -0
  127. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/jupyter/cdn_handler.py +0 -0
  128. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/jupyter/server_extension.py +0 -0
  129. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/jupyter/solara.py +0 -0
  130. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/jupytertools.py +0 -0
  131. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/kernel.py +0 -0
  132. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/kernel_context.py +0 -0
  133. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/patch.py +0 -0
  134. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/pyinstaller/__init__.py +0 -0
  135. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/pyinstaller/hook-ipyreact.py +0 -0
  136. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/pyinstaller/hook-ipyvuetify.py +0 -0
  137. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/pyinstaller/hook-solara.py +0 -0
  138. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/qt.py +0 -0
  139. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/reload.py +0 -0
  140. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/server.py +0 -0
  141. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/settings.py +0 -0
  142. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/shell.py +0 -0
  143. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/starlette.py +0 -0
  144. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/ansi.js +0 -0
  145. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/highlight-dark.css +0 -0
  146. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/highlight.css +0 -0
  147. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/main-vuetify.js +0 -0
  148. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/main.js +0 -0
  149. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/sun.svg +0 -0
  150. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/static/webworker.js +0 -0
  151. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/telemetry.py +0 -0
  152. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/index.html.j2 +0 -0
  153. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/loader-plain.css +0 -0
  154. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/loader-plain.html +0 -0
  155. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/loader-solara.css +0 -0
  156. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/loader-solara.html +0 -0
  157. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/plain.html +0 -0
  158. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/templates/solara.html.j2 +0 -0
  159. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/threaded.py +0 -0
  160. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/utils.py +0 -0
  161. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/server/websocket.py +0 -0
  162. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/settings.py +0 -0
  163. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/tasks.py +0 -0
  164. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/button.py +0 -0
  165. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/markdown.py +0 -0
  166. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/.flake8 +0 -0
  167. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/.pre-commit-config.yaml +0 -0
  168. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/LICENSE +0 -0
  169. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/Procfile +0 -0
  170. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/mypy.ini +0 -0
  171. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/pyproject.toml +0 -0
  172. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/__init__.py +0 -0
  173. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  174. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/components/article.py +0 -0
  175. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/components/data.py +0 -0
  176. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/components/header.py +0 -0
  177. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/components/layout.py +0 -0
  178. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  179. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  180. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/data.py +0 -0
  181. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  182. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  183. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  184. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  185. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  186. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/test/__init__.py +0 -0
  187. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/test/pytest_plugin.py +0 -0
  188. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/toestand.py +0 -0
  189. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/util.py +0 -0
  190. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/validate_hooks.py +0 -0
  191. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/__init__.py +0 -0
  192. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/assets/custom.css +0 -0
  193. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/assets/images/logo-small.png +0 -0
  194. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/assets/images/logo.svg +0 -0
  195. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/assets/images/logo_white.svg +0 -0
  196. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/assets/theme.js +0 -0
  197. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/__init__.py +0 -0
  198. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/algolia.py +0 -0
  199. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/algolia.vue +0 -0
  200. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/algolia_api.vue +0 -0
  201. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/breadcrumbs.py +0 -0
  202. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/contact.py +0 -0
  203. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/docs.py +0 -0
  204. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/header.py +0 -0
  205. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/mailchimp.py +0 -0
  206. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/mailchimp.vue +0 -0
  207. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/markdown.py +0 -0
  208. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/markdown_nav.vue +0 -0
  209. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/notebook.py +0 -0
  210. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/components/sidebar.py +0 -0
  211. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/__init__.py +0 -0
  212. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/about/__init__.py +0 -0
  213. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/about/about.md +0 -0
  214. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/__init__.py +0 -0
  215. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/authorization/__init__.py +0 -0
  216. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/authorization/admin.py +0 -0
  217. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/authorization/users.py +0 -0
  218. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  219. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/layout-demo.py +0 -0
  220. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/multipage/__init__.py +0 -0
  221. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/multipage/page1.py +0 -0
  222. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/multipage/page2.py +0 -0
  223. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/scatter.py +0 -0
  224. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/scrolling.py +0 -0
  225. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  226. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/careers/__init__.py +0 -0
  227. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/changelog/__init__.py +0 -0
  228. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/contact/__init__.py +0 -0
  229. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/doc_use_download.py +0 -0
  230. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/__init__.py +0 -0
  231. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  232. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  233. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  234. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  235. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  236. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -0
  237. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  238. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -0
  239. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  240. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  241. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  242. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +0 -0
  243. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  244. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  245. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  246. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  247. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  248. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  249. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  250. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  251. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  252. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  253. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  254. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  255. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  256. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  257. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -0
  258. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -0
  259. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  260. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -0
  261. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -0
  262. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  263. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  264. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  265. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/__init__.py +0 -0
  266. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  267. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  268. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  269. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  270. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  271. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  272. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  273. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  274. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  275. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  276. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  277. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  278. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  279. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  280. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  281. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  282. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  283. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_thread.md +0 -0
  284. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  285. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  286. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  287. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  288. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  289. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  290. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/route.py +0 -0
  291. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  292. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  293. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  294. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  295. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  296. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  297. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  298. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  299. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  300. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  301. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  302. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  303. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/__init__.py +0 -0
  304. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  305. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  306. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  307. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  308. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/common.py +0 -0
  309. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  310. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  311. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/data/pivot_table.py +0 -0
  312. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  313. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  314. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  315. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  316. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/button.py +0 -0
  317. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  318. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
  319. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  320. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/input.py +0 -0
  321. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/select.py +0 -0
  322. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/slider.py +0 -0
  323. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/switch.py +0 -0
  324. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  325. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  326. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  327. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  328. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  329. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  330. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/input_time.py +0 -0
  331. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  332. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  333. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  334. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/task.py +0 -0
  335. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  336. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  337. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  338. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  339. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  340. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  341. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/card.py +0 -0
  342. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  343. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/column.py +0 -0
  344. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  345. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  346. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/details.py +0 -0
  347. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  348. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  349. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  350. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/row.py +0 -0
  351. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  352. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  353. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  354. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  355. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/html.py +0 -0
  356. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/image.py +0 -0
  357. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  358. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  359. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/sql_code.py +0 -0
  360. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  361. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  362. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/page/head.py +0 -0
  363. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/page/title.py +0 -0
  364. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  365. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/error.py +0 -0
  366. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/info.py +0 -0
  367. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/progress.py +0 -0
  368. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  369. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/success.py +0 -0
  370. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/status/warning.py +0 -0
  371. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  372. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  373. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  374. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  375. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  376. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  377. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/__init__.py +0 -0
  378. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  379. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
  380. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  381. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  382. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  383. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  384. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  385. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  386. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  387. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  388. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  389. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  390. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  391. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  392. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  393. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  394. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  395. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  396. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  397. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
  398. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
  399. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  400. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
  401. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
  402. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
  403. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
  404. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  405. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  406. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
  407. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  408. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  409. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
  410. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
  411. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  412. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/faq/__init__.py +0 -0
  413. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  414. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  415. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
  416. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  417. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  418. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  419. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  420. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  421. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  422. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  423. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  424. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  425. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  426. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
  427. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -0
  428. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  429. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -0
  430. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -0
  431. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  432. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -0
  433. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  434. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  435. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  436. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/docutils.py +0 -0
  437. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/home.vue +0 -0
  438. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/our_team/__init__.py +0 -0
  439. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/pricing/__init__.py +0 -0
  440. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/roadmap/__init__.py +0 -0
  441. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/roadmap/roadmap.md +0 -0
  442. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/scale_ipywidgets.py +0 -0
  443. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/__init__.py +0 -0
  444. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  445. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/planeto_tessa.py +0 -0
  446. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/solara_dev.py +0 -0
  447. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  448. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  449. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  450. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  451. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/pages/showcase/wanderlust.py +0 -0
  452. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/public/beach.jpeg +0 -0
  453. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/public/logo.svg +0 -0
  454. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/public/social/discord.svg +0 -0
  455. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/public/social/github.svg +0 -0
  456. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/public/social/twitter.svg +0 -0
  457. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/public/success.html +0 -0
  458. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/templates/index.html.j2 +0 -0
  459. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/website/utils.py +0 -0
  460. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/widgets/__init__.py +0 -0
  461. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/widgets/vue/gridlayout.vue +0 -0
  462. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/widgets/vue/html.vue +0 -0
  463. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/widgets/vue/navigator.vue +0 -0
  464. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/widgets/vue/vegalite.vue +0 -0
  465. {solara_ui-1.56.0 → solara_ui-1.57.1}/solara/widgets/widgets.py +0 -0
  466. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/__init__.py +0 -0
  467. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/conftest.py +0 -0
  468. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  469. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  470. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  471. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  472. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  473. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/__init__.py +0 -0
  474. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/api_test.py +0 -0
  475. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/app_widget.py +0 -0
  476. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/apps/not-allowed +0 -0
  477. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/apps/public/test.txt +0 -0
  478. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/apps/secure/app.py +0 -0
  479. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets/assets1/common.js +0 -0
  480. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets/assets1/unique1.js +0 -0
  481. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets/assets2/common.js +0 -0
  482. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets/assets2/custom.css +0 -0
  483. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets/assets2/custom.js +0 -0
  484. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets/assets2/unique2.js +0 -0
  485. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/assets_test.py +0 -0
  486. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/async_test.py +0 -0
  487. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/cdn_test.py +0 -0
  488. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/cmdline_test.py +0 -0
  489. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/conftest.py +0 -0
  490. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/create_test.py +0 -0
  491. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/enterprise/__init__.py +0 -0
  492. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/enterprise/oauth_test.py +0 -0
  493. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/error_test.py +0 -0
  494. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/esm_test.py +0 -0
  495. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/file_download_test.py +0 -0
  496. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/flask_test.py +0 -0
  497. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/input_date_test.py +0 -0
  498. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/latex_test.py +0 -0
  499. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/lifecycle_test.py +0 -0
  500. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/markdown_test.py +0 -0
  501. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/memleak_test.py +0 -0
  502. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/menu_test.py +0 -0
  503. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/popout_test.py +0 -0
  504. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/reconnect_test.py +0 -0
  505. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/reload/apps.py +0 -0
  506. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/router_test.py +0 -0
  507. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/server_test.py +0 -0
  508. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/ssg_test.py +0 -0
  509. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/starlette_test.py +0 -0
  510. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/test.vue +0 -0
  511. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/testapp.py +0 -0
  512. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/integration/widget_test.py +0 -0
  513. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/pyinstaller/__init__.py +0 -0
  514. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/pyinstaller/pyinstaller_test.py +0 -0
  515. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/titanic.csv +0 -0
  516. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  517. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  518. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  519. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  520. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-changed-reference.png +0 -0
  521. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-reference.png +0 -0
  522. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-changed-reference.png +0 -0
  523. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-reference.png +0 -0
  524. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
  525. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
  526. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-7-reference.png +0 -0
  527. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-8-reference.png +0 -0
  528. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
  529. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
  530. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-7-reference.png +0 -0
  531. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-8-reference.png +0 -0
  532. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  533. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  534. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  535. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  536. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
  537. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
  538. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-7-reference.png +0 -0
  539. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-8-reference.png +0 -0
  540. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  541. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  542. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  543. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  544. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
  545. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-win32-reference.png +0 -0
  546. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
  547. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-win32-reference.png +0 -0
  548. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
  549. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-win32-reference.png +0 -0
  550. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
  551. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-win32-reference.png +0 -0
  552. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
  553. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-win32-reference.png +0 -0
  554. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
  555. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  556. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  557. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
  558. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  559. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  560. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/__init__.py +0 -0
  561. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/app_test.py +0 -0
  562. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/applayout_test.py +0 -0
  563. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/async_test.py +0 -0
  564. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/autorouting_test.py +0 -0
  565. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/cache_test.py +0 -0
  566. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/cdn_helper_test.py +0 -0
  567. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/chat_test.py +0 -0
  568. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/checkbox_test.py +0 -0
  569. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/common.py +0 -0
  570. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/component_frontend_test.py +0 -0
  571. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/component_vue_test.vue +0 -0
  572. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/confirmation_dialog_test.py +0 -0
  573. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/conftest.py +0 -0
  574. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/cross_filter_component_test.py +0 -0
  575. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/cross_filter_test.py +0 -0
  576. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/dataframe_test.py +0 -0
  577. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/datatable_test.py +0 -0
  578. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/display_test.py +0 -0
  579. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/express_test.py +0 -0
  580. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/file_download_test.py +0 -0
  581. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/hook_use_invalid_test.py +0 -0
  582. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/hooks_test.py +0 -0
  583. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/input_date_test.py +0 -0
  584. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/input_test.py +0 -0
  585. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/input_time_test.py +0 -0
  586. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/kernel_test.py +0 -0
  587. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/lab/__init__.py +0 -0
  588. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/lifecycle_test.py +0 -0
  589. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/matplotlib_test.py +0 -0
  590. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/no_solara_test.py +0 -0
  591. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/output_widget_test.py +0 -0
  592. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/patch_test.py +0 -0
  593. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/pivottable_test.py +0 -0
  594. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/reload_test.py +0 -0
  595. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/router_test.py +0 -0
  596. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/select_test.py +0 -0
  597. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/settings_test.py +0 -0
  598. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/shell_test.py +0 -0
  599. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/slider_test.py +0 -0
  600. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/__init__.py +0 -0
  601. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/food/__init__.py +0 -0
  602. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/food/food.py +0 -0
  603. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/food/index.py +0 -0
  604. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  605. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  606. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  607. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  608. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  609. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  610. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  611. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
  612. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  613. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  614. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  615. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  616. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  617. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  618. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  619. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  620. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
  621. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
  622. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  623. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  624. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/single_file.py +0 -0
  625. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  626. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  627. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/switch_test.py +0 -0
  628. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/tabs_test.py +0 -0
  629. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/task_test.py +0 -0
  630. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/telemetry_tests.py +0 -0
  631. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/toestand_computed_reload.py +0 -0
  632. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/toestand_test.py +0 -0
  633. {solara_ui-1.56.0 → solara_ui-1.57.1}/tests/unit/toggle_button_test.py +0 -0
@@ -67,6 +67,7 @@ python/.idea
67
67
  test/.idea
68
68
  venv
69
69
  .venv
70
+ uv.lock
70
71
  tmp
71
72
  python/vaex/version.py # gets generated
72
73
  **/*.egg-info/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: solara-ui
3
- Version: 1.56.0
3
+ Version: 1.57.1
4
4
  Dynamic: Summary
5
5
  Project-URL: Home, https://www.github.com/widgetti/solara
6
6
  Project-URL: Documentation, https://solara.dev
@@ -1,6 +1,6 @@
1
1
  """Build webapps using IPywidgets"""
2
2
 
3
- __version__ = "1.56.0"
3
+ __version__ = "1.57.1"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -25,11 +25,15 @@ def FigureAltair(
25
25
 
26
26
  with alt.renderers.enable("mimetype"):
27
27
  bundle = chart._repr_mimebundle_()[0]
28
- key4 = "application/vnd.vegalite.v4+json"
29
- key5 = "application/vnd.vegalite.v5+json"
30
- if key4 not in bundle and key5 not in bundle:
31
- raise KeyError(f"{key4} and {key5} not in mimebundle:\n\n{bundle}")
32
- spec = bundle.get(key5, bundle.get(key4))
28
+ # Find the Vega-Lite spec from the bundle (supports v4, v5, v6+)
29
+ # MIME type format varies: v4/v5 use "+json" suffix, v6 uses ".json"
30
+ spec = None
31
+ for key in bundle:
32
+ if key.startswith("application/vnd.vegalite.v"):
33
+ spec = bundle[key]
34
+ break
35
+ if spec is None:
36
+ raise KeyError(f"No Vega-Lite MIME type found in mimebundle: {list(bundle.keys())}")
33
37
  return solara.widgets.VegaLite.element(
34
38
  spec=spec, on_click=on_click, listen_to_click=on_click is not None, on_hover=on_hover, listen_to_hover=on_hover is not None
35
39
  )
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import os
2
3
  from os.path import isfile, join
3
4
  from pathlib import Path
@@ -8,6 +9,11 @@ import humanize
8
9
  import ipyvuetify as vy
9
10
  import traitlets
10
11
 
12
+ try:
13
+ import watchfiles
14
+ except ModuleNotFoundError:
15
+ watchfiles = None # type: ignore
16
+
11
17
  import solara
12
18
  from solara.components import Div
13
19
 
@@ -84,6 +90,7 @@ def FileBrowser(
84
90
  on_file_name: Optional[Callable[[str], None]] = None,
85
91
  start_directory=None,
86
92
  can_select=False,
93
+ watch: bool = False,
87
94
  ):
88
95
  """File/directory browser at the server side.
89
96
 
@@ -109,6 +116,8 @@ def FileBrowser(
109
116
  * `directory_first`: If `True` directories are shown before files. Default: `False`.
110
117
  * `on_file_name`: (deprecated) Use on_file_open instead.
111
118
  * `start_directory`: (deprecated) Use directory instead.
119
+ * `watch`: If `True`, watch the current directory for file changes and automatically refresh the file list.
120
+ Requires the `watchfiles` package to be installed.
112
121
  """
113
122
  if start_directory is not None:
114
123
  directory = start_directory # pragma: no cover
@@ -122,6 +131,8 @@ def FileBrowser(
122
131
  warning, set_warning = solara.use_state(cast(Optional[str], None))
123
132
  scroll_pos_stack, set_scroll_pos_stack = solara.use_state(cast(List[int], []))
124
133
  scroll_pos, set_scroll_pos = solara.use_state(0)
134
+ # Counter to trigger re-render when files change
135
+ file_change_counter, set_file_change_counter = solara.use_state(0)
125
136
  selected_private, set_selected_private = use_reactive_or_value(
126
137
  selected,
127
138
  on_value=on_path_select if can_select else lambda x: None,
@@ -137,12 +148,48 @@ def FileBrowser(
137
148
  # if we select a file, we need to make sure the directory is correct
138
149
  # NOTE: although we expect a Path, abuse might make it a string
139
150
  if isinstance(selected_private, Path):
140
- # Note that we do not call .resolve() before using .parent, otherwise /some/path/.. will
141
- # set the current directory to /, moving up two levels.
142
- current_dir.value = selected_private.parent.resolve()
151
+ # Only sync directory from selected if the path is absolute.
152
+ # Relative paths would resolve against the process CWD, not the
153
+ # current directory shown in the FileBrowser, leading to incorrect paths.
154
+ if selected_private.is_absolute():
155
+ # Note that we do not call .resolve() before using .parent, otherwise /some/path/.. will
156
+ # set the current directory to /, moving up two levels.
157
+ current_dir.value = selected_private.parent.resolve()
143
158
 
144
159
  solara.use_effect(sync_directory_from_selected, [selected_private])
145
160
 
161
+ def watch_directory():
162
+ if not watch:
163
+ return
164
+ if not watchfiles:
165
+ logger.warning("watchfiles not installed, cannot watch directory")
166
+ return
167
+
168
+ # Check if there's a running event loop before creating the coroutine
169
+ try:
170
+ asyncio.get_running_loop()
171
+ except RuntimeError:
172
+ # No running event loop (e.g., in unit tests or non-server environments)
173
+ logger.warning("No running event loop, cannot watch directory for changes")
174
+ return
175
+
176
+ dir_to_watch = current_dir.value
177
+
178
+ async def watch_task():
179
+ try:
180
+ async for _ in watchfiles.awatch(dir_to_watch):
181
+ logger.debug("Directory %s changed, refreshing file list", dir_to_watch)
182
+ set_file_change_counter(lambda x: x + 1)
183
+ except RuntimeError:
184
+ pass # swallow the RuntimeError: Already borrowed errors from watchfiles
185
+ except Exception:
186
+ logger.exception("Error watching directory")
187
+
188
+ future = asyncio.create_task(watch_task())
189
+ return future.cancel
190
+
191
+ solara.use_effect(watch_directory, [watch, current_dir.value])
192
+
146
193
  def change_dir(new_dir: Path):
147
194
  if os.access(new_dir, os.R_OK):
148
195
  current_dir.value = new_dir
@@ -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.56.0-py2.py3-none-any.whl", keep_going=True)
122
+ await micropip.install("/wheels/solara-1.57.1-py2.py3-none-any.whl", keep_going=True)
123
123
  import solara
124
124
 
125
125
  el = solara.Warning("lala")
@@ -1,5 +1,88 @@
1
1
  # Solara Changelog
2
2
 
3
+ ## Version 1.57.0
4
+
5
+ * Feature: Add `watch` option to `FileBrowser` for automatic file change detection. [a0c75202](https://github.com/widgetti/solara/commit/a0c75202)
6
+ * Bug Fix: Prevent `FileBrowser` from using relative paths for directory sync. [7be73e88](https://github.com/widgetti/solara/commit/7be73e88)
7
+
8
+ ## Version 1.56.0
9
+
10
+ * Feature: On disconnect and reconnect, force a page reload. [8d6fb2f1](https://github.com/widgetti/solara/commit/8d6fb2f1)
11
+ * Feature: Allow `data` function in `FileDownload` to be a coroutine. [a395f090](https://github.com/widgetti/solara/commit/a395f090)
12
+ * Breaking change: Drop Python 3.7 support. [abd9400d](https://github.com/widgetti/solara/commit/abd9400d)
13
+
14
+ ## Version 1.55.1
15
+
16
+ * Bug Fix: False positive for returns in async defs for hook use validation. [67381dc6](https://github.com/widgetti/solara/commit/67381dc6)
17
+
18
+ ## Version 1.55.0
19
+
20
+ * Feature: Allows tasks to have their own kernel context. [3a97835a](https://github.com/widgetti/solara/commit/3a97835a)
21
+ * Bug Fix: Python 3.14 compatibility - fix RuntimeError in BaseSettings iteration. [4bf31d5a](https://github.com/widgetti/solara/commit/4bf31d5a)
22
+
23
+ ## Version 1.54.0
24
+
25
+ * Feature: Use different port in `pytest-ipywidgets` for different workers in `pytest-xdist`. [7e924e21](https://github.com/widgetti/solara/commit/7e924e21)
26
+
27
+ ## Version 1.53.0
28
+
29
+ * Feature: With `--log-level=info` we can see where a reactive variable was set. [771df82f](https://github.com/widgetti/solara/commit/771df82f)
30
+ * Bug Fix: Hash and search were flipped, causing strange URLs/locations. [375fd9ba](https://github.com/widgetti/solara/commit/375fd9ba)
31
+
32
+ ## Version 1.52.0
33
+
34
+ * Feature: In Vue template, support both `event_foo` and `foo` to avoid LLM confusion. [3ba93278](https://github.com/widgetti/solara/commit/3ba93278)
35
+ * Feature: Allow custom serializers in Vue components. [cd1beabb](https://github.com/widgetti/solara/commit/cd1beabb)
36
+ * Bug Fix: Exclude breaking ipykernel releases. [9858c013](https://github.com/widgetti/solara/commit/9858c013)
37
+ * Bug Fix: Support modern versions of uvicorn. [ce2abebd](https://github.com/widgetti/solara/commit/ce2abebd)
38
+
39
+ ## Version 1.51.1
40
+
41
+ * Bug Fix: Enhance thread init patching to handle latest anyio (4.10.0) which may not populate name field properly. [93f78c6f](https://github.com/widgetti/solara/commit/93f78c6f)
42
+
43
+ ## Version 1.51.0
44
+
45
+ * Feature: Configure the initial title before the app runs/loads. [4515a8c3](https://github.com/widgetti/solara/commit/4515a8c3)
46
+ * Bug Fix: Do not crash on `use_close_menu`. [d0032943](https://github.com/widgetti/solara/commit/d0032943)
47
+
48
+ ## Version 1.50.1
49
+
50
+ * Bug Fix: `FileBrowser` could go two directories up if ".." was selected. [68e99e58](https://github.com/widgetti/solara/commit/68e99e58)
51
+ * Bug Fix: Tornado async gives no issues with event loops. [6706f6ed](https://github.com/widgetti/solara/commit/6706f6ed)
52
+
53
+ ## Version 1.50.0
54
+
55
+ * Feature: Support `Optional[str]` / optional for `InputText`. [814a8a6c](https://github.com/widgetti/solara/commit/814a8a6c)
56
+ * Feature: Give more control over the underlying Vuetify text input. [c5b47a84](https://github.com/widgetti/solara/commit/c5b47a84)
57
+ * Bug Fix: Sanitize infinite values in `/resourcez` JSON response. [6aacbff4](https://github.com/widgetti/solara/commit/6aacbff4)
58
+
59
+ ## Version 1.49.0
60
+
61
+ * Feature: Control selected file or directory externally in `FileBrowser`. [73a26dde](https://github.com/widgetti/solara/commit/73a26dde)
62
+ * Feature: Support relative paths in `FileBrowser`. [4b172244](https://github.com/widgetti/solara/commit/4b172244)
63
+
64
+ ## Version 1.48.0
65
+
66
+ * Feature: Expose `col_num` and `row_height` options for `GridLayout`. [8f40eeb5](https://github.com/widgetti/solara/commit/8f40eeb5)
67
+ * Feature: Warn if task is being called from a component. [e454b953](https://github.com/widgetti/solara/commit/e454b953)
68
+ * Bug Fix: Decrease `chunk_size` for `FileDrop` to 1MB to avoid Modal max 2MB limit. [fa65d5a1](https://github.com/widgetti/solara/commit/fa65d5a1)
69
+ * Bug Fix: Resolve logger warnings. [#1059](https://github.com/widgetti/solara/pull/1059)
70
+ * Bug Fix: A `use_task` with `dependencies=None` (user called) can have arguments. [da2f8cfe](https://github.com/widgetti/solara/commit/da2f8cfe)
71
+
72
+ ## Version 1.47.0
73
+
74
+ * Feature: Add `on_layer_updated` to `GridLayout`. [1163b89d](https://github.com/widgetti/solara/commit/1163b89d)
75
+ * Bug Fix: Classes were not applied to `ColumnsResponsive` when `wrap` was `False`. [ce879dad](https://github.com/widgetti/solara/commit/ce879dad)
76
+ * Bug Fix: Tasks did not have a stable key, causing hot reloads to miss values. [e1567f9d](https://github.com/widgetti/solara/commit/e1567f9d)
77
+ * Bug Fix: Re-run app on hot reload before running `on_kernel_start` callbacks. [cf4f5c1a](https://github.com/widgetti/solara/commit/cf4f5c1a)
78
+ * Bug Fix: Display port in runtime error when server is running. [cafe757c](https://github.com/widgetti/solara/commit/cafe757c)
79
+
80
+ ## Version 1.46.0
81
+
82
+ * Feature: When tasks fail to set results, handle it gracefully. [e6c1ce07](https://github.com/widgetti/solara/commit/e6c1ce07)
83
+ * Bug Fix: Follow ASGI spec and also check if text or bytes are `None` (Modal fix). [396c58ac](https://github.com/widgetti/solara/commit/396c58ac)
84
+ * Bug Fix: Make task threads daemon, so the Solara server can stop when tasks are running. [da346063](https://github.com/widgetti/solara/commit/da346063)
85
+
3
86
  ## Version 1.45.0
4
87
 
5
88
  * Bug Fix: Correctly handle expected websocket errors instead of logging them. [#1013](https://github.com/widgetti/solara/pull/1013)
@@ -0,0 +1,75 @@
1
+ import unittest.mock
2
+
3
+ import pytest
4
+
5
+ import solara
6
+ import solara.widgets
7
+
8
+
9
+ class MockChart:
10
+ """Mock Altair chart that returns a configurable mimebundle."""
11
+
12
+ def __init__(self, bundle):
13
+ self._bundle = bundle
14
+
15
+ def _repr_mimebundle_(self):
16
+ return (self._bundle, {})
17
+
18
+
19
+ @pytest.fixture
20
+ def mock_altair_renderers():
21
+ """Mock altair.renderers.enable to be a no-op context manager."""
22
+ import contextlib
23
+
24
+ import altair as alt
25
+
26
+ @contextlib.contextmanager
27
+ def mock_enable(renderer):
28
+ yield
29
+
30
+ with unittest.mock.patch.object(alt.renderers, "enable", mock_enable):
31
+ yield
32
+
33
+
34
+ def test_figure_altair_v4(mock_altair_renderers):
35
+ spec = {"$schema": "https://vega.github.io/schema/vega-lite/v4.json", "data": {"values": []}}
36
+ chart = MockChart({"application/vnd.vegalite.v4+json": spec})
37
+
38
+ el = solara.FigureAltair(chart)
39
+ _, rc = solara.render(el, handle_error=False)
40
+ widget = rc.find(solara.widgets.VegaLite).widget
41
+ assert widget.spec == spec
42
+ rc.close()
43
+
44
+
45
+ def test_figure_altair_v5(mock_altair_renderers):
46
+ spec = {"$schema": "https://vega.github.io/schema/vega-lite/v5.json", "data": {"values": []}}
47
+ chart = MockChart({"application/vnd.vegalite.v5+json": spec})
48
+
49
+ el = solara.FigureAltair(chart)
50
+ _, rc = solara.render(el, handle_error=False)
51
+ widget = rc.find(solara.widgets.VegaLite).widget
52
+ assert widget.spec == spec
53
+ rc.close()
54
+
55
+
56
+ def test_figure_altair_v6(mock_altair_renderers):
57
+ """Test that Altair 6+ with v6 MIME type works (uses .json suffix instead of +json)."""
58
+ spec = {"$schema": "https://vega.github.io/schema/vega-lite/v6.json", "data": {"values": []}}
59
+ # Altair 6 uses ".json" suffix instead of "+json"
60
+ chart = MockChart({"application/vnd.vegalite.v6.json": spec})
61
+
62
+ el = solara.FigureAltair(chart)
63
+ _, rc = solara.render(el, handle_error=False)
64
+ widget = rc.find(solara.widgets.VegaLite).widget
65
+ assert widget.spec == spec
66
+ rc.close()
67
+
68
+
69
+ def test_figure_altair_no_vegalite_mime(mock_altair_renderers):
70
+ """Test that a KeyError is raised when no Vega-Lite MIME type is found."""
71
+ chart = MockChart({"text/plain": "some text"})
72
+
73
+ el = solara.FigureAltair(chart)
74
+ with pytest.raises(KeyError, match="No Vega-Lite MIME type found"):
75
+ solara.render(el, handle_error=False)
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import platform
2
3
  import unittest.mock
3
4
  from pathlib import Path
@@ -290,3 +291,197 @@ def test_file_browser_programmatic_select():
290
291
  selected.value = current_dir.value / ".." / "unit" / ".."
291
292
  assert current_dir.value == HERE.parent
292
293
  rc.close()
294
+
295
+
296
+ def test_file_browser_watch_no_event_loop(tmpdir: Path):
297
+ """Test that watch=True gracefully handles no running event loop."""
298
+ tmpdir = Path(tmpdir)
299
+ (tmpdir / "test.txt").write_text("test")
300
+
301
+ # When watch=True but no event loop is available, it should log a warning but not crash
302
+ with unittest.mock.patch.object(solara.components.file_browser.logger, "warning") as mock_warning:
303
+
304
+ @solara.component
305
+ def Test():
306
+ return solara.FileBrowser(tmpdir, watch=True)
307
+
308
+ div, rc = solara.render_fixed(Test(), handle_error=False)
309
+ file_list: solara.components.file_browser.FileListWidget = div.children[1]
310
+
311
+ # Verify files are still shown correctly
312
+ files = {k["name"] for k in file_list.files}
313
+ assert "test.txt" in files
314
+
315
+ # Verify warning was logged about no event loop
316
+ mock_warning.assert_called_with("No running event loop, cannot watch directory for changes")
317
+ rc.close()
318
+
319
+
320
+ def test_file_browser_watch_disabled_by_default():
321
+ """Test that watch is disabled by default (no warning when watchfiles not available)."""
322
+
323
+ @solara.component
324
+ def Test():
325
+ return solara.FileBrowser(HERE.parent)
326
+
327
+ # This should work without any issues even if watchfiles is not installed
328
+ div, rc = solara.render_fixed(Test(), handle_error=False)
329
+ file_list: solara.components.file_browser.FileListWidget = div.children[1]
330
+ assert "file_browser_test.py" in file_list
331
+ rc.close()
332
+
333
+
334
+ def test_file_browser_watch_no_watchfiles(tmpdir: Path):
335
+ """Test that watch=True logs a warning when watchfiles is not installed."""
336
+ tmpdir = Path(tmpdir)
337
+ (tmpdir / "test.txt").write_text("test")
338
+
339
+ with unittest.mock.patch.object(solara.components.file_browser, "watchfiles", None):
340
+ with unittest.mock.patch.object(solara.components.file_browser.logger, "warning") as mock_warning:
341
+
342
+ @solara.component
343
+ def Test():
344
+ return solara.FileBrowser(tmpdir, watch=True)
345
+
346
+ div, rc = solara.render_fixed(Test(), handle_error=False)
347
+
348
+ # Give the effect a chance to run
349
+ import time
350
+
351
+ time.sleep(0.1)
352
+
353
+ mock_warning.assert_called_with("watchfiles not installed, cannot watch directory")
354
+ rc.close()
355
+
356
+
357
+ @pytest.mark.asyncio
358
+ async def test_file_browser_watch_detects_new_file(tmpdir: Path):
359
+ """Test that watch=True actually detects when a new file is added."""
360
+ tmpdir = Path(tmpdir)
361
+ (tmpdir / "initial.txt").write_text("initial")
362
+
363
+ files_changed_event = asyncio.Event()
364
+
365
+ @solara.component
366
+ def Test():
367
+ return solara.FileBrowser(tmpdir, watch=True)
368
+
369
+ div, rc = solara.render_fixed(Test(), handle_error=False)
370
+ file_list: solara.components.file_browser.FileListWidget = div.children[1]
371
+
372
+ # Verify initial state
373
+ initial_files = {k["name"] for k in file_list.files}
374
+ assert "initial.txt" in initial_files
375
+ assert "new_file.txt" not in initial_files
376
+
377
+ # Set up observer to detect when files trait changes
378
+ def on_files_change(change):
379
+ files_changed_event.set()
380
+
381
+ file_list.observe(on_files_change, "files")
382
+
383
+ # Give the watcher task a moment to start
384
+ await asyncio.sleep(0.1)
385
+
386
+ # Create a new file - this should trigger the watcher
387
+ (tmpdir / "new_file.txt").write_text("new content")
388
+
389
+ # Wait for the watcher to detect the change
390
+ try:
391
+ await asyncio.wait_for(files_changed_event.wait(), timeout=5.0)
392
+ except asyncio.TimeoutError:
393
+ pytest.fail("File change was not detected within timeout")
394
+
395
+ # Verify the new file is now in the list
396
+ new_files = {k["name"] for k in file_list.files}
397
+ assert "new_file.txt" in new_files
398
+ assert "initial.txt" in new_files
399
+
400
+ rc.close()
401
+
402
+
403
+ @pytest.mark.asyncio
404
+ async def test_file_browser_watch_detects_deleted_file(tmpdir: Path):
405
+ """Test that watch=True detects when a file is deleted."""
406
+ tmpdir = Path(tmpdir)
407
+ (tmpdir / "file1.txt").write_text("content1")
408
+ (tmpdir / "file2.txt").write_text("content2")
409
+
410
+ files_changed_event = asyncio.Event()
411
+
412
+ @solara.component
413
+ def Test():
414
+ return solara.FileBrowser(tmpdir, watch=True)
415
+
416
+ div, rc = solara.render_fixed(Test(), handle_error=False)
417
+ file_list: solara.components.file_browser.FileListWidget = div.children[1]
418
+
419
+ # Verify initial state
420
+ initial_files = {k["name"] for k in file_list.files}
421
+ assert "file1.txt" in initial_files
422
+ assert "file2.txt" in initial_files
423
+
424
+ # Set up observer
425
+ def on_files_change(change):
426
+ files_changed_event.set()
427
+
428
+ file_list.observe(on_files_change, "files")
429
+
430
+ # Give the watcher task a moment to start
431
+ await asyncio.sleep(0.1)
432
+
433
+ # Delete a file
434
+ (tmpdir / "file2.txt").unlink()
435
+
436
+ # Wait for the watcher to detect the change
437
+ try:
438
+ await asyncio.wait_for(files_changed_event.wait(), timeout=5.0)
439
+ except asyncio.TimeoutError:
440
+ pytest.fail("File deletion was not detected within timeout")
441
+
442
+ # Verify file2 is gone
443
+ new_files = {k["name"] for k in file_list.files}
444
+ assert "file1.txt" in new_files
445
+ assert "file2.txt" not in new_files
446
+
447
+ rc.close()
448
+
449
+
450
+ def test_file_browser_selected_relative_path_after_full_path(tmpdir: Path):
451
+ """Test that FileBrowser handles setting selected to a relative path after a full path.
452
+
453
+ Regression test for issue where:
454
+ 1. User sets selected to a full path like /some/path/subdir/file.txt
455
+ 2. User then sets selected to a relative path like subdir/file.txt
456
+ 3. The current_dir would incorrectly become /some/path/subdir/subdir
457
+ because the relative path's parent was appended to the existing directory.
458
+ """
459
+ tmpdir = Path(tmpdir)
460
+ subdir = tmpdir / "subdir"
461
+ subdir.mkdir()
462
+ (subdir / "file.txt").write_text("content")
463
+
464
+ selected = solara.reactive(cast(Optional[Path], None))
465
+
466
+ @solara.component
467
+ def Test():
468
+ return solara.FileBrowser(tmpdir, selected=selected, can_select=True)
469
+
470
+ div, rc = solara.render_fixed(Test(), handle_error=False)
471
+
472
+ # First, set selected to a full path
473
+ full_path = subdir / "file.txt"
474
+ selected.value = full_path
475
+
476
+ # Verify we're now in the subdir
477
+ current_dir_text = div.children[0].children[0]
478
+ assert str(subdir) in current_dir_text
479
+
480
+ # Now set selected to a relative path (simulating user setting selected to "subdir/file.txt")
481
+ # This should work and stay in the same subdir, not create /subdir/subdir
482
+ relative_path = Path("subdir") / "file.txt"
483
+ selected.value = relative_path
484
+
485
+ # This should not raise FileNotFoundError
486
+ # The current_dir should resolve relative to cwd, not to the previous current_dir
487
+ rc.close()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes