solara-ui 1.47.0__tar.gz → 1.49.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 (632) hide show
  1. {solara_ui-1.47.0 → solara_ui-1.49.0}/PKG-INFO +1 -1
  2. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/__init__.py +1 -1
  3. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/file_browser.py +62 -11
  4. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/file_drop.vue +1 -1
  5. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/app.py +1 -1
  6. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/solara_bootstrap.py +1 -1
  7. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/tasks.py +80 -12
  8. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/toestand.py +1 -0
  9. solara_ui-1.49.0/solara/website/pages/documentation/components/input/file_browser.py +38 -0
  10. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/__init__.py +1 -1
  11. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/planeto_tessa.py +1 -1
  12. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/widgets/vue/gridlayout.vue +2 -2
  13. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/widgets/widgets.py +2 -0
  14. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/file_browser_test.py +59 -5
  15. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/task_test.py +29 -0
  16. solara_ui-1.47.0/solara/website/pages/documentation/components/input/file_browser.py +0 -30
  17. {solara_ui-1.47.0 → solara_ui-1.49.0}/.gitignore +0 -0
  18. {solara_ui-1.47.0 → solara_ui-1.49.0}/LICENSE +0 -0
  19. {solara_ui-1.47.0 → solara_ui-1.49.0}/README.md +0 -0
  20. {solara_ui-1.47.0 → solara_ui-1.49.0}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  21. {solara_ui-1.47.0 → solara_ui-1.49.0}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  22. {solara_ui-1.47.0 → solara_ui-1.49.0}/pyproject.toml +0 -0
  23. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/__main__.py +0 -0
  24. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/_stores.py +0 -0
  25. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/alias.py +0 -0
  26. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/autorouting.py +0 -0
  27. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/cache.py +0 -0
  28. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/checks.html +0 -0
  29. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/checks.py +0 -0
  30. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/comm.py +0 -0
  31. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/__init__.py +0 -0
  32. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/alert.py +0 -0
  33. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/applayout.py +0 -0
  34. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/button.py +0 -0
  35. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/card.py +0 -0
  36. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/checkbox.py +0 -0
  37. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/code_highlight_css.py +0 -0
  38. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/code_highlight_css.vue +0 -0
  39. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/columns.py +0 -0
  40. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/component_vue.py +0 -0
  41. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/cross_filter.py +0 -0
  42. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/dataframe.py +0 -0
  43. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/datatable.py +0 -0
  44. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/datatable.vue +0 -0
  45. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/details.py +0 -0
  46. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/download.vue +0 -0
  47. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/echarts.py +0 -0
  48. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/echarts.vue +0 -0
  49. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/figure_altair.py +0 -0
  50. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/file_download.py +0 -0
  51. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/file_drop.py +0 -0
  52. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/file_list_widget.vue +0 -0
  53. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/head.py +0 -0
  54. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/head_tag.py +0 -0
  55. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/head_tag.vue +0 -0
  56. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/image.py +0 -0
  57. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/input.py +0 -0
  58. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/input_text_area.py +0 -0
  59. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/link.py +0 -0
  60. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/markdown.py +0 -0
  61. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/markdown_editor.py +0 -0
  62. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/markdown_editor.vue +0 -0
  63. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/matplotlib.py +0 -0
  64. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/meta.py +0 -0
  65. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/misc.py +0 -0
  66. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/pivot_table.py +0 -0
  67. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/pivot_table.vue +0 -0
  68. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/progress.py +0 -0
  69. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/select.py +0 -0
  70. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/select.vue +0 -0
  71. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/slider.py +0 -0
  72. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/slider_date.vue +0 -0
  73. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/spinner-solara.vue +0 -0
  74. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/spinner.py +0 -0
  75. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/sql_code.py +0 -0
  76. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/sql_code.vue +0 -0
  77. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/style.py +0 -0
  78. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/switch.py +0 -0
  79. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/tab_navigation.py +0 -0
  80. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/title.py +0 -0
  81. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/title.vue +0 -0
  82. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/togglebuttons.py +0 -0
  83. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/components/tooltip.py +0 -0
  84. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/core.py +0 -0
  85. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/datatypes.py +0 -0
  86. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/express.py +0 -0
  87. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/hooks/__init__.py +0 -0
  88. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/hooks/dataframe.py +0 -0
  89. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/hooks/misc.py +0 -0
  90. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/hooks/use_reactive.py +0 -0
  91. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/hooks/use_thread.py +0 -0
  92. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/kitchensink.py +0 -0
  93. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/__init__.py +0 -0
  94. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/__init__.py +0 -0
  95. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/chat.py +0 -0
  96. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/confirmation_dialog.py +0 -0
  97. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/cross_filter.py +0 -0
  98. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/input_date.py +0 -0
  99. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/input_time.py +0 -0
  100. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/menu.py +0 -0
  101. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/menu.vue +0 -0
  102. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/tabs.py +0 -0
  103. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/theming.py +0 -0
  104. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/components/theming.vue +0 -0
  105. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/hooks/__init__.py +0 -0
  106. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/hooks/dataframe.py +0 -0
  107. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/toestand.py +0 -0
  108. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/utils/__init__.py +0 -0
  109. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/utils/cookies.py +0 -0
  110. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/utils/dataframe.py +0 -0
  111. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lab/utils/headers.py +0 -0
  112. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/layout.py +0 -0
  113. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/lifecycle.py +0 -0
  114. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/minisettings.py +0 -0
  115. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/py.typed +0 -0
  116. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/reactive.py +0 -0
  117. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/routing.py +0 -0
  118. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/scope/__init__.py +0 -0
  119. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/scope/types.py +0 -0
  120. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/__init__.py +0 -0
  121. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/custom.css +0 -0
  122. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/custom.js +0 -0
  123. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/favicon.png +0 -0
  124. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/favicon.svg +0 -0
  125. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/style.css +0 -0
  126. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/theme-dark.css +0 -0
  127. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/theme-light.css +0 -0
  128. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/assets/theme.js +0 -0
  129. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/cdn_helper.py +0 -0
  130. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/esm.py +0 -0
  131. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/fastapi.py +0 -0
  132. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/flask.py +0 -0
  133. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/jupyter/__init__.py +0 -0
  134. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/jupyter/cdn_handler.py +0 -0
  135. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/jupyter/server_extension.py +0 -0
  136. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/jupyter/solara.py +0 -0
  137. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/jupytertools.py +0 -0
  138. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/kernel.py +0 -0
  139. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/kernel_context.py +0 -0
  140. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/patch.py +0 -0
  141. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/pyinstaller/__init__.py +0 -0
  142. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/pyinstaller/hook-ipyreact.py +0 -0
  143. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/pyinstaller/hook-ipyvuetify.py +0 -0
  144. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/pyinstaller/hook-solara.py +0 -0
  145. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/qt.py +0 -0
  146. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/reload.py +0 -0
  147. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/server.py +0 -0
  148. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/settings.py +0 -0
  149. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/shell.py +0 -0
  150. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/starlette.py +0 -0
  151. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/ansi.js +0 -0
  152. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/highlight-dark.css +0 -0
  153. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/highlight.css +0 -0
  154. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/main-vuetify.js +0 -0
  155. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/main.js +0 -0
  156. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/sun.svg +0 -0
  157. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/static/webworker.js +0 -0
  158. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/telemetry.py +0 -0
  159. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/index.html.j2 +0 -0
  160. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/loader-plain.css +0 -0
  161. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/loader-plain.html +0 -0
  162. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/loader-solara.css +0 -0
  163. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/loader-solara.html +0 -0
  164. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/plain.html +0 -0
  165. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/templates/solara.html.j2 +0 -0
  166. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/threaded.py +0 -0
  167. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/utils.py +0 -0
  168. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/server/websocket.py +0 -0
  169. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/settings.py +0 -0
  170. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/button.py +0 -0
  171. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/markdown.py +0 -0
  172. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/.flake8 +0 -0
  173. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/.pre-commit-config.yaml +0 -0
  174. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/LICENSE +0 -0
  175. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/Procfile +0 -0
  176. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/mypy.ini +0 -0
  177. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/pyproject.toml +0 -0
  178. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/__init__.py +0 -0
  179. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  180. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/components/article.py +0 -0
  181. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/components/data.py +0 -0
  182. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/components/header.py +0 -0
  183. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/components/layout.py +0 -0
  184. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  185. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  186. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/data.py +0 -0
  187. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  188. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  189. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  190. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  191. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  192. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/test/__init__.py +0 -0
  193. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/test/pytest_plugin.py +0 -0
  194. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/util.py +0 -0
  195. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/validate_hooks.py +0 -0
  196. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/__init__.py +0 -0
  197. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/assets/custom.css +0 -0
  198. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/assets/images/logo-small.png +0 -0
  199. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/assets/images/logo.svg +0 -0
  200. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/assets/images/logo_white.svg +0 -0
  201. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/assets/theme.js +0 -0
  202. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/__init__.py +0 -0
  203. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/algolia.py +0 -0
  204. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/algolia.vue +0 -0
  205. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/algolia_api.vue +0 -0
  206. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/breadcrumbs.py +0 -0
  207. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/contact.py +0 -0
  208. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/docs.py +0 -0
  209. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/header.py +0 -0
  210. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/mailchimp.py +0 -0
  211. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/mailchimp.vue +0 -0
  212. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/markdown.py +0 -0
  213. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/markdown_nav.vue +0 -0
  214. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/notebook.py +0 -0
  215. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/components/sidebar.py +0 -0
  216. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/__init__.py +0 -0
  217. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/about/__init__.py +0 -0
  218. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/about/about.md +0 -0
  219. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/__init__.py +0 -0
  220. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/authorization/__init__.py +0 -0
  221. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/authorization/admin.py +0 -0
  222. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/authorization/users.py +0 -0
  223. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  224. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/layout-demo.py +0 -0
  225. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/multipage/__init__.py +0 -0
  226. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/multipage/page1.py +0 -0
  227. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/multipage/page2.py +0 -0
  228. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/scatter.py +0 -0
  229. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/scrolling.py +0 -0
  230. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  231. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/careers/__init__.py +0 -0
  232. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/changelog/__init__.py +0 -0
  233. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/changelog/changelog.md +0 -0
  234. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/contact/__init__.py +0 -0
  235. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/doc_use_download.py +0 -0
  236. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/__init__.py +0 -0
  237. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  238. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  239. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  240. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  241. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  242. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -0
  243. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  244. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -0
  245. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  246. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  247. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  248. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +0 -0
  249. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  250. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  251. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  252. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  253. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  254. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  255. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  256. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  257. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  258. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  259. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  260. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  261. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  262. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  263. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -0
  264. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -0
  265. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  266. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -0
  267. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -0
  268. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  269. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  270. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  271. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/__init__.py +0 -0
  272. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  273. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  274. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  275. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  276. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  277. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  278. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  279. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  280. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  281. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  282. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  283. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  284. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  285. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  286. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  287. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  288. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  289. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_thread.md +0 -0
  290. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  291. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  292. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  293. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  294. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  295. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  296. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/route.py +0 -0
  297. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  298. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  299. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  300. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  301. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  302. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  303. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  304. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  305. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  306. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  307. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  308. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  309. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/__init__.py +0 -0
  310. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  311. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  312. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  313. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  314. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/common.py +0 -0
  315. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  316. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  317. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/data/pivot_table.py +0 -0
  318. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  319. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  320. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  321. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  322. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/button.py +0 -0
  323. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  324. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  325. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/input.py +0 -0
  326. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/select.py +0 -0
  327. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/slider.py +0 -0
  328. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/switch.py +0 -0
  329. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  330. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  331. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  332. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  333. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  334. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  335. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/input_time.py +0 -0
  336. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  337. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  338. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  339. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/task.py +0 -0
  340. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  341. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  342. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  343. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  344. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  345. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  346. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/card.py +0 -0
  347. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  348. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/column.py +0 -0
  349. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  350. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  351. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/details.py +0 -0
  352. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  353. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  354. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  355. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/row.py +0 -0
  356. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  357. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  358. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  359. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  360. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/html.py +0 -0
  361. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/image.py +0 -0
  362. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  363. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  364. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/sql_code.py +0 -0
  365. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  366. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  367. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/page/head.py +0 -0
  368. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/page/title.py +0 -0
  369. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  370. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/error.py +0 -0
  371. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/info.py +0 -0
  372. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/progress.py +0 -0
  373. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  374. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/success.py +0 -0
  375. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/status/warning.py +0 -0
  376. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  377. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  378. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  379. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  380. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  381. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  382. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/__init__.py +0 -0
  383. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  384. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
  385. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  386. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  387. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  388. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  389. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  390. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  391. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  392. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  393. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  394. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  395. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  396. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  397. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  398. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  399. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  400. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  401. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  402. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
  403. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
  404. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  405. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
  406. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
  407. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
  408. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
  409. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  410. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  411. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
  412. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  413. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  414. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
  415. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
  416. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  417. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/faq/__init__.py +0 -0
  418. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  419. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  420. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
  421. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  422. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  423. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  424. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  425. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  426. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  427. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  428. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  429. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  430. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  431. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
  432. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -0
  433. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  434. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -0
  435. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -0
  436. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  437. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -0
  438. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  439. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  440. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  441. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/docutils.py +0 -0
  442. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/home.vue +0 -0
  443. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/our_team/__init__.py +0 -0
  444. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/pricing/__init__.py +0 -0
  445. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/roadmap/__init__.py +0 -0
  446. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/roadmap/roadmap.md +0 -0
  447. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/scale_ipywidgets.py +0 -0
  448. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  449. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/solara_dev.py +0 -0
  450. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  451. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  452. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  453. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  454. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/pages/showcase/wanderlust.py +0 -0
  455. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/public/beach.jpeg +0 -0
  456. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/public/logo.svg +0 -0
  457. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/public/social/discord.svg +0 -0
  458. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/public/social/github.svg +0 -0
  459. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/public/social/twitter.svg +0 -0
  460. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/public/success.html +0 -0
  461. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/templates/index.html.j2 +0 -0
  462. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/website/utils.py +0 -0
  463. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/widgets/__init__.py +0 -0
  464. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/widgets/vue/html.vue +0 -0
  465. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/widgets/vue/navigator.vue +0 -0
  466. {solara_ui-1.47.0 → solara_ui-1.49.0}/solara/widgets/vue/vegalite.vue +0 -0
  467. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/__init__.py +0 -0
  468. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/conftest.py +0 -0
  469. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  470. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  471. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  472. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  473. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  474. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/__init__.py +0 -0
  475. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/api_test.py +0 -0
  476. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/app_widget.py +0 -0
  477. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/apps/not-allowed +0 -0
  478. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/apps/public/test.txt +0 -0
  479. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/apps/secure/app.py +0 -0
  480. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets/assets1/common.js +0 -0
  481. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets/assets1/unique1.js +0 -0
  482. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets/assets2/common.js +0 -0
  483. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets/assets2/custom.css +0 -0
  484. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets/assets2/custom.js +0 -0
  485. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets/assets2/unique2.js +0 -0
  486. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/assets_test.py +0 -0
  487. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/async_test.py +0 -0
  488. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/cdn_test.py +0 -0
  489. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/cmdline_test.py +0 -0
  490. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/conftest.py +0 -0
  491. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/create_test.py +0 -0
  492. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/enterprise/__init__.py +0 -0
  493. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/enterprise/oauth_test.py +0 -0
  494. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/error_test.py +0 -0
  495. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/esm_test.py +0 -0
  496. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/file_download_test.py +0 -0
  497. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/flask_test.py +0 -0
  498. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/input_date_test.py +0 -0
  499. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/latex_test.py +0 -0
  500. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/lifecycle_test.py +0 -0
  501. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/markdown_test.py +0 -0
  502. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/memleak_test.py +0 -0
  503. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/menu_test.py +0 -0
  504. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/popout_test.py +0 -0
  505. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/reconnect_test.py +0 -0
  506. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/reload/apps.py +0 -0
  507. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/router_test.py +0 -0
  508. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/server_test.py +0 -0
  509. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/ssg_test.py +0 -0
  510. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/starlette_test.py +0 -0
  511. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/test.vue +0 -0
  512. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/testapp.py +0 -0
  513. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/integration/widget_test.py +0 -0
  514. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/pyinstaller/__init__.py +0 -0
  515. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/pyinstaller/pyinstaller_test.py +0 -0
  516. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/titanic.csv +0 -0
  517. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  518. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  519. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  520. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  521. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-changed-reference.png +0 -0
  522. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-reference.png +0 -0
  523. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-changed-reference.png +0 -0
  524. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-reference.png +0 -0
  525. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
  526. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
  527. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-7-reference.png +0 -0
  528. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-8-reference.png +0 -0
  529. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
  530. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
  531. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-7-reference.png +0 -0
  532. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-8-reference.png +0 -0
  533. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  534. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  535. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  536. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  537. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
  538. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
  539. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-7-reference.png +0 -0
  540. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-8-reference.png +0 -0
  541. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  542. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  543. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  544. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  545. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
  546. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-win32-reference.png +0 -0
  547. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
  548. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-win32-reference.png +0 -0
  549. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
  550. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-win32-reference.png +0 -0
  551. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
  552. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-win32-reference.png +0 -0
  553. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
  554. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-win32-reference.png +0 -0
  555. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
  556. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  557. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  558. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
  559. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  560. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  561. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/__init__.py +0 -0
  562. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/app_test.py +0 -0
  563. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/applayout_test.py +0 -0
  564. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/autorouting_test.py +0 -0
  565. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/cache_test.py +0 -0
  566. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/cdn_helper_test.py +0 -0
  567. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/chat_test.py +0 -0
  568. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/checkbox_test.py +0 -0
  569. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/common.py +0 -0
  570. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/component_frontend_test.py +0 -0
  571. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/component_vue_test.vue +0 -0
  572. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/confirmation_dialog_test.py +0 -0
  573. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/conftest.py +0 -0
  574. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/cross_filter_component_test.py +0 -0
  575. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/cross_filter_test.py +0 -0
  576. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/dataframe_test.py +0 -0
  577. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/datatable_test.py +0 -0
  578. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/display_test.py +0 -0
  579. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/express_test.py +0 -0
  580. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/file_download_test.py +0 -0
  581. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/hook_use_invalid_test.py +0 -0
  582. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/hooks_test.py +0 -0
  583. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/input_date_test.py +0 -0
  584. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/input_test.py +0 -0
  585. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/input_time_test.py +0 -0
  586. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/kernel_test.py +0 -0
  587. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/lab/__init__.py +0 -0
  588. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/lifecycle_test.py +0 -0
  589. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/matplotlib_test.py +0 -0
  590. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/no_solara_test.py +0 -0
  591. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/output_widget_test.py +0 -0
  592. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/patch_test.py +0 -0
  593. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/pivottable_test.py +0 -0
  594. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/reload_test.py +0 -0
  595. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/router_test.py +0 -0
  596. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/select_test.py +0 -0
  597. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/settings_test.py +0 -0
  598. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/shell_test.py +0 -0
  599. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/slider_test.py +0 -0
  600. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/__init__.py +0 -0
  601. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/food/__init__.py +0 -0
  602. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/food/food.py +0 -0
  603. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/food/index.py +0 -0
  604. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  605. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  606. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  607. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  608. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  609. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  610. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  611. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
  612. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  613. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  614. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  615. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  616. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  617. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  618. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  619. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  620. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
  621. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
  622. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  623. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  624. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/single_file.py +0 -0
  625. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  626. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  627. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/switch_test.py +0 -0
  628. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/tabs_test.py +0 -0
  629. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/telemetry_tests.py +0 -0
  630. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/toestand_computed_reload.py +0 -0
  631. {solara_ui-1.47.0 → solara_ui-1.49.0}/tests/unit/toestand_test.py +0 -0
  632. {solara_ui-1.47.0 → solara_ui-1.49.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.47.0
3
+ Version: 1.49.0
4
4
  Dynamic: Summary
5
5
  Project-URL: Home, https://www.github.com/widgetti/solara
6
6
  Project-URL: Documentation, https://solara.dev
@@ -1,6 +1,6 @@
1
1
  """Build webapps using IPywidgets"""
2
2
 
3
- __version__ = "1.47.0"
3
+ __version__ = "1.49.0"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -1,7 +1,8 @@
1
1
  import os
2
2
  from os.path import isfile, join
3
3
  from pathlib import Path
4
- from typing import Callable, Dict, List, Optional, Union, cast
4
+ from typing import Callable, Dict, List, Optional, TypeVar, Union, cast
5
+ import logging
5
6
 
6
7
  import humanize
7
8
  import ipyvuetify as vy
@@ -10,6 +11,9 @@ import traitlets
10
11
  import solara
11
12
  from solara.components import Div
12
13
 
14
+ T = TypeVar("T")
15
+ logger = logging.getLogger(__name__)
16
+
13
17
 
14
18
  def list_dir(path, filter: Callable[[Path], bool] = lambda x: True, directory_first: bool = False) -> List[dict]:
15
19
  def mk_item(n):
@@ -48,9 +52,30 @@ class FileListWidget(vy.VuetifyTemplate):
48
52
  return name in [k["name"] for k in self.files]
49
53
 
50
54
 
55
+ def use_reactive_or_value(
56
+ value: Union[T, solara.Reactive[T]], on_value: Optional[Callable[[T], None]] = None, value_name="value", on_value_name="on_value", use_internal_value=False
57
+ ):
58
+ def hookup_on_value():
59
+ if isinstance(value, solara.Reactive) and on_value:
60
+ return value.subscribe(on_value)
61
+
62
+ solara.use_effect(hookup_on_value, [isinstance(value, solara.Reactive), on_value])
63
+ internal_value, set_internal_value = solara.use_state(value.value if isinstance(value, solara.Reactive) else value)
64
+ if use_internal_value:
65
+ return internal_value, set_internal_value
66
+ if isinstance(value, solara.Reactive):
67
+ return value.value, value.set
68
+ elif on_value:
69
+ return value, on_value
70
+ else:
71
+ logger.warning("You should provide an %s callback if you are not using a reactive value, otherwise %s input will not update", on_value_name, value_name)
72
+ return value, lambda x: None
73
+
74
+
51
75
  @solara.component
52
76
  def FileBrowser(
53
77
  directory: Union[None, str, Path, solara.Reactive[Path]] = None,
78
+ selected: Union[None, Path, solara.Reactive[Optional[Path]]] = None,
54
79
  on_directory_change: Optional[Callable[[Path], None]] = None,
55
80
  on_path_select: Optional[Callable[[Optional[Path]], None]] = None,
56
81
  on_file_open: Optional[Callable[[Path], None]] = None,
@@ -75,7 +100,8 @@ def FileBrowser(
75
100
 
76
101
  ## Arguments
77
102
 
78
- * `directory`: The directory to start in. If `None` the current working directory is used.
103
+ * `directory`: The directory to start in. If `None`, the current working directory is used.
104
+ * `selected`: The selected file or directory. If `None`, no file or directory is selected (requires `can_select=True`).
79
105
  * `on_directory_change`: Depends on mode, see above.
80
106
  * `on_path_select`: Depends on mode, see above.
81
107
  * `on_file_open`: Depends on mode, see above.
@@ -90,13 +116,30 @@ def FileBrowser(
90
116
  directory = os.getcwd() # pragma: no cover
91
117
  if isinstance(directory, str):
92
118
  directory = Path(directory)
119
+ # directory = directory.resolve()
93
120
  current_dir = solara.use_reactive(directory)
94
- selected, set_selected = solara.use_state(None)
95
121
  double_clicked, set_double_clicked = solara.use_state(None)
96
122
  warning, set_warning = solara.use_state(cast(Optional[str], None))
97
123
  scroll_pos_stack, set_scroll_pos_stack = solara.use_state(cast(List[int], []))
98
124
  scroll_pos, set_scroll_pos = solara.use_state(0)
99
- selected, set_selected = solara.use_state(None)
125
+ selected_private, set_selected_private = use_reactive_or_value(
126
+ selected,
127
+ on_value=on_path_select if can_select else lambda x: None,
128
+ value_name="selected",
129
+ on_value_name="on_path_select",
130
+ use_internal_value=not can_select,
131
+ )
132
+ # remove so we don't accidentally use it
133
+ del selected
134
+
135
+ def sync_directory_from_selected():
136
+ if selected_private is not None:
137
+ # if we select a file, we need to make sure the directory is correct
138
+ # NOTE: although we expect a Path, abuse might make it a string
139
+ if isinstance(selected_private, Path):
140
+ current_dir.value = selected_private.resolve().parent
141
+
142
+ solara.use_effect(sync_directory_from_selected, [selected_private])
100
143
 
101
144
  def change_dir(new_dir: Path):
102
145
  if os.access(new_dir, os.R_OK):
@@ -114,14 +157,14 @@ def FileBrowser(
114
157
  on_path_select(None)
115
158
  return
116
159
  if item["name"] == "..":
117
- new_dir = current_dir.value.parent
160
+ new_dir = current_dir.value.resolve().parent
118
161
  action_change_directory = (can_select and double_click) or (not can_select and not double_click)
119
162
  if action_change_directory and change_dir(new_dir):
120
163
  if scroll_pos_stack:
121
164
  last_pos = scroll_pos_stack[-1]
122
165
  set_scroll_pos_stack(scroll_pos_stack[:-1])
123
166
  set_scroll_pos(last_pos)
124
- set_selected(None)
167
+ set_selected_private(None)
125
168
  set_double_clicked(None)
126
169
  if on_path_select and can_select:
127
170
  on_path_select(None)
@@ -142,7 +185,7 @@ def FileBrowser(
142
185
  if change_dir(path):
143
186
  set_scroll_pos_stack(scroll_pos_stack + [scroll_pos])
144
187
  set_scroll_pos(0)
145
- set_selected(None)
188
+ set_selected_private(None)
146
189
  set_double_clicked(None)
147
190
  if on_path_select and can_select:
148
191
  on_path_select(None)
@@ -153,7 +196,7 @@ def FileBrowser(
153
196
  raise RuntimeError("Combination should not happen") # pragma: no cover
154
197
 
155
198
  def on_click(item):
156
- set_selected(item)
199
+ set_selected_private(item["name"] if item else None)
157
200
  on_item(item, False)
158
201
 
159
202
  def on_double_click(item):
@@ -163,12 +206,20 @@ def FileBrowser(
163
206
  # otherwise we can ignore it, single click will handle it
164
207
 
165
208
  files = [{"name": "..", "is_file": False}] + list_dir(current_dir.value, filter=filter, directory_first=directory_first)
209
+ clicked = (
210
+ {
211
+ "name": selected_private.name if isinstance(selected_private, Path) else selected_private,
212
+ "is_file": isinstance(selected_private, Path),
213
+ "size": None,
214
+ }
215
+ if selected_private is not None
216
+ else None
217
+ )
166
218
  with Div(class_="solara-file-browser") as main:
167
- Div(children=[str(current_dir.value)])
219
+ Div(children=[str(current_dir.value.resolve())])
168
220
  FileListWidget.element(
169
221
  files=files,
170
- selected=selected,
171
- clicked=selected,
222
+ clicked=clicked,
172
223
  on_clicked=on_click,
173
224
  double_clicked=double_clicked,
174
225
  on_double_clicked=on_double_click,
@@ -19,7 +19,7 @@
19
19
  <script>
20
20
  module.exports = {
21
21
  mounted() {
22
- this.chunk_size = 2 * 1024 * 1024;
22
+ this.chunk_size = 1 * 1024 * 1024;
23
23
  this.$refs.dropzone.addEventListener('dragover', event => {
24
24
  event.preventDefault();
25
25
  });
@@ -136,7 +136,7 @@ class AppScript:
136
136
  routes = solara.generate_routes_directory(self.path)
137
137
 
138
138
  if any(name for name in sys.modules.keys() if name.startswith(self.name)):
139
- logger.warn(
139
+ logger.warning(
140
140
  f"Directory {self.name} is also used as a package. This can cause modules to be loaded twice, and might "
141
141
  "cause unexpected behavior. If you run solara from a different directory (e.g. the parent directory) you "
142
142
  "can avoid this ambiguity."
@@ -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.47.0-py2.py3-none-any.whl", keep_going=True)
122
+ await micropip.install("/wheels/solara-1.49.0-py2.py3-none-any.whl", keep_going=True)
123
123
  import solara
124
124
 
125
125
  el = solara.Warning("lala")
@@ -6,6 +6,7 @@ import functools
6
6
  import inspect
7
7
  import logging
8
8
  import threading
9
+ import warnings
9
10
  from enum import Enum
10
11
  import typing
11
12
  from typing import (
@@ -536,6 +537,7 @@ def task(
536
537
  f: None = None,
537
538
  *,
538
539
  prefer_threaded: bool = ...,
540
+ check_for_render_context: bool = ...,
539
541
  ) -> Callable[[Callable[P, R]], Task[P, R]]: ...
540
542
 
541
543
 
@@ -544,6 +546,7 @@ def task(
544
546
  f: Callable[P, Union[Coroutine[Any, Any, R], R]],
545
547
  *,
546
548
  prefer_threaded: bool = ...,
549
+ check_for_render_context: bool = ...,
547
550
  ) -> Task[P, R]: ...
548
551
 
549
552
 
@@ -551,6 +554,7 @@ def task(
551
554
  f: Union[None, Callable[P, Union[Coroutine[Any, Any, R], R]]] = None,
552
555
  *,
553
556
  prefer_threaded: bool = True,
557
+ check_for_render_context: bool = True,
554
558
  ) -> Union[Callable[[Callable[P, R]], Task[P, R]], Task[P, R]]:
555
559
  """Decorator to turn a function or coroutine function into a task.
556
560
 
@@ -764,12 +768,76 @@ def task(
764
768
  This ensures that even when a coroutine functions calls a blocking function the UI is still responsive.
765
769
  On platform where threads are not supported (like Pyodide / WASM / Emscripten / PyScript), a coroutine
766
770
  function will always run in the current event loop.
771
+ - `check_for_render_context` - bool: If true, we will check if we are in a render context, and if so, we will
772
+ warn you that you should probably be using `use_task` instead of `task`.
767
773
 
768
774
  ```
769
775
 
770
776
  """
771
777
 
778
+ def check_if_we_should_use_use_task():
779
+ import reacton.core
780
+
781
+ in_reacton_context = reacton.core.get_render_context(required=False) is not None
782
+ if not in_reacton_context:
783
+ # We are not in a reacton context, so we should not (and cannot) use use_task
784
+ return
785
+ from .toestand import _find_outside_solara_frame
786
+
787
+ frame = _find_outside_solara_frame()
788
+ if frame is None:
789
+ # We cannot determine which frame we are in, just skip this check
790
+ return
791
+ import inspect
792
+
793
+ tb = inspect.getframeinfo(frame)
794
+ msg = """You are calling task(...) from a component, while you should probably be using use_task.
795
+
796
+ Reason:
797
+ - task(...) creates a new task object on every render, and should only be used outside of a component.
798
+ - use_task(...) returns the same task object on every render, and should be used inside a component.
799
+
800
+ Example:
801
+ @solara.component
802
+ def Page():
803
+ @task # This is wrong, this creates a new task object on every render
804
+ def my_task():
805
+ ...
806
+
807
+ Instead, you should do:
808
+ @solara.component
809
+ def Page():
810
+ @use_task
811
+ def my_task():
812
+ ...
813
+
814
+ """
815
+ if tb:
816
+ if tb.code_context:
817
+ code = tb.code_context[0]
818
+ else:
819
+ code = "<No code context available>"
820
+ msg += f"This warning was triggered from:\n{tb.filename}:{tb.lineno}\n{code.strip()}"
821
+
822
+ # Check if the call is within a use_memo context by inspecting the call stack
823
+ if frame:
824
+ caller_frame = frame.f_back
825
+ # Check a few frames up the stack (e.g., up to 5) for 'use_memo'
826
+ for _ in range(5):
827
+ if caller_frame is None:
828
+ break
829
+ func_name = caller_frame.f_code.co_name
830
+ module_name = caller_frame.f_globals.get("__name__", "")
831
+ if func_name == "use_memo" and (module_name.startswith("solara.") or module_name.startswith("reacton.")):
832
+ # We are in a use_memo (or a context that should not trigger the warning)
833
+ return
834
+ caller_frame = caller_frame.f_back
835
+
836
+ warnings.warn(msg)
837
+
772
838
  def wrapper(f: Union[None, Callable[P, Union[Coroutine[Any, Any, R], R]]]) -> Task[P, R]:
839
+ if check_for_render_context:
840
+ check_if_we_should_use_use_task()
773
841
  # we use wraps to make the key of the reactive variable more unique
774
842
  # and less likely to mixup during hot reloads
775
843
  assert f is not None
@@ -800,46 +868,46 @@ def use_task(
800
868
  dependencies: Literal[None] = ...,
801
869
  raise_error=...,
802
870
  prefer_threaded=...,
803
- ) -> Callable[[Callable[[], R]], "Task[[], R]"]: ...
871
+ ) -> Callable[[Callable[P, R]], "Task[P, R]"]: ...
804
872
 
805
873
 
806
874
  @overload
807
875
  def use_task(
808
- f: Callable[[], R],
876
+ f: None = None,
809
877
  *,
810
- dependencies: Literal[None] = ...,
878
+ dependencies: List = ...,
811
879
  raise_error=...,
812
880
  prefer_threaded=...,
813
- ) -> "Task[[], R]": ...
881
+ ) -> Callable[[Callable[[], R]], "Task[[], R]"]: ...
814
882
 
815
883
 
816
884
  @overload
817
885
  def use_task(
818
- f: None = None,
886
+ f: Callable[[], R],
819
887
  *,
820
888
  dependencies: List = ...,
821
889
  raise_error=...,
822
890
  prefer_threaded=...,
823
- ) -> Callable[[Callable[[], R]], "Task[[], R]"]: ...
891
+ ) -> "Task[[], R]": ...
824
892
 
825
893
 
826
894
  @overload
827
895
  def use_task(
828
- f: Callable[[], R],
896
+ f: Callable[P, R],
829
897
  *,
830
- dependencies: List = ...,
898
+ dependencies: Literal[None] = ...,
831
899
  raise_error=...,
832
900
  prefer_threaded=...,
833
- ) -> "Task[[], R]": ...
901
+ ) -> "Task[P, R]": ...
834
902
 
835
903
 
836
904
  def use_task(
837
- f: Union[None, Callable[[], R]] = None,
905
+ f: Union[None, Callable[P, R]] = None,
838
906
  *,
839
907
  dependencies: Union[None, List] = [],
840
908
  raise_error=True,
841
909
  prefer_threaded=True,
842
- ) -> Union[Callable[[Callable[[], R]], "Task[[], R]"], "Task[[], R]"]:
910
+ ) -> Union[Callable[[Callable[P, R]], "Task[P, R]"], "Task[P, R]"]:
843
911
  """A hook that runs a function or coroutine function as a task and returns the result.
844
912
 
845
913
  Allows you to run code in the background, with the UI available to the user. This is useful for long running tasks,
@@ -919,7 +987,7 @@ def use_task(
919
987
 
920
988
  def wrapper(f):
921
989
  def create_task() -> "Task[[], R]":
922
- return task(f, prefer_threaded=prefer_threaded)
990
+ return task(f, prefer_threaded=prefer_threaded, check_for_render_context=False)
923
991
 
924
992
  task_instance = solara.use_memo(create_task, dependencies=[])
925
993
  # we always update the function so we do not have stale data in the function
@@ -343,6 +343,7 @@ def _is_internal_module(file_name: str):
343
343
  return (
344
344
  file_name_parts[-2:] == ["solara", "toestand.py"]
345
345
  or file_name_parts[-2:] == ["solara", "reactive.py"]
346
+ or file_name_parts[-2:] == ["solara", "tasks.py"]
346
347
  or file_name_parts[-2:] == ["solara", "_stores.py"]
347
348
  or file_name_parts[-3:] == ["solara", "hooks", "use_reactive.py"]
348
349
  or file_name_parts[-2:] == ["reacton", "core.py"]
@@ -0,0 +1,38 @@
1
+ """# FileBrowser"""
2
+
3
+ from pathlib import Path
4
+ from typing import Optional, cast
5
+ import random
6
+ import solara
7
+ from solara.website.utils import apidoc
8
+
9
+ opened = solara.reactive(cast(Optional[Path], None))
10
+ selected = solara.reactive(cast(Optional[Path], None))
11
+ directory = solara.reactive(Path("~").expanduser())
12
+ can_select = solara.reactive(False)
13
+
14
+
15
+ @solara.component
16
+ def Page():
17
+ def reset_path():
18
+ opened.value = None
19
+ selected.value = None
20
+
21
+ def select_random_file():
22
+ files = list(directory.value.glob("*"))
23
+ if files:
24
+ selected.value = random.choice(files)
25
+
26
+ # reset path and file when can_select changes
27
+ solara.use_memo(reset_path, [can_select.value])
28
+ solara.Checkbox(label="Enable select", value=can_select)
29
+ solara.FileBrowser(directory, selected=selected, on_file_open=opened.set, can_select=can_select.value)
30
+ solara.Info(f"You are in directory: {directory}")
31
+ solara.Info(f"You selected path: {selected}")
32
+ solara.Info(f"You opened file: {opened}")
33
+
34
+ if can_select.value:
35
+ solara.Button(label="Select random file", on_click=select_random_file)
36
+
37
+
38
+ __doc__ += apidoc(solara.FileBrowser.f) # type: ignore
@@ -32,7 +32,7 @@ def Page():
32
32
  with solara.Card("TESSA", style={"height": "100%"}):
33
33
  solara.Markdown(
34
34
  """
35
- [TESSA](https://planeto-energy.ch/solution/) is a tool developed by Planeto for district heating & cooling planning.
35
+ [TESSA](https://planeto-energy.ch/) is a tool developed by Planeto for district heating & cooling planning.
36
36
  """
37
37
  )
38
38
  with solara.Link("./planeto_tessa"):
@@ -10,7 +10,7 @@ def Page():
10
10
  """
11
11
  # TESSA by Planeto
12
12
 
13
- [Planeto](https://planeto-energy.ch/) developed a tool called [TESSA](https://planeto-energy.ch/solution/) for district heating & cooling planning.
13
+ [Planeto](https://planeto-energy.ch/) developed a tool called TESSA for district heating & cooling planning.
14
14
 
15
15
  TESSA was prototyped in the Jupyter notebook using ipywidgets. Using solara, they are able to bring TESSA into production using the
16
16
  same technology stack.
@@ -3,8 +3,8 @@
3
3
  <div v-if="gridlayout_loaded" style="padding: 0px; width: 100%;">
4
4
  <grid-layout
5
5
  :layout.sync="grid_layout"
6
- :col-num="12"
7
- :row-height="30"
6
+ :col-num="col_num"
7
+ :row-height="row_height"
8
8
  :is-draggable="draggable"
9
9
  :is-resizable="resizable"
10
10
  :is-mirrored="false"
@@ -53,6 +53,8 @@ class GridLayout(v.VuetifyTemplate):
53
53
  resizable = traitlets.CBool(True).tag(sync=True)
54
54
  cdn = traitlets.Unicode(None, allow_none=True).tag(sync=True)
55
55
  on_layout_updated = traitlets.traitlets.Callable(None, allow_none=True)
56
+ col_num = traitlets.Int(12).tag(sync=True)
57
+ row_height = traitlets.Int(30).tag(sync=True)
56
58
 
57
59
  def vue_layout_updated(self, *args):
58
60
  if self.on_layout_updated is not None:
@@ -1,6 +1,7 @@
1
1
  import platform
2
2
  import unittest.mock
3
3
  from pathlib import Path
4
+ from typing import Optional, cast
4
5
 
5
6
  import pytest
6
7
 
@@ -22,7 +23,7 @@ def test_file_browser_callback_no_select():
22
23
  HERE.parent, on_path_select=on_path_select, on_directory_change=on_directory_change, on_file_open=on_file_open, on_file_name=on_file_name
23
24
  )
24
25
 
25
- div, rc = solara.render_fixed(Test())
26
+ div, rc = solara.render_fixed(Test(), handle_error=False)
26
27
  on_directory_change.assert_not_called()
27
28
  on_file_open.assert_not_called()
28
29
  on_path_select.assert_not_called()
@@ -149,10 +150,12 @@ def test_file_browser_no_access(tmpdir: Path):
149
150
 
150
151
  @solara.component
151
152
  def Test():
152
- return solara.FileBrowser(tmpdir, on_path_select=on_path_select, on_directory_change=on_directory_change, on_file_open=on_file_open, can_select=True)
153
+ return solara.FileBrowser(
154
+ Path(tmpdir), on_path_select=on_path_select, on_directory_change=on_directory_change, on_file_open=on_file_open, can_select=True
155
+ )
153
156
 
154
157
  try:
155
- div, rc = solara.render_fixed(Test())
158
+ div, rc = solara.render_fixed(Test(), handle_error=False)
156
159
 
157
160
  list: solara.components.file_browser.FileListWidget = div.children[1]
158
161
  # select is ok
@@ -179,7 +182,7 @@ def test_file_browser_filter():
179
182
  list: solara.components.file_browser.FileListWidget = div.children[1]
180
183
  items = list.files
181
184
  names = {k["name"] for k in items}
182
- assert names == {"unit", "ui", "docs", "integration", "pyinstaller", ".."}
185
+ assert names.issuperset({"unit", "ui", "docs", "integration", "pyinstaller", ".."})
183
186
 
184
187
 
185
188
  def test_file_browser_test_change_directory():
@@ -212,7 +215,7 @@ def test_file_browser_control_directory():
212
215
  file_list.observe(mock, "files")
213
216
  items = file_list.files
214
217
  names = {k["name"] for k in items}
215
- assert names == {"unit", "ui", "docs", "integration", "pyinstaller", ".."}
218
+ assert names.issuperset({"unit", "ui", "docs", "integration", "pyinstaller", ".."})
216
219
  file_list.test_click("..")
217
220
  assert mock.call_count == 0
218
221
  file_list.test_click("integration")
@@ -220,3 +223,54 @@ def test_file_browser_control_directory():
220
223
  names = {k["name"] for k in items}
221
224
  assert names != {"unit", "ui", "docs", "integration", "pyinstaller", ".."}
222
225
  assert mock.call_count == 1
226
+
227
+
228
+ def test_file_browser_relative_path():
229
+ @solara.component
230
+ def Test():
231
+ return solara.FileBrowser(".")
232
+
233
+ div, rc = solara.render_fixed(Test())
234
+ list: solara.components.file_browser.FileListWidget = div.children[1]
235
+ files = {k["name"] for k in list.files}
236
+ list.test_click("..")
237
+ files_parent = {k["name"] for k in list.files}
238
+ assert files_parent != files
239
+
240
+
241
+ def test_file_browser_programmatic_select():
242
+ # using a reactive value to select a file
243
+ selected = solara.reactive(cast(Optional[Path], None))
244
+
245
+ @solara.component
246
+ def Test():
247
+ return solara.FileBrowser(HERE.parent, selected=selected, can_select=True)
248
+
249
+ div, rc = solara.render_fixed(Test(), handle_error=False)
250
+ list: solara.components.file_browser.FileListWidget = div.children[1]
251
+ files = list.files.copy()
252
+ assert list.clicked is None
253
+ selected.value = HERE.parent / "file_browser_test.py"
254
+ assert list.clicked is not None
255
+ assert list.clicked["name"] == "file_browser_test.py"
256
+ list.test_click("..", double_click=True)
257
+ assert list.files != files
258
+ assert selected.value is None
259
+
260
+ selected.value = None
261
+
262
+ # passing selected as a value (non reactive)
263
+ @solara.component
264
+ def Test2():
265
+ return solara.FileBrowser(HERE.parent, selected=selected.value, on_path_select=selected.set, can_select=True)
266
+
267
+ div, rc = solara.render_fixed(Test2(), handle_error=False)
268
+ list = div.children[1]
269
+ files = list.files.copy()
270
+ assert list.clicked is None
271
+ selected.value = HERE.parent / "file_browser_test.py"
272
+ assert list.clicked is not None
273
+ assert list.clicked["name"] == "file_browser_test.py"
274
+ list.test_click("..", double_click=True)
275
+ assert list.files != files
276
+ assert selected.value is None
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import time
3
+ import warnings
3
4
 
4
5
  import ipyvuetify as v
5
6
  import pytest
@@ -652,3 +653,31 @@ def test_update_while_rendering():
652
653
 
653
654
  box, rc = solara.render(Test(), handle_error=False)
654
655
  rc.find(children=["value = 20"]).wait_for(timeout=3)
656
+
657
+
658
+ def test_task_decorator_warning_in_component():
659
+ with pytest.warns(UserWarning, match=r"You are calling task.*"):
660
+
661
+ @solara.component
662
+ def ComponentWithTask():
663
+ @solara.tasks.task
664
+ def my_task_in_component():
665
+ return "done"
666
+
667
+ return solara.Text("ComponentWithTask")
668
+
669
+ solara.render(ComponentWithTask(), handle_error=False)
670
+
671
+ # Test that no warning is issued when task is used with use_memo
672
+ with warnings.catch_warnings():
673
+ warnings.simplefilter("error") # Treat all warnings as errors
674
+
675
+ @solara.component
676
+ def ComponentWithTaskInMemo():
677
+ def my_job_for_memo():
678
+ return "done"
679
+
680
+ solara.use_memo(lambda: solara.tasks.task(my_job_for_memo), dependencies=[])
681
+ return solara.Text("ComponentWithTaskInMemo")
682
+
683
+ solara.render_fixed(ComponentWithTaskInMemo(), handle_error=False)
@@ -1,30 +0,0 @@
1
- """# FileBrowser"""
2
-
3
- from pathlib import Path
4
- from typing import Optional, cast
5
-
6
- import solara
7
- from solara.website.utils import apidoc
8
-
9
-
10
- @solara.component
11
- def Page():
12
- file, set_file = solara.use_state(cast(Optional[Path], None))
13
- path, set_path = solara.use_state(cast(Optional[Path], None))
14
- directory, set_directory = solara.use_state(Path("~").expanduser())
15
-
16
- can_select = solara.ui_checkbox("Enable select")
17
-
18
- def reset_path():
19
- set_path(None)
20
- set_file(None)
21
-
22
- # reset path and file when can_select changes
23
- solara.use_memo(reset_path, [can_select])
24
- solara.FileBrowser(directory, on_directory_change=set_directory, on_path_select=set_path, on_file_open=set_file, can_select=can_select)
25
- solara.Info(f"You are in directory: {directory}")
26
- solara.Info(f"You selected path: {path}")
27
- solara.Info(f"You opened file: {file}")
28
-
29
-
30
- __doc__ += apidoc(solara.FileBrowser.f) # type: ignore
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes