solara-ui 1.38.0__tar.gz → 1.40.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 (630) hide show
  1. {solara_ui-1.38.0 → solara_ui-1.40.0}/PKG-INFO +2 -2
  2. {solara_ui-1.38.0 → solara_ui-1.40.0}/README.md +1 -1
  3. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/__init__.py +2 -2
  4. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/__main__.py +8 -1
  5. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/checks.py +4 -1
  6. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/__init__.py +1 -0
  7. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/echarts.py +8 -0
  8. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/echarts.vue +1 -1
  9. solara_ui-1.40.0/solara/components/input_text_area.py +86 -0
  10. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/markdown.py +10 -1
  11. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/markdown_editor.py +8 -0
  12. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/markdown_editor.vue +1 -1
  13. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/sql_code.py +8 -0
  14. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/sql_code.vue +1 -1
  15. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/hooks/use_thread.py +4 -4
  16. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/chat.py +8 -2
  17. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/style.css +2 -1
  18. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/flask.py +1 -1
  19. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/jupyter/server_extension.py +11 -1
  20. solara_ui-1.40.0/solara/server/jupyter/solara.py +91 -0
  21. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/patch.py +1 -0
  22. solara_ui-1.40.0/solara/server/pyinstaller/__init__.py +9 -0
  23. solara_ui-1.40.0/solara/server/pyinstaller/hook-ipyreact.py +5 -0
  24. solara_ui-1.40.0/solara/server/pyinstaller/hook-ipyvuetify.py +5 -0
  25. solara_ui-1.40.0/solara/server/pyinstaller/hook-solara.py +9 -0
  26. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/server.py +6 -1
  27. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/starlette.py +18 -6
  28. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/highlight-dark.css +1 -1
  29. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/main-vuetify.js +1 -1
  30. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/solara_bootstrap.py +1 -1
  31. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/solara.html.j2 +30 -6
  32. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/assets/custom.css +20 -57
  33. solara_ui-1.40.0/solara/website/components/__init__.py +5 -0
  34. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/algolia_api.vue +23 -6
  35. solara_ui-1.40.0/solara/website/components/breadcrumbs.py +28 -0
  36. solara_ui-1.40.0/solara/website/components/contact.py +144 -0
  37. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/docs.py +11 -9
  38. solara_ui-1.40.0/solara/website/components/header.py +75 -0
  39. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/markdown.py +12 -1
  40. solara_ui-1.40.0/solara/website/components/markdown_nav.vue +34 -0
  41. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/sidebar.py +7 -1
  42. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/__init__.py +87 -254
  43. solara_ui-1.40.0/solara/website/pages/about/__init__.py +9 -0
  44. solara_ui-1.40.0/solara/website/pages/about/about.md +3 -0
  45. solara_ui-1.40.0/solara/website/pages/careers/__init__.py +27 -0
  46. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/changelog/__init__.py +2 -2
  47. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/changelog/changelog.md +23 -0
  48. solara_ui-1.40.0/solara/website/pages/contact/__init__.py +34 -0
  49. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/__init__.py +25 -33
  50. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +2 -1
  51. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +1 -1
  52. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +2 -1
  53. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +1 -1
  54. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +5 -2
  55. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_thread.md +6 -0
  56. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/data/pivot_table.py +2 -2
  57. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/input.py +2 -0
  58. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/sql_code.py +3 -3
  59. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/__init__.py +2 -2
  60. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +2 -2
  61. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +19 -14
  62. solara_ui-1.40.0/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +278 -0
  63. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +3 -1
  64. solara_ui-1.40.0/solara/website/pages/home.vue +1199 -0
  65. solara_ui-1.40.0/solara/website/pages/our_team/__init__.py +83 -0
  66. solara_ui-1.40.0/solara/website/pages/pricing/__init__.py +31 -0
  67. solara_ui-1.40.0/solara/website/pages/roadmap/__init__.py +11 -0
  68. solara_ui-1.40.0/solara/website/pages/roadmap/roadmap.md +41 -0
  69. solara_ui-1.40.0/solara/website/pages/scale_ipywidgets.py +45 -0
  70. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/widgets/vue/gridlayout.vue +1 -1
  71. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/widgets/widgets.py +8 -0
  72. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/router_test.py +4 -4
  73. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/server_test.py +4 -4
  74. solara_ui-1.40.0/tests/pyinstaller/pyinstaller_test.py +10 -0
  75. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/file_browser_test.py +3 -3
  76. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/hooks_test.py +2 -2
  77. solara_ui-1.40.0/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  78. solara_ui-1.38.0/solara/website/components/__init__.py +0 -5
  79. solara_ui-1.38.0/solara/website/components/header.py +0 -64
  80. solara_ui-1.38.0/solara/website/components/hero.py +0 -15
  81. solara_ui-1.38.0/solara/website/pages/contact/__init__.py +0 -10
  82. solara_ui-1.38.0/solara/website/pages/contact/contact.md +0 -17
  83. solara_ui-1.38.0/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -88
  84. {solara_ui-1.38.0 → solara_ui-1.40.0}/.gitignore +0 -0
  85. {solara_ui-1.38.0 → solara_ui-1.40.0}/LICENSE +0 -0
  86. {solara_ui-1.38.0 → solara_ui-1.40.0}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  87. {solara_ui-1.38.0 → solara_ui-1.40.0}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  88. {solara_ui-1.38.0 → solara_ui-1.40.0}/pyproject.toml +0 -0
  89. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/alias.py +0 -0
  90. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/autorouting.py +0 -0
  91. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/cache.py +0 -0
  92. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/checks.html +0 -0
  93. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/comm.py +0 -0
  94. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/alert.py +0 -0
  95. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/applayout.py +0 -0
  96. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/button.py +0 -0
  97. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/card.py +0 -0
  98. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/checkbox.py +0 -0
  99. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/code_highlight_css.py +0 -0
  100. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/code_highlight_css.vue +0 -0
  101. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/columns.py +0 -0
  102. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/component_vue.py +0 -0
  103. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/cross_filter.py +0 -0
  104. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/dataframe.py +0 -0
  105. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/datatable.py +0 -0
  106. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/datatable.vue +0 -0
  107. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/details.py +0 -0
  108. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/download.vue +0 -0
  109. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/figure_altair.py +0 -0
  110. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/file_browser.py +0 -0
  111. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/file_download.py +0 -0
  112. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/file_drop.py +0 -0
  113. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/file_drop.vue +0 -0
  114. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/file_list_widget.vue +0 -0
  115. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/head.py +0 -0
  116. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/head_tag.py +0 -0
  117. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/head_tag.vue +0 -0
  118. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/image.py +0 -0
  119. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/input.py +0 -0
  120. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/link.py +0 -0
  121. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/matplotlib.py +0 -0
  122. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/meta.py +0 -0
  123. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/misc.py +0 -0
  124. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/pivot_table.py +0 -0
  125. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/pivot_table.vue +0 -0
  126. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/progress.py +0 -0
  127. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/select.py +0 -0
  128. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/select.vue +0 -0
  129. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/slider.py +0 -0
  130. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/slider_date.vue +0 -0
  131. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/spinner-solara.vue +0 -0
  132. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/spinner.py +0 -0
  133. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/style.py +0 -0
  134. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/switch.py +0 -0
  135. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/tab_navigation.py +0 -0
  136. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/title.py +0 -0
  137. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/title.vue +0 -0
  138. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/togglebuttons.py +0 -0
  139. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/components/tooltip.py +0 -0
  140. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/core.py +0 -0
  141. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/datatypes.py +0 -0
  142. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/express.py +0 -0
  143. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/hooks/__init__.py +0 -0
  144. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/hooks/dataframe.py +0 -0
  145. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/hooks/misc.py +0 -0
  146. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/hooks/use_reactive.py +0 -0
  147. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/kitchensink.py +0 -0
  148. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/__init__.py +0 -0
  149. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/__init__.py +0 -0
  150. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/confirmation_dialog.py +0 -0
  151. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/cross_filter.py +0 -0
  152. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/input_date.py +0 -0
  153. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/menu.py +0 -0
  154. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/menu.vue +0 -0
  155. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/tabs.py +0 -0
  156. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/theming.py +0 -0
  157. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/components/theming.vue +0 -0
  158. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/hooks/__init__.py +0 -0
  159. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/hooks/dataframe.py +0 -0
  160. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/toestand.py +0 -0
  161. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/utils/__init__.py +0 -0
  162. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/utils/cookies.py +0 -0
  163. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/utils/dataframe.py +0 -0
  164. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lab/utils/headers.py +0 -0
  165. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/layout.py +0 -0
  166. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/lifecycle.py +0 -0
  167. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/minisettings.py +0 -0
  168. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/py.typed +0 -0
  169. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/reactive.py +0 -0
  170. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/routing.py +0 -0
  171. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/scope/__init__.py +0 -0
  172. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/scope/types.py +0 -0
  173. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/__init__.py +0 -0
  174. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/app.py +0 -0
  175. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/custom.css +0 -0
  176. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/custom.js +0 -0
  177. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/favicon.png +0 -0
  178. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/favicon.svg +0 -0
  179. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/theme-dark.css +0 -0
  180. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/theme-light.css +0 -0
  181. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/assets/theme.js +0 -0
  182. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/cdn_helper.py +0 -0
  183. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/esm.py +0 -0
  184. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/fastapi.py +0 -0
  185. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/jupyter/__init__.py +0 -0
  186. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/jupyter/cdn_handler.py +0 -0
  187. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/jupytertools.py +0 -0
  188. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/kernel.py +0 -0
  189. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/kernel_context.py +0 -0
  190. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/reload.py +0 -0
  191. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/settings.py +0 -0
  192. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/shell.py +0 -0
  193. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/ansi.js +0 -0
  194. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/highlight.css +0 -0
  195. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/main.js +0 -0
  196. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/sun.svg +0 -0
  197. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/static/webworker.js +0 -0
  198. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/telemetry.py +0 -0
  199. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/index.html.j2 +0 -0
  200. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/loader-plain.css +0 -0
  201. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/loader-plain.html +0 -0
  202. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/loader-solara.css +0 -0
  203. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/loader-solara.html +0 -0
  204. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/templates/plain.html +0 -0
  205. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/threaded.py +0 -0
  206. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/utils.py +0 -0
  207. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/server/websocket.py +0 -0
  208. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/settings.py +0 -0
  209. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/tasks.py +0 -0
  210. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/button.py +0 -0
  211. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/markdown.py +0 -0
  212. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/.flake8 +0 -0
  213. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/.pre-commit-config.yaml +0 -0
  214. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/LICENSE +0 -0
  215. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/Procfile +0 -0
  216. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/mypy.ini +0 -0
  217. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/pyproject.toml +0 -0
  218. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/__init__.py +0 -0
  219. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  220. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/components/article.py +0 -0
  221. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/components/data.py +0 -0
  222. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/components/header.py +0 -0
  223. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/components/layout.py +0 -0
  224. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  225. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  226. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/data.py +0 -0
  227. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  228. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  229. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  230. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  231. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  232. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/test/__init__.py +0 -0
  233. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/test/pytest_plugin.py +0 -0
  234. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/toestand.py +0 -0
  235. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/util.py +0 -0
  236. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/validate_hooks.py +0 -0
  237. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/__init__.py +0 -0
  238. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/assets/images/logo-small.png +0 -0
  239. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/assets/images/logo.svg +0 -0
  240. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/assets/images/logo_white.svg +0 -0
  241. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/assets/theme.js +0 -0
  242. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/algolia.py +0 -0
  243. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/algolia.vue +0 -0
  244. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/mailchimp.py +0 -0
  245. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/mailchimp.vue +0 -0
  246. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/components/notebook.py +0 -0
  247. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/__init__.py +0 -0
  248. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/authorization/__init__.py +0 -0
  249. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/authorization/admin.py +0 -0
  250. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/authorization/users.py +0 -0
  251. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  252. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/layout-demo.py +0 -0
  253. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/multipage/__init__.py +0 -0
  254. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/multipage/page1.py +0 -0
  255. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/multipage/page2.py +0 -0
  256. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/scatter.py +0 -0
  257. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/scrolling.py +0 -0
  258. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  259. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/doc_use_download.py +0 -0
  260. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  261. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  262. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  263. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  264. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  265. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -0
  266. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  267. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  268. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  269. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  270. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  271. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  272. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  273. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  274. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  275. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  276. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  277. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  278. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  279. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  280. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  281. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  282. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  283. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  284. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -0
  285. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  286. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  287. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  288. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  289. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/__init__.py +0 -0
  290. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  291. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  292. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  293. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  294. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  295. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  296. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  297. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  298. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  299. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  300. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  301. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  302. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  303. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  304. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  305. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  306. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  307. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  308. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  309. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  310. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  311. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  312. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  313. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/route.py +0 -0
  314. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  315. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  316. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  317. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  318. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  319. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  320. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  321. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  322. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  323. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  324. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  325. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  326. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/__init__.py +0 -0
  327. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  328. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  329. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  330. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  331. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/common.py +0 -0
  332. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  333. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  334. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  335. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  336. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  337. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  338. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/button.py +0 -0
  339. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  340. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
  341. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  342. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/select.py +0 -0
  343. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/slider.py +0 -0
  344. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/switch.py +0 -0
  345. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  346. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  347. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  348. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  349. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  350. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  351. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  352. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  353. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  354. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/task.py +0 -0
  355. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  356. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  357. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  358. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  359. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  360. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  361. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/card.py +0 -0
  362. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  363. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/column.py +0 -0
  364. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  365. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  366. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/details.py +0 -0
  367. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  368. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  369. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  370. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/row.py +0 -0
  371. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  372. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  373. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  374. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  375. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/html.py +0 -0
  376. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/image.py +0 -0
  377. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  378. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  379. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  380. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  381. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/page/head.py +0 -0
  382. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/page/title.py +0 -0
  383. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  384. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/error.py +0 -0
  385. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/info.py +0 -0
  386. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/progress.py +0 -0
  387. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  388. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/success.py +0 -0
  389. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/status/warning.py +0 -0
  390. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  391. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  392. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  393. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  394. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  395. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  396. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  397. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/ai/chatbot.py +0 -0
  398. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  399. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  400. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  401. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  402. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  403. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  404. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  405. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  406. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  407. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  408. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  409. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  410. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  411. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  412. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  413. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  414. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  415. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/general/vue_component.py +0 -0
  416. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
  417. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  418. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/libraries/altair.py +0 -0
  419. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/libraries/bqplot.py +0 -0
  420. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -0
  421. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -0
  422. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  423. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  424. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -0
  425. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  426. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  427. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/visualization/annotator.py +0 -0
  428. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/visualization/linked_views.py +0 -0
  429. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  430. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/faq/__init__.py +0 -0
  431. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  432. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  433. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -0
  434. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  435. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  436. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  437. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  438. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  439. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  440. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  441. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  442. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  443. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  444. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
  445. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  446. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  447. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  448. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  449. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  450. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/docutils.py +0 -0
  451. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/__init__.py +0 -0
  452. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  453. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/planeto_tessa.py +0 -0
  454. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/solara_dev.py +0 -0
  455. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  456. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  457. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  458. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  459. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/pages/showcase/wanderlust.py +0 -0
  460. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/public/beach.jpeg +0 -0
  461. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/public/logo.svg +0 -0
  462. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/public/social/discord.svg +0 -0
  463. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/public/social/github.svg +0 -0
  464. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/public/social/twitter.svg +0 -0
  465. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/public/success.html +0 -0
  466. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/templates/index.html.j2 +0 -0
  467. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/website/utils.py +0 -0
  468. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/widgets/__init__.py +0 -0
  469. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/widgets/vue/html.vue +0 -0
  470. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/widgets/vue/navigator.vue +0 -0
  471. {solara_ui-1.38.0 → solara_ui-1.40.0}/solara/widgets/vue/vegalite.vue +0 -0
  472. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/__init__.py +0 -0
  473. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/conftest.py +0 -0
  474. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  475. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  476. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  477. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  478. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  479. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/__init__.py +0 -0
  480. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/api_test.py +0 -0
  481. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/app_widget.py +0 -0
  482. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/apps/not-allowed +0 -0
  483. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/apps/public/test.txt +0 -0
  484. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/apps/secure/app.py +0 -0
  485. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets/assets1/common.js +0 -0
  486. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets/assets1/unique1.js +0 -0
  487. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets/assets2/common.js +0 -0
  488. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets/assets2/custom.css +0 -0
  489. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets/assets2/custom.js +0 -0
  490. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets/assets2/unique2.js +0 -0
  491. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/assets_test.py +0 -0
  492. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/async_test.py +0 -0
  493. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/cdn_test.py +0 -0
  494. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/cmdline_test.py +0 -0
  495. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/conftest.py +0 -0
  496. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/create_test.py +0 -0
  497. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/enterprise/__init__.py +0 -0
  498. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/enterprise/oauth_test.py +0 -0
  499. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/error_test.py +0 -0
  500. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/esm_test.py +0 -0
  501. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/file_download_test.py +0 -0
  502. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/flask_test.py +0 -0
  503. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/input_date_test.py +0 -0
  504. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/latex_test.py +0 -0
  505. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/lifecycle_test.py +0 -0
  506. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/markdown_test.py +0 -0
  507. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/menu_test.py +0 -0
  508. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/popout_test.py +0 -0
  509. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/reconnect_test.py +0 -0
  510. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/reload/apps.py +0 -0
  511. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/ssg_test.py +0 -0
  512. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/starlette_test.py +0 -0
  513. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/test.vue +0 -0
  514. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/testapp.py +0 -0
  515. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/integration/widget_test.py +0 -0
  516. {solara_ui-1.38.0/tests/unit → solara_ui-1.40.0/tests/pyinstaller}/__init__.py +0 -0
  517. {solara_ui-1.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  557. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  558. {solara_ui-1.38.0 → solara_ui-1.40.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.38.0 → solara_ui-1.40.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  560. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  561. {solara_ui-1.38.0/tests/unit/lab → solara_ui-1.40.0/tests/unit}/__init__.py +0 -0
  562. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/app_test.py +0 -0
  563. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/applayout_test.py +0 -0
  564. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/autorouting_test.py +0 -0
  565. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/cache_test.py +0 -0
  566. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/cdn_helper_test.py +0 -0
  567. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/chat_test.py +0 -0
  568. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/checkbox_test.py +0 -0
  569. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/common.py +0 -0
  570. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/component_frontend_test.py +0 -0
  571. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/component_vue_test.vue +0 -0
  572. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/confirmation_dialog_test.py +0 -0
  573. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/conftest.py +0 -0
  574. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/cross_filter_component_test.py +0 -0
  575. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/cross_filter_test.py +0 -0
  576. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/dataframe_test.py +0 -0
  577. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/datatable_test.py +0 -0
  578. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/display_test.py +0 -0
  579. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/express_test.py +0 -0
  580. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/file_download_test.py +0 -0
  581. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/hook_use_invalid_test.py +0 -0
  582. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/input_date_test.py +0 -0
  583. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/input_test.py +0 -0
  584. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/kernel_test.py +0 -0
  585. {solara_ui-1.38.0/tests/unit/solara_test_apps → solara_ui-1.40.0/tests/unit/lab}/__init__.py +0 -0
  586. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/lifecycle_test.py +0 -0
  587. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/matplotlib_test.py +0 -0
  588. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/no_solara_test.py +0 -0
  589. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/output_widget_test.py +0 -0
  590. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/patch_test.py +0 -0
  591. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/pivottable_test.py +0 -0
  592. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/reload_test.py +0 -0
  593. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/router_test.py +0 -0
  594. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/select_test.py +0 -0
  595. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/settings_test.py +0 -0
  596. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/shell_test.py +0 -0
  597. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/slider_test.py +0 -0
  598. {solara_ui-1.38.0/tests/unit/solara_test_apps/food → solara_ui-1.40.0/tests/unit/solara_test_apps}/__init__.py +0 -0
  599. /solara_ui-1.38.0/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py → /solara_ui-1.40.0/tests/unit/solara_test_apps/food/__init__.py +0 -0
  600. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/food/food.py +0 -0
  601. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/food/index.py +0 -0
  602. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  603. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  604. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  605. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  606. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  607. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  608. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  609. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
  610. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  611. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  612. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  613. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  614. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  615. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  616. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  617. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
  618. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
  619. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  620. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  621. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/single_file.py +0 -0
  622. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  623. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  624. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/switch_test.py +0 -0
  625. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/tabs_test.py +0 -0
  626. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/task_test.py +0 -0
  627. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/telemetry_tests.py +0 -0
  628. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/toestand_computed_reload.py +0 -0
  629. {solara_ui-1.38.0 → solara_ui-1.40.0}/tests/unit/toestand_test.py +0 -0
  630. {solara_ui-1.38.0 → solara_ui-1.40.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.38.0
3
+ Version: 1.40.0
4
4
  Dynamic: Summary
5
5
  Project-URL: Home, https://www.github.com/widgetti/solara
6
6
  Project-URL: Documentation, https://solara.dev
@@ -129,7 +129,7 @@ See this snippet run live at https://solara.dev/documentation/getting_started
129
129
 
130
130
  ## Demo
131
131
 
132
- The following demo app can be used to explore a dataset (buildin or upload yourself) using
132
+ The following demo app can be used to explore a dataset (build in or upload yourself) using
133
133
  a scatter plot. The plot can be interacted with to filter the dataset, and the filtered dataset can
134
134
  be downloaded.
135
135
 
@@ -77,7 +77,7 @@ See this snippet run live at https://solara.dev/documentation/getting_started
77
77
 
78
78
  ## Demo
79
79
 
80
- The following demo app can be used to explore a dataset (buildin or upload yourself) using
80
+ The following demo app can be used to explore a dataset (build in or upload yourself) using
81
81
  a scatter plot. The plot can be interacted with to filter the dataset, and the filtered dataset can
82
82
  be downloaded.
83
83
 
@@ -1,6 +1,6 @@
1
1
  """Build webapps using IPywidgets"""
2
2
 
3
- __version__ = "1.38.0"
3
+ __version__ = "1.40.0"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -11,7 +11,7 @@ from . import comm # noqa: F401
11
11
  def _using_solara_server():
12
12
  import sys
13
13
 
14
- if "solara.server" in sys.modules:
14
+ if "solara.server.starlette" in sys.modules or "solara.server.flask" in sys.modules:
15
15
  return True
16
16
  if sys.argv[0].split("/")[-1] == "solara":
17
17
  return True
@@ -17,6 +17,7 @@ from uvicorn.main import LEVEL_CHOICES, LOOP_CHOICES
17
17
 
18
18
  import solara
19
19
  from solara.server import settings
20
+ import solara.server.threaded
20
21
 
21
22
  from .server import telemetry
22
23
 
@@ -130,7 +131,11 @@ if "SOLARA_MODE" in os.environ:
130
131
 
131
132
 
132
133
  @cli.command()
133
- @click.option("--port", default=int(os.environ.get("PORT", 8765)))
134
+ @click.option(
135
+ "--port",
136
+ default=int(os.environ.get("PORT", 8765)),
137
+ help="Port to run the server on, 0 for a random free port, default to $PORT or 8765.",
138
+ )
134
139
  @click.option(
135
140
  "--host",
136
141
  default=settings.main.host,
@@ -302,6 +307,8 @@ def run(
302
307
  settings.ssg.enabled = ssg
303
308
  settings.search.enabled = search
304
309
  reload_dirs = restart_dirs if restart_dirs else None
310
+ if port == 0:
311
+ port = solara.server.threaded.get_free_port()
305
312
  del restart_dirs
306
313
  url = f"http://{host}:{port}"
307
314
 
@@ -124,6 +124,9 @@ def SolaraCheck():
124
124
  def getcmdline(pid):
125
125
  # for linux
126
126
  if sys.platform == "linux":
127
+ # if /proc/{pid}/exe exists, follow the symlink
128
+ if os.path.exists(f"/proc/{pid}/exe"):
129
+ return os.readlink(f"/proc/{pid}/exe")
127
130
  with open(f"/proc/{pid}/cmdline", "rb") as f:
128
131
  return f.read().split(b"\00")[0].decode("utf-8")
129
132
  elif sys.platform == "darwin":
@@ -176,7 +179,7 @@ libraries_extra = [
176
179
  {"python": "bqplot", "classic": "bqplot/extension", "lab": "bqplot"},
177
180
  {"python": "ipyvolume", "classic": "ipyvolume/extension", "lab": "ipyvolume"},
178
181
  {"python": "ipywebrtc", "classic": "jupyter-webrtc", "lab": "jupyter-webrtc"},
179
- {"python": "ipyleaflet", "classic": "ipyleaflet/extension", "lab": "ipyleaflet"},
182
+ {"python": "ipyleaflet", "classic": "jupyter-leaflet/extension", "lab": "jupyter-leaflet"},
180
183
  ]
181
184
 
182
185
 
@@ -33,6 +33,7 @@ from .togglebuttons import ( # noqa: F401 F403
33
33
  ToggleButtonsSingle,
34
34
  )
35
35
  from .input import InputText, InputFloat, InputInt # noqa: F401 F403
36
+ from .input_text_area import InputTextArea # noqa: F401 F403
36
37
  from .pivot_table import PivotTableView, PivotTable, PivotTableCard # noqa: F401 F403
37
38
  from .head import Head # noqa: F401 F403
38
39
  from .title import Title # noqa: F401 F403
@@ -20,6 +20,14 @@ class EchartsWidget(ipyvuetify.VuetifyTemplate):
20
20
  on_mouseout = traitlets.Callable(None, allow_none=True)
21
21
  # same, for performance
22
22
  on_mouseout_enabled = traitlets.Bool(False).tag(sync=True)
23
+ cdn = traitlets.Unicode(None, allow_none=True).tag(sync=True)
24
+
25
+ @traitlets.default("cdn")
26
+ def _cdn(self):
27
+ import solara.settings
28
+
29
+ if not solara.settings.assets.proxy:
30
+ return solara.settings.assets.cdn
23
31
 
24
32
  def vue_on_click(self, data):
25
33
  if self.on_click is not None:
@@ -110,7 +110,7 @@ module.exports = {
110
110
  return base;
111
111
  },
112
112
  getCdn() {
113
- return window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`
113
+ return this.cdn || (window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`);
114
114
  },
115
115
  },
116
116
  };
@@ -0,0 +1,86 @@
1
+ from typing import Callable, Optional, Union, List
2
+ from .input import use_change
3
+ import solara
4
+ from solara.alias import rv as v
5
+
6
+
7
+ @solara.component
8
+ def InputTextArea(
9
+ label: str,
10
+ value: Union[str, solara.Reactive[str]] = "",
11
+ on_value: Callable[[str], None] = None,
12
+ disabled: bool = False,
13
+ continuous_update: bool = False,
14
+ update_events: List[str] = ["focusout"],
15
+ error: Union[bool, str] = False,
16
+ message: Optional[str] = None,
17
+ auto_grow: bool = True,
18
+ rows: int = 5,
19
+ ):
20
+ r"""Free form text area input.
21
+
22
+ ### Basic example:
23
+
24
+ ```solara
25
+ import solara
26
+
27
+ text = solara.reactive("Hello\nWorld\n!!!")
28
+ continuous_update = solara.reactive(True)
29
+
30
+ @solara.component
31
+ def Page():
32
+ solara.Checkbox(label="Continuous update", value=continuous_update)
33
+ solara.InputTextArea("Enter some text", value=text, continuous_update=continuous_update.value)
34
+ with solara.Row():
35
+ solara.Button("Clear", on_click=lambda: text.set(""))
36
+ solara.Button("Reset", on_click=lambda: text.set("Hello\nWorld\n!!!"))
37
+ solara.Markdown(f"**You entered**: {text.value}")
38
+ ```
39
+
40
+
41
+ ## Arguments
42
+
43
+ * `label`: Label to display next to the slider.
44
+ * `value`: The currently entered value.
45
+ * `on_value`: Callback to call when the value changes.
46
+ * `disabled`: Whether the input is disabled.
47
+ * `continuous_update`: Whether to call the `on_value` callback on every change or only when the input loses focus or the enter key is pressed.
48
+ * `update_events`: A list of events that should trigger `on_value`. If continuous update is enabled, this will effectively be ignored,
49
+ since updates will happen every change.
50
+ * `auto_grow`: Whether the text area auto grows with more text.
51
+ * `rows`: Number of empty rows to display.
52
+ * `error`: If truthy, show the input as having an error (in red). If a string is passed, it will be shown as the error message.
53
+ * `message`: Message to show below the input. If `error` is a string, this will be ignored.
54
+ * `classes`: List of CSS classes to apply to the input.
55
+ * `style`: CSS style to apply to the input.
56
+ """
57
+ reactive_value = solara.use_reactive(value, on_value)
58
+ del value, on_value
59
+
60
+ def set_value_cast(value):
61
+ reactive_value.value = str(value)
62
+
63
+ def on_v_model(value):
64
+ if continuous_update:
65
+ set_value_cast(value)
66
+
67
+ messages = []
68
+ if error and isinstance(error, str):
69
+ messages.append(error)
70
+ elif message:
71
+ messages.append(message)
72
+ text_area = v.Textarea(
73
+ v_model=reactive_value.value,
74
+ on_v_model=on_v_model,
75
+ label=label,
76
+ disabled=disabled,
77
+ error=bool(error),
78
+ messages=messages,
79
+ solo=True,
80
+ hide_details=True,
81
+ outlined=True,
82
+ rows=rows,
83
+ auto_grow=auto_grow,
84
+ )
85
+ use_change(text_area, set_value_cast, enabled=not continuous_update, update_events=update_events)
86
+ return text_area
@@ -76,6 +76,12 @@ def _markdown_template(
76
76
  html,
77
77
  style="",
78
78
  ):
79
+ cdn = None
80
+ import solara.settings
81
+
82
+ if not solara.settings.assets.proxy:
83
+ cdn = solara.settings.assets.cdn
84
+
79
85
  template = (
80
86
  """
81
87
  <template>
@@ -89,6 +95,9 @@ def _markdown_template(
89
95
  <script>
90
96
  module.exports = {
91
97
  async mounted() {
98
+ this.cdn = """
99
+ + (rf"'{cdn}'" if cdn is not None else r"null")
100
+ + r""";
92
101
  await this.loadRequire();
93
102
  this.mermaid = await this.loadMermaid();
94
103
  this.mermaid.init();
@@ -119,7 +128,7 @@ module.exports = {
119
128
  href = location.pathname + href.substr(1);
120
129
  a.attributes['href'].href = href;
121
130
  }
122
- let authLink = href.starswith("/_solara/auth/");
131
+ let authLink = href.startsWith("/_solara/auth/");
123
132
  if( (href.startsWith("./") || href.startsWith("/")) && !authLink) {
124
133
  a.onclick = e => {
125
134
  console.log("clicked", href)
@@ -11,6 +11,14 @@ class MarkdownEditorWidget(ipyvuetify.VuetifyTemplate):
11
11
 
12
12
  value = traitlets.Unicode("").tag(sync=True)
13
13
  height = traitlets.Unicode("180px").tag(sync=True)
14
+ cdn = traitlets.Unicode(None, allow_none=True).tag(sync=True)
15
+
16
+ @traitlets.default("cdn")
17
+ def _cdn(self):
18
+ import solara.settings
19
+
20
+ if not solara.settings.assets.proxy:
21
+ return solara.settings.assets.cdn
14
22
 
15
23
 
16
24
  @solara.component
@@ -264,7 +264,7 @@ module.exports = {
264
264
  return base
265
265
  },
266
266
  getCdn() {
267
- return window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`;
267
+ return this.cdn || (window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`);
268
268
  },
269
269
  },
270
270
  };
@@ -13,6 +13,14 @@ class SqlCodeWidget(ipyvue.VueTemplate):
13
13
  query = traitlets.Unicode(allow_none=True, default_value=None).tag(sync=True)
14
14
  tables = traitlets.Dict(allow_none=True, default_value=None).tag(sync=True)
15
15
  height = traitlets.Unicode("180px").tag(sync=True)
16
+ cdn = traitlets.Unicode(None, allow_none=True).tag(sync=True)
17
+
18
+ @traitlets.default("cdn")
19
+ def _cdn(self):
20
+ import solara.settings
21
+
22
+ if not solara.settings.assets.proxy:
23
+ return solara.settings.assets.cdn
16
24
 
17
25
 
18
26
  @solara.component
@@ -100,7 +100,7 @@
100
100
  return base
101
101
  },
102
102
  getCdn() {
103
- return window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`;
103
+ return this.cdn || (window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`);
104
104
  },
105
105
  }
106
106
  }
@@ -15,7 +15,7 @@ logger = logging.getLogger("solara.hooks.use_thread")
15
15
 
16
16
 
17
17
  def use_thread(
18
- callback=Union[
18
+ callback: Union[
19
19
  Callable[[threading.Event], T],
20
20
  Iterator[Callable[[threading.Event], T]],
21
21
  Callable[[], T],
@@ -69,11 +69,11 @@ def use_thread(
69
69
  # result.current = None
70
70
  set_result_state(ResultState.RUNNING)
71
71
 
72
- sig = inspect.signature(callback)
72
+ sig = inspect.signature(callback) # type: ignore
73
73
  if sig.parameters:
74
- f = functools.partial(callback, cancel)
74
+ f = functools.partial(callback, cancel) # type: ignore
75
75
  else:
76
- f = callback
76
+ f = callback # type: ignore
77
77
  try:
78
78
  try:
79
79
  # we only use the cancel_guard context manager around
@@ -46,7 +46,9 @@ def ChatInput(
46
46
  send_callback: Optional[Callable] = None,
47
47
  disabled: bool = False,
48
48
  style: Optional[Union[str, Dict[str, str]]] = None,
49
+ input_text_style: Optional[Union[str, Dict[str, str]]] = None,
49
50
  classes: List[str] = [],
51
+ input_text_classes: List[str] = [],
50
52
  ):
51
53
  """
52
54
  The ChatInput component renders a text input together with a send button.
@@ -56,11 +58,14 @@ def ChatInput(
56
58
  * `send_callback`: A callback function for when the user presses enter or clicks the send button.
57
59
  * `disabled`: Whether the input should be disabled. Useful for disabling sending further messages while a chatbot is replying,
58
60
  among other things.
59
- * `style`: CSS styles to apply to the component. Either a string or a dictionary. These styles are applied to the container component.
61
+ * `style`: CSS styles to apply to the `solara.Row` containing the input field and submit button. Either a string or a dictionary.
62
+ * `input_text_style`: CSS styles to apply to the `InputText` part of the component. Either a string or a dictionary.
60
63
  * `classes`: A list of CSS classes to apply to the component. Also applied to the container.
64
+ * `input_text_classes`: A list of CSS classes to apply to the `InputText` part of the component.
61
65
  """
62
66
  message, set_message = solara.use_state("") # type: ignore
63
67
  style_flat = solara.util._flatten_style(style)
68
+ input_text_style_flat = solara.util._flatten_style(input_text_style)
64
69
 
65
70
  if "align-items" not in style_flat:
66
71
  style_flat += " align-items: center;"
@@ -79,8 +84,9 @@ def ChatInput(
79
84
  rounded=True,
80
85
  filled=True,
81
86
  hide_details=True,
82
- style_="flex-grow: 1;",
87
+ style_="flex-grow: 1;" + input_text_style_flat,
83
88
  disabled=disabled,
89
+ class_=" ".join(input_text_classes),
84
90
  )
85
91
 
86
92
  use_change(message_input, send, update_events=["keyup.enter"])
@@ -75,7 +75,8 @@ div.solara-markdown-output {
75
75
 
76
76
 
77
77
  div.highlight {
78
- background-color: #eee;
78
+ border: 1px solid var(--color-border-appbar);
79
+ background-color: #fafafa;
79
80
  padding: 30px;
80
81
  border-radius: 20px;
81
82
  margin-top: 15px;
@@ -192,7 +192,7 @@ def assets(path):
192
192
  return flask.Response("not found", status=404)
193
193
 
194
194
 
195
- @blueprint.route("/static/nbextensions/<dir>/<filename>")
195
+ @blueprint.route("/jupyter/nbextensions/<dir>/<filename>")
196
196
  def nbext(dir, filename):
197
197
  if not allowed():
198
198
  abort(401)
@@ -2,6 +2,7 @@ from jupyter_server.utils import url_path_join
2
2
 
3
3
  from solara.server.cdn_helper import cdn_url_path
4
4
  from solara.server.jupyter.cdn_handler import CdnHandler
5
+ from .solara import SolaraHandler, Assets, ReadyZ
5
6
 
6
7
 
7
8
  def _jupyter_server_extension_paths():
@@ -9,6 +10,11 @@ def _jupyter_server_extension_paths():
9
10
 
10
11
 
11
12
  def _load_jupyter_server_extension(server_app):
13
+ # a dummy app, so that server.read_root can be used
14
+ import solara.server.app
15
+
16
+ solara.server.app.apps["__default__"] = solara.server.app.AppScript("solara.server.jupyter.solara:Page")
17
+
12
18
  web_app = server_app.web_app
13
19
 
14
20
  host_pattern = ".*$"
@@ -17,7 +23,11 @@ def _load_jupyter_server_extension(server_app):
17
23
  web_app.add_handlers(
18
24
  host_pattern,
19
25
  [
20
- (url_path_join(base_url, f"/{cdn_url_path}/(.*)"), CdnHandler, {}),
26
+ (url_path_join(base_url, f"/{cdn_url_path}/(.*)"), CdnHandler, {}), # kept for backward compatibility
27
+ (url_path_join(base_url, f"/solara/{cdn_url_path}/(.*)"), CdnHandler, {}),
28
+ (url_path_join(base_url, "/solara/static/assets/(.*)"), Assets, {}),
29
+ (url_path_join(base_url, "/solara/readyz"), ReadyZ, {}),
30
+ (url_path_join(base_url, "/solara(.*)"), SolaraHandler, {}),
21
31
  ],
22
32
  )
23
33
 
@@ -0,0 +1,91 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ from pathlib import Path
5
+
6
+ import tornado.web
7
+ from jupyter_server.base.handlers import JupyterHandler
8
+ import solara.server.server as server
9
+
10
+ from solara.server.utils import path_is_child_of
11
+ import solara
12
+
13
+ logger = logging.getLogger("solara.server.jupyter.solara")
14
+
15
+
16
+ @solara.component
17
+ def Page():
18
+ solara.Error("Hi, you should not see this, we only support ipypopout for now")
19
+
20
+
21
+ class SolaraHandler(JupyterHandler):
22
+ async def get(self, path=None):
23
+ try:
24
+ # base url ends with /
25
+ base_url = self.settings["base_url"]
26
+ # root_path's do not end with /
27
+ jupyter_root_path = ""
28
+ if base_url and base_url.endswith("/"):
29
+ jupyter_root_path = base_url[:-1]
30
+ root_path = f"{jupyter_root_path}/solara"
31
+ content = server.read_root(path="", root_path=root_path, jupyter_root_path=jupyter_root_path)
32
+ except Exception as e:
33
+ logger.exception(e)
34
+ raise tornado.web.HTTPError(500)
35
+
36
+ if content is None:
37
+ raise tornado.web.HTTPError(404)
38
+
39
+ self.set_header("Content-Type", "text/html")
40
+ self.write(content)
41
+
42
+
43
+ # similar to voila
44
+ class MultiStaticFileHandler(tornado.web.StaticFileHandler):
45
+ """A static file handler that 'merges' a list of directories
46
+
47
+ If initialized like this::
48
+
49
+ application = web.Application([
50
+ (r"/content/(.*)", web.MultiStaticFileHandler, {"paths": ["/var/1", "/var/2"]}),
51
+ ])
52
+
53
+ A file will be looked up in /var/1 first, then in /var/2.
54
+
55
+ """
56
+
57
+ def initialize(self, paths, default_filename=None): # type: ignore
58
+ self.roots = paths
59
+ super().initialize(path=paths[0], default_filename=default_filename)
60
+
61
+ def get_absolute_path(self, root: str, path: str) -> str: # type: ignore
62
+ # find the first absolute path that exists
63
+ self.root = self.roots[0]
64
+ abspath = os.path.abspath(os.path.join(root, path))
65
+ for root in self.roots[1:]:
66
+ abspath = os.path.abspath(os.path.join(root, path))
67
+ if os.path.exists(abspath):
68
+ self.root = root # make sure all the other methods in the base class know how to find the file
69
+ break
70
+
71
+ # tornado probably already does a version of this, to make sure it behaves as the rest of the solara
72
+ # server, we do it again
73
+ if not path_is_child_of(Path(abspath), Path(self.root)):
74
+ raise PermissionError(f"Trying to read from outside of cache directory: {abspath} is not a subdir of {self.root}")
75
+
76
+ return abspath
77
+
78
+
79
+ class Assets(MultiStaticFileHandler):
80
+ def initialize(self): # type: ignore
81
+ super().initialize(server.asset_directories())
82
+ logging.error("Using %r as assets directories", self.roots)
83
+
84
+
85
+ class ReadyZ(JupyterHandler):
86
+ def get(self):
87
+ json_data, status = server.readyz()
88
+ json_response = json.dumps(json_data)
89
+ self.set_header("Content-Type", "application/json")
90
+ self.set_status(status)
91
+ self.write(json_response)
@@ -38,6 +38,7 @@ class FakeIPython:
38
38
  # needed for the pyplot interface of matplotlib
39
39
  # (although we don't really support it)
40
40
  self.events = mock.MagicMock()
41
+ self.user_ns: Dict[Any, Any] = {}
41
42
 
42
43
  def enable_gui(self, gui):
43
44
  logger.error("ignoring call to enable_gui(%s)", gui)
@@ -0,0 +1,9 @@
1
+ from pathlib import Path
2
+
3
+
4
+ HERE = Path(__file__).parent
5
+
6
+
7
+ def get_hook_dirs():
8
+ # used for pyinstaller
9
+ return [str(HERE)]
@@ -0,0 +1,5 @@
1
+ from PyInstaller.utils.hooks import collect_data_files, copy_metadata, collect_submodules
2
+
3
+ hiddenimports = collect_submodules("ipyreact")
4
+ datas = collect_data_files("ipyreact") # codespell:ignore datas
5
+ datas += copy_metadata("ipyreact") # codespell:ignore datas
@@ -0,0 +1,5 @@
1
+ from PyInstaller.utils.hooks import collect_data_files, copy_metadata, collect_submodules
2
+
3
+ hiddenimports = collect_submodules("ipyvuetify")
4
+ datas = collect_data_files("ipyvuetify") # codespell:ignore datas
5
+ datas += copy_metadata("ipyvuetify") # codespell:ignore datas
@@ -0,0 +1,9 @@
1
+ from PyInstaller.utils.hooks import collect_data_files, collect_submodules
2
+
3
+ hiddenimports = collect_submodules("solara")
4
+ datas = collect_data_files("solara") # codespell:ignore datas
5
+ datas += collect_data_files("solara-ui") # codespell:ignore datas
6
+
7
+ # this makes sure that inspect.getfile works, which is used for the
8
+ # vue component decorator
9
+ module_collection_mode = "pyz+py"
@@ -6,7 +6,7 @@ import os
6
6
  import sys
7
7
  import time
8
8
  from pathlib import Path
9
- from typing import Dict, List, Optional, Tuple, TypeVar
9
+ from typing import Dict, List, Optional, Tuple, TypeVar, Union
10
10
 
11
11
  import ipykernel
12
12
  import ipyvue
@@ -268,6 +268,7 @@ def asset_directories():
268
268
  def read_root(
269
269
  path: str,
270
270
  root_path: str = "",
271
+ jupyter_root_path: Union[str, None] = None,
271
272
  render_kwargs={},
272
273
  use_nbextensions=True,
273
274
  ssg_data=None,
@@ -373,10 +374,14 @@ def read_root(
373
374
  else:
374
375
  cdn = solara.settings.assets.cdn
375
376
 
377
+ if jupyter_root_path is None:
378
+ jupyter_root_path = f"{root_path}/jupyter"
379
+
376
380
  render_settings = {
377
381
  "title": title,
378
382
  "path": path,
379
383
  "root_path": root_path,
384
+ "jupyter_root_path": jupyter_root_path,
380
385
  "resources": resources,
381
386
  "theme": settings.theme.dict(),
382
387
  "production": settings.main.mode == "production",
@@ -391,16 +391,16 @@ See also https://solara.dev/documentation/getting_started/deploying/self-hosted
391
391
  """
392
392
  if "script-name" in request.headers:
393
393
  msg += f"""It looks like the reverse proxy sets the script-name header to {request.headers['script-name']!r}
394
- """
394
+ """
395
395
  if "x-script-name" in request.headers:
396
396
  msg += f"""It looks like the reverse proxy sets the x-script-name header to {request.headers['x-script-name']!r}
397
- """
397
+ """
398
398
  if configured_root_path:
399
399
  msg += f"""It looks like the root path was configured to {configured_root_path!r} in the settings
400
- """
400
+ """
401
401
  if root_path_asgi:
402
402
  msg += f"""It looks like the root path set by the asgi framework was configured to {root_path_asgi!r}
403
- """
403
+ """
404
404
  warnings.warn(msg)
405
405
  if host and forwarded_host and forwarded_proto:
406
406
  port = request.base_url.port
@@ -451,6 +451,18 @@ See also https://solara.dev/documentation/getting_started/deploying/self-hosted
451
451
  if request.scope["scheme"] == "https" or request.headers.get("x-forwarded-proto", "http") == "https" or request.base_url.hostname == "localhost":
452
452
  samesite = "none"
453
453
  secure = True
454
+ elif request.base_url.hostname != "localhost":
455
+ warnings.warn(f"""Cookies with samesite=none require https, but according to the asgi framework, the scheme is {request.scope['scheme']!r}
456
+ and the x-forwarded-proto header is {request.headers.get('x-forwarded-proto', 'http')!r}. We will fallback to samesite=lax.
457
+
458
+ If you embed solara in an iframe, make sure you forward the x-forwarded-proto header correctly so that the session cookie can be set.
459
+
460
+ See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite for more information on samesite cookies.
461
+
462
+ Also check out the following Solara documentation:
463
+ * https://solara.dev/documentation/getting_started/deploying/self-hosted
464
+ * https://solara.dev/documentation/advanced/howto/embed
465
+ """)
454
466
  response.set_cookie(
455
467
  server.COOKIE_KEY_SESSION_ID,
456
468
  value=session_id,
@@ -483,9 +495,9 @@ class StaticNbFiles(StaticFilesOptionalAuth):
483
495
  # from https://github.com/encode/starlette/pull/1377/files
484
496
  def lookup_path(self, path: str) -> typing.Tuple[str, typing.Optional[os.stat_result]]:
485
497
  for directory in self.all_directories:
498
+ directory = os.path.realpath(directory)
486
499
  original_path = os.path.join(directory, path)
487
500
  full_path = os.path.realpath(original_path)
488
- directory = os.path.realpath(directory)
489
501
  # return early if someone tries to access a file outside of the directory
490
502
  if not path_is_child_of(Path(original_path), Path(directory)):
491
503
  return "", None
@@ -668,7 +680,7 @@ routes = [
668
680
  *([Mount(f"/{cdn_url_path}", app=StaticCdn(directory=settings.assets.proxy_cache_dir))] if solara.settings.assets.proxy else []),
669
681
  Mount(f"{prefix}/static/public", app=StaticPublic()),
670
682
  Mount(f"{prefix}/static/assets", app=StaticAssets()),
671
- Mount(f"{prefix}/static/nbextensions", app=StaticNbFiles()),
683
+ Mount(f"{prefix}/jupyter/nbextensions", app=StaticNbFiles()),
672
684
  Mount(f"{prefix}/static", app=StaticFilesOptionalAuth(directory=server.solara_static)),
673
685
  Route("/{fullpath:path}", endpoint=root),
674
686
  ]
@@ -2,7 +2,7 @@
2
2
  and then remove the overlapping first lines with highlight.css
3
3
  */
4
4
  .theme--dark.v-application .highlight .hll { background-color: #ffffcc }
5
- .theme--dark.v-application .highlight { background: #282C34; color: #ABB2BF }
5
+ .theme--dark.v-application .highlight { background: #1d1f22; color: #ABB2BF }
6
6
  .theme--dark.v-application .highlight .c { color: #7F848E } /* Comment */
7
7
  .theme--dark.v-application .highlight .err { color: #ABB2BF } /* Error */
8
8
  .theme--dark.v-application .highlight .esc { color: #ABB2BF } /* Escape */