solara 1.30.1__py2.py3-none-any.whl → 1.31.0__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 (438) hide show
  1. {solara-1.30.1.dist-info → solara-1.31.0.dist-info}/METADATA +7 -42
  2. solara-1.31.0.dist-info/RECORD +5 -0
  3. {solara-1.30.1.dist-info → solara-1.31.0.dist-info}/WHEEL +1 -1
  4. {solara/template/portal → solara-1.31.0.dist-info/licenses}/LICENSE +1 -1
  5. solara/__init__.py +0 -123
  6. solara/__main__.py +0 -734
  7. solara/alias.py +0 -6
  8. solara/autorouting.py +0 -545
  9. solara/cache.py +0 -294
  10. solara/checks.html +0 -71
  11. solara/checks.py +0 -224
  12. solara/comm.py +0 -28
  13. solara/components/__init__.py +0 -59
  14. solara/components/alert.py +0 -155
  15. solara/components/applayout.py +0 -393
  16. solara/components/button.py +0 -85
  17. solara/components/card.py +0 -87
  18. solara/components/checkbox.py +0 -50
  19. solara/components/code_highlight_css.py +0 -11
  20. solara/components/code_highlight_css.vue +0 -63
  21. solara/components/columns.py +0 -159
  22. solara/components/component_vue.py +0 -110
  23. solara/components/cross_filter.py +0 -335
  24. solara/components/dataframe.py +0 -546
  25. solara/components/datatable.py +0 -221
  26. solara/components/datatable.vue +0 -175
  27. solara/components/details.py +0 -21
  28. solara/components/download.vue +0 -35
  29. solara/components/echarts.py +0 -75
  30. solara/components/echarts.vue +0 -128
  31. solara/components/figure_altair.py +0 -39
  32. solara/components/file_browser.py +0 -182
  33. solara/components/file_download.py +0 -199
  34. solara/components/file_drop.py +0 -139
  35. solara/components/file_drop.vue +0 -83
  36. solara/components/file_list_widget.vue +0 -78
  37. solara/components/head.py +0 -27
  38. solara/components/head_tag.py +0 -49
  39. solara/components/head_tag.vue +0 -60
  40. solara/components/image.py +0 -173
  41. solara/components/input.py +0 -440
  42. solara/components/link.py +0 -55
  43. solara/components/markdown.py +0 -371
  44. solara/components/markdown_editor.py +0 -25
  45. solara/components/markdown_editor.vue +0 -362
  46. solara/components/matplotlib.py +0 -74
  47. solara/components/meta.py +0 -47
  48. solara/components/misc.py +0 -333
  49. solara/components/pivot_table.py +0 -258
  50. solara/components/pivot_table.vue +0 -158
  51. solara/components/progress.py +0 -47
  52. solara/components/select.py +0 -186
  53. solara/components/select.vue +0 -27
  54. solara/components/slider.py +0 -442
  55. solara/components/slider_date.vue +0 -56
  56. solara/components/spinner-solara.vue +0 -105
  57. solara/components/spinner.py +0 -30
  58. solara/components/sql_code.py +0 -33
  59. solara/components/sql_code.vue +0 -128
  60. solara/components/style.py +0 -105
  61. solara/components/switch.py +0 -68
  62. solara/components/tab_navigation.py +0 -37
  63. solara/components/title.py +0 -90
  64. solara/components/title.vue +0 -38
  65. solara/components/togglebuttons.py +0 -202
  66. solara/components/tooltip.py +0 -61
  67. solara/datatypes.py +0 -143
  68. solara/express.py +0 -241
  69. solara/hooks/__init__.py +0 -4
  70. solara/hooks/dataframe.py +0 -99
  71. solara/hooks/misc.py +0 -263
  72. solara/hooks/use_reactive.py +0 -129
  73. solara/hooks/use_thread.py +0 -129
  74. solara/kitchensink.py +0 -8
  75. solara/lab/__init__.py +0 -34
  76. solara/lab/components/__init__.py +0 -6
  77. solara/lab/components/chat.py +0 -203
  78. solara/lab/components/confirmation_dialog.py +0 -165
  79. solara/lab/components/cross_filter.py +0 -7
  80. solara/lab/components/input_date.py +0 -298
  81. solara/lab/components/menu.py +0 -181
  82. solara/lab/components/menu.vue +0 -38
  83. solara/lab/components/tabs.py +0 -274
  84. solara/lab/components/theming.py +0 -98
  85. solara/lab/components/theming.vue +0 -72
  86. solara/lab/hooks/__init__.py +0 -0
  87. solara/lab/hooks/dataframe.py +0 -12
  88. solara/lab/toestand.py +0 -3
  89. solara/lab/utils/__init__.py +0 -2
  90. solara/lab/utils/cookies.py +0 -5
  91. solara/lab/utils/dataframe.py +0 -115
  92. solara/lab/utils/headers.py +0 -5
  93. solara/layout.py +0 -44
  94. solara/minisettings.py +0 -133
  95. solara/py.typed +0 -0
  96. solara/reactive.py +0 -93
  97. solara/routing.py +0 -268
  98. solara/scope/__init__.py +0 -88
  99. solara/scope/types.py +0 -55
  100. solara/server/__init__.py +0 -0
  101. solara/server/app.py +0 -490
  102. solara/server/assets/custom.css +0 -1
  103. solara/server/assets/custom.js +0 -1
  104. solara/server/assets/favicon.png +0 -0
  105. solara/server/assets/favicon.svg +0 -5
  106. solara/server/assets/style.css +0 -1665
  107. solara/server/assets/theme-dark.css +0 -437
  108. solara/server/assets/theme-light.css +0 -420
  109. solara/server/assets/theme.js +0 -3
  110. solara/server/cdn_helper.py +0 -77
  111. solara/server/esm.py +0 -69
  112. solara/server/fastapi.py +0 -5
  113. solara/server/flask.py +0 -286
  114. solara/server/jupyter/__init__.py +0 -2
  115. solara/server/jupyter/cdn_handler.py +0 -28
  116. solara/server/jupyter/server_extension.py +0 -29
  117. solara/server/jupytertools.py +0 -46
  118. solara/server/kernel.py +0 -319
  119. solara/server/kernel_context.py +0 -396
  120. solara/server/patch.py +0 -552
  121. solara/server/reload.py +0 -242
  122. solara/server/server.py +0 -437
  123. solara/server/settings.py +0 -212
  124. solara/server/shell.py +0 -240
  125. solara/server/starlette.py +0 -597
  126. solara/server/static/ansi.js +0 -270
  127. solara/server/static/highlight-dark.css +0 -82
  128. solara/server/static/highlight.css +0 -43
  129. solara/server/static/main-vuetify.js +0 -260
  130. solara/server/static/main.js +0 -163
  131. solara/server/static/solara_bootstrap.py +0 -129
  132. solara/server/static/sun.svg +0 -23
  133. solara/server/static/webworker.js +0 -42
  134. solara/server/telemetry.py +0 -212
  135. solara/server/templates/index.html.j2 +0 -1
  136. solara/server/templates/loader-plain.css +0 -11
  137. solara/server/templates/loader-plain.html +0 -20
  138. solara/server/templates/loader-solara.css +0 -111
  139. solara/server/templates/loader-solara.html +0 -40
  140. solara/server/templates/plain.html +0 -82
  141. solara/server/templates/solara.html.j2 +0 -446
  142. solara/server/threaded.py +0 -75
  143. solara/server/utils.py +0 -30
  144. solara/server/websocket.py +0 -44
  145. solara/settings.py +0 -56
  146. solara/tasks.py +0 -847
  147. solara/template/button.py +0 -16
  148. solara/template/markdown.py +0 -42
  149. solara/template/portal/.flake8 +0 -6
  150. solara/template/portal/.pre-commit-config.yaml +0 -28
  151. solara/template/portal/Procfile +0 -7
  152. solara/template/portal/mypy.ini +0 -3
  153. solara/template/portal/pyproject.toml +0 -26
  154. solara/template/portal/solara_portal/__init__.py +0 -3
  155. solara/template/portal/solara_portal/components/__init__.py +0 -2
  156. solara/template/portal/solara_portal/components/article.py +0 -28
  157. solara/template/portal/solara_portal/components/data.py +0 -28
  158. solara/template/portal/solara_portal/components/header.py +0 -6
  159. solara/template/portal/solara_portal/components/layout.py +0 -6
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -85
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -70
  162. solara/template/portal/solara_portal/data.py +0 -60
  163. solara/template/portal/solara_portal/pages/__init__.py +0 -67
  164. solara/template/portal/solara_portal/pages/article/__init__.py +0 -26
  165. solara/template/portal/solara_portal/pages/tabular.py +0 -29
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +0 -69
  167. solara/template/portal/solara_portal/pages/viz/overview.py +0 -14
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +0 -698
  170. solara/toestand.py +0 -772
  171. solara/util.py +0 -308
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +0 -462
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +0 -17
  176. solara/website/assets/images/logo_white.svg +0 -50
  177. solara/website/assets/theme.js +0 -8
  178. solara/website/components/__init__.py +0 -5
  179. solara/website/components/algolia.vue +0 -24
  180. solara/website/components/algolia_api.vue +0 -157
  181. solara/website/components/docs.py +0 -118
  182. solara/website/components/header.py +0 -72
  183. solara/website/components/hero.py +0 -15
  184. solara/website/components/mailchimp.py +0 -12
  185. solara/website/components/mailchimp.vue +0 -47
  186. solara/website/components/markdown.py +0 -30
  187. solara/website/components/notebook.py +0 -172
  188. solara/website/pages/__init__.py +0 -575
  189. solara/website/pages/apps/__init__.py +0 -16
  190. solara/website/pages/apps/authorization/__init__.py +0 -118
  191. solara/website/pages/apps/authorization/admin.py +0 -12
  192. solara/website/pages/apps/authorization/users.py +0 -12
  193. solara/website/pages/apps/jupyter-dashboard-1.py +0 -116
  194. solara/website/pages/apps/layout-demo.py +0 -40
  195. solara/website/pages/apps/multipage/__init__.py +0 -38
  196. solara/website/pages/apps/multipage/page1.py +0 -26
  197. solara/website/pages/apps/multipage/page2.py +0 -34
  198. solara/website/pages/apps/scatter.py +0 -136
  199. solara/website/pages/apps/scrolling.py +0 -63
  200. solara/website/pages/apps/tutorial-streamlit.py +0 -18
  201. solara/website/pages/changelog/__init__.py +0 -8
  202. solara/website/pages/changelog/changelog.md +0 -195
  203. solara/website/pages/contact/__init__.py +0 -8
  204. solara/website/pages/contact/contact.md +0 -17
  205. solara/website/pages/doc_use_download.py +0 -85
  206. solara/website/pages/documentation/__init__.py +0 -184
  207. solara/website/pages/documentation/advanced/__init__.py +0 -9
  208. solara/website/pages/documentation/advanced/content/00-overview.md +0 -1
  209. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -6
  210. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -196
  211. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -125
  212. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -154
  213. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -69
  214. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -49
  215. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -124
  216. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -10
  217. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -35
  218. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -42
  219. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -28
  220. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -108
  221. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -23
  222. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -7
  223. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -166
  224. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -18
  225. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -240
  226. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -86
  227. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -12
  228. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -1
  229. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -171
  230. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  231. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -45
  232. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -76
  233. solara/website/pages/documentation/api/__init__.py +0 -19
  234. solara/website/pages/documentation/api/cross_filter/__init__.py +0 -9
  235. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -23
  236. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -22
  237. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -22
  238. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -22
  239. solara/website/pages/documentation/api/hooks/__init__.py +0 -9
  240. solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -25
  241. solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -13
  242. solara/website/pages/documentation/api/hooks/use_effect.md +0 -43
  243. solara/website/pages/documentation/api/hooks/use_effect.py +0 -9
  244. solara/website/pages/documentation/api/hooks/use_exception.py +0 -33
  245. solara/website/pages/documentation/api/hooks/use_memo.md +0 -16
  246. solara/website/pages/documentation/api/hooks/use_memo.py +0 -9
  247. solara/website/pages/documentation/api/hooks/use_previous.py +0 -32
  248. solara/website/pages/documentation/api/hooks/use_reactive.py +0 -15
  249. solara/website/pages/documentation/api/hooks/use_state.py +0 -11
  250. solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -68
  251. solara/website/pages/documentation/api/hooks/use_thread.md +0 -58
  252. solara/website/pages/documentation/api/hooks/use_thread.py +0 -44
  253. solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -13
  254. solara/website/pages/documentation/api/routing/__init__.py +0 -9
  255. solara/website/pages/documentation/api/routing/generate_routes.py +0 -11
  256. solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -11
  257. solara/website/pages/documentation/api/routing/resolve_path.py +0 -36
  258. solara/website/pages/documentation/api/routing/route.py +0 -32
  259. solara/website/pages/documentation/api/routing/use_route.py +0 -80
  260. solara/website/pages/documentation/api/routing/use_router.py +0 -15
  261. solara/website/pages/documentation/api/utilities/__init__.py +0 -9
  262. solara/website/pages/documentation/api/utilities/component_vue.py +0 -11
  263. solara/website/pages/documentation/api/utilities/computed.py +0 -16
  264. solara/website/pages/documentation/api/utilities/display.py +0 -15
  265. solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -16
  266. solara/website/pages/documentation/api/utilities/get_session_id.py +0 -16
  267. solara/website/pages/documentation/api/utilities/memoize.py +0 -36
  268. solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -27
  269. solara/website/pages/documentation/api/utilities/reactive.py +0 -15
  270. solara/website/pages/documentation/api/utilities/widget.py +0 -104
  271. solara/website/pages/documentation/components/__init__.py +0 -12
  272. solara/website/pages/documentation/components/advanced/__init__.py +0 -9
  273. solara/website/pages/documentation/components/advanced/link.py +0 -28
  274. solara/website/pages/documentation/components/advanced/meta.py +0 -21
  275. solara/website/pages/documentation/components/advanced/style.py +0 -44
  276. solara/website/pages/documentation/components/common.py +0 -9
  277. solara/website/pages/documentation/components/data/__init__.py +0 -9
  278. solara/website/pages/documentation/components/data/dataframe.py +0 -44
  279. solara/website/pages/documentation/components/data/pivot_table.py +0 -81
  280. solara/website/pages/documentation/components/enterprise/__init__.py +0 -9
  281. solara/website/pages/documentation/components/enterprise/avatar.py +0 -19
  282. solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -20
  283. solara/website/pages/documentation/components/input/__init__.py +0 -9
  284. solara/website/pages/documentation/components/input/button.py +0 -22
  285. solara/website/pages/documentation/components/input/checkbox.py +0 -12
  286. solara/website/pages/documentation/components/input/file_browser.py +0 -33
  287. solara/website/pages/documentation/components/input/file_drop.py +0 -75
  288. solara/website/pages/documentation/components/input/input.py +0 -18
  289. solara/website/pages/documentation/components/input/select.py +0 -21
  290. solara/website/pages/documentation/components/input/slider.py +0 -28
  291. solara/website/pages/documentation/components/input/switch.py +0 -12
  292. solara/website/pages/documentation/components/input/togglebuttons.py +0 -20
  293. solara/website/pages/documentation/components/lab/__init__.py +0 -9
  294. solara/website/pages/documentation/components/lab/chat.py +0 -108
  295. solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -55
  296. solara/website/pages/documentation/components/lab/cookies_headers.py +0 -48
  297. solara/website/pages/documentation/components/lab/input_date.py +0 -19
  298. solara/website/pages/documentation/components/lab/menu.py +0 -21
  299. solara/website/pages/documentation/components/lab/tab.py +0 -24
  300. solara/website/pages/documentation/components/lab/tabs.py +0 -44
  301. solara/website/pages/documentation/components/lab/task.py +0 -12
  302. solara/website/pages/documentation/components/lab/theming.py +0 -72
  303. solara/website/pages/documentation/components/lab/use_task.py +0 -12
  304. solara/website/pages/documentation/components/layout/__init__.py +0 -9
  305. solara/website/pages/documentation/components/layout/app_bar.py +0 -15
  306. solara/website/pages/documentation/components/layout/app_bar_title.py +0 -15
  307. solara/website/pages/documentation/components/layout/app_layout.py +0 -23
  308. solara/website/pages/documentation/components/layout/card.py +0 -14
  309. solara/website/pages/documentation/components/layout/card_actions.py +0 -15
  310. solara/website/pages/documentation/components/layout/column.py +0 -29
  311. solara/website/pages/documentation/components/layout/columns.py +0 -26
  312. solara/website/pages/documentation/components/layout/columns_responsive.py +0 -67
  313. solara/website/pages/documentation/components/layout/griddraggable.py +0 -61
  314. solara/website/pages/documentation/components/layout/gridfixed.py +0 -21
  315. solara/website/pages/documentation/components/layout/hbox.py +0 -17
  316. solara/website/pages/documentation/components/layout/row.py +0 -29
  317. solara/website/pages/documentation/components/layout/sidebar.py +0 -23
  318. solara/website/pages/documentation/components/layout/vbox.py +0 -19
  319. solara/website/pages/documentation/components/output/__init__.py +0 -9
  320. solara/website/pages/documentation/components/output/file_download.py +0 -12
  321. solara/website/pages/documentation/components/output/html.py +0 -22
  322. solara/website/pages/documentation/components/output/image.py +0 -12
  323. solara/website/pages/documentation/components/output/markdown.py +0 -59
  324. solara/website/pages/documentation/components/output/markdown_editor.py +0 -53
  325. solara/website/pages/documentation/components/output/sql_code.py +0 -84
  326. solara/website/pages/documentation/components/output/tooltip.py +0 -12
  327. solara/website/pages/documentation/components/page/__init__.py +0 -9
  328. solara/website/pages/documentation/components/page/head.py +0 -19
  329. solara/website/pages/documentation/components/page/title.py +0 -28
  330. solara/website/pages/documentation/components/status/__init__.py +0 -9
  331. solara/website/pages/documentation/components/status/error.py +0 -40
  332. solara/website/pages/documentation/components/status/info.py +0 -40
  333. solara/website/pages/documentation/components/status/progress.py +0 -10
  334. solara/website/pages/documentation/components/status/spinner.py +0 -10
  335. solara/website/pages/documentation/components/status/success.py +0 -40
  336. solara/website/pages/documentation/components/status/warning.py +0 -47
  337. solara/website/pages/documentation/components/viz/__init__.py +0 -9
  338. solara/website/pages/documentation/components/viz/altair.py +0 -44
  339. solara/website/pages/documentation/components/viz/echarts.py +0 -78
  340. solara/website/pages/documentation/components/viz/matplotlib.py +0 -32
  341. solara/website/pages/documentation/components/viz/plotly.py +0 -63
  342. solara/website/pages/documentation/components/viz/plotly_express.py +0 -41
  343. solara/website/pages/documentation/examples/__init__.py +0 -52
  344. solara/website/pages/documentation/examples/ai/__init__.py +0 -10
  345. solara/website/pages/documentation/examples/ai/chatbot.py +0 -96
  346. solara/website/pages/documentation/examples/ai/tokenizer.py +0 -106
  347. solara/website/pages/documentation/examples/basics/__init__.py +0 -2
  348. solara/website/pages/documentation/examples/basics/sine.py +0 -28
  349. solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -9
  350. solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -3
  351. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -3
  352. solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -3
  353. solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -3
  354. solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -3
  355. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -3
  356. solara/website/pages/documentation/examples/general/__init__.py +0 -9
  357. solara/website/pages/documentation/examples/general/custom_storage.py +0 -69
  358. solara/website/pages/documentation/examples/general/deploy_model.py +0 -114
  359. solara/website/pages/documentation/examples/general/live_update.py +0 -38
  360. solara/website/pages/documentation/examples/general/login_oauth.py +0 -76
  361. solara/website/pages/documentation/examples/general/mycard.vue +0 -58
  362. solara/website/pages/documentation/examples/general/pokemon_search.py +0 -51
  363. solara/website/pages/documentation/examples/general/vue_component.py +0 -50
  364. solara/website/pages/documentation/examples/ipycanvas.py +0 -49
  365. solara/website/pages/documentation/examples/libraries/__init__.py +0 -9
  366. solara/website/pages/documentation/examples/libraries/altair.py +0 -63
  367. solara/website/pages/documentation/examples/libraries/bqplot.py +0 -39
  368. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -32
  369. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -65
  370. solara/website/pages/documentation/examples/utilities/__init__.py +0 -9
  371. solara/website/pages/documentation/examples/utilities/calculator.py +0 -157
  372. solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -64
  373. solara/website/pages/documentation/examples/utilities/todo.py +0 -195
  374. solara/website/pages/documentation/examples/visualization/__init__.py +0 -6
  375. solara/website/pages/documentation/examples/visualization/annotator.py +0 -68
  376. solara/website/pages/documentation/examples/visualization/linked_views.py +0 -84
  377. solara/website/pages/documentation/examples/visualization/plotly.py +0 -43
  378. solara/website/pages/documentation/faq/__init__.py +0 -12
  379. solara/website/pages/documentation/faq/content/99-faq.md +0 -76
  380. solara/website/pages/documentation/getting_started/__init__.py +0 -9
  381. solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -89
  382. solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -125
  383. solara/website/pages/documentation/getting_started/content/02-installing.md +0 -85
  384. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -14
  385. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -13
  386. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -89
  387. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -124
  388. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -146
  389. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -144
  390. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -64
  391. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -445
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -1000
  394. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -11
  395. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -223
  396. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -88
  397. solara/website/pages/documentation/getting_started/content/06-reference/00-overview.md +0 -3
  398. solara/website/pages/documentation/getting_started/content/06-reference/40-static_files.md +0 -31
  399. solara/website/pages/documentation/getting_started/content/06-reference/41-asset-files.md +0 -36
  400. solara/website/pages/documentation/getting_started/content/06-reference/60-static-site-generation.md +0 -59
  401. solara/website/pages/documentation/getting_started/content/06-reference/70-search.md +0 -34
  402. solara/website/pages/documentation/getting_started/content/06-reference/80-reloading.md +0 -34
  403. solara/website/pages/documentation/getting_started/content/06-reference/90-notebook-support.md +0 -7
  404. solara/website/pages/documentation/getting_started/content/06-reference/95-caching.md +0 -148
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -7
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -273
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -80
  408. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -7
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -26
  410. solara/website/pages/docutils.py +0 -38
  411. solara/website/pages/showcase/__init__.py +0 -105
  412. solara/website/pages/showcase/domino_code_assist.py +0 -60
  413. solara/website/pages/showcase/planeto_tessa.py +0 -19
  414. solara/website/pages/showcase/solara_dev.py +0 -54
  415. solara/website/pages/showcase/solarathon_2023_team_2.py +0 -22
  416. solara/website/pages/showcase/solarathon_2023_team_4.py +0 -22
  417. solara/website/pages/showcase/solarathon_2023_team_5.py +0 -23
  418. solara/website/pages/showcase/solarathon_2023_team_6.py +0 -34
  419. solara/website/pages/showcase/wanderlust.py +0 -27
  420. solara/website/public/beach.jpeg +0 -0
  421. solara/website/public/logo.svg +0 -6
  422. solara/website/public/social/discord.svg +0 -1
  423. solara/website/public/social/github.svg +0 -1
  424. solara/website/public/social/twitter.svg +0 -3
  425. solara/website/public/success.html +0 -25
  426. solara/website/templates/index.html.j2 +0 -117
  427. solara/website/utils.py +0 -51
  428. solara/widgets/__init__.py +0 -1
  429. solara/widgets/vue/gridlayout.vue +0 -110
  430. solara/widgets/vue/html.vue +0 -4
  431. solara/widgets/vue/navigator.vue +0 -104
  432. solara/widgets/vue/vegalite.vue +0 -115
  433. solara/widgets/widgets.py +0 -65
  434. solara-1.30.1.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -7
  435. solara-1.30.1.data/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -7
  436. solara-1.30.1.dist-info/RECORD +0 -437
  437. solara-1.30.1.dist-info/entry_points.txt +0 -5
  438. /solara-1.30.1.dist-info/licenses/LICENSE → /LICENSE +0 -0
@@ -1,125 +0,0 @@
1
- ---
2
- title: A quick introduction to Solara
3
- description: Solara is an Open Source library that lets you use and build data-focused web apps (data apps) using reusable UI components. Here you'll learn the basics!
4
- ---
5
- # Introduction
6
-
7
-
8
- ## What is Solara?
9
-
10
- Solara is an Open Source library that lets you use and build data-focused web apps (data apps) using reusable UI components. Your app will work in the Jupyter notebook and production-grade web frameworks (FastAPI, Starlette, Flask, ...).
11
-
12
- Solara uses proven technologies and mature standards. Grow from a one-off experiment in the Jupyter notebook to a dynamic data portal in production. Built on top of [Reacton](/documentation/advanced/understanding/reacton) to keep your code complexity under control and [IPywidgets](/documentation/advanced/understanding/ipywidgets) to access a rich set of UI libraries without having to write Javascript or CSS.
13
-
14
- We care about developer experience. Solara will give your hot code reloading and type hints for faster development.
15
-
16
- ## Why is Solara created?
17
-
18
- How much time have you wasted investing in a web framework only to find out that what you need is impossible to do?
19
-
20
- Many frameworks only solve a specific set of problems. Once you step outside of the paved path, you get stuck.
21
-
22
- On the other extreme, you might be working with a library with no clear patterns that let you do anything. You may only be weeks away from a total code complexity nightmare, which slowly kills your project.
23
-
24
- At the same time, starting a new framework from scratch would be unwise. We prefer to build on top of solid, battle-tested libraries, such as [IPywidgets](/documentation/advanced/understanding/ipywidgets).
25
-
26
- ## Why use Solara?
27
-
28
- Instead of inventing a new API with an unknown track record, we take a different approach. We look at the JavaScript world. React is a technology that has proven itself for many years. It has shown to be a good all-around model for building complex UIs.
29
-
30
- [Reacton](/documentation/advanced/understanding/reacton) is the equivalent of ReactJS for Python (and IPywidgets). It allows us to use the same reusable components and hooks as in the ReactJS ecosystem. Using Reacton, we build web/data applications without suffering from complex code bases.
31
-
32
- Looking again at the JavaScript world, we see software such as NextJS is putting a framework around ReactJS. NextJS is more opinionated than ReactJS and adds more "batteries" such as routing.
33
-
34
- Solara plays a similar role as NextJS. It builds on top of Reacton but handles things like routing for you.
35
-
36
- But Solara is also different and is even more opinionated than NextJS. The reason for this is its focus on the data-heavy Python ecosystem. For this reason, it comes with many components and hooks that make building beautiful data apps easier (see our [Documentation](/documentation)).
37
-
38
- Solara is a clear, systematic, Python-based web framework using industry-trusted technology. Smooth developer experience and enforced code modularity will allow you to build a data app at any scale while maintaining simple code.
39
-
40
- ## A quick Solara example
41
-
42
- For your understanding, it might be good just to run an example.
43
-
44
- Follow the [installation instructions](/documentation/getting_started/installing) or do the TLDR:
45
-
46
- $ pip install solara
47
-
48
-
49
- Create a file `myapp.py`, or put the following code in the Jupyter notebook:
50
-
51
- ```solara
52
- import solara
53
-
54
- clicks = solara.reactive(0)
55
-
56
-
57
- @solara.component
58
- def Page():
59
- def increase_clicks():
60
- clicks.value += 1
61
-
62
- solara.Button(label=f"Clicked {clicks} times", on_click=increase_clicks)
63
-
64
- # in the Jupyter notebook, uncomment the next line:
65
- # display(Page())
66
- ```
67
-
68
- *Note that the above output is __live__, you can click the button and see the behaviour*.
69
-
70
- Run solara-server (if *not* using the Jupyter notebook)
71
-
72
- $ solara run myapp.py
73
- Solara server is starting at http://localhost:8765
74
-
75
- The browser should open http://127.0.0.1:8765
76
-
77
-
78
-
79
-
80
- ## How does Solara fit into the big picture?
81
-
82
- Solara is actually two things.
83
-
84
- ### Solara server
85
- [Solara server](/documentation/advanced/understanding/solara-server) renders ipywidgets in the browser in a very efficient manner and takes care of many other things
86
- such as [routing](/documentation/advanced/understanding/routing) and [Static Site Generation](/documentation/getting_started/reference/static-site-generation).
87
-
88
- ### Solara UI
89
-
90
- The UI part is built on top of [Reacton](/documentation/advanced/understanding/reacton), which uses the existing IPyWidgets stack. It gives a consistent set
91
- of modern UI components with the Material Design look, as well as a set of routines to make application development of data heavy web apps
92
- easier.
93
-
94
-
95
- ### Overview
96
- If you use Jupyter, then you probably use the Jupyter notebook, Lab, or [Voila](/documentation/advanced/understanding/voila) to get your widgets into the browser. You may not care about [Solara server](/documentation/advanced/understanding/solara-server) and can focus on just the UI part.
97
-
98
- If you don't use Jupyter, don't know what it is, or are an ML Ops, Dev Ops, or Sys Admin, you are probably more interested in the Solara server.
99
-
100
- ![Solara stack](https://dxhl76zpt6fap.cloudfront.net/public/docs/solara-stack.webp)
101
-
102
- ## How do I learn Solara?
103
-
104
- We recommend going through the documentation linearly following the arrows on the bottom, meaning you will go through:
105
-
106
- * [Installing](/documentation/getting_started/installing)
107
- * [Quick start](/documentation/getting_started)
108
- * [Tutorials](/documentation/getting_started/tutorials)
109
-
110
- If you want to know more about specific parts, you can go through the [How-to section](/documentation/advanced/howto) to learn more. Feel free to skip chapters, and go back to topics when you need to.
111
-
112
-
113
- If you want to know what components or hooks are available, or want to know more about a specific component, check out the [Documentation](/documentation) which includes live code examples. Other reference documentation can be found at the [reference section](/documentation/getting_started/reference)
114
-
115
- If you feel like you miss some basic understanding and want to give a bit deeper into the what and why feel free to explore the [Understanding section](/documentation/advanced/understanding).
116
-
117
-
118
- [Our examples](/documentation/examples) may help you see how particular problems can be solved using Solara, or as inspiration. If you want to contribute an example, contact us on GitHub or directly open a [Pull Request](https://github.com/widgetti/solara/).
119
-
120
-
121
- ## Where can I hire an expert?
122
-
123
- If you need consulting, training or development, you can reach us at:
124
-
125
- contact@solara.dev
@@ -1,85 +0,0 @@
1
- ---
2
- title: Installing Solara
3
- description: Installation should be as easy as running pip install Solara. Read on for advanced setups.
4
- ---
5
- # Installation
6
-
7
- ## Create a virtual environment
8
-
9
- It is best to install Solara into a virtual environment unless you know what you are doing (you already have a virtual environment, or you are using conda or docker).
10
-
11
- See also [The Python Packaging User Guide](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment) for more information about virtual environments.
12
-
13
-
14
- ### OSX/Unix/Linux
15
-
16
- Setting up a virtual environment on OSX/Unix/Linux:
17
-
18
- $ python -m venv solara-env
19
- $ source ./solara-env/bin/activate
20
-
21
- ### Windows
22
-
23
- Setting up a virtual environment on Windows:
24
-
25
- > py -m venv solara-env
26
- > solara-env\Scripts\activate
27
-
28
-
29
- ## Install Solara as a user
30
-
31
- Now install Solara using pip:
32
-
33
- $ pip install solara
34
-
35
- ## Bleeding edge
36
-
37
- If you want to install an unreleased version of Solara (e.g. because we just merged a feature you need)
38
-
39
-
40
- ```
41
- $ pip install "solara @ git+https://github.com/widgetti/solara"
42
- ```
43
-
44
- Or put the following in your `requirements.txt`:
45
-
46
- ```
47
- solara @ https://github.com/widgetti/solara/package/archive/master.tar.gz
48
-
49
- ```
50
-
51
- If you want to do development on Solara, read the [development documentation](/documentation/advanced/development/setup).
52
-
53
- ## Air-gapped installation / Firewalled network
54
-
55
- If you want to have Solara running in an air-gapped environment or where access to a CDN is not possible due to firewall rules, you have two options
56
-
57
-
58
- ### Pre-install assets
59
-
60
- Normally, Solara fetches assets (CSS, JavaScript and fonts) from a CDN on the fly, if that is not possible, you can pre-install the assets by running
61
-
62
- ```
63
- $ pip install "solara[assets]"
64
- ```
65
-
66
- ### Airgapped install
67
-
68
- If you cannot install `solara` or `solara-assets` from pypi because the server is not connected to the internet, you can
69
- follow the following steps to install Solara:
70
-
71
- ```bash
72
- # Download the required wheels from pypi.
73
- $ pip wheel --wheel-dir solara-air-gapped "solara[assets]"
74
- # Zip them in a tarball.
75
- $ tar zcfv solara-air-gapped.tar.gz solara-air-gapped
76
- # Copy the tarball to your server.
77
- $ scp solara-air-gapped.tar.gz yourusername@youmachine:~/solara-air-gapped.tar.gz
78
- # ssh into your server.
79
- $ ssh yourusername@yourmachine
80
- ...
81
- # Unzip the tarball.
82
- $ tar zxfv solara-air-gapped.tar.gz
83
- # Install all wheels.
84
- $ pip install solara-air-gapped/*.whl
85
- ```
@@ -1,14 +0,0 @@
1
- ---
2
- title: Solara Tutorials
3
- description: A collection of tutorials for those learning to use Solara, each geared towards a users coming from particular backgrounds, such as data science, or
4
- users coming from other frameworks like Streamlit.
5
- ---
6
- # Tutorials
7
-
8
- Instead of having one tutorial, we have tutorials for different audiences.
9
-
10
- * [Jupyter Dashboard](/documentation/getting_started/tutorials/jupyter-dashboard-part1): Learn to create a dashboard in the Jupyter notebook.
11
- * [Data science](/documentation/getting_started/tutorials/data-science): In this tutorial, we will introduce Solara from the perspective of a data scientist or when you are thinking of using Solara for a data science app.
12
- * [Web app](/documentation/getting_started/tutorials/web-app): You are not a data scientist, but you are interested in using Solara to create a web app using Pure Python.
13
- * [IPywidgets user](/documentation/getting_started/tutorials/ipywidgets): If you are already using [ipywidgets](/documentation/advanced/understanding/ipywidgets) you will learn how to use the [Solara server](/documentation/advanced/understanding/solara-server) to render your regular ipywidget applications.
14
- * [Streamlit](/documentation/getting_started/tutorials/streamlit): If you are an existing Streamlit user, this might appeal more to you.
@@ -1,13 +0,0 @@
1
- from pathlib import Path
2
-
3
- import solara
4
- import solara.components.applayout
5
- from solara.website.components.notebook import Notebook
6
-
7
- HERE = Path(__file__).parent
8
-
9
-
10
- @solara.component
11
- def Page():
12
- # only execute once, other
13
- Notebook(HERE / "_data_science.ipynb")
@@ -1,89 +0,0 @@
1
- ---
2
- title: Tutorial - Building web apps in python using Solara
3
- description: In this tutorial, you will learn how to use Solara to create a tiny web app using only Python. You can run these apps using either Solara server,
4
- Jupyter lab / notebook, or whatever server infrastructure you prefer.
5
- ---
6
- # Tutorial: Web app
7
-
8
- In this tutorial, you will learn how to use Solara to create a tiny web app using only Python.
9
-
10
- ## You should know
11
- This tutorial will assume you have successfully installed Solara.
12
-
13
- If not, please follow the [Installation guide](/documentation/getting_started/installing).
14
-
15
- ## Generate a script file
16
- The simplest way to get started is to run the command
17
-
18
- ```bash
19
- $ solara create button
20
- Wrote: /Users/maartenbreddels/github/widgetti/solara/sol.py
21
- Run as:
22
- $ solara run /Users/maartenbreddels/github/widgetti/solara/sol.py
23
- ```
24
-
25
- This will create the `sol.py` file with the following content.
26
- ```solara
27
- import solara
28
-
29
- clicks = solara.reactive(0)
30
-
31
-
32
- @solara.component
33
- def Page():
34
- color = "green"
35
- if clicks.value >= 5:
36
- color = "red"
37
-
38
- def increment():
39
- clicks.value += 1
40
- print("clicks", clicks)
41
-
42
- solara.Button(label=f"Clicked: {clicks}", on_click=increment, color=color)
43
- ```
44
-
45
-
46
- ## Run the script
47
-
48
- Using [Solara server](/documentation/advanced/understanding/solara-server), we can now run our Python script using:
49
-
50
- ```bash
51
- $ solara run sol.py
52
- Solara server is starting at http://localhost:8765
53
- ```
54
-
55
- If you open the URL in your browser ([or click here](http://localhost:8765)), you should see the same example as above.
56
-
57
- Solara will run your script once, and will look for the `Page` component. Solara expects this component to exist
58
- and be a [Reacton](/documentation/advanced/understanding/reacton) component. (See the [IPywidget tutorial](/documentation/getting_started/tutorials/ipywidgets) to learn how to render a regular ipywidget).
59
-
60
- Since your script is only run once, you could put in the main body of your script code that only needs to run once (e.g. loading data from disk)
61
-
62
- Every browser/user that connects will get an independent version of the state (in this case the number of clicks), so
63
- you do not share the number of clicks with other people.
64
-
65
- ## Modify the script
66
-
67
- Lets modify the script a little bit, possibly in this way:
68
-
69
- ```diff
70
- - solara.Button(label=f"Clicked: {clicks}", on_click=increment, color=color)
71
- + label = "Not clicked yet" if clicks.value == 0 else f"Clicked: {clicks}"
72
- + solara.Button(label=label, on_click=increment, color=color)
73
- ```
74
-
75
- If we save the script, Solara will automatically reload your script and update
76
- your browser (we call this feature [hot reloading](/documentation/getting_started/reference/reloading)).
77
-
78
- Note that Solara will remember your state (e.g., the number of buttons clicked) when the app reloads.
79
-
80
- (*Note: Upgrade to solara 1.14.0 for a fix in hot reloading using `pip install "solara>=1.14.0"`*)
81
-
82
- ## What you have learned
83
-
84
- * How to create a Python script `sol.py` by running `solara create button`
85
- * How to run the script with Solara server by running `solara run sol.py`
86
- * Your script is executed once, which is useful for loading data in the main body of your script only once.
87
- * Your script should have a component called `Page`.
88
- * Every user has its own state (in the above example, the number of clicks)
89
- * If you save your script, Solara will automatically re-execute your script, and all attached users will see the changes directly (hot reloading).
@@ -1,124 +0,0 @@
1
- ---
2
- title: Tutorial - Building ipywidgets based apps
3
- description: Ipywidgets can be used together with Solara to build and quickly get to users your data apps or dashboards.
4
- ---
5
- # Tutorial: IPywidgets
6
-
7
- If you are already using [ipywidgets](/documentation/advanced/understanding/ipywidgets) in the notebook, possibly using [Voila](/documentation/advanced/understanding/voila), you might be pleased to know that you
8
- can also use the [Solara server](/documentation/advanced/understanding/solara-server) to render your regular ipywidget application.
9
-
10
- We recommend you learn how to write applications using [Reacton](/documentation/advanced/understanding/reacton). However, if you have already written an application in
11
- pure [ipywidgets](/documentation/advanced/understanding/ipywidgets), this approach will let you gradually move from pure ipywidgets to Reacton.
12
-
13
- ## You should know
14
- This tutorial will assume you have successfully installed Solara.
15
-
16
- If not, please follow the [Installation guide](/documentation/getting_started/installing).
17
-
18
- ## Your first ipywidget based Solara app
19
-
20
- Put the following code in a file called `sol-ipywidgets.py`:
21
-
22
- ```python
23
- import ipywidgets as widgets
24
-
25
- clicks = 0
26
-
27
- print("I get run at startup, and for every page request")
28
-
29
- def on_click(button):
30
- global clicks
31
- clicks += 1
32
- button.description = f"Clicked {clicks} times"
33
-
34
-
35
- button = widgets.Button(description="Clicked 0 times")
36
- button.on_click(on_click)
37
- ```
38
-
39
- And run the following command in your shell
40
- ```bash
41
- $ solara run sol-ipywidgets.py:button
42
- Solara server is starting at http://localhost:8765
43
- I get run at startup, and for every page request
44
- ...
45
- # your browser opens http://localhost:8765
46
- I get run at startup, and for every page request
47
- ...
48
- ```
49
-
50
- The Solara server will execute your script once before any browser connects,
51
- as demonstrated by the `"I get run at startup, and for every page request"` output.
52
-
53
- The `:button` part on the command line tells the Solara server the variable name of
54
- the widget it should render. The default name for a widget variable Solara will look
55
- for is `page`.
56
-
57
- For every page request (for instance, you open a second tab, or do a page refresh)
58
- you will see the same text printed out in the terminal.
59
- This tell you that each "tab" gets its own run, and its own namespace, which means
60
- that the `clicks` variable is not shared between multiple users.
61
-
62
- If you refresh the page, the script is executed again, and the `clicks` is set to
63
- `0` again.
64
-
65
- ## Hot reloading
66
-
67
- If you edit your script, and save it, Solara server will re-execute it for all connected users without you having to manually refresh your browser.
68
-
69
- Try making the following code change (remove the first, add the last), and watch your browser page instantly refresh.
70
- ```diff
71
- - button = widgets.Button(description="Clicked 0 times")
72
- + button = widgets.Button(description="Did not click yet!")
73
- ```
74
-
75
- ## Using Solara components
76
-
77
- There are a lot of [valuable components in Solara](/documentation/components), but they are written as [Reacton/Solara components](/documentation/advanced/understanding/reacton-basics), not
78
- classic ipywidgets.
79
-
80
- Use the [.widget(...)](/documentation/api/utilities/widget) method on a component to create a widget that can be used in your existing classic ipywidget application.
81
-
82
- ```python
83
-
84
- import ipywidgets as widgets
85
-
86
- import solara
87
-
88
- clicks = 0
89
-
90
-
91
- def on_click(button):
92
- global clicks
93
- clicks += 1
94
- button.description = f"Clicked {clicks} times"
95
-
96
-
97
- button = widgets.Button(description="Clicked 0 times")
98
- button.on_click(on_click)
99
-
100
- page = widgets.VBox(
101
- [
102
- button,
103
- # using .widget(..) we can create a classic ipywidget from a solara component
104
- solara.FileDownload.widget(data="some text data", filename="solara-demo.txt"),
105
- ]
106
- )
107
- ```
108
-
109
- Now we can run this app using:
110
- ```
111
- $ solara run sol-ipywidgets.py
112
- ```
113
-
114
- Note that we did not include the `:page` here, since solara will automatically look for that.
115
-
116
- ## What you have learned
117
-
118
- * [Solara server](/documentation/advanced/understanding/solara-server) can render [ipywidgets](/documentation/advanced/understanding/ipywidgets).
119
- * Running `$ solara run filename.py:variablename` tells Solara which script to execute and which variable name from the script to render.
120
- * The script is executed:
121
- * Once, when the solara server starts.
122
- * On each page request.
123
- * For each open browser page/tab, when the script is saved (hot reloading).
124
- * Using the [.widget(...)](/documentation/api/utilities/widget) method we can start using Solara components in classic ipywidget app.
@@ -1,146 +0,0 @@
1
- ---
2
- title: Using Solara as a more scalable alternative to Streamlit
3
- description: If you are coming from Streamlit, it should be simple to adapt to using Solara, and take advantage of partial re-execution, state
4
- management, and reusable components.
5
- ---
6
- # Tutorial: Streamlit
7
-
8
- If you are coming from [Streamlit](https://streamlit.io/) you may be happy to know Solara does not re-execute your whole script. We execute components (starting with the `Page` component), and only need to re-execute what needs to.
9
-
10
-
11
- ## Streamlit example
12
- Let us start with a typical streamlit example:
13
-
14
- ```python
15
- import streamlit as st
16
-
17
- with st.sidebar:
18
- st.markdown("## My First Solara tutorial ☀️")
19
- x = st.slider("x")
20
- x_squared = x**2
21
- st.markdown(f"{x} squared = {x_squared}")
22
- ```
23
-
24
- ## Translated to Solara
25
-
26
- We now translate this to the equivalent in Solara. The largest difference is we need to explicitly create (application) state using [`solara.reactive`](/documentation/api/utilities/reactive). By passing the
27
- reactive variable to the [SliderInt](/documentation/components/input/slider) via `value=x` we set up a two way binding between the component and the reactive variable. The generated text is passed down to the [Markdown](/documentation/components/output/markdown) component.
28
-
29
-
30
- ```solara
31
- import solara
32
-
33
- x = solara.reactive(2)
34
-
35
-
36
- @solara.component
37
- def Page():
38
- x_squared = x.value**2
39
-
40
- with solara.Sidebar():
41
- solara.Markdown("## My First Solara app ☀️")
42
- solara.SliderInt(label="x", value=x)
43
- solara.Markdown(f"{x.value} squared = {x_squared}")
44
- ```
45
-
46
- ### Running this example using Solara server
47
-
48
- If you put this script in a file called `sol.py` and run
49
- ```
50
- $ solara run sol.py
51
- ```
52
- You will see:
53
- ![app screenshot](https://dxhl76zpt6fap.cloudfront.net/public/docs/app-squared.webp)
54
-
55
- Because we do some styling and because the sidebar is already used up, our preview on this page looks slightly different.
56
-
57
- [Navigate to /apps/tutorial-streamlit](/apps/tutorial-streamlit) to see this app fullscreen.
58
-
59
-
60
- ### Running this example in the notebook
61
-
62
- If you add the above code snippet to your notebook, and include `Page()` at the end of your notebook cell, you should see:
63
- ![app screenshot](https://dxhl76zpt6fap.cloudfront.net/public/docs/app-squared-notebook.webp)
64
-
65
- Again, slightly different for a different environment.
66
-
67
- ## Hot reloading
68
-
69
- If you are using [Solara server](/documentation/advanced/understanding/solara-server), try editing `sol.py`, and watch the page reload automatically after you save your file. Notebook users can simply edit and re-run.
70
-
71
- (*Note: Upgrade to solara 1.14.0 for a fix in hot reloading using `pip install "solara>=1.14.0"`*)
72
-
73
- ## How are streamlit and Solara different?
74
-
75
- ### Execution model
76
- As the introduction says, Solara does not re-execute your whole script after user interactions.
77
- The main script is executed only once. With Solara you can use your main script to read large dataframes, or do some pre-calculations without the need for [caching](/documentation/getting_started/reference/caching).
78
-
79
- When a user navigates to a Solara server, the `Page` component (basically a function) will get executed. The `Page` component will call (lazily) new components like [solara.Markdown](/documentation/components/output/markdown) to build up the page. If state changes due to user input, Solara will trigger a cascade of re-excecutions of components which inputs or state changed, but never your whole script, nor every component.
80
-
81
- ### State
82
- With Solara (and [Reacton](/documentation/advanced/understanding/reacton)) state does not live in a UI component (like a slider). Application state created with [`solara.reactive`](/documentation/api/utilities/reactive) lives on its own. Connecting the state to the UI component (in this case a slider) is a separate step, done via `value=x` in the above example. In general we recommend organising your components
83
- similarly as in the example: [First use_state and other hooks, then calculations, at last the UI components](/documentation/advanced/understanding/anatomy).
84
-
85
- For complex situations, it is important to separate the state and the UI. Especially when you need the state of a UI component as input of the UI component itself, you can get stuck with streamlit. In Solara this follows naturally.
86
-
87
-
88
- ## Creating a reusable component
89
-
90
-
91
- A big advantage of Solara is that you can create reusable components. A single component can be seen as the equivalent of a single streamlit script. However, in that case, we need to modify our component to have its own state, rather than using global application state, for this you can use the [`use_reactive`](/documentation/api/hooks/use_reactive), or [`use_state`](/documentation/api/hooks/use_state) hook.
92
- Read more about state management in the [state management](/documentation/getting_started/fundamentals/state-management) section.
93
-
94
- ```solara
95
- import solara
96
-
97
-
98
- @solara.component
99
- def Square(name: str):
100
- # x = solara.use_reactive(2) # another possibility
101
- x, set_x = solara.use_state(2)
102
- y = x**2
103
- with solara.Sidebar():
104
- solara.SliderInt(label=name, value=x, on_value=set_x)
105
- solara.Markdown(f'{name}: {x} squared = {y}')
106
-
107
-
108
- @solara.component
109
- def Page():
110
- Square('a')
111
- Square('b')
112
- ```
113
-
114
- In this example, each instance of the `Square` component, calls `use_state`, and therefore has its own private
115
- x variable. Truly reusable UI components!
116
-
117
- In streamlit, this is trickier. While this would work:
118
-
119
- ```python
120
- import streamlit as st
121
-
122
-
123
- def square(name):
124
- with st.sidebar:
125
- x = st.slider(name)
126
- x_squared = x**2
127
- st.markdown(f"{name}: {x} squared = {x_squared}")
128
-
129
- square("x")
130
- square("y")
131
- ```
132
-
133
- Changing that "y" to "x" will lead to an error, however. If this is a problem in practice depends on the situation.
134
-
135
- ### Long running function
136
-
137
- In Streamlit, it is normal for your main script to block execution. In Solara, the functions bodies of your components ([called render functions](/documentation/advanced/understanding/anatomy)) should not block. Functions that block, or take a long time to execute, should be executed in a thread, such that rendering can continue. Using threads may sound scary, but using the
138
- [use_thread](/documentation/api/hooks/use_thread) hook will help a lot.
139
-
140
- ## What you have learned
141
-
142
- * Solara will not continuously re-execute your script as Streamlit does.
143
- * Solara will re-execute components instead, only what needs to.
144
- * State in Solara is separate from the UI components, unlike streamlit, where they are strongly linked.
145
- * State can be on the application level (global) for simplicity or on the component level (local) for creating reusable components.
146
- * Solara should not block the render loop. Long-running functions should be executed in a thread using [use_thread](/documentation/api/hooks/use_thread).