solara-ui 1.34.1__tar.gz → 1.35.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 (582) hide show
  1. {solara_ui-1.34.1 → solara_ui-1.35.1}/PKG-INFO +1 -1
  2. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/__init__.py +1 -1
  3. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/__main__.py +1 -1
  4. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/autorouting.py +2 -4
  5. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/applayout.py +1 -1
  6. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/file_browser.py +13 -14
  7. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/markdown.py +2 -5
  8. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/style.py +2 -2
  9. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/app.py +1 -1
  10. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/cdn_helper.py +15 -1
  11. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/esm.py +1 -1
  12. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/flask.py +5 -2
  13. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/starlette.py +6 -1
  14. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/solara_bootstrap.py +1 -1
  15. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/threaded.py +10 -1
  16. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/utils.py +7 -0
  17. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/test/pytest_plugin.py +2 -1
  18. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/changelog/changelog.md +6 -0
  19. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +4 -0
  20. solara_ui-1.35.1/tests/integration/apps/not-allowed +1 -0
  21. solara_ui-1.35.1/tests/integration/apps/public/test.txt +1 -0
  22. solara_ui-1.35.1/tests/integration/apps/secure/app.py +4 -0
  23. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/server_test.py +100 -0
  24. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/cdn_helper_test.py +23 -0
  25. {solara_ui-1.34.1 → solara_ui-1.35.1}/.gitignore +0 -0
  26. {solara_ui-1.34.1 → solara_ui-1.35.1}/LICENSE +0 -0
  27. {solara_ui-1.34.1 → solara_ui-1.35.1}/README.md +0 -0
  28. {solara_ui-1.34.1 → solara_ui-1.35.1}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  29. {solara_ui-1.34.1 → solara_ui-1.35.1}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  30. {solara_ui-1.34.1 → solara_ui-1.35.1}/pyproject.toml +0 -0
  31. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/alias.py +0 -0
  32. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/cache.py +0 -0
  33. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/checks.html +0 -0
  34. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/checks.py +0 -0
  35. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/comm.py +0 -0
  36. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/__init__.py +0 -0
  37. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/alert.py +0 -0
  38. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/button.py +0 -0
  39. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/card.py +0 -0
  40. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/checkbox.py +0 -0
  41. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/code_highlight_css.py +0 -0
  42. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/code_highlight_css.vue +0 -0
  43. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/columns.py +0 -0
  44. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/component_vue.py +0 -0
  45. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/cross_filter.py +0 -0
  46. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/dataframe.py +0 -0
  47. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/datatable.py +0 -0
  48. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/datatable.vue +0 -0
  49. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/details.py +0 -0
  50. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/download.vue +0 -0
  51. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/echarts.py +0 -0
  52. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/echarts.vue +0 -0
  53. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/figure_altair.py +0 -0
  54. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/file_download.py +0 -0
  55. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/file_drop.py +0 -0
  56. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/file_drop.vue +0 -0
  57. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/file_list_widget.vue +0 -0
  58. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/head.py +0 -0
  59. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/head_tag.py +0 -0
  60. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/head_tag.vue +0 -0
  61. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/image.py +0 -0
  62. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/input.py +0 -0
  63. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/link.py +0 -0
  64. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/markdown_editor.py +0 -0
  65. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/markdown_editor.vue +0 -0
  66. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/matplotlib.py +0 -0
  67. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/meta.py +0 -0
  68. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/misc.py +0 -0
  69. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/pivot_table.py +0 -0
  70. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/pivot_table.vue +0 -0
  71. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/progress.py +0 -0
  72. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/select.py +0 -0
  73. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/select.vue +0 -0
  74. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/slider.py +0 -0
  75. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/slider_date.vue +0 -0
  76. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/spinner-solara.vue +0 -0
  77. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/spinner.py +0 -0
  78. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/sql_code.py +0 -0
  79. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/sql_code.vue +0 -0
  80. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/switch.py +0 -0
  81. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/tab_navigation.py +0 -0
  82. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/title.py +0 -0
  83. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/title.vue +0 -0
  84. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/togglebuttons.py +0 -0
  85. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/components/tooltip.py +0 -0
  86. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/datatypes.py +0 -0
  87. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/express.py +0 -0
  88. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/hooks/__init__.py +0 -0
  89. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/hooks/dataframe.py +0 -0
  90. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/hooks/misc.py +0 -0
  91. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/hooks/use_reactive.py +0 -0
  92. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/hooks/use_thread.py +0 -0
  93. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/kitchensink.py +0 -0
  94. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/__init__.py +0 -0
  95. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/__init__.py +0 -0
  96. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/chat.py +0 -0
  97. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/confirmation_dialog.py +0 -0
  98. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/cross_filter.py +0 -0
  99. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/input_date.py +0 -0
  100. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/menu.py +0 -0
  101. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/menu.vue +0 -0
  102. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/tabs.py +0 -0
  103. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/theming.py +0 -0
  104. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/components/theming.vue +0 -0
  105. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/hooks/__init__.py +0 -0
  106. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/hooks/dataframe.py +0 -0
  107. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/toestand.py +0 -0
  108. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/utils/__init__.py +0 -0
  109. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/utils/cookies.py +0 -0
  110. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/utils/dataframe.py +0 -0
  111. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lab/utils/headers.py +0 -0
  112. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/layout.py +0 -0
  113. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/lifecycle.py +0 -0
  114. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/minisettings.py +0 -0
  115. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/py.typed +0 -0
  116. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/reactive.py +0 -0
  117. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/routing.py +0 -0
  118. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/scope/__init__.py +0 -0
  119. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/scope/types.py +0 -0
  120. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/__init__.py +0 -0
  121. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/custom.css +0 -0
  122. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/custom.js +0 -0
  123. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/favicon.png +0 -0
  124. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/favicon.svg +0 -0
  125. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/style.css +0 -0
  126. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/theme-dark.css +0 -0
  127. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/theme-light.css +0 -0
  128. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/assets/theme.js +0 -0
  129. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/fastapi.py +0 -0
  130. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/jupyter/__init__.py +0 -0
  131. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/jupyter/cdn_handler.py +0 -0
  132. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/jupyter/server_extension.py +0 -0
  133. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/jupytertools.py +0 -0
  134. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/kernel.py +0 -0
  135. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/kernel_context.py +0 -0
  136. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/patch.py +0 -0
  137. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/reload.py +0 -0
  138. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/server.py +0 -0
  139. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/settings.py +0 -0
  140. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/shell.py +0 -0
  141. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/ansi.js +0 -0
  142. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/highlight-dark.css +0 -0
  143. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/highlight.css +0 -0
  144. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/main-vuetify.js +0 -0
  145. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/main.js +0 -0
  146. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/sun.svg +0 -0
  147. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/static/webworker.js +0 -0
  148. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/telemetry.py +0 -0
  149. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/index.html.j2 +0 -0
  150. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/loader-plain.css +0 -0
  151. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/loader-plain.html +0 -0
  152. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/loader-solara.css +0 -0
  153. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/loader-solara.html +0 -0
  154. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/plain.html +0 -0
  155. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/templates/solara.html.j2 +0 -0
  156. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/server/websocket.py +0 -0
  157. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/settings.py +0 -0
  158. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/tasks.py +0 -0
  159. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/button.py +0 -0
  160. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/markdown.py +0 -0
  161. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/.flake8 +0 -0
  162. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/.pre-commit-config.yaml +0 -0
  163. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/LICENSE +0 -0
  164. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/Procfile +0 -0
  165. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/mypy.ini +0 -0
  166. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/pyproject.toml +0 -0
  167. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/__init__.py +0 -0
  168. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  169. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/components/article.py +0 -0
  170. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/components/data.py +0 -0
  171. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/components/header.py +0 -0
  172. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/components/layout.py +0 -0
  173. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  174. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  175. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/data.py +0 -0
  176. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  177. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  178. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  179. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  180. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  181. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/test/__init__.py +0 -0
  182. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/toestand.py +0 -0
  183. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/util.py +0 -0
  184. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/__init__.py +0 -0
  185. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/assets/custom.css +0 -0
  186. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/assets/images/logo-small.png +0 -0
  187. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/assets/images/logo.svg +0 -0
  188. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/assets/images/logo_white.svg +0 -0
  189. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/assets/theme.js +0 -0
  190. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/__init__.py +0 -0
  191. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/algolia.py +0 -0
  192. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/algolia.vue +0 -0
  193. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/algolia_api.vue +0 -0
  194. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/docs.py +0 -0
  195. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/header.py +0 -0
  196. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/hero.py +0 -0
  197. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/mailchimp.py +0 -0
  198. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/mailchimp.vue +0 -0
  199. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/markdown.py +0 -0
  200. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/notebook.py +0 -0
  201. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/components/sidebar.py +0 -0
  202. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/__init__.py +0 -0
  203. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/__init__.py +0 -0
  204. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/authorization/__init__.py +0 -0
  205. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/authorization/admin.py +0 -0
  206. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/authorization/users.py +0 -0
  207. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  208. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/layout-demo.py +0 -0
  209. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/multipage/__init__.py +0 -0
  210. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/multipage/page1.py +0 -0
  211. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/multipage/page2.py +0 -0
  212. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/scatter.py +0 -0
  213. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/scrolling.py +0 -0
  214. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  215. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/changelog/__init__.py +0 -0
  216. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/contact/__init__.py +0 -0
  217. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/contact/contact.md +0 -0
  218. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/doc_use_download.py +0 -0
  219. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/__init__.py +0 -0
  220. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  221. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  222. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  223. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  224. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  225. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  226. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -0
  227. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  228. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  229. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  230. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +0 -0
  231. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  232. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  233. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  234. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  235. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  236. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  237. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  238. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  239. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  240. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  241. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  242. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  243. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  244. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  245. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -0
  246. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -0
  247. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  248. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -0
  249. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -0
  250. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  251. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  252. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  253. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/__init__.py +0 -0
  254. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  255. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  256. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  257. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  258. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  259. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  260. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  261. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  262. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  263. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  264. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  265. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  266. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  267. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  268. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  269. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  270. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  271. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_thread.md +0 -0
  272. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  273. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  274. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  275. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  276. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  277. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  278. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/route.py +0 -0
  279. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  280. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  281. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  282. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  283. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  284. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  285. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  286. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  287. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  288. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  289. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  290. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  291. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/__init__.py +0 -0
  292. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  293. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  294. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  295. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  296. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/common.py +0 -0
  297. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  298. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  299. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/data/pivot_table.py +0 -0
  300. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  301. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  302. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  303. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  304. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/button.py +0 -0
  305. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  306. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
  307. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  308. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/input.py +0 -0
  309. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/select.py +0 -0
  310. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/slider.py +0 -0
  311. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/switch.py +0 -0
  312. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  313. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  314. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  315. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  316. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  317. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  318. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  319. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  320. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  321. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/task.py +0 -0
  322. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  323. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  324. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  325. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  326. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  327. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  328. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/card.py +0 -0
  329. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  330. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/column.py +0 -0
  331. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  332. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  333. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/details.py +0 -0
  334. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  335. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  336. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  337. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/row.py +0 -0
  338. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  339. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  340. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  341. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  342. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/html.py +0 -0
  343. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/image.py +0 -0
  344. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  345. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  346. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/sql_code.py +0 -0
  347. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  348. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  349. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/page/head.py +0 -0
  350. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/page/title.py +0 -0
  351. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  352. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/error.py +0 -0
  353. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/info.py +0 -0
  354. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/progress.py +0 -0
  355. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  356. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/success.py +0 -0
  357. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/status/warning.py +0 -0
  358. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  359. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  360. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  361. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  362. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  363. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  364. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/__init__.py +0 -0
  365. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  366. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
  367. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  368. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  369. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  370. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  371. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  372. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  373. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  374. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  375. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  376. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  377. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  378. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  379. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  380. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  381. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  382. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  383. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  384. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
  385. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
  386. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  387. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
  388. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
  389. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
  390. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
  391. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  392. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  393. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
  394. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  395. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  396. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
  397. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
  398. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  399. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/faq/__init__.py +0 -0
  400. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  401. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  402. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
  403. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  404. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  405. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  406. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  407. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  408. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  409. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  410. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  411. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  412. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  413. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
  414. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -0
  415. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  416. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -0
  417. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -0
  418. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  419. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -0
  420. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  421. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  422. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  423. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/docutils.py +0 -0
  424. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/__init__.py +0 -0
  425. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  426. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/planeto_tessa.py +0 -0
  427. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/solara_dev.py +0 -0
  428. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  429. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  430. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  431. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  432. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/pages/showcase/wanderlust.py +0 -0
  433. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/public/beach.jpeg +0 -0
  434. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/public/logo.svg +0 -0
  435. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/public/social/discord.svg +0 -0
  436. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/public/social/github.svg +0 -0
  437. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/public/social/twitter.svg +0 -0
  438. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/public/success.html +0 -0
  439. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/templates/index.html.j2 +0 -0
  440. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/website/utils.py +0 -0
  441. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/widgets/__init__.py +0 -0
  442. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/widgets/vue/gridlayout.vue +0 -0
  443. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/widgets/vue/html.vue +0 -0
  444. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/widgets/vue/navigator.vue +0 -0
  445. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/widgets/vue/vegalite.vue +0 -0
  446. {solara_ui-1.34.1 → solara_ui-1.35.1}/solara/widgets/widgets.py +0 -0
  447. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/__init__.py +0 -0
  448. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/conftest.py +0 -0
  449. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  450. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  451. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  452. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  453. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  454. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/__init__.py +0 -0
  455. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/api_test.py +0 -0
  456. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/app_widget.py +0 -0
  457. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets/assets1/common.js +0 -0
  458. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets/assets1/unique1.js +0 -0
  459. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets/assets2/common.js +0 -0
  460. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets/assets2/custom.css +0 -0
  461. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets/assets2/custom.js +0 -0
  462. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets/assets2/unique2.js +0 -0
  463. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/assets_test.py +0 -0
  464. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/async_test.py +0 -0
  465. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/cdn_test.py +0 -0
  466. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/cmdline_test.py +0 -0
  467. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/conftest.py +0 -0
  468. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/create_test.py +0 -0
  469. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/enterprise/__init__.py +0 -0
  470. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/enterprise/oauth_test.py +0 -0
  471. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/error_test.py +0 -0
  472. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/esm_test.py +0 -0
  473. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/file_download_test.py +0 -0
  474. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/flask_test.py +0 -0
  475. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/input_date_test.py +0 -0
  476. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/latex_test.py +0 -0
  477. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/lifecycle_test.py +0 -0
  478. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/markdown_test.py +0 -0
  479. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/menu_test.py +0 -0
  480. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/popout_test.py +0 -0
  481. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/reconnect_test.py +0 -0
  482. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/reload/apps.py +0 -0
  483. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/router_test.py +0 -0
  484. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/ssg_test.py +0 -0
  485. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/starlette_test.py +0 -0
  486. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/test.vue +0 -0
  487. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/testapp.py +0 -0
  488. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/integration/widget_test.py +0 -0
  489. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  490. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  491. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  492. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  493. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
  494. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
  495. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
  496. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
  497. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  498. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  499. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
  500. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
  501. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  502. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  503. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
  504. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
  505. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
  506. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
  507. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
  508. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
  509. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  510. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
  511. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  512. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/__init__.py +0 -0
  513. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/app_test.py +0 -0
  514. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/applayout_test.py +0 -0
  515. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/autorouting_test.py +0 -0
  516. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/cache_test.py +0 -0
  517. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/chat_test.py +0 -0
  518. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/checkbox_test.py +0 -0
  519. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/common.py +0 -0
  520. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/component_frontend_test.py +0 -0
  521. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/component_vue_test.vue +0 -0
  522. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/confirmation_dialog_test.py +0 -0
  523. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/conftest.py +0 -0
  524. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/cross_filter_component_test.py +0 -0
  525. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/cross_filter_test.py +0 -0
  526. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/dataframe_test.py +0 -0
  527. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/datatable_test.py +0 -0
  528. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/display_test.py +0 -0
  529. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/express_test.py +0 -0
  530. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/file_browser_test.py +0 -0
  531. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/file_download_test.py +0 -0
  532. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/hooks_test.py +0 -0
  533. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/input_date_test.py +0 -0
  534. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/input_test.py +0 -0
  535. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/kernel_test.py +0 -0
  536. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/lab/__init__.py +0 -0
  537. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/lifecycle_test.py +0 -0
  538. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/matplotlib_test.py +0 -0
  539. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/no_solara_test.py +0 -0
  540. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/output_widget_test.py +0 -0
  541. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/patch_test.py +0 -0
  542. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/pivottable_test.py +0 -0
  543. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/reload_test.py +0 -0
  544. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/router_test.py +0 -0
  545. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/select_test.py +0 -0
  546. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/settings_test.py +0 -0
  547. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/shell_test.py +0 -0
  548. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/slider_test.py +0 -0
  549. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/__init__.py +0 -0
  550. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/food/__init__.py +0 -0
  551. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/food/food.py +0 -0
  552. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/food/index.py +0 -0
  553. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  554. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  555. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  556. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  557. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  558. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  559. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  560. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
  561. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  562. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  563. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  564. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  565. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  566. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  567. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  568. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  569. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
  570. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
  571. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  572. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  573. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/single_file.py +0 -0
  574. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  575. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  576. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/switch_test.py +0 -0
  577. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/tabs_test.py +0 -0
  578. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/task_test.py +0 -0
  579. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/telemetry_tests.py +0 -0
  580. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/toestand_computed_reload.py +0 -0
  581. {solara_ui-1.34.1 → solara_ui-1.35.1}/tests/unit/toestand_test.py +0 -0
  582. {solara_ui-1.34.1 → solara_ui-1.35.1}/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.34.1
3
+ Version: 1.35.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.34.1"
3
+ __version__ = "1.35.1"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -653,7 +653,7 @@ def markdown(target: typing.Optional[Path] = None):
653
653
 
654
654
 
655
655
  def write_script(name: str, target: typing.Optional[Path]):
656
- code = (HERE / "template" / f"{name}.py").read_text()
656
+ code = (HERE / "template" / f"{name}.py").read_text(encoding="utf-8")
657
657
  if target is None:
658
658
  target = Path("sol.py")
659
659
  else:
@@ -215,11 +215,9 @@ def RenderPage(main_name: str = "Page"):
215
215
  solara.Button(
216
216
  icon_name="mdi-pencil", icon=True, href=url, target="_blank", style={"position": "absolute", "top": "0px", "right": "0px"}
217
217
  )
218
- # solara.Markdown(path.read_text(), unsafe_solara_execute=True)
219
- component(path.read_text(), unsafe_solara_execute=True)
218
+ component(path.read_text(encoding="utf-8"), unsafe_solara_execute=True)
220
219
  else:
221
- # content = solara.Markdown(path.read_text(), unsafe_solara_execute=True)
222
- content = component(path.read_text(), unsafe_solara_execute=True)
220
+ content = component(path.read_text(encoding="utf-8"), unsafe_solara_execute=True)
223
221
 
224
222
  main = solara.Div(
225
223
  classes=["solara-autorouter-content"],
@@ -342,7 +342,7 @@ def AppLayout(
342
342
  ):
343
343
  if not show_app_bar:
344
344
  AppIcon(sidebar_open, on_click=lambda: set_sidebar_open(not sidebar_open))
345
- v.Html(tag="div", children=children_sidebar, style_="padding: 12px;").meta(ref="sidebar-content")
345
+ v.Html(tag="div", children=children_sidebar, style_="padding: 12px; height: 100%").meta(ref="sidebar-content")
346
346
  if show_app_bar:
347
347
  # if hide_on_scroll is True, and we have a little bit of scrolling, vuetify seems to act strangely
348
348
  # when scrolling (on @mariobuikhuizen/vuetify v2.2.26-rc.0
@@ -51,12 +51,12 @@ class FileListWidget(vy.VuetifyTemplate):
51
51
  @solara.component
52
52
  def FileBrowser(
53
53
  directory: Union[None, str, Path, solara.Reactive[Path]] = None,
54
- on_directory_change: Callable[[Path], None] = None,
55
- on_path_select: Callable[[Optional[Path]], None] = None,
56
- on_file_open: Callable[[Path], None] = None,
54
+ on_directory_change: Optional[Callable[[Path], None]] = None,
55
+ on_path_select: Optional[Callable[[Optional[Path]], None]] = None,
56
+ on_file_open: Optional[Callable[[Path], None]] = None,
57
57
  filter: Callable[[Path], bool] = lambda x: True,
58
58
  directory_first: bool = False,
59
- on_file_name: Callable[[str], None] = None,
59
+ on_file_name: Optional[Callable[[str], None]] = None,
60
60
  start_directory=None,
61
61
  can_select=False,
62
62
  ):
@@ -98,11 +98,11 @@ def FileBrowser(
98
98
  scroll_pos, set_scroll_pos = solara.use_state(0)
99
99
  selected, set_selected = solara.use_state(None)
100
100
 
101
- def change_dir(new_dir: str):
101
+ def change_dir(new_dir: Path):
102
102
  if os.access(new_dir, os.R_OK):
103
- current_dir.value = Path(new_dir)
103
+ current_dir.value = new_dir
104
104
  if on_directory_change:
105
- on_directory_change(Path(new_dir))
105
+ on_directory_change(new_dir)
106
106
  set_warning(None)
107
107
  return True
108
108
  else:
@@ -114,8 +114,7 @@ def FileBrowser(
114
114
  on_path_select(None)
115
115
  return
116
116
  if item["name"] == "..":
117
- current_dir_str = str(current_dir.value)
118
- new_dir = current_dir_str[: current_dir_str.rfind(os.path.sep)]
117
+ new_dir = current_dir.value.parent
119
118
  action_change_directory = (can_select and double_click) or (not can_select and not double_click)
120
119
  if action_change_directory and change_dir(new_dir):
121
120
  if scroll_pos_stack:
@@ -128,17 +127,17 @@ def FileBrowser(
128
127
  on_path_select(None)
129
128
  if can_select and not double_click:
130
129
  if on_path_select:
131
- on_path_select(Path(new_dir))
130
+ on_path_select(new_dir)
132
131
  return
133
132
 
134
- path = os.path.join(current_dir.value, item["name"])
133
+ path = current_dir.value / item["name"]
135
134
  is_file = item["is_file"]
136
135
  if (can_select and double_click) or (not can_select and not double_click):
137
136
  if is_file:
138
137
  if on_file_open:
139
- on_file_open(Path(path))
138
+ on_file_open(path)
140
139
  if on_file_name is not None:
141
- on_file_name(path)
140
+ on_file_name(str(path))
142
141
  else:
143
142
  if change_dir(path):
144
143
  set_scroll_pos_stack(scroll_pos_stack + [scroll_pos])
@@ -149,7 +148,7 @@ def FileBrowser(
149
148
  on_path_select(None)
150
149
  elif can_select and not double_click:
151
150
  if on_path_select:
152
- on_path_select(Path(path))
151
+ on_path_select(path)
153
152
  else: # not can_select and double_click is ignored
154
153
  raise RuntimeError("Combination should not happen") # pragma: no cover
155
154
 
@@ -185,10 +185,7 @@ module.exports = {
185
185
  document.head.appendChild(script);
186
186
  });
187
187
  },
188
- getBaseUrl() {
189
- if (window.solara && window.solara.rootPath !== undefined) {
190
- return solara.rootPath + "/";
191
- }
188
+ getJupyterBaseUrl() {
192
189
  // if base url is set, we use ./ for relative paths compared to the base url
193
190
  if (document.getElementsByTagName("base").length) {
194
191
  return "./";
@@ -205,7 +202,7 @@ module.exports = {
205
202
  return base
206
203
  },
207
204
  getCdn() {
208
- return this.cdn || (typeof solara_cdn !== "undefined" && solara_cdn) || `${this.getBaseUrl()}_solara/cdn`;
205
+ return this.cdn || (window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`);
209
206
  }
210
207
  },
211
208
  updated() {
@@ -52,7 +52,7 @@ def Style(value: Union[str, Path] = ""):
52
52
  try:
53
53
  async for _ in watchfiles.awatch(value):
54
54
  print(value, "changed, reloading css") # noqa
55
- set_css_content_reloaded(cast(Path, value).read_text())
55
+ set_css_content_reloaded(cast(Path, value).read_text(encoding="utf-8"))
56
56
  except RuntimeError:
57
57
  pass # swallow the RuntimeError: Already borrowed errors from watchfiles
58
58
  except Exception:
@@ -70,7 +70,7 @@ def Style(value: Union[str, Path] = ""):
70
70
  if css_content_reloaded is not None:
71
71
  css_content = css_content_reloaded
72
72
  else:
73
- css_content = value.read_text() if isinstance(value, Path) else value
73
+ css_content = value.read_text(encoding="utf-8") if isinstance(value, Path) else value
74
74
  # del value
75
75
  hash = hashlib.sha256(css_content.encode("utf-8")).hexdigest()
76
76
  # the key is unique for this component + value
@@ -229,7 +229,7 @@ class AppScript:
229
229
  path = Path(name)
230
230
  if path.suffix == ".vue":
231
231
  logger.info("Vue file changed: %s", name)
232
- template_content = path.read_text()
232
+ template_content = path.read_text(encoding="utf-8")
233
233
  for context in list(kernel_context.contexts.values()):
234
234
  with context:
235
235
  for filepath, widget in context.templates.items():
@@ -3,6 +3,7 @@ import pathlib
3
3
  import shutil
4
4
 
5
5
  import requests
6
+ from solara.server.utils import path_is_child_of
6
7
 
7
8
  import solara.settings
8
9
 
@@ -13,6 +14,9 @@ cdn_url_path = "_solara/cdn"
13
14
 
14
15
  def put_in_cache(base_cache_dir: pathlib.Path, path, data: bytes):
15
16
  cache_path = base_cache_dir / path
17
+ if not path_is_child_of(cache_path, base_cache_dir):
18
+ raise PermissionError("Trying to write outside of cache directory")
19
+
16
20
  pathlib.Path(cache_path.parent).mkdir(parents=True, exist_ok=True)
17
21
  try:
18
22
  logger.info("Writing cache file: %s", cache_path)
@@ -22,7 +26,14 @@ def put_in_cache(base_cache_dir: pathlib.Path, path, data: bytes):
22
26
 
23
27
 
24
28
  def get_from_cache(base_cache_dir: pathlib.Path, path):
25
- cache_path = base_cache_dir / path
29
+ cache_path = pathlib.Path(base_cache_dir / path)
30
+ # Make sure cache_path is a subdirectory of base_cache_dir
31
+ # so we don't accidentally read files from the parent directory
32
+ # which is a security risk.
33
+ if not path_is_child_of(cache_path, base_cache_dir):
34
+ logger.warning("Trying to read from outside of cache directory: %s is not a subdir of %s", cache_path, base_cache_dir)
35
+ raise PermissionError("Trying to read from outside of cache directory")
36
+
26
37
  try:
27
38
  logger.info("Opening cache file: %s", cache_path)
28
39
  return cache_path.read_bytes()
@@ -58,6 +69,9 @@ def get_path(base_cache_dir: pathlib.Path, path) -> pathlib.Path:
58
69
  store_path = path if len(parts) != 1 else pathlib.Path(path) / "__main.js"
59
70
  cache_path = base_cache_dir / store_path
60
71
 
72
+ if not path_is_child_of(cache_path, base_cache_dir):
73
+ raise PermissionError("Trying to read from outside of cache directory")
74
+
61
75
  if cache_path.exists():
62
76
  # before d7eba856f100d5c3c64f4eec22c62390f084cb40 on windows, we could
63
77
  # accidentally write to the cache directory, so we need to check if we still
@@ -40,7 +40,7 @@ def get_module_names():
40
40
  def create_modules():
41
41
  kernel_id = kernel_context.get_current_context().id
42
42
  _modules_added = _modules_added_per_kernel[kernel_id]
43
- logger.info("define modules %s", _modules)
43
+ logger.info("create modules %s", _modules)
44
44
  widgets = {}
45
45
  with lock:
46
46
  for name, (module, dependencies) in _modules.items():
@@ -199,7 +199,7 @@ def nbext(dir, filename):
199
199
  for directory in server.nbextensions_directories:
200
200
  file = directory / dir / filename
201
201
  if file.exists():
202
- return send_from_directory(directory / dir, filename)
202
+ return send_from_directory(directory, dir + os.path.sep + filename)
203
203
  return flask.Response("not found", status=404)
204
204
 
205
205
 
@@ -217,7 +217,10 @@ if solara.settings.assets.proxy:
217
217
  if not allowed():
218
218
  abort(401)
219
219
  cache_directory = settings.assets.proxy_cache_dir
220
- content = cdn_helper.get_data(Path(cache_directory), path)
220
+ try:
221
+ content = cdn_helper.get_data(Path(cache_directory), path)
222
+ except PermissionError:
223
+ return flask.Response("not found", status=404)
221
224
  mime = mimetypes.guess_type(path)
222
225
  return flask.Response(content, mimetype=mime[0])
223
226
 
@@ -3,6 +3,7 @@ import json
3
3
  import logging
4
4
  import math
5
5
  import os
6
+ from pathlib import Path
6
7
  import sys
7
8
  import threading
8
9
  import typing
@@ -14,6 +15,8 @@ import starlette.websockets
14
15
  import uvicorn.server
15
16
  import websockets.legacy.http
16
17
 
18
+ from solara.server.utils import path_is_child_of
19
+
17
20
  try:
18
21
  import solara_enterprise
19
22
 
@@ -405,6 +408,9 @@ class StaticNbFiles(StaticFilesOptionalAuth):
405
408
  original_path = os.path.join(directory, path)
406
409
  full_path = os.path.realpath(original_path)
407
410
  directory = os.path.realpath(directory)
411
+ # return early if someone tries to access a file outside of the directory
412
+ if not path_is_child_of(Path(original_path), Path(directory)):
413
+ return "", None
408
414
  try:
409
415
  return full_path, os.stat(full_path)
410
416
  except (FileNotFoundError, NotADirectoryError):
@@ -449,7 +455,6 @@ class StaticCdn(StaticFilesOptionalAuth):
449
455
  full_path = str(get_path(settings.assets.proxy_cache_dir, path))
450
456
  except Exception:
451
457
  return "", None
452
-
453
458
  return full_path, os.stat(full_path)
454
459
 
455
460
 
@@ -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.34.1-py2.py3-none-any.whl", keep_going=True)
122
+ await micropip.install("/wheels/solara-1.35.1-py2.py3-none-any.whl", keep_going=True)
123
123
  import solara
124
124
 
125
125
  el = solara.Warning("lala")
@@ -2,15 +2,24 @@ import logging
2
2
  import threading
3
3
  import time
4
4
  from typing import Optional
5
+ import socket
5
6
 
6
7
  logger = logging.getLogger("solara.server.threaded")
7
8
 
8
9
 
10
+ def get_free_port():
11
+ sock = socket.socket()
12
+ sock.bind(("", 0))
13
+ port = sock.getsockname()[1]
14
+ sock.close()
15
+ return port
16
+
17
+
9
18
  class ServerBase(threading.Thread):
10
19
  name = "not set"
11
20
 
12
21
  def __init__(self, port: int, host: str = "localhost", **kwargs):
13
- self.port = port
22
+ self.port = get_free_port() if port == 0 else port
14
23
  self.host = host
15
24
  self.base_url = f"http://{self.host}:{self.port}"
16
25
 
@@ -1,6 +1,7 @@
1
1
  import contextlib
2
2
  import logging
3
3
  import os
4
+ from pathlib import Path
4
5
  import pdb
5
6
  import traceback
6
7
 
@@ -16,6 +17,12 @@ def start_error(title, msg, exception: Exception = None):
16
17
  os._exit(-1)
17
18
 
18
19
 
20
+ def path_is_child_of(path: Path, parent: Path) -> bool:
21
+ # We use os.path.normpath() because we do not want to follow symlinks
22
+ # in editable installs, since some packages are symlinked
23
+ return os.path.normpath(path).startswith(os.path.normpath(parent))
24
+
25
+
19
26
  @contextlib.contextmanager
20
27
  def pdb_guard():
21
28
  from . import settings
@@ -37,6 +37,7 @@ logger = logging.getLogger("solara.pytest_plugin")
37
37
  TEST_PORT_START = int(os.environ.get("PORT", "18765")) + 100 # do not interfere with the solara integration tests
38
38
  TEST_HOST = solara.server.settings.main.host
39
39
  TIMEOUT = float(os.environ.get("SOLARA_PW_TIMEOUT", "18"))
40
+ PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT = int(os.environ.get("PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT", "10"))
40
41
 
41
42
 
42
43
  @pytest.fixture(scope="session")
@@ -192,7 +193,7 @@ def _solara_test(solara_server, solara_app, page_session: "playwright.sync_api.P
192
193
  run_events[id] = run_event = threading.Event()
193
194
  page_session.goto(solara_server.base_url + f"?id={id}")
194
195
  try:
195
- assert run_event.wait(10)
196
+ assert run_event.wait(PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT)
196
197
  context = used_contexts[id]
197
198
  with context:
198
199
  test_output_warmup = widgets.Output()
@@ -1,5 +1,11 @@
1
1
  # Solara Changelog
2
2
 
3
+ ## Version 1.34.1
4
+
5
+ * Bug Fix: Using `SOLARA_ASSETS_PROXY=False` (default on [py.cafe](https://py.cafe)) would break grid layout. [#705](https://github.com/widgetti/solara/pull/705)
6
+ * Bug Fix: Hot reload work in more situations on Linux. [#702](https://github.com/widgetti/solara/pull/702)
7
+
8
+
3
9
  ## Version 1.34.0
4
10
 
5
11
  * Feature: Enhancements for Solara `InputDate` and `InputDateRange` components [#672](https://github.com/widgetti/solara/pull/672):
@@ -411,3 +411,7 @@ To configure the ports the socket is bound to when starting the test servers, us
411
411
  #### Vuetify warmup
412
412
 
413
413
  By default, we insert an ipyvuetify widget with an icon into the frontend to force loading all the vuetify assets, such as CSS and fonts. However, if you are using the solara test plugin to test pure ipywidgets or a 3rd ipywidget based party library you might not need this. Disable this vuetify warmup phase by passing the `--no-solara-vuetify-warmup` argument to pytest, or setting the environment variable `SOLARA_TEST_VUETIFY_WARMUP` to a falsey value (e.g. `SOLARA_TEST_VUETIFY_WARMUP=0`).
414
+
415
+ #### Changing the application wait timeout
416
+
417
+ By default, we wait for 10 seconds for the browser to connect to the server when the solara server is used for testing. On slower systems, this may be too short. To change this timeout, set the `PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT` environment variable to the desired value in seconds (e.g. `PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT=20`).
@@ -0,0 +1 @@
1
+ not accessible
@@ -0,0 +1,4 @@
1
+ import solara
2
+
3
+
4
+ page = solara.Button("Click me")
@@ -5,8 +5,11 @@ import playwright
5
5
  import playwright.sync_api
6
6
  import pytest
7
7
  import reacton.ipywidgets as w
8
+ import requests
8
9
 
9
10
  import solara
11
+ import solara.server.server
12
+ from solara.server import settings
10
13
 
11
14
  HERE = Path(__file__).parent
12
15
 
@@ -211,3 +214,100 @@ def test_kernel_asyncio(browser: playwright.sync_api.Browser, solara_server, sol
211
214
  context1.close()
212
215
  context2.close()
213
216
  solara.server.settings.kernel.threaded = threaded
217
+
218
+
219
+ def test_cdn_secure(solara_server, solara_app, extra_include_path):
220
+ cdn_url = solara_server.base_url + "/_solara/cdn"
221
+ assert solara.settings.assets.proxy
222
+
223
+ with extra_include_path(HERE), solara_app("server_test:ClickButton"):
224
+ url = cdn_url + "/vue-grid-layout@1.0.2/dist/vue-grid-layout.min.js"
225
+ response = requests.get(url)
226
+ assert response.status_code == 200
227
+ # create a file in /share/solara
228
+ test_file = settings.assets.proxy_cache_dir.parent / "not-allowed"
229
+ test_file.write_text("test")
230
+ url = cdn_url + "/..%2fnot-allowed"
231
+ response = requests.get(url)
232
+ assert response.status_code == 404
233
+
234
+
235
+ def test_nbextension_secure(solara_server, solara_app, extra_include_path):
236
+ nbextensions_url = solara_server.base_url + "/static/nbextensions"
237
+ nbextensions_directories = [k for k in solara.server.server.nbextensions_directories if k.exists()]
238
+ assert nbextensions_directories, "we should at least test one directory"
239
+ nbextensions_directory = nbextensions_directories[0]
240
+
241
+ with extra_include_path(HERE), solara_app("server_test:ClickButton"):
242
+ url = nbextensions_url + "/jupyter-vuetify/nodeps.js"
243
+ response = requests.get(url)
244
+ assert response.status_code == 200
245
+ test_file = nbextensions_directory.parent / "not-allowed"
246
+ test_file.write_text("test")
247
+ url = nbextensions_url + "/..%2fnot-allowed"
248
+ response = requests.get(url)
249
+ assert response.status_code == 404
250
+
251
+ url = nbextensions_url + "/foo/..%2f..%2fnot-allowed"
252
+ response = requests.get(url)
253
+ assert response.status_code == 404
254
+
255
+
256
+ def test_assets_secure(solara_server, solara_app, extra_include_path):
257
+ assets_url = solara_server.base_url + "/static/assets"
258
+ assets_directory = solara.server.server.solara_static.parent / "assets"
259
+
260
+ with extra_include_path(HERE), solara_app("server_test:ClickButton"):
261
+ url = assets_url + "/theme.js"
262
+ response = requests.get(url)
263
+ assert response.status_code == 200
264
+ test_file = assets_directory.parent / "__init__.py"
265
+ assert test_file.exists()
266
+ url = assets_url + "/..%2f__init__.py"
267
+ response = requests.get(url)
268
+ assert response.status_code == 404
269
+
270
+ url = assets_url + "/foo/..%2f..%2f__init__.py"
271
+ response = requests.get(url)
272
+ assert response.status_code == 404
273
+
274
+
275
+ def test_public_secure(solara_server, solara_app, extra_include_path):
276
+ public_url = solara_server.base_url + "/static/public"
277
+
278
+ with solara_app(str(HERE / "apps/secure/app.py")):
279
+ apps = list(solara.server.app.apps.values())
280
+ assert len(apps) == 1
281
+ app = apps[0]
282
+ public_directory = app.directory.parent / "public"
283
+ url = public_url + "/test.txt"
284
+ response = requests.get(url)
285
+ assert response.status_code == 200
286
+ test_file = public_directory.parent / "not-allowed"
287
+ assert test_file.exists()
288
+ url = public_url + "/..%2fnot-allowed"
289
+ response = requests.get(url)
290
+ assert response.status_code == 404
291
+
292
+ url = public_url + "/foo/..%2f..%2fnot-allowed"
293
+ response = requests.get(url)
294
+ assert response.status_code == 404
295
+
296
+
297
+ def test_static_secure(solara_server, solara_app, extra_include_path):
298
+ static_url = solara_server.base_url + "/static"
299
+ static_directory = solara.server.server.solara_static
300
+
301
+ with extra_include_path(HERE), solara_app("server_test:ClickButton"):
302
+ url = static_url + "/main.js"
303
+ response = requests.get(url)
304
+ assert response.status_code == 200
305
+ test_file = static_directory.parent / "__init__.py"
306
+ assert test_file.exists()
307
+ url = static_url + "/..%2f__init__.py"
308
+ response = requests.get(url)
309
+ assert response.status_code == 404
310
+
311
+ url = static_url + "/foo/..%2f..%2f__init__.py"
312
+ response = requests.get(url)
313
+ assert response.status_code == 404
@@ -2,6 +2,9 @@ import hashlib
2
2
  import os
3
3
  from pathlib import Path
4
4
 
5
+ from pytest import TempPathFactory
6
+ import pytest
7
+
5
8
  from solara.server.cdn_helper import get_cdn_url, get_data, get_from_cache, put_in_cache, get_path
6
9
 
7
10
 
@@ -68,6 +71,26 @@ def test_get_data(tmp_path_factory):
68
71
  assert data == b"test_cached_2"
69
72
 
70
73
 
74
+ def test_get_data_secure(tmp_path_factory: TempPathFactory):
75
+ # we should never be able to get data from the parent directory
76
+
77
+ root_dir = tmp_path_factory.mktemp("root")
78
+ base_cache_dir = root_dir / "cdn"
79
+ base_cache_dir.mkdir()
80
+
81
+ (root_dir / "secret").write_bytes(b"not allowed")
82
+
83
+ project_dir = base_cache_dir / "project"
84
+ project_dir.mkdir()
85
+
86
+ (project_dir / "file").write_bytes(b"a")
87
+
88
+ data = get_data(base_cache_dir, "project/file")
89
+ assert data == b"a"
90
+ with pytest.raises(PermissionError):
91
+ get_data(base_cache_dir, "project/../../secret")
92
+
93
+
71
94
  def test_redirect(tmp_path_factory):
72
95
  base_cache_dir = tmp_path_factory.mktemp("cdn")
73
96
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes