solara 1.29.1__py2.py3-none-any.whl → 1.30.1__py2.py3-none-any.whl

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 (286) hide show
  1. solara/__init__.py +5 -5
  2. solara/__main__.py +6 -2
  3. solara/autorouting.py +88 -56
  4. solara/cache.py +2 -2
  5. solara/checks.html +1 -1
  6. solara/components/__init__.py +1 -1
  7. solara/components/applayout.py +5 -5
  8. solara/components/button.py +4 -4
  9. solara/components/card.py +1 -2
  10. solara/components/component_vue.py +9 -8
  11. solara/components/cross_filter.py +6 -7
  12. solara/components/datatable.py +2 -3
  13. solara/components/figure_altair.py +1 -1
  14. solara/components/file_download.py +2 -2
  15. solara/components/file_drop.py +76 -33
  16. solara/components/file_drop.vue +24 -10
  17. solara/components/head.py +1 -2
  18. solara/components/head_tag.py +2 -3
  19. solara/components/image.py +1 -1
  20. solara/components/link.py +3 -4
  21. solara/components/meta.py +1 -1
  22. solara/components/misc.py +5 -9
  23. solara/datatypes.py +2 -2
  24. solara/hooks/use_reactive.py +2 -2
  25. solara/lab/components/confirmation_dialog.py +1 -1
  26. solara/lab/components/tabs.py +6 -6
  27. solara/reactive.py +1 -1
  28. solara/routing.py +9 -8
  29. solara/scope/__init__.py +3 -2
  30. solara/server/app.py +44 -1
  31. solara/server/assets/style.css +6 -0
  32. solara/server/esm.py +28 -4
  33. solara/server/kernel_context.py +78 -7
  34. solara/server/patch.py +3 -0
  35. solara/server/reload.py +2 -2
  36. solara/server/server.py +3 -3
  37. solara/server/settings.py +1 -0
  38. solara/server/starlette.py +66 -33
  39. solara/server/static/solara_bootstrap.py +1 -1
  40. solara/server/templates/solara.html.j2 +62 -42
  41. solara/tasks.py +1 -6
  42. solara/util.py +23 -1
  43. solara/website/assets/custom.css +56 -0
  44. solara/website/components/__init__.py +1 -0
  45. solara/website/components/algolia_api.vue +157 -0
  46. solara/website/components/docs.py +118 -0
  47. solara/website/components/header.py +20 -10
  48. solara/website/components/hero.py +1 -1
  49. solara/website/components/markdown.py +30 -0
  50. solara/website/pages/__init__.py +234 -20
  51. solara/website/pages/apps/jupyter-dashboard-1.py +1 -1
  52. solara/website/pages/apps/multipage/__init__.py +1 -1
  53. solara/website/pages/apps/multipage/page2.py +1 -1
  54. solara/website/pages/apps/scatter.py +21 -7
  55. solara/website/pages/changelog/__init__.py +8 -0
  56. solara/website/pages/{docs/content/95-changelog.md → changelog/changelog.md} +43 -2
  57. solara/website/pages/contact/__init__.py +8 -0
  58. solara/website/pages/documentation/__init__.py +184 -0
  59. solara/website/pages/{docs → documentation/advanced}/__init__.py +2 -2
  60. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  61. solara/website/pages/{docs → documentation/advanced}/content/10-howto/00-overview.md +5 -0
  62. solara/website/pages/{docs/content/10-howto/20-multipage.md → documentation/advanced/content/10-howto/10-multipage.md} +9 -5
  63. solara/website/pages/{docs/content/10-howto/30-layout.md → documentation/advanced/content/10-howto/20-layout.md} +26 -21
  64. solara/website/pages/{docs/content/10-howto/50-testing.md → documentation/advanced/content/10-howto/30-testing.md} +5 -0
  65. solara/website/pages/{docs/content/10-howto/51-debugging.md → documentation/advanced/content/10-howto/31-debugging.md} +4 -1
  66. solara/website/pages/{docs/content/10-howto/80-embed.md → documentation/advanced/content/10-howto/40-embed.md} +7 -1
  67. solara/website/pages/{docs/content/10-howto/ipywidget_libraries.md → documentation/advanced/content/10-howto/50-ipywidget_libraries.md} +4 -0
  68. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  69. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/05-ipywidgets.md +5 -0
  70. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/06-ipyvuetify.md +5 -1
  71. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/10-reacton.md +4 -0
  72. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/12-reacton-basics.md +5 -1
  73. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/15-anatomy.md +6 -2
  74. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +7 -0
  75. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/18-containers.md +9 -3
  76. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/20-solara.md +5 -0
  77. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/40-routing.md +13 -9
  78. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/50-solara-server.md +6 -1
  79. solara/website/pages/{docs → documentation/advanced}/content/20-understanding/60-voila.md +5 -0
  80. solara/website/pages/{docs/content/50-enterprise → documentation/advanced/content/30-enterprise}/10-oauth.md +7 -3
  81. solara/website/pages/{docs/content/10-howto → documentation/advanced/content/40-development}/01-contribute.md +9 -5
  82. solara/website/pages/{docs/content/90-development → documentation/advanced/content/40-development}/10-setup.md +6 -2
  83. solara/website/pages/documentation/api/__init__.py +19 -0
  84. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  85. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  86. solara/website/pages/{api → documentation/api/hooks}/use_effect.md +3 -3
  87. solara/website/pages/{api → documentation/api/hooks}/use_effect.py +2 -1
  88. solara/website/pages/{api → documentation/api/hooks}/use_memo.md +2 -2
  89. solara/website/pages/{api → documentation/api/hooks}/use_memo.py +2 -1
  90. solara/website/pages/{api → documentation/api/hooks}/use_reactive.py +1 -2
  91. solara/website/pages/{api → documentation/api/hooks}/use_state.py +1 -2
  92. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  93. solara/website/pages/{api → documentation/api/routing}/generate_routes.py +1 -2
  94. solara/website/pages/{api → documentation/api/routing}/generate_routes_directory.py +1 -2
  95. solara/website/pages/{api → documentation/api/routing}/use_route.py +2 -2
  96. solara/website/pages/{api → documentation/api/routing}/use_router.py +1 -2
  97. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  98. solara/website/pages/{api → documentation/api/utilities}/component_vue.py +1 -2
  99. solara/website/pages/{api → documentation/api/utilities}/computed.py +2 -2
  100. solara/website/pages/{api → documentation/api/utilities}/display.py +1 -2
  101. solara/website/pages/{api → documentation/api/utilities}/get_kernel_id.py +2 -2
  102. solara/website/pages/{api → documentation/api/utilities}/get_session_id.py +2 -2
  103. solara/website/pages/{api → documentation/api/utilities}/on_kernel_start.py +9 -3
  104. solara/website/pages/{api → documentation/api/utilities}/reactive.py +1 -2
  105. solara/website/pages/{api → documentation/api/utilities}/widget.py +2 -2
  106. solara/website/pages/documentation/components/__init__.py +12 -0
  107. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  108. solara/website/pages/documentation/components/data/__init__.py +9 -0
  109. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  110. solara/website/pages/{api → documentation/components/enterprise}/avatar.py +1 -2
  111. solara/website/pages/{api → documentation/components/enterprise}/avatar_menu.py +1 -2
  112. solara/website/pages/documentation/components/input/__init__.py +9 -0
  113. solara/website/pages/{api → documentation/components/input}/checkbox.py +1 -2
  114. solara/website/pages/documentation/components/input/file_drop.py +75 -0
  115. solara/website/pages/{api → documentation/components/input}/input.py +1 -2
  116. solara/website/pages/{api → documentation/components/input}/select.py +1 -2
  117. solara/website/pages/{api → documentation/components/input}/slider.py +1 -2
  118. solara/website/pages/{api → documentation/components/input}/switch.py +1 -2
  119. solara/website/pages/{api → documentation/components/input}/togglebuttons.py +1 -2
  120. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  121. solara/website/pages/{api → documentation/components/lab}/chat.py +2 -3
  122. solara/website/pages/{api → documentation/components/lab}/cookies_headers.py +1 -1
  123. solara/website/pages/{api → documentation/components/lab}/input_date.py +1 -2
  124. solara/website/pages/{api → documentation/components/lab}/menu.py +1 -2
  125. solara/website/pages/{api → documentation/components/lab}/task.py +1 -2
  126. solara/website/pages/{api → documentation/components/lab}/theming.py +1 -2
  127. solara/website/pages/{api → documentation/components/lab}/use_task.py +1 -2
  128. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  129. solara/website/pages/{api → documentation/components/layout}/app_bar.py +1 -2
  130. solara/website/pages/{api → documentation/components/layout}/app_bar_title.py +1 -2
  131. solara/website/pages/{api → documentation/components/layout}/card.py +1 -2
  132. solara/website/pages/{api → documentation/components/layout}/card_actions.py +1 -2
  133. solara/website/pages/{api → documentation/components/layout}/griddraggable.py +1 -1
  134. solara/website/pages/{api → documentation/components/layout}/gridfixed.py +1 -1
  135. solara/website/pages/{api → documentation/components/layout}/hbox.py +1 -1
  136. solara/website/pages/{api → documentation/components/layout}/vbox.py +1 -1
  137. solara/website/pages/documentation/components/output/__init__.py +9 -0
  138. solara/website/pages/{api → documentation/components/output}/file_download.py +1 -2
  139. solara/website/pages/{api → documentation/components/output}/image.py +1 -2
  140. solara/website/pages/{api → documentation/components/output}/tooltip.py +1 -2
  141. solara/website/pages/documentation/components/page/__init__.py +9 -0
  142. solara/website/pages/documentation/components/status/__init__.py +9 -0
  143. solara/website/pages/{api → documentation/components/status}/error.py +3 -3
  144. solara/website/pages/{api → documentation/components/status}/info.py +3 -3
  145. solara/website/pages/{api → documentation/components/status}/progress.py +1 -2
  146. solara/website/pages/{api → documentation/components/status}/spinner.py +1 -2
  147. solara/website/pages/{api → documentation/components/status}/success.py +3 -3
  148. solara/website/pages/{api → documentation/components/status}/warning.py +3 -3
  149. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  150. solara/website/pages/{api → documentation/components/viz}/plotly.py +1 -0
  151. solara/website/pages/{examples → documentation/examples}/__init__.py +3 -43
  152. solara/website/pages/{examples → documentation/examples}/general/custom_storage.py +1 -1
  153. solara/website/pages/{examples → documentation/examples}/general/deploy_model.py +3 -3
  154. solara/website/pages/{examples → documentation/examples}/general/login_oauth.py +1 -1
  155. solara/website/pages/{examples → documentation/examples}/general/vue_component.py +1 -2
  156. solara/website/pages/{examples → documentation/examples}/libraries/altair.py +2 -3
  157. solara/website/pages/{examples → documentation/examples}/libraries/ipyleaflet_advanced.py +1 -1
  158. solara/website/pages/{examples → documentation/examples}/utilities/countdown_timer.py +1 -1
  159. solara/website/pages/{examples → documentation/examples}/visualization/plotly.py +1 -2
  160. solara/website/pages/documentation/faq/__init__.py +12 -0
  161. solara/website/pages/{docs → documentation/faq}/content/99-faq.md +4 -1
  162. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  163. solara/website/pages/{docs/content/03-quickstart.md → documentation/getting_started/content/00-quickstart.md} +7 -2
  164. solara/website/pages/{docs/content/00-introduction.md → documentation/getting_started/content/01-introduction.md} +20 -16
  165. solara/website/pages/{docs → documentation/getting_started}/content/02-installing.md +5 -1
  166. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  167. solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/20-web-app.md +9 -4
  168. solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/30-ipywidgets.md +13 -9
  169. solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/40-streamlit.md +17 -12
  170. solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/50-dash.md +7 -3
  171. solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/_data_science.ipynb +5 -5
  172. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  173. solara/website/pages/{docs/content/07-fundamentals → documentation/getting_started/content/05-fundamentals}/10-components.md +7 -2
  174. solara/website/pages/{docs/content/07-fundamentals → documentation/getting_started/content/05-fundamentals}/50-state-management.md +8 -3
  175. solara/website/pages/documentation/getting_started/content/06-reference/00-overview.md +3 -0
  176. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/40-static_files.md +4 -0
  177. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/41-asset-files.md +5 -1
  178. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/60-static-site-generation.md +5 -1
  179. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/70-search.md +5 -1
  180. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/80-reloading.md +7 -3
  181. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/90-notebook-support.md +4 -1
  182. solara/website/pages/{docs/content/15-reference → documentation/getting_started/content/06-reference}/95-caching.md +6 -1
  183. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  184. solara/website/pages/{docs/content/30-deploying → documentation/getting_started/content/07-deploying}/10-self-hosted.md +7 -3
  185. solara/website/pages/{docs/content/30-deploying → documentation/getting_started/content/07-deploying}/20-cloud-hosted.md +5 -1
  186. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  187. solara/website/pages/{docs → documentation/getting_started}/content/90-troubleshoot.md +4 -0
  188. solara/website/pages/showcase/__init__.py +1 -1
  189. solara/website/pages/showcase/domino_code_assist.py +1 -1
  190. solara/website/pages/showcase/solara_dev.py +1 -1
  191. solara/website/public/social/discord.svg +1 -0
  192. solara/website/public/social/github.svg +1 -0
  193. solara/website/public/social/twitter.svg +3 -0
  194. {solara-1.29.1.dist-info → solara-1.30.1.dist-info}/METADATA +8 -7
  195. solara-1.30.1.dist-info/RECORD +437 -0
  196. {solara-1.29.1.dist-info → solara-1.30.1.dist-info}/WHEEL +1 -1
  197. solara/website/pages/api/__init__.py +0 -292
  198. solara/website/pages/api/default_layout.py +0 -16
  199. solara/website/pages/api/file_drop.py +0 -36
  200. solara/website/pages/docs/content/04-tutorial/00-overview.md +0 -9
  201. solara/website/pages/docs/content/07-fundamentals/00-overview.md +0 -7
  202. solara/website/pages/docs/content/15-reference/00-overview.md +0 -6
  203. solara/website/pages/docs/content/20-understanding/00-introduction.md +0 -4
  204. solara/website/pages/docs/content/20-understanding/17-rules-of-hooks.md +0 -3
  205. solara/website/pages/docs/content/30-deploying/00-overview.md +0 -3
  206. solara/website/pages/docs/content/lab/00-what-is-lab.md +0 -3
  207. solara-1.29.1.dist-info/RECORD +0 -411
  208. /solara/website/pages/{docs/content/99-contact.md → contact/contact.md} +0 -0
  209. /solara/website/pages/{docs/content/50-enterprise → documentation/advanced/content/30-enterprise}/00-overview.md +0 -0
  210. /solara/website/pages/{docs/content/__init__.py → documentation/advanced/content/40-development/00-overview.md} +0 -0
  211. /solara/website/pages/{api → documentation/api/cross_filter}/cross_filter_dataframe.py +0 -0
  212. /solara/website/pages/{api → documentation/api/cross_filter}/cross_filter_report.py +0 -0
  213. /solara/website/pages/{api → documentation/api/cross_filter}/cross_filter_select.py +0 -0
  214. /solara/website/pages/{api → documentation/api/cross_filter}/cross_filter_slider.py +0 -0
  215. /solara/website/pages/{api → documentation/api/hooks}/use_cross_filter.py +0 -0
  216. /solara/website/pages/{api → documentation/api/hooks}/use_dark_effective.py +0 -0
  217. /solara/website/pages/{api → documentation/api/hooks}/use_exception.py +0 -0
  218. /solara/website/pages/{api → documentation/api/hooks}/use_previous.py +0 -0
  219. /solara/website/pages/{api → documentation/api/hooks}/use_state_or_update.py +0 -0
  220. /solara/website/pages/{api → documentation/api/hooks}/use_thread.md +0 -0
  221. /solara/website/pages/{api → documentation/api/hooks}/use_thread.py +0 -0
  222. /solara/website/pages/{api → documentation/api/hooks}/use_trait_observe.py +0 -0
  223. /solara/website/pages/{api → documentation/api/routing}/resolve_path.py +0 -0
  224. /solara/website/pages/{api → documentation/api/routing}/route.py +0 -0
  225. /solara/website/pages/{api → documentation/api/utilities}/memoize.py +0 -0
  226. /solara/website/pages/{api → documentation/components/advanced}/link.py +0 -0
  227. /solara/website/pages/{api → documentation/components/advanced}/meta.py +0 -0
  228. /solara/website/pages/{api → documentation/components/advanced}/style.py +0 -0
  229. /solara/website/pages/{api → documentation/components}/common.py +0 -0
  230. /solara/website/pages/{api → documentation/components/data}/dataframe.py +0 -0
  231. /solara/website/pages/{api → documentation/components/data}/pivot_table.py +0 -0
  232. /solara/website/pages/{api → documentation/components/input}/button.py +0 -0
  233. /solara/website/pages/{api → documentation/components/input}/file_browser.py +0 -0
  234. /solara/website/pages/{api → documentation/components/lab}/confirmation_dialog.py +0 -0
  235. /solara/website/pages/{api → documentation/components/lab}/tab.py +0 -0
  236. /solara/website/pages/{api → documentation/components/lab}/tabs.py +0 -0
  237. /solara/website/pages/{api → documentation/components/layout}/app_layout.py +0 -0
  238. /solara/website/pages/{api → documentation/components/layout}/column.py +0 -0
  239. /solara/website/pages/{api → documentation/components/layout}/columns.py +0 -0
  240. /solara/website/pages/{api → documentation/components/layout}/columns_responsive.py +0 -0
  241. /solara/website/pages/{api → documentation/components/layout}/row.py +0 -0
  242. /solara/website/pages/{api → documentation/components/layout}/sidebar.py +0 -0
  243. /solara/website/pages/{api → documentation/components/output}/html.py +0 -0
  244. /solara/website/pages/{api → documentation/components/output}/markdown.py +0 -0
  245. /solara/website/pages/{api → documentation/components/output}/markdown_editor.py +0 -0
  246. /solara/website/pages/{api → documentation/components/output}/sql_code.py +0 -0
  247. /solara/website/pages/{api → documentation/components/page}/head.py +0 -0
  248. /solara/website/pages/{api → documentation/components/page}/title.py +0 -0
  249. /solara/website/pages/{api → documentation/components/viz}/altair.py +0 -0
  250. /solara/website/pages/{api → documentation/components/viz}/echarts.py +0 -0
  251. /solara/website/pages/{api → documentation/components/viz}/matplotlib.py +0 -0
  252. /solara/website/pages/{api → documentation/components/viz}/plotly_express.py +0 -0
  253. /solara/website/pages/{examples → documentation/examples}/ai/__init__.py +0 -0
  254. /solara/website/pages/{examples → documentation/examples}/ai/chatbot.py +0 -0
  255. /solara/website/pages/{examples → documentation/examples}/ai/tokenizer.py +0 -0
  256. /solara/website/pages/{examples → documentation/examples}/basics/__init__.py +0 -0
  257. /solara/website/pages/{examples → documentation/examples}/basics/sine.py +0 -0
  258. /solara/website/pages/{examples → documentation/examples}/fullscreen/__init__.py +0 -0
  259. /solara/website/pages/{examples → documentation/examples}/fullscreen/authorization.py +0 -0
  260. /solara/website/pages/{examples → documentation/examples}/fullscreen/layout_demo.py +0 -0
  261. /solara/website/pages/{examples → documentation/examples}/fullscreen/multipage.py +0 -0
  262. /solara/website/pages/{examples → documentation/examples}/fullscreen/scatter.py +0 -0
  263. /solara/website/pages/{examples → documentation/examples}/fullscreen/scrolling.py +0 -0
  264. /solara/website/pages/{examples → documentation/examples}/fullscreen/tutorial_streamlit.py +0 -0
  265. /solara/website/pages/{examples → documentation/examples}/general/__init__.py +0 -0
  266. /solara/website/pages/{examples → documentation/examples}/general/live_update.py +0 -0
  267. /solara/website/pages/{examples → documentation/examples}/general/mycard.vue +0 -0
  268. /solara/website/pages/{examples → documentation/examples}/general/pokemon_search.py +0 -0
  269. /solara/website/pages/{examples → documentation/examples}/ipycanvas.py +0 -0
  270. /solara/website/pages/{examples → documentation/examples}/libraries/__init__.py +0 -0
  271. /solara/website/pages/{examples → documentation/examples}/libraries/bqplot.py +0 -0
  272. /solara/website/pages/{examples → documentation/examples}/libraries/ipyleaflet.py +0 -0
  273. /solara/website/pages/{examples → documentation/examples}/utilities/__init__.py +0 -0
  274. /solara/website/pages/{examples → documentation/examples}/utilities/calculator.py +0 -0
  275. /solara/website/pages/{examples → documentation/examples}/utilities/todo.py +0 -0
  276. /solara/website/pages/{examples → documentation/examples}/visualization/__init__.py +0 -0
  277. /solara/website/pages/{examples → documentation/examples}/visualization/annotator.py +0 -0
  278. /solara/website/pages/{examples → documentation/examples}/visualization/linked_views.py +0 -0
  279. /solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/10_data_science.py +0 -0
  280. /solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/60-jupyter-dashboard-part1.py +0 -0
  281. /solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/SF_crime_sample.csv.gz +0 -0
  282. /solara/website/pages/{docs/content/04-tutorial → documentation/getting_started/content/04-tutorials}/_jupyter_dashboard_1.ipynb +0 -0
  283. {solara-1.29.1.data → solara-1.30.1.data}/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  284. {solara-1.29.1.data → solara-1.30.1.data}/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  285. {solara-1.29.1.dist-info → solara-1.30.1.dist-info}/entry_points.txt +0 -0
  286. {solara-1.29.1.dist-info → solara-1.30.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,15 +1,221 @@
1
1
  import contextlib
2
2
 
3
3
  import solara
4
+ from solara import autorouting
4
5
  from solara.alias import rv
5
6
  from solara.components.title import Title
7
+ from solara.server import server
6
8
 
7
9
  from ..components import Header, Hero
8
10
  from ..components.mailchimp import MailChimp
9
11
 
10
12
  title = "Home"
11
13
 
12
- route_order = ["/", "showcase", "docs", "api", "examples", "apps"]
14
+ route_order = ["/", "showcase", "documentation", "apps", "contact", "changelog"]
15
+
16
+
17
+ _redirects = {
18
+ "/docs": "/documentation/getting_started/introduction",
19
+ "/docs/installing": "/documentation/getting_started/installing",
20
+ "/docs/quickstart": "/documentation/getting_started",
21
+ "/docs/tutorial": "/documentation/getting_started/tutorials",
22
+ "/docs/tutorial/data-science": "/documentation/getting_started/tutorials/data-science",
23
+ "/docs/tutorial/web-app": "/documentation/getting_started/tutorials/web-app",
24
+ "/docs/tutorial/ipywidgets": "/documentation/getting_started/tutorials/ipywidgets",
25
+ "/docs/tutorial/streamlit": "/documentation/getting_started/tutorials/streamlit",
26
+ "/docs/tutorial/dash": "/documentation/getting_started/tutorials/dash",
27
+ "/docs/tutorial/jupyter-dashboard-part1": "/documentation/getting_started/tutorials/jupyter-dashboard-part1",
28
+ "/docs/fundamentals": "/documentation/getting_started/fundamentals",
29
+ "/docs/fundamentals/components": "/documentation/getting_started/fundamentals/components",
30
+ "/docs/fundamentals/state-management": "/documentation/getting_started/fundamentals/state-management",
31
+ "/docs/howto": "/documentation/advanced/howto",
32
+ "/docs/howto/contribute": "/documentation/advanced/development/contribute",
33
+ "/docs/howto/multipage": "/documentation/advanced/howto/multipage",
34
+ "/docs/howto/layout": "/documentation/advanced/howto/layout",
35
+ "/docs/howto/testing": "/documentation/advanced/howto/testing",
36
+ "/docs/howto/debugging": "/documentation/advanced/howto/debugging",
37
+ "/docs/howto/embed": "/documentation/advanced/howto/embed",
38
+ "/docs/howto/ipywidget-libraries": "/documentation/advanced/howto/ipywidget-libraries",
39
+ "/docs/reference": "/documentation/getting_started/reference",
40
+ "/docs/reference/static-files": "/documentation/getting_started/reference/static-files",
41
+ "/docs/reference/asset-files": "/documentation/getting_started/reference/asset-files",
42
+ "/docs/reference/static-site-generation": "/documentation/getting_started/reference/static-site-generation",
43
+ "/docs/reference/search": "/documentation/getting_started/reference/search",
44
+ "/docs/reference/reloading": "/documentation/getting_started/reference/reloading",
45
+ "/docs/reference/notebook-support": "/documentation/getting_started/reference/notebook-support",
46
+ "/docs/reference/caching": "/documentation/getting_started/reference/caching",
47
+ "/docs/understanding": "/documentation/advanced/understanding",
48
+ "/docs/understanding/ipywidgets": "/documentation/advanced/understanding/ipywidgets",
49
+ "/docs/understanding/ipyvuetify": "/documentation/advanced/understanding/ipyvuetify",
50
+ "/docs/understanding/reacton": "/documentation/advanced/understanding/reacton",
51
+ "/docs/understanding/reacton-basics": "/documentation/advanced/understanding/reacton-basics",
52
+ "/docs/understanding/anatomy": "/documentation/advanced/understanding/anatomy",
53
+ "/docs/understanding/rules-of-hooks": "/documentation/advanced/understanding/rules-of-hooks",
54
+ "/docs/understanding/containers": "/documentation/advanced/understanding/containers",
55
+ "/docs/understanding/solara": "/documentation/advanced/understanding/solara",
56
+ "/docs/understanding/routing": "/documentation/advanced/understanding/routing",
57
+ "/docs/understanding/solara-server": "/documentation/advanced/understanding/solara-server",
58
+ "/docs/understanding/voila": "/documentation/advanced/understanding/voila",
59
+ "/docs/deploying": "/documentation/getting_started/deploying",
60
+ "/docs/deploying/self-hosted": "/documentation/getting_started/deploying/self-hosted",
61
+ "/docs/deploying/cloud-hosted": "/documentation/getting_started/deploying/cloud-hosted",
62
+ "/docs/enterprise": "/documentation/advanced/enterprise",
63
+ "/docs/enterprise/oauth": "/documentation/advanced/enterprise/oauth",
64
+ "/docs/development": "/documentation/advanced/development/setup",
65
+ "/docs/troubleshoot": "/documentation/getting_started/troubleshoot",
66
+ "/docs/changelog": "/changelog",
67
+ "/docs/contact": "/contact",
68
+ "/docs/faq": "/documentation/faq",
69
+ "/docs/lab": "/documentation/getting_started/lab",
70
+ "/api": "/documentation/api",
71
+ "/api/altair": "/documentation/components/viz/altair",
72
+ "/api/app_bar": "/documentation/components/layout/app_bar",
73
+ "/api/app_bar_title": "/documentation/components/layout/app_bar_title",
74
+ "/api/app_layout": "/documentation/components/layout/app_layout",
75
+ "/api/avatar": "/documentation/components/enterprise/avatar",
76
+ "/api/avatar_menu": "/documentation/components/enterprise/avatar_menu",
77
+ "/api/card": "/documentation/components/layout/card",
78
+ "/api/card_actions": "/documentation/components/layout/card_actions",
79
+ "/api/column": "/documentation/components/layout/column",
80
+ "/api/columns": "/documentation/components/layout/columns",
81
+ "/api/columns_responsive": "/documentation/components/layout/columns_responsive",
82
+ "/api/cross_filter_dataframe": "/documentation/api/cross_filter/cross_filter_dataframe",
83
+ "/api/cross_filter_report": "/documentation/api/cross_filter/cross_filter_report",
84
+ "/api/cross_filter_select": "/documentation/api/cross_filter/cross_filter_select",
85
+ "/api/cross_filter_slider": "/documentation/api/cross_filter/cross_filter_slider",
86
+ "/api/generate_routes": "/documentation/api/routing/generate_routes",
87
+ "/api/generate_routes_directory": "/documentation/api/routing/generate_routes_directory",
88
+ "/api/resolve_path": "/documentation/api/routing/resolve_path",
89
+ "/api/resolve_path/kiwi": "/documentation/api/routing/resolve_path/kiwi",
90
+ "/api/resolve_path/banana": "/documentation/api/routing/resolve_path/banana",
91
+ "/api/resolve_path/apple": "/documentation/api/routing/resolve_path/apple",
92
+ "/api/link": "/documentation/components/advanced/link",
93
+ "/api/link/kiwi": "/documentation/components/advanced/link/kiwi",
94
+ "/api/link/banana": "/documentation/components/advanced/link/banana",
95
+ "/api/link/apple": "/documentation/components/advanced/link/apple",
96
+ "/api/use_route": "/documentation/api/routing/use_route",
97
+ "/api/use_route/fruit": "/documentation/api/routing/use_route/fruit",
98
+ "/api/use_route/fruit/kiwi": "/documentation/api/routing/use_route/fruit/kiwi",
99
+ "/api/use_route/fruit/banana": "/documentation/api/routing/use_route/fruit/banana",
100
+ "/api/use_route/fruit/apple": "/documentation/api/routing/use_route/fruit/apple",
101
+ "/api/use_router": "/documentation/api/routing/use_router",
102
+ "/api/use_cross_filter": "/documentation/api/hooks/use_cross_filter",
103
+ "/api/use_dark_effective": "/documentation/api/hooks/use_dark_effective",
104
+ "/api/use_effect": "/documentation/api/hooks/use_effect",
105
+ "/api/use_exception": "/documentation/api/hooks/use_exception",
106
+ "/api/use_memo": "/documentation/api/hooks/use_memo",
107
+ "/api/use_previous": "/documentation/api/hooks/use_previous",
108
+ "/api/use_reactive": "/documentation/api/hooks/use_reactive",
109
+ "/api/use_state": "/documentation/api/hooks/use_state",
110
+ "/api/use_state_or_update": "/documentation/api/hooks/use_state_or_update",
111
+ "/api/use_task": "/documentation/components/lab/use_task",
112
+ "/api/use_thread": "/documentation/api/hooks/use_thread",
113
+ "/api/use_trait_observe": "/documentation/api/hooks/use_trait_observe",
114
+ "/examples/fullscreen": "/documentation/examples/fullscreen",
115
+ "/examples/fullscreen/authorization": "/apps/authorization",
116
+ "documentation/examples/fullscreen/authorization": "/apps/authorization",
117
+ "/examples/fullscreen/layout-demo": "/apps/layout-demo",
118
+ "/documentation/examples/fullscreen/layout-demo": "/apps/layout-demo",
119
+ "/examples/fullscreen/multipage": "/apps/multipage",
120
+ "/documentation/examples/fullscreen/multipage": "/apps/multipage",
121
+ "/examples/fullscreen/scatter": "apps/scatter",
122
+ "/documentation/examples/fullscreen/scatter": "/apps/scatter",
123
+ "/examples/fullscreen/scrolling": "/apps/scrolling",
124
+ "/documentation/examples/fullscreen/scrolling": "/apps/scrolling",
125
+ "/examples/fullscreen/tutorial-streamlit": "/apps/tutorial-streamlit",
126
+ "/documentation/examples/fullscreen/tutorial-streamlit": "/apps/tutorial-streamlit",
127
+ "/api/route": "/documentation/api/routing/route",
128
+ "/api/route/kiwi": "/documentation/api/routing/route/kiwi",
129
+ "/api/route/banana": "/documentation/api/routing/route/banana",
130
+ "/api/route/apple": "/documentation/api/routing/route/apple",
131
+ "/examples/libraries": "/documentation/examples/libraries",
132
+ "/examples/libraries/altair": "/documentation/examples/libraries/altair",
133
+ "/examples/libraries/bqplot": "/documentation/examples/libraries/bqplot",
134
+ "/examples/libraries/ipyleaflet": "/documentation/examples/libraries/ipyleaflet",
135
+ "/examples/libraries/ipyleaflet_advanced": "/documentation/examples/libraries/ipyleaflet_advanced",
136
+ "/examples/utilities": "/documentation/examples/utilities",
137
+ "/examples/utilities/calculator": "/documentation/examples/utilities/calculator",
138
+ "/examples/utilities/countdown_timer": "/documentation/examples/utilities/countdown_timer",
139
+ "/examples/utilities/todo": "/documentation/examples/utilities/todo",
140
+ "/examples/visualization": "/documentation/examples/visualization",
141
+ "/examples/visualization/annotator": "/documentation/examples/visualization/annotator",
142
+ "/examples/visualization/linked_views": "/documentation/examples/visualization/linked_views",
143
+ "/examples/visualization/plotly": "/documentation/examples/visualization/plotly",
144
+ "/examples/general": "/documentation/examples/general",
145
+ "/examples/general/custom_storage": "/documentation/examples/general/custom_storage",
146
+ "/examples/general/deploy_model": "/documentation/examples/general/deploy_model",
147
+ "/examples/general/live_update": "/documentation/examples/general/live_update",
148
+ "/examples/general/login_oauth": "/documentation/examples/general/login_oauth",
149
+ "/examples/general/pokemon_search": "/documentation/examples/general/pokemon_search",
150
+ "/examples/general/vue_component": "/documentation/examples/general/vue_component",
151
+ "/examples": "/documentation/examples",
152
+ "/examples/ai": "/documentation/examples/ai",
153
+ "/examples/ai/chatbot": "/documentation/examples/ai/chatbot",
154
+ "/examples/ai/tokenizer": "/documentation/examples/ai/tokenizer",
155
+ "/examples/basics": "/documentation/examples/basics",
156
+ "/examples/basics/sine": "/documentation/examples/basics/sine",
157
+ "/api/get_kernel_id": "/documentation/api/utilities/get_kernel_id",
158
+ "/api/get_session_id": "/documentation/api/utilities/get_session_id",
159
+ "/api/on_kernel_start": "/documentation/api/utilities/on_kernel_start",
160
+ "/api/component_vue": "/documentation/api/utilities/component_vue",
161
+ "/api/plotly": "/documentation/components/viz/plotly",
162
+ "/api/plotly_express": "/documentation/components/viz/plotly_express",
163
+ "/api/tab": "/documentation/components/lab/tab",
164
+ "/api/tabs": "/documentation/components/lab/tabs",
165
+ "/api/task": "/documentation/components/lab/task",
166
+ "/api/computed": "/documentation/api/utilities/computed",
167
+ "/api/markdown": "/documentation/components/output/markdown",
168
+ "/api/markdown_editor": "/documentation/components/output/markdown_editor",
169
+ "/api/matplotlib": "/documentation/components/viz/matplotlib",
170
+ "/api/echarts": "/documentation/components/viz/echarts",
171
+ "/api/theming": "/documentation/components/lab/theming",
172
+ "/api/griddraggable": "/documentation/components/layout/griddraggable",
173
+ "/api/gridfixed": "/documentation/components/layout/gridfixed",
174
+ "/api/html": "/documentation/components/output/html",
175
+ "/api/file_download": "/documentation/components/output/file_download",
176
+ "/api/hbox": "/documentation/components/layout/hbox",
177
+ "/api/vbox": "/documentation/components/layout/vbox",
178
+ "/api/sidebar": "/documentation/components/layout/sidebar",
179
+ "/api/row": "/documentation/components/layout/row",
180
+ "/api/error": "/documentation/components/status/error",
181
+ "/api/info": "/documentation/components/status/info",
182
+ "/api/progress": "/documentation/components/status/progress",
183
+ "/api/spinner": "/documentation/components/status/spinner",
184
+ "/api/success": "/documentation/components/status/success",
185
+ "/api/warning": "/documentation/components/status/warning",
186
+ "/api/image": "/documentation/components/output/image",
187
+ "/api/sql_code": "/documentation/components/output/sql_code",
188
+ "/api/tooltip": "/documentation/components/output/tooltip",
189
+ "/api/chat": "/documentation/components/lab/chat",
190
+ "/api/confirmation_dialog": "/documentation/components/lab/confirmation_dialog",
191
+ "/api/cookies_headers": "/documentation/components/lab/cookies_headers",
192
+ "/api/input_date": "/documentation/components/lab/input_date",
193
+ "/api/button": "/documentation/components/input/button",
194
+ "/api/checkbox": "/documentation/components/input/checkbox",
195
+ "/api/file_browser": "/documentation/components/input/file_browser",
196
+ "/api/file_drop": "/documentation/components/input/file_drop",
197
+ "/api/meta": "/documentation/components/advanced/meta",
198
+ "/api/style": "/documentation/components/advanced/style",
199
+ "/api/menu": "/documentation/components/lab/menu",
200
+ "/api/head": "/documentation/components/page/head",
201
+ "/api/input": "/documentation/components/input/input",
202
+ "/api/select": "/documentation/components/input/select",
203
+ "/api/slider": "/documentation/components/input/slider",
204
+ "/api/switch": "/documentation/components/input/switch",
205
+ "/api/togglebuttons": "/documentation/components/input/togglebuttons",
206
+ "/api/dataframe": "/documentation/components/data/dataframe",
207
+ "/api/pivot_table": "/documentation/components/data/pivot_table",
208
+ "/api/display": "/documentation/api/utilities/display",
209
+ "/api/memoize": "/documentation/api/utilities/memoize",
210
+ "/api/reactive": "/documentation/api/utilities/reactive",
211
+ "/api/widget": "/documentation/api/utilities/widget",
212
+ "/api/default_layout": "/documentation/components/layout",
213
+ "/api/title": "/documentation/components/page/title",
214
+ }
215
+
216
+
217
+ server._redirects = _redirects
218
+ autorouting._redirects = _redirects
13
219
 
14
220
 
15
221
  @solara.component
@@ -96,8 +302,10 @@ def Layout(children=[]):
96
302
  button_text="Quickstart",
97
303
  )
98
304
 
99
- with rv.Container(tag="section", fluid=True, ma_0=True, pa_0=True, class_="fill-height mb-8 solara-content-main"):
100
- if route_current is not None and route_current.path == "/":
305
+ with rv.Container(tag="section", fluid=True, ma_0=True, pa_0=True, class_="fill-height solara-content-main"):
306
+ if route_current is None:
307
+ return solara.Error("Page not found")
308
+ elif route_current.path == "/":
101
309
  description = "Use ipywidgets with Solara to build powerful and scalable web apps for Jupyter and production in Python."
102
310
  # both tags in one
103
311
  solara.Meta(name="description", property="og:description", content=description)
@@ -123,9 +331,9 @@ def Layout(children=[]):
123
331
  """
124
332
  )
125
333
  with solara.HBox():
126
- with solara.Link("/docs"):
127
- solara.Button(label="Read more", class_="ma-1 homepage-button", href="/docs", color="primary", dark=True)
128
- with solara.Link("/docs/quickstart"):
334
+ with solara.Link("/documentation"):
335
+ solara.Button(label="Read more", class_="ma-1 homepage-button", href="/documentation", color="primary", dark=True)
336
+ with solara.Link("/documentation/getting_started"):
129
337
  solara.Button(label="Quickstart", class_="ma-1 homepage-button", color="primary", dark=True)
130
338
  # with rv.Col(md=4, sm=5):
131
339
  # rv.Img(src="https://dxhl76zpt6fap.cloudfront.net/public/landing/what.webp", style_="width:900px")
@@ -181,7 +389,7 @@ def Layout(children=[]):
181
389
  text=True,
182
390
  outlined=False,
183
391
  )
184
- with solara.Link("/examples"):
392
+ with solara.Link("/documentation/examples"):
185
393
  with solara.Column(style="width: 100%;"):
186
394
  solara.Button(
187
395
  label="More examples",
@@ -197,7 +405,7 @@ def Layout(children=[]):
197
405
  In Jupyter or standalone, and run them in production
198
406
  using FastAPI or starlette.
199
407
 
200
- Get more inspiration from our [examples](/examples).
408
+ Get more inspiration from our [examples](/documentation/examples).
201
409
  """
202
410
  )
203
411
  with rv.ExpansionPanels(v_model=target, on_v_model=set_target, mandatory=True, flat=True):
@@ -209,7 +417,8 @@ def Layout(children=[]):
209
417
  rv.ExpansionPanelHeader(children=["FastAPI"])
210
418
  with rv.ExpansionPanelContent():
211
419
  solara.Markdown(
212
- "Using [solara-server](/docs/understanding/solara-server), we can run our app in production using FastAPI."
420
+ """Using [solara-server](documentation/advanced/understanding/solara-server),
421
+ we can run our app in production using FastAPI."""
213
422
  )
214
423
 
215
424
  with solara.Column(style={"width": "100%"}):
@@ -262,26 +471,32 @@ def Layout(children=[]):
262
471
  solara.Markdown("#### Join our Mailing list to get the latest news")
263
472
  with solara.Div(style={"width": "80%"}):
264
473
  MailChimp(location=router.path)
265
-
266
474
  else:
267
475
  with rv.Row(
268
- style_="gap:6rem; flex-wrap: nowrap;", justify="center" if route_current is not None and route_current.path == "showcase" else "start"
476
+ style_="flex-wrap: nowrap; margin: 0; min-height: calc(100vh - 215.5px);",
477
+ justify="center" if route_current is not None and route_current.path in ["documentation", "showcase"] else "start",
269
478
  ):
270
479
  if route_current is not None and hasattr(route_current.module, "Sidebar"):
271
480
  route_current.module.Sidebar() # type: ignore
272
481
  else:
273
- if route_current is not None and route_current.path != "showcase":
482
+ if route_current is not None and route_current.path not in ["documentation", "showcase", "contact", "changelog"]:
274
483
  Sidebar()
275
- with rv.Col(tag="main", md=True, class_="pt-12 pl-12 pr-10", style_="max-width: 1024px; overflow: auto;"):
484
+ with rv.Col(
485
+ tag="main",
486
+ md=True,
487
+ class_="pa-0",
488
+ style_=f"""max-width: {'1024px' if route_current.path not in ['documentation', 'contact', 'changelog']
489
+ else 'unset'}; overflow: hidden auto;""",
490
+ ):
276
491
  if route_current is not None and route_current.path == "/":
277
492
  with rv.Row(align="center"):
278
493
  pass
279
- # with rv.Col(md=6, class_="pa-0"):
280
- # rv.Html(tag="h1", children=["Live Demo"])
281
- # with rv.Col(md=6, class_="d-flex", style_="justify-content: end"):
282
- # rv.Btn(elevation=0, large=True, children=["Running App"], color="primary", class_="btn-size--xlarge")
283
- # solara.Padding(6)
284
- with rv.Row(children=children, class_="solara-page-content-search"):
494
+ with solara.Row(
495
+ children=children,
496
+ justify="center",
497
+ classes=["solara-page-content-search"],
498
+ style=f"height: {'100%' if route_current.path == 'documentation' else 'unset'};",
499
+ ):
285
500
  pass
286
501
 
287
502
  # absolute = True prevents the drawer from being below the overlay it generates
@@ -344,7 +559,6 @@ def Testimonial(text, name, position, img):
344
559
  max_width=max_width,
345
560
  class_="testimonial-card",
346
561
  ):
347
- # rv.CardTitle(children=["Former Plotly CEO"])
348
562
  with rv.CardActions():
349
563
  with rv.ListItem(class_="grow"):
350
564
  with rv.ListItemAvatar(color="grey darken-3"):
@@ -14,7 +14,7 @@ categories = solara.reactive(["Vandalism", "Assault", "Robbery"])
14
14
  limit = solara.reactive(100)
15
15
 
16
16
 
17
- ROOT = Path(solara.__file__).parent / "website" / "pages" / "docs" / "content" / "04-tutorial"
17
+ ROOT = Path(solara.__file__).parent / "website" / "pages" / "documentation" / "getting_started" / "content" / "04-tutorials"
18
18
  path = ROOT / Path("SF_crime_sample.csv.gz")
19
19
  url = "https://raw.githubusercontent.com/widgetti/solara/master/solara/website/pages/docs/content/04-tutorial/SF_crime_sample.csv"
20
20
 
@@ -12,7 +12,7 @@ def SharedComponent():
12
12
  f"""
13
13
  This component will be used on each page.
14
14
 
15
- It uses the `app_state` [reactive variable](https://solara.dev/api/reactive)
15
+ It uses the `app_state` [reactive variable](https://solara.dev/documentation/api/utilities/reactive)
16
16
  so that the state outlives each page
17
17
 
18
18
 
@@ -23,7 +23,7 @@ def Page():
23
23
  It creates the `component_state` [using the use_reactive hook](https://solara.dev/api/use_reactive)
24
24
  so that the state is bound to the component.
25
25
 
26
- See also [about state management](https://solara.dev/docs/fundamentals/state-management) for more information.
26
+ See also [about state management](https://solara.dev/documentation/getting_started/fundamentals/state-management) for more information.
27
27
 
28
28
 
29
29
  component_state: {component_state.value}
@@ -1,3 +1,5 @@
1
+ import pathlib
2
+ import sys
1
3
  from typing import Optional, cast
2
4
 
3
5
  import pandas as pd
@@ -9,11 +11,11 @@ from solara.components.columns import Columns
9
11
  from solara.components.file_drop import FileDrop
10
12
 
11
13
  github_url = solara.util.github_url(__file__)
12
- try:
13
- # fails on pyodide
14
- df_sample = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")
15
- except: # noqa
16
- df_sample = None
14
+ if sys.platform != "emscripten":
15
+ pycafe_url = solara.util.pycafe_url(path=pathlib.Path(__file__), requirements=["solara", "pandas", "plotly"])
16
+ else:
17
+ pycafe_url = None
18
+ df_sample = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")
17
19
 
18
20
 
19
21
  class State:
@@ -72,7 +74,10 @@ def Page():
72
74
  with solara.Row():
73
75
  solara.Button("Sample dataset", color="primary", text=True, outlined=True, on_click=State.load_sample, disabled=df is not None)
74
76
  solara.Button("Clear dataset", color="primary", text=True, outlined=True, on_click=State.reset)
75
- FileDrop(on_file=State.load_from_file, on_total_progress=lambda *args: None, label="Drag file here")
77
+ if sys.platform != "emscripten":
78
+ FileDrop(on_file=State.load_from_file, on_total_progress=lambda *args: None, label="Drag file here")
79
+ else:
80
+ solara.Info("File upload not supported in this environment")
76
81
 
77
82
  if df is not None:
78
83
  solara.SliderFloat(label="Size", value=State.size_max, min=1, max=100)
@@ -112,7 +117,16 @@ def Page():
112
117
  else:
113
118
  solara.Info("No data loaded, click on the sample dataset button to load a sample dataset, or upload a file.")
114
119
 
115
- solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
120
+ with solara.Column(style={"max-width": "400px"}):
121
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
122
+ if sys.platform != "emscripten":
123
+ solara.Button(
124
+ label="Edit this example live on py.cafe",
125
+ icon_name="mdi-coffee-to-go-outline",
126
+ attributes={"href": pycafe_url, "target": "_blank"},
127
+ text=True,
128
+ outlined=True,
129
+ )
116
130
 
117
131
 
118
132
  @solara.component
@@ -0,0 +1,8 @@
1
+ from pathlib import Path
2
+
3
+ import solara
4
+
5
+ title = "Changelog"
6
+ HERE = Path(__file__)
7
+
8
+ Page = solara.Markdown(Path(HERE.parent / "changelog.md").read_text())
@@ -1,9 +1,50 @@
1
1
  # Solara Changelog
2
2
 
3
+ ## Version 1.30.0
4
+
5
+ ### Details
6
+
7
+ * Feature: Multiple file support for `FileDrop`. [#562](https://github.com/widgetti/solara/pull/562)
8
+ * Feature: Solara server is now compatible with Pyodide (threads are combined if they cannot be used). [#569](https://github.com/widgetti/solara/pull/569)
9
+ * Bug Fix: Nested Vuetify apps were not displayed correctly. [#570](https://github.com/widgetti/solara/pull/570)
10
+ * Bug Fix: `on_kernel_start` callbacks were accumulating on hot reload. [#556](https://github.com/widgetti/solara/pull/556)
11
+ * Bug Fix: ES Modules were being loaded multiple times on hot reload. [#559](https://github.com/widgetti/solara/pull/559)
12
+ * Bug Fix: Theme CSS was not loaded when `rootPath` was non-trivial. [829946c](https://github.com/widgetti/solara/commit/829946c4bf47a2ea78d783bb500faaab93b2549b)
13
+ * Fix: `Route.component` is now rendered, instead of the internal `RenderPage` component. [#555](https://github.com/widgetti/solara/pull/555)
14
+ * Fix: `Route.layout` now allows for layouts to be used when defining routes manually. [#554](https://github.com/widgetti/solara/pull/554)
15
+ * Fix: Allow custom command like arguments that can be parsed by the application. [#558](https://github.com/widgetti/solara/pull/558)
16
+
17
+
18
+ ## Version 1.29.1
19
+
20
+ ### Details
21
+
22
+ * Bug Fix: Solara installation failing when using [pixi](https://pixi.sh/latest/). [#553](https://github.com/widgetti/solara/pull/553)
23
+
24
+ ## Version 1.29.0
25
+
26
+ <video width="80%" controls>
27
+ <source src="https://solara-assets.s3.us-east-2.amazonaws.com/videos/solara-1.29-drawdata-na.mp4" type="video/mp4" >
28
+ </video>
29
+
30
+
31
+ ### Highlights
32
+
33
+ * Feature: Improved matplotlib support (pylab interface, display support) making it work more similar as in Jupyter. [#540](https://github.com/widgetti/solara/pull/540)
34
+ * Feature: [use_dark_effective](https://solara.dev/api/use_dark_effective) to get the effective dark mode of the app, making it easier to support dark mode on the Python side [#551](https://github.com/widgetti/solara/pull/551).
35
+
36
+
37
+ ### Details
38
+
39
+ * Feature: [`/resourcez` endpoint](https://solara.dev/docs/understanding/solara-server) to get server resource statistics [#547](https://github.com/widgetti/solara/pull/547).
40
+ * Bug fix: router.push to external links should not use history, allowing navigation to external links [11c6094](https://github.com/widgetti/solara/commit/11c6094f3c47528d40f8be951c1d322e454f98ea).
41
+ * Bug fix: After upgrading widgets, solara server would still use the previous version due to browser cache [#523](https://github.com/widgetti/solara/pull/523).
42
+ * Bug fix: [The example todo app](https://solara.dev/examples/utilities/todo) would not work because Ref(..) did not work in combination with use_reactive [#544](https://github.com/widgetti/solara/pull/544).
43
+
3
44
  ## Version 1.28.0
4
45
 
5
46
  <video width="80%" controls>
6
- <source src=https://dxhl76zpt6fap.cloudfront.net/videos/solara-theme.mp4 type="video/mp4" >
47
+ <source src="https://dxhl76zpt6fap.cloudfront.net/videos/solara-theme.mp4" type="video/mp4" >
7
48
  </video>
8
49
 
9
50
  ### Highlight
@@ -123,7 +164,7 @@
123
164
  ### Highlights
124
165
 
125
166
  * Feature: Solara now has a production mode (enabled by passing in `--production`) which will load optimized CSS and JS and disable hot reloading.
126
- Our [Solara server](https://solara.dev/docs/understanding/solara-server) page contains more information about it. If you used `--reload` or
167
+ Our [Solara server](https://solara.dev/documentation/advanced/understanding/solara-server) page contains more information about it. If you used `--reload` or
127
168
  `--dev` before you can now use the `-a/--auto-restart` flat. The `--dev` and `--reload` flags are kept for backwards compatibility.
128
169
  * Feature: All `Input` components expose the `style` and `classes` arguments for custom styling.
129
170
  * Feature: New component: [`InputDate` and `InputDateRange`](https://solara.dev/api/input_date) which use a datepicker in a menu. (#326)
@@ -0,0 +1,8 @@
1
+ from pathlib import Path
2
+
3
+ import solara
4
+
5
+ title = "Contact"
6
+ HERE = Path(__file__)
7
+
8
+ Page = solara.Markdown(Path(HERE.parent / "contact.md").read_text())