solara-ui 1.39.0__tar.gz → 1.41.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) hide show
  1. {solara_ui-1.39.0 → solara_ui-1.41.0}/PKG-INFO +2 -2
  2. {solara_ui-1.39.0 → solara_ui-1.41.0}/README.md +1 -1
  3. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/__init__.py +1 -1
  4. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/__main__.py +23 -10
  5. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/__init__.py +1 -0
  6. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/component_vue.py +3 -2
  7. solara_ui-1.41.0/solara/components/input_text_area.py +86 -0
  8. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/markdown.py +1 -1
  9. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/hooks/use_thread.py +4 -4
  10. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/chat.py +8 -2
  11. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/style.css +4 -1
  12. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/flask.py +1 -1
  13. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/jupyter/server_extension.py +11 -1
  14. solara_ui-1.41.0/solara/server/jupyter/solara.py +91 -0
  15. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/patch.py +1 -0
  16. solara_ui-1.41.0/solara/server/pyinstaller/__init__.py +9 -0
  17. solara_ui-1.41.0/solara/server/pyinstaller/hook-ipyreact.py +5 -0
  18. solara_ui-1.41.0/solara/server/pyinstaller/hook-ipyvuetify.py +5 -0
  19. solara_ui-1.41.0/solara/server/pyinstaller/hook-solara.py +9 -0
  20. solara_ui-1.41.0/solara/server/qt.py +113 -0
  21. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/server.py +6 -1
  22. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/settings.py +1 -0
  23. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/starlette.py +18 -6
  24. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/highlight-dark.css +1 -1
  25. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/main-vuetify.js +11 -1
  26. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/solara_bootstrap.py +1 -1
  27. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/loader-solara.html +1 -1
  28. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/solara.html.j2 +36 -7
  29. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/assets/custom.css +20 -57
  30. solara_ui-1.41.0/solara/website/components/__init__.py +5 -0
  31. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/algolia_api.vue +23 -6
  32. solara_ui-1.41.0/solara/website/components/breadcrumbs.py +28 -0
  33. solara_ui-1.41.0/solara/website/components/contact.py +144 -0
  34. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/docs.py +11 -9
  35. solara_ui-1.41.0/solara/website/components/header.py +75 -0
  36. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/markdown.py +12 -1
  37. solara_ui-1.41.0/solara/website/components/markdown_nav.vue +34 -0
  38. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/sidebar.py +9 -1
  39. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/__init__.py +93 -254
  40. solara_ui-1.41.0/solara/website/pages/about/__init__.py +9 -0
  41. solara_ui-1.41.0/solara/website/pages/about/about.md +3 -0
  42. solara_ui-1.41.0/solara/website/pages/careers/__init__.py +27 -0
  43. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/changelog/__init__.py +2 -2
  44. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/changelog/changelog.md +12 -0
  45. solara_ui-1.41.0/solara/website/pages/contact/__init__.py +34 -0
  46. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/__init__.py +25 -33
  47. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +2 -1
  48. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +1 -1
  49. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +17 -1
  50. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +2 -1
  51. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +1 -1
  52. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +5 -2
  53. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_thread.md +6 -0
  54. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/data/pivot_table.py +2 -2
  55. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/input.py +2 -0
  56. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/sql_code.py +3 -3
  57. solara_ui-1.41.0/solara/website/pages/documentation/examples/__init__.py +44 -0
  58. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/ai/chatbot.py +1 -1
  59. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/vue_component.py +1 -1
  60. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/libraries/altair.py +1 -0
  61. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/libraries/bqplot.py +1 -1
  62. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet.py +1 -1
  63. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +1 -1
  64. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/utilities/countdown_timer.py +18 -20
  65. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/visualization/annotator.py +1 -3
  66. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/visualization/linked_views.py +4 -4
  67. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/00-quickstart.md +18 -0
  68. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +2 -2
  69. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +19 -14
  70. solara_ui-1.41.0/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +278 -0
  71. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +3 -1
  72. solara_ui-1.41.0/solara/website/pages/home.vue +1199 -0
  73. solara_ui-1.41.0/solara/website/pages/our_team/__init__.py +83 -0
  74. solara_ui-1.41.0/solara/website/pages/pricing/__init__.py +31 -0
  75. solara_ui-1.41.0/solara/website/pages/roadmap/__init__.py +11 -0
  76. solara_ui-1.41.0/solara/website/pages/roadmap/roadmap.md +41 -0
  77. solara_ui-1.41.0/solara/website/pages/scale_ipywidgets.py +45 -0
  78. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/widgets/vue/navigator.vue +46 -16
  79. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/widgets/vue/vegalite.vue +18 -0
  80. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/router_test.py +4 -4
  81. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/server_test.py +4 -4
  82. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/widget_test.py +37 -0
  83. solara_ui-1.41.0/tests/pyinstaller/pyinstaller_test.py +10 -0
  84. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/file_browser_test.py +3 -3
  85. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/hooks_test.py +2 -2
  86. solara_ui-1.41.0/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py +0 -0
  87. solara_ui-1.39.0/solara/website/components/__init__.py +0 -5
  88. solara_ui-1.39.0/solara/website/components/header.py +0 -64
  89. solara_ui-1.39.0/solara/website/components/hero.py +0 -15
  90. solara_ui-1.39.0/solara/website/pages/contact/__init__.py +0 -10
  91. solara_ui-1.39.0/solara/website/pages/contact/contact.md +0 -17
  92. solara_ui-1.39.0/solara/website/pages/documentation/examples/__init__.py +0 -52
  93. solara_ui-1.39.0/solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -88
  94. {solara_ui-1.39.0 → solara_ui-1.41.0}/.gitignore +0 -0
  95. {solara_ui-1.39.0 → solara_ui-1.41.0}/LICENSE +0 -0
  96. {solara_ui-1.39.0 → solara_ui-1.41.0}/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  97. {solara_ui-1.39.0 → solara_ui-1.41.0}/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  98. {solara_ui-1.39.0 → solara_ui-1.41.0}/pyproject.toml +0 -0
  99. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/alias.py +0 -0
  100. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/autorouting.py +0 -0
  101. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/cache.py +0 -0
  102. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/checks.html +0 -0
  103. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/checks.py +0 -0
  104. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/comm.py +0 -0
  105. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/alert.py +0 -0
  106. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/applayout.py +0 -0
  107. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/button.py +0 -0
  108. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/card.py +0 -0
  109. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/checkbox.py +0 -0
  110. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/code_highlight_css.py +0 -0
  111. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/code_highlight_css.vue +0 -0
  112. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/columns.py +0 -0
  113. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/cross_filter.py +0 -0
  114. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/dataframe.py +0 -0
  115. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/datatable.py +0 -0
  116. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/datatable.vue +0 -0
  117. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/details.py +0 -0
  118. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/download.vue +0 -0
  119. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/echarts.py +0 -0
  120. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/echarts.vue +0 -0
  121. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/figure_altair.py +0 -0
  122. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/file_browser.py +0 -0
  123. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/file_download.py +0 -0
  124. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/file_drop.py +0 -0
  125. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/file_drop.vue +0 -0
  126. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/file_list_widget.vue +0 -0
  127. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/head.py +0 -0
  128. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/head_tag.py +0 -0
  129. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/head_tag.vue +0 -0
  130. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/image.py +0 -0
  131. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/input.py +0 -0
  132. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/link.py +0 -0
  133. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/markdown_editor.py +0 -0
  134. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/markdown_editor.vue +0 -0
  135. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/matplotlib.py +0 -0
  136. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/meta.py +0 -0
  137. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/misc.py +0 -0
  138. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/pivot_table.py +0 -0
  139. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/pivot_table.vue +0 -0
  140. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/progress.py +0 -0
  141. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/select.py +0 -0
  142. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/select.vue +0 -0
  143. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/slider.py +0 -0
  144. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/slider_date.vue +0 -0
  145. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/spinner-solara.vue +0 -0
  146. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/spinner.py +0 -0
  147. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/sql_code.py +0 -0
  148. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/sql_code.vue +0 -0
  149. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/style.py +0 -0
  150. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/switch.py +0 -0
  151. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/tab_navigation.py +0 -0
  152. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/title.py +0 -0
  153. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/title.vue +0 -0
  154. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/togglebuttons.py +0 -0
  155. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/components/tooltip.py +0 -0
  156. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/core.py +0 -0
  157. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/datatypes.py +0 -0
  158. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/express.py +0 -0
  159. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/hooks/__init__.py +0 -0
  160. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/hooks/dataframe.py +0 -0
  161. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/hooks/misc.py +0 -0
  162. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/hooks/use_reactive.py +0 -0
  163. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/kitchensink.py +0 -0
  164. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/__init__.py +0 -0
  165. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/__init__.py +0 -0
  166. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/confirmation_dialog.py +0 -0
  167. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/cross_filter.py +0 -0
  168. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/input_date.py +0 -0
  169. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/menu.py +0 -0
  170. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/menu.vue +0 -0
  171. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/tabs.py +0 -0
  172. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/theming.py +0 -0
  173. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/components/theming.vue +0 -0
  174. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/hooks/__init__.py +0 -0
  175. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/hooks/dataframe.py +0 -0
  176. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/toestand.py +0 -0
  177. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/utils/__init__.py +0 -0
  178. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/utils/cookies.py +0 -0
  179. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/utils/dataframe.py +0 -0
  180. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lab/utils/headers.py +0 -0
  181. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/layout.py +0 -0
  182. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/lifecycle.py +0 -0
  183. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/minisettings.py +0 -0
  184. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/py.typed +0 -0
  185. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/reactive.py +0 -0
  186. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/routing.py +0 -0
  187. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/scope/__init__.py +0 -0
  188. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/scope/types.py +0 -0
  189. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/__init__.py +0 -0
  190. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/app.py +0 -0
  191. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/custom.css +0 -0
  192. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/custom.js +0 -0
  193. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/favicon.png +0 -0
  194. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/favicon.svg +0 -0
  195. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/theme-dark.css +0 -0
  196. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/theme-light.css +0 -0
  197. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/assets/theme.js +0 -0
  198. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/cdn_helper.py +0 -0
  199. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/esm.py +0 -0
  200. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/fastapi.py +0 -0
  201. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/jupyter/__init__.py +0 -0
  202. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/jupyter/cdn_handler.py +0 -0
  203. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/jupytertools.py +0 -0
  204. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/kernel.py +0 -0
  205. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/kernel_context.py +0 -0
  206. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/reload.py +0 -0
  207. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/shell.py +0 -0
  208. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/ansi.js +0 -0
  209. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/highlight.css +0 -0
  210. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/main.js +0 -0
  211. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/sun.svg +0 -0
  212. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/static/webworker.js +0 -0
  213. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/telemetry.py +0 -0
  214. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/index.html.j2 +0 -0
  215. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/loader-plain.css +0 -0
  216. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/loader-plain.html +0 -0
  217. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/loader-solara.css +0 -0
  218. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/templates/plain.html +0 -0
  219. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/threaded.py +0 -0
  220. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/utils.py +0 -0
  221. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/server/websocket.py +0 -0
  222. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/settings.py +0 -0
  223. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/tasks.py +0 -0
  224. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/button.py +0 -0
  225. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/markdown.py +0 -0
  226. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/.flake8 +0 -0
  227. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/.pre-commit-config.yaml +0 -0
  228. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/LICENSE +0 -0
  229. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/Procfile +0 -0
  230. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/mypy.ini +0 -0
  231. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/pyproject.toml +0 -0
  232. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/__init__.py +0 -0
  233. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/components/__init__.py +0 -0
  234. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/components/article.py +0 -0
  235. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/components/data.py +0 -0
  236. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/components/header.py +0 -0
  237. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/components/layout.py +0 -0
  238. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -0
  239. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -0
  240. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/data.py +0 -0
  241. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/pages/__init__.py +0 -0
  242. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/pages/article/__init__.py +0 -0
  243. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/pages/tabular.py +0 -0
  244. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/pages/viz/__init__.py +0 -0
  245. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/template/portal/solara_portal/pages/viz/overview.py +0 -0
  246. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/test/__init__.py +0 -0
  247. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/test/pytest_plugin.py +0 -0
  248. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/toestand.py +0 -0
  249. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/util.py +0 -0
  250. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/validate_hooks.py +0 -0
  251. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/__init__.py +0 -0
  252. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/assets/images/logo-small.png +0 -0
  253. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/assets/images/logo.svg +0 -0
  254. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/assets/images/logo_white.svg +0 -0
  255. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/assets/theme.js +0 -0
  256. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/algolia.py +0 -0
  257. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/algolia.vue +0 -0
  258. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/mailchimp.py +0 -0
  259. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/mailchimp.vue +0 -0
  260. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/components/notebook.py +0 -0
  261. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/__init__.py +0 -0
  262. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/authorization/__init__.py +0 -0
  263. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/authorization/admin.py +0 -0
  264. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/authorization/users.py +0 -0
  265. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/jupyter-dashboard-1.py +0 -0
  266. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/layout-demo.py +0 -0
  267. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/multipage/__init__.py +0 -0
  268. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/multipage/page1.py +0 -0
  269. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/multipage/page2.py +0 -0
  270. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/scatter.py +0 -0
  271. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/scrolling.py +0 -0
  272. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/apps/tutorial-streamlit.py +0 -0
  273. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/doc_use_download.py +0 -0
  274. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/__init__.py +0 -0
  275. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/00-overview.md +0 -0
  276. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -0
  277. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -0
  278. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -0
  279. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -0
  280. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -0
  281. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -0
  282. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +0 -0
  283. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +0 -0
  284. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +0 -0
  285. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/70-search.md +0 -0
  286. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +0 -0
  287. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +0 -0
  288. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +0 -0
  289. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -0
  290. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -0
  291. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -0
  292. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -0
  293. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -0
  294. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -0
  295. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -0
  296. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -0
  297. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -0
  298. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -0
  299. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  300. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -0
  301. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -0
  302. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/__init__.py +0 -0
  303. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/cross_filter/__init__.py +0 -0
  304. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -0
  305. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -0
  306. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -0
  307. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -0
  308. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/__init__.py +0 -0
  309. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -0
  310. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -0
  311. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_effect.md +0 -0
  312. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_effect.py +0 -0
  313. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_exception.py +0 -0
  314. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_memo.md +0 -0
  315. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_memo.py +0 -0
  316. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_previous.py +0 -0
  317. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_reactive.py +0 -0
  318. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_state.py +0 -0
  319. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -0
  320. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_thread.py +0 -0
  321. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -0
  322. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/__init__.py +0 -0
  323. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/generate_routes.py +0 -0
  324. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -0
  325. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/resolve_path.py +0 -0
  326. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/route.py +0 -0
  327. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/use_route.py +0 -0
  328. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/routing/use_router.py +0 -0
  329. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/__init__.py +0 -0
  330. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/component_vue.py +0 -0
  331. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/computed.py +0 -0
  332. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/display.py +0 -0
  333. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -0
  334. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/get_session_id.py +0 -0
  335. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/memoize.py +0 -0
  336. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -0
  337. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/reactive.py +0 -0
  338. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/api/utilities/widget.py +0 -0
  339. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/__init__.py +0 -0
  340. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/advanced/__init__.py +0 -0
  341. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/advanced/link.py +0 -0
  342. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/advanced/meta.py +0 -0
  343. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/advanced/style.py +0 -0
  344. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/common.py +0 -0
  345. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/data/__init__.py +0 -0
  346. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/data/dataframe.py +0 -0
  347. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/enterprise/__init__.py +0 -0
  348. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/enterprise/avatar.py +0 -0
  349. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -0
  350. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/__init__.py +0 -0
  351. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/button.py +0 -0
  352. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/checkbox.py +0 -0
  353. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/file_browser.py +0 -0
  354. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/file_drop.py +0 -0
  355. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/select.py +0 -0
  356. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/slider.py +0 -0
  357. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/switch.py +0 -0
  358. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/input/togglebuttons.py +0 -0
  359. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/__init__.py +0 -0
  360. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/chat.py +0 -0
  361. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -0
  362. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/cookies_headers.py +0 -0
  363. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/input_date.py +0 -0
  364. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/menu.py +0 -0
  365. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/tab.py +0 -0
  366. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/tabs.py +0 -0
  367. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/task.py +0 -0
  368. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/theming.py +0 -0
  369. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/lab/use_task.py +0 -0
  370. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/__init__.py +0 -0
  371. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/app_bar.py +0 -0
  372. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/app_bar_title.py +0 -0
  373. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/app_layout.py +0 -0
  374. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/card.py +0 -0
  375. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/card_actions.py +0 -0
  376. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/column.py +0 -0
  377. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/columns.py +0 -0
  378. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/columns_responsive.py +0 -0
  379. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/details.py +0 -0
  380. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/griddraggable.py +0 -0
  381. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/gridfixed.py +0 -0
  382. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/hbox.py +0 -0
  383. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/row.py +0 -0
  384. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/sidebar.py +0 -0
  385. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/layout/vbox.py +0 -0
  386. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/__init__.py +0 -0
  387. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/file_download.py +0 -0
  388. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/html.py +0 -0
  389. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/image.py +0 -0
  390. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/markdown.py +0 -0
  391. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/markdown_editor.py +0 -0
  392. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/output/tooltip.py +0 -0
  393. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/page/__init__.py +0 -0
  394. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/page/head.py +0 -0
  395. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/page/title.py +0 -0
  396. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/__init__.py +0 -0
  397. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/error.py +0 -0
  398. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/info.py +0 -0
  399. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/progress.py +0 -0
  400. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/spinner.py +0 -0
  401. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/success.py +0 -0
  402. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/status/warning.py +0 -0
  403. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/viz/__init__.py +0 -0
  404. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/viz/altair.py +0 -0
  405. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/viz/echarts.py +0 -0
  406. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/viz/matplotlib.py +0 -0
  407. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/viz/plotly.py +0 -0
  408. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/components/viz/plotly_express.py +0 -0
  409. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/ai/__init__.py +0 -0
  410. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/ai/tokenizer.py +0 -0
  411. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/basics/__init__.py +0 -0
  412. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/basics/sine.py +0 -0
  413. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -0
  414. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -0
  415. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -0
  416. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -0
  417. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -0
  418. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -0
  419. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -0
  420. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/__init__.py +0 -0
  421. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/custom_storage.py +0 -0
  422. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/deploy_model.py +0 -0
  423. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/live_update.py +0 -0
  424. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/login_oauth.py +0 -0
  425. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/mycard.vue +0 -0
  426. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/general/pokemon_search.py +0 -0
  427. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/ipycanvas.py +0 -0
  428. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/libraries/__init__.py +0 -0
  429. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/utilities/__init__.py +0 -0
  430. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/utilities/calculator.py +0 -0
  431. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/utilities/todo.py +0 -0
  432. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/visualization/__init__.py +0 -0
  433. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/examples/visualization/plotly.py +0 -0
  434. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/faq/__init__.py +0 -0
  435. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/faq/content/99-faq.md +0 -0
  436. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/__init__.py +0 -0
  437. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -0
  438. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/02-installing.md +0 -0
  439. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -0
  440. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -0
  441. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -0
  442. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -0
  443. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -0
  444. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -0
  445. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -0
  446. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  447. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -0
  448. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -0
  449. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -0
  450. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -0
  451. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -0
  452. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -0
  453. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/docutils.py +0 -0
  454. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/__init__.py +0 -0
  455. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/domino_code_assist.py +0 -0
  456. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/planeto_tessa.py +0 -0
  457. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/solara_dev.py +0 -0
  458. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/solarathon_2023_team_2.py +0 -0
  459. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/solarathon_2023_team_4.py +0 -0
  460. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/solarathon_2023_team_5.py +0 -0
  461. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/solarathon_2023_team_6.py +0 -0
  462. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/pages/showcase/wanderlust.py +0 -0
  463. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/public/beach.jpeg +0 -0
  464. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/public/logo.svg +0 -0
  465. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/public/social/discord.svg +0 -0
  466. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/public/social/github.svg +0 -0
  467. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/public/social/twitter.svg +0 -0
  468. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/public/success.html +0 -0
  469. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/templates/index.html.j2 +0 -0
  470. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/website/utils.py +0 -0
  471. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/widgets/__init__.py +0 -0
  472. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/widgets/vue/gridlayout.vue +0 -0
  473. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/widgets/vue/html.vue +0 -0
  474. {solara_ui-1.39.0 → solara_ui-1.41.0}/solara/widgets/widgets.py +0 -0
  475. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/__init__.py +0 -0
  476. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/conftest.py +0 -0
  477. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/docs/docs_howto_event_with_future_test.py +0 -0
  478. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/docs/docs_howto_event_with_polling_test.py +0 -0
  479. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/docs/docs_howto_no_browser_api_find_testing_test.py +0 -0
  480. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/docs/docs_howto_no_browser_testing_test.py +0 -0
  481. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/docs/docs_howto_no_browser_threaded_test.py +0 -0
  482. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/__init__.py +0 -0
  483. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/api_test.py +0 -0
  484. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/app_widget.py +0 -0
  485. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/apps/not-allowed +0 -0
  486. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/apps/public/test.txt +0 -0
  487. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/apps/secure/app.py +0 -0
  488. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets/assets1/common.js +0 -0
  489. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets/assets1/unique1.js +0 -0
  490. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets/assets2/common.js +0 -0
  491. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets/assets2/custom.css +0 -0
  492. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets/assets2/custom.js +0 -0
  493. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets/assets2/unique2.js +0 -0
  494. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/assets_test.py +0 -0
  495. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/async_test.py +0 -0
  496. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/cdn_test.py +0 -0
  497. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/cmdline_test.py +0 -0
  498. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/conftest.py +0 -0
  499. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/create_test.py +0 -0
  500. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/enterprise/__init__.py +0 -0
  501. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/enterprise/oauth_test.py +0 -0
  502. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/error_test.py +0 -0
  503. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/esm_test.py +0 -0
  504. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/file_download_test.py +0 -0
  505. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/flask_test.py +0 -0
  506. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/input_date_test.py +0 -0
  507. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/latex_test.py +0 -0
  508. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/lifecycle_test.py +0 -0
  509. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/markdown_test.py +0 -0
  510. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/menu_test.py +0 -0
  511. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/popout_test.py +0 -0
  512. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/reconnect_test.py +0 -0
  513. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/reload/apps.py +0 -0
  514. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/ssg_test.py +0 -0
  515. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/starlette_test.py +0 -0
  516. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/test.vue +0 -0
  517. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/integration/testapp.py +0 -0
  518. {solara_ui-1.39.0/tests/unit → solara_ui-1.41.0/tests/pyinstaller}/__init__.py +0 -0
  519. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-changed-reference.png +0 -0
  520. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-7-reference.png +0 -0
  521. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-changed-reference.png +0 -0
  522. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-linux-ipywidgets-8-reference.png +0 -0
  523. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-changed-reference.png +0 -0
  524. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-7-reference.png +0 -0
  525. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-changed-reference.png +0 -0
  526. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/latex_test.py/test_widget_latex_solara-flask-chromium-win32-ipywidgets-8-reference.png +0 -0
  527. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-7-reference.png +0 -0
  528. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-linux-ipywidgets-8-reference.png +0 -0
  529. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-7-reference.png +0 -0
  530. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_lab-chromium-win32-ipywidgets-8-reference.png +0 -0
  531. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-7-reference.png +0 -0
  532. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-linux-ipywidgets-8-reference.png +0 -0
  533. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-7-reference.png +0 -0
  534. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-jupyter_notebook-chromium-win32-ipywidgets-8-reference.png +0 -0
  535. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  536. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  537. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  538. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  539. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-7-reference.png +0 -0
  540. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-linux-ipywidgets-8-reference.png +0 -0
  541. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-7-reference.png +0 -0
  542. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-flask-voila-chromium-win32-ipywidgets-8-reference.png +0 -0
  543. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-7-reference.png +0 -0
  544. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-linux-ipywidgets-8-reference.png +0 -0
  545. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-7-reference.png +0 -0
  546. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_slider_all-starlette-solara-chromium-win32-ipywidgets-8-reference.png +0 -0
  547. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-linux-reference.png +0 -0
  548. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_lab-chromium-win32-reference.png +0 -0
  549. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-linux-reference.png +0 -0
  550. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-jupyter_notebook-chromium-win32-reference.png +0 -0
  551. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-linux-reference.png +0 -0
  552. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-solara-chromium-win32-reference.png +0 -0
  553. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-linux-reference.png +0 -0
  554. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-flask-voila-chromium-win32-reference.png +0 -0
  555. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-linux-reference.png +0 -0
  556. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_solara_button_all-starlette-solara-chromium-win32-reference.png +0 -0
  557. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-ipyvuetify3-reference.png +0 -0
  558. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-linux-reference.png +0 -0
  559. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-flask-chromium-win32-reference.png +0 -0
  560. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-ipyvuetify3-reference.png +0 -0
  561. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-linux-reference.png +0 -0
  562. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/ui/snapshots/tests/integration/widget_test.py/test_widget_button_solara-starlette-chromium-win32-reference.png +0 -0
  563. {solara_ui-1.39.0/tests/unit/lab → solara_ui-1.41.0/tests/unit}/__init__.py +0 -0
  564. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/app_test.py +0 -0
  565. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/applayout_test.py +0 -0
  566. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/autorouting_test.py +0 -0
  567. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/cache_test.py +0 -0
  568. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/cdn_helper_test.py +0 -0
  569. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/chat_test.py +0 -0
  570. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/checkbox_test.py +0 -0
  571. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/common.py +0 -0
  572. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/component_frontend_test.py +0 -0
  573. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/component_vue_test.vue +0 -0
  574. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/confirmation_dialog_test.py +0 -0
  575. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/conftest.py +0 -0
  576. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/cross_filter_component_test.py +0 -0
  577. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/cross_filter_test.py +0 -0
  578. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/dataframe_test.py +0 -0
  579. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/datatable_test.py +0 -0
  580. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/display_test.py +0 -0
  581. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/express_test.py +0 -0
  582. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/file_download_test.py +0 -0
  583. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/hook_use_invalid_test.py +0 -0
  584. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/input_date_test.py +0 -0
  585. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/input_test.py +0 -0
  586. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/kernel_test.py +0 -0
  587. {solara_ui-1.39.0/tests/unit/solara_test_apps → solara_ui-1.41.0/tests/unit/lab}/__init__.py +0 -0
  588. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/lifecycle_test.py +0 -0
  589. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/matplotlib_test.py +0 -0
  590. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/no_solara_test.py +0 -0
  591. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/output_widget_test.py +0 -0
  592. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/patch_test.py +0 -0
  593. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/pivottable_test.py +0 -0
  594. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/reload_test.py +0 -0
  595. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/router_test.py +0 -0
  596. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/select_test.py +0 -0
  597. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/settings_test.py +0 -0
  598. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/shell_test.py +0 -0
  599. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/slider_test.py +0 -0
  600. {solara_ui-1.39.0/tests/unit/solara_test_apps/food → solara_ui-1.41.0/tests/unit/solara_test_apps}/__init__.py +0 -0
  601. /solara_ui-1.39.0/tests/unit/solara_test_apps/multipage/99-some_other_python_script.py → /solara_ui-1.41.0/tests/unit/solara_test_apps/food/__init__.py +0 -0
  602. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/food/food.py +0 -0
  603. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/food/index.py +0 -0
  604. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/kernel_start.py +0 -0
  605. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/01-home.py +0 -0
  606. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/02-my_fruit.py +0 -0
  607. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/03-some-markdown.md +0 -0
  608. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/04-a_directory/00-another-markdown.md +0 -0
  609. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/04-a_directory/01-not-an-app.py +0 -0
  610. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/04-a_directory/__init__.py +0 -0
  611. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/05-and-notebooks.ipynb +0 -0
  612. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/06-custom-routes.py +0 -0
  613. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/10-single-file-directory/single-file.md +0 -0
  614. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage/some_other_file.txt +0 -0
  615. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage-widgets/00-overview.md +0 -0
  616. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage-widgets/01-views.py +0 -0
  617. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage-widgets/02-likes.py +0 -0
  618. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage-widgets/03-volume.py +0 -0
  619. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/multipage-widgets/04-color.ipynb +0 -0
  620. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/notebookapp_component.ipynb +0 -0
  621. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/notebookapp_element.ipynb +0 -0
  622. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/notebookapp_widget.ipynb +0 -0
  623. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/single_file.py +0 -0
  624. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/single_file_multiple_routes.py +0 -0
  625. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/solara_test_apps/single_file_routes.py +0 -0
  626. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/switch_test.py +0 -0
  627. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/tabs_test.py +0 -0
  628. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/task_test.py +0 -0
  629. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/telemetry_tests.py +0 -0
  630. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/toestand_computed_reload.py +0 -0
  631. {solara_ui-1.39.0 → solara_ui-1.41.0}/tests/unit/toestand_test.py +0 -0
  632. {solara_ui-1.39.0 → solara_ui-1.41.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.39.0
3
+ Version: 1.41.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.39.0"
3
+ __version__ = "1.41.0"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -261,6 +261,12 @@ if "SOLARA_MODE" in os.environ:
261
261
  default=True,
262
262
  help="Check installed version again pypi version.",
263
263
  )
264
+ @click.option(
265
+ "--qt",
266
+ is_flag=True,
267
+ default=False,
268
+ help="Instead of opening a browser, open a Qt window. Will also stop the server when the window is closed. (experimental)",
269
+ )
264
270
  def run(
265
271
  app,
266
272
  host,
@@ -290,6 +296,7 @@ def run(
290
296
  ssg: bool,
291
297
  search: bool,
292
298
  check_version: bool = True,
299
+ qt=False,
293
300
  ):
294
301
  """Run a Solara app."""
295
302
  if dev is not None:
@@ -365,9 +372,16 @@ def run(
365
372
  while not failed and (server is None or not server.started):
366
373
  time.sleep(0.1)
367
374
  if not failed:
368
- webbrowser.open(url)
375
+ if qt:
376
+ from .server.qt import run_qt
369
377
 
370
- if open:
378
+ run_qt(url)
379
+ else:
380
+ webbrowser.open(url)
381
+
382
+ # with qt, we open the browser in the main thread (qt wants that)
383
+ # otherwise, we open the browser in a separate thread
384
+ if open and not qt:
371
385
  threading.Thread(target=open_browser, daemon=True).start()
372
386
 
373
387
  rich.print(f"Solara server is starting at {url}")
@@ -397,7 +411,7 @@ def run(
397
411
  settings.main.timing = timing
398
412
  items = (
399
413
  "theme_variant_user_selectable dark theme_variant theme_loader use_pdb server open_browser open url failed dev tracer"
400
- " timing ssg search check_version production".split()
414
+ " timing ssg search check_version production qt".split()
401
415
  )
402
416
  for item in items:
403
417
  del kwargs[item]
@@ -451,14 +465,13 @@ def run(
451
465
 
452
466
  build_index("")
453
467
 
454
- start_server()
455
-
456
468
  # TODO: if we want to use webview, it should be sth like this
457
- # server_thread = threading.Thread(target=start_server)
458
- # server_thread.start()
459
- # if open:
460
- # # open_webview()
461
- # open_browser()
469
+ if qt:
470
+ server_thread = threading.Thread(target=start_server, daemon=True)
471
+ server_thread.start()
472
+ open_browser()
473
+ else:
474
+ start_server()
462
475
  # server_thread.join()
463
476
 
464
477
 
@@ -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
@@ -1,4 +1,5 @@
1
1
  import inspect
2
+ import os
2
3
  from typing import Any, Callable, Dict, Type
3
4
 
4
5
  import ipyvue as vue
@@ -48,10 +49,10 @@ def _widget_from_signature(classname, base_class: Type[widgets.Widget], func: Ca
48
49
  def _widget_vue(vue_path: str, vuetify=True) -> Callable[[Callable[P, None]], Type[v.VuetifyTemplate]]:
49
50
  def decorator(func: Callable[P, None]):
50
51
  class VuetifyWidgetSolara(v.VuetifyTemplate):
51
- template_file = (inspect.getfile(func), vue_path)
52
+ template_file = (os.path.abspath(inspect.getfile(func)), vue_path)
52
53
 
53
54
  class VueWidgetSolara(vue.VueTemplate):
54
- template_file = (inspect.getfile(func), vue_path)
55
+ template_file = (os.path.abspath(inspect.getfile(func)), vue_path)
55
56
 
56
57
  base_class = VuetifyWidgetSolara if vuetify else VueWidgetSolara
57
58
  widget_class = _widget_from_signature("VueWidgetSolaraSub", base_class, func, "vue_")
@@ -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
@@ -128,7 +128,7 @@ module.exports = {
128
128
  href = location.pathname + href.substr(1);
129
129
  a.attributes['href'].href = href;
130
130
  }
131
- let authLink = href.starswith("/_solara/auth/");
131
+ let authLink = href.startsWith("/_solara/auth/");
132
132
  if( (href.startsWith("./") || href.startsWith("/")) && !authLink) {
133
133
  a.onclick = e => {
134
134
  console.log("clicked", href)
@@ -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"])
@@ -1,6 +1,7 @@
1
1
  html {
2
2
  /* override vuetify's css reset ress.css */
3
3
  overflow-y: auto;
4
+ scroll-behavior: smooth;
4
5
  }
5
6
 
6
7
  .jupyter-widgets code {
@@ -75,7 +76,8 @@ div.solara-markdown-output {
75
76
 
76
77
 
77
78
  div.highlight {
78
- background-color: #eee;
79
+ border: 1px solid var(--color-border-appbar);
80
+ background-color: #fafafa;
79
81
  padding: 30px;
80
82
  border-radius: 20px;
81
83
  margin-top: 15px;
@@ -123,6 +125,7 @@ div.highlight {
123
125
 
124
126
  .solara-autorouter-content {
125
127
  height: 100%;
128
+ max-width: 100%;
126
129
  }
127
130
 
128
131
  /* originally from index.css */
@@ -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"
@@ -0,0 +1,113 @@
1
+ import sys
2
+ from typing import List
3
+ import webbrowser
4
+ from qtpy.QtWidgets import QApplication
5
+ from qtpy.QtWebEngineWidgets import QWebEngineView
6
+ from qtpy.QtWebChannel import QWebChannel
7
+ from qtpy import QtCore, QtGui
8
+ import signal
9
+ from pathlib import Path
10
+
11
+ HERE = Path(__file__).parent
12
+
13
+
14
+ # setUrlRequestInterceptor, navigationRequested and acceptNavigationRequest
15
+ # all trigger the websocket to disconnect, so we need to block cross origin
16
+ # requests on the frontend/browser side by intercepting clicks on links
17
+
18
+ cross_origin_block_js = """
19
+ var script = document.createElement('script');
20
+ script.src = 'qrc:///qtwebchannel/qwebchannel.js';
21
+ document.head.appendChild(script);
22
+ script.onload = function() {
23
+ new QWebChannel(qt.webChannelTransport, function(channel) {
24
+ let py_callback = channel.objects.py_callback;
25
+
26
+ document.addEventListener('click', function(event) {
27
+ let target = event.target;
28
+ while (target && target.tagName !== 'A') {
29
+ target = target.parentNode;
30
+ }
31
+
32
+ if (target && target.tagName === 'A') {
33
+ const linkOrigin = new URL(target.href).origin;
34
+ const currentOrigin = window.location.origin;
35
+
36
+ if (linkOrigin !== currentOrigin) {
37
+ event.preventDefault();
38
+ console.log("Blocked cross-origin navigation to:", target.href);
39
+ py_callback.open_link(target.href); // Call Python method
40
+ }
41
+ }
42
+ }, true);
43
+ });
44
+ };
45
+ """
46
+
47
+
48
+ class PyCallback(QtCore.QObject):
49
+ @QtCore.Slot(str)
50
+ def open_link(self, url):
51
+ webbrowser.open(url)
52
+
53
+
54
+ class QWebEngineViewWithPopup(QWebEngineView):
55
+ # keep a strong reference to all windows
56
+ windows: List = []
57
+
58
+ def __init__(self):
59
+ super().__init__()
60
+ self.page().newWindowRequested.connect(self.handle_new_window_request)
61
+
62
+ # Set up WebChannel and py_callback object
63
+ self.py_callback = PyCallback()
64
+ self.channel = QWebChannel()
65
+ self.channel.registerObject("py_callback", self.py_callback)
66
+ self.page().setWebChannel(self.channel)
67
+
68
+ self.loadFinished.connect(self._inject_javascript)
69
+
70
+ def _inject_javascript(self, ok):
71
+ self.page().runJavaScript(cross_origin_block_js)
72
+
73
+ def handle_new_window_request(self, info):
74
+ webview = QWebEngineViewWithPopup()
75
+ geometry = info.requestedGeometry()
76
+ webview.resize(geometry.width(), geometry.height())
77
+ webview.setUrl(info.requestedUrl())
78
+ webview.show()
79
+ QWebEngineViewWithPopup.windows.append(webview)
80
+ return webview
81
+
82
+
83
+ def run_qt(url):
84
+ app = QApplication([])
85
+ web = QWebEngineViewWithPopup()
86
+ web.setUrl(QtCore.QUrl(url))
87
+ web.resize(1024, 1024)
88
+ web.show()
89
+
90
+ app_name = "Solara"
91
+ app.setApplicationDisplayName(app_name)
92
+ app.setApplicationName(app_name)
93
+ web.setWindowTitle(app_name)
94
+ app.setWindowIcon(QtGui.QIcon(str(HERE.parent / "website/public/logo.svg")))
95
+ if sys.platform.startswith("darwin"):
96
+ # Set app name, if PyObjC is installed
97
+ # Python 2 has PyObjC preinstalled
98
+ # Python 3: pip3 install pyobjc-framework-Cocoa
99
+ try:
100
+ from Foundation import NSBundle
101
+
102
+ bundle = NSBundle.mainBundle()
103
+ if bundle:
104
+ app_info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
105
+ if app_info is not None:
106
+ app_info["CFBundleName"] = app_name
107
+ app_info["CFBundleDisplayName"] = app_name
108
+ except ModuleNotFoundError:
109
+ pass
110
+
111
+ # without this, ctrl-c does not work in the terminal
112
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
113
+ app.exec_()
@@ -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",
@@ -37,6 +37,7 @@ class ThemeVariant(str, Enum):
37
37
  class ThemeSettings(BaseSettings):
38
38
  variant: ThemeVariant = ThemeVariant.light
39
39
  loader: str = "solara"
40
+ show_banner: bool = True
40
41
 
41
42
  class Config:
42
43
  env_prefix = "solara_theme_"