solara 1.30.1__py2.py3-none-any.whl → 1.32.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.32.0.dist-info}/METADATA +12 -42
  2. solara-1.32.0.dist-info/RECORD +5 -0
  3. {solara-1.30.1.dist-info → solara-1.32.0.dist-info}/WHEEL +1 -1
  4. {solara/template/portal → solara-1.32.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,51 +0,0 @@
1
- """# Pokemon search
2
-
3
- This example shows to to dynamically fetch data and render the results in a table when done, and show an error on failure.
4
-
5
- It also shows an optional filter to narrow down the results.
6
- """
7
-
8
- import solara
9
- from solara import use_fetch
10
- from solara.alias import rv
11
-
12
- github_url = solara.util.github_url(__file__)
13
-
14
- json_url = "https://jherr-pokemon.s3.us-west-1.amazonaws.com/index.json"
15
-
16
-
17
- @solara.component
18
- def Page():
19
- data = use_fetch(json_url)
20
- json = solara.use_json_load(data)
21
- filter, set_filter = solara.use_state("")
22
-
23
- with solara.Div() as main:
24
- if json.error:
25
- solara.Error(f"Error {json.error}")
26
- solara.Button("Retry", on_click=data.retry)
27
- else:
28
- if json.value:
29
- solara.InputText(label="Filter pokemons by name", value=filter, on_value=set_filter, continuous_update=True)
30
- pokemons = json.value
31
- if filter:
32
- pokemons = [k for k in pokemons if filter.lower() in k["name"].lower()]
33
- if len(pokemons) == 0:
34
- solara.Warning("No pokemons found, try a different filter")
35
- else:
36
- solara.Info(f"{len(pokemons)} pokemons found")
37
- else:
38
- solara.Info(f"{len(pokemons)} pokemons in total")
39
- with solara.GridFixed(columns=4, align_items="end", justify_items="stretch"):
40
- for pokemon in pokemons[:20]:
41
- with solara.Div():
42
- name = pokemon["name"]
43
- url = "https://jherr-pokemon.s3.us-west-1.amazonaws.com/" + pokemon["image"]
44
- # TODO: how to do this with solara
45
- rv.Img(src=url, contain=True, max_height="200px")
46
- solara.Text(name)
47
- else:
48
- with solara.Div():
49
- solara.Text("Loading...")
50
- rv.ProgressCircular(indeterminate=True, class_="solara-progress")
51
- return main
@@ -1,50 +0,0 @@
1
- """Demonstrates how to use Vue components in Solara.
2
-
3
- Although many components can be made from the Python side, sometimes it is easier to write components using Vue directly.
4
- It can also be beneficial for performance, since instead of creating many widgets from the Python side we only send data to
5
- the frontend. If event handling is also done on the frontend, this reduces latency and makes you app feel much smoother.
6
-
7
- See [the API documentation on component_vue](/documentation/api/utilities/component_vue) for more information.
8
-
9
- This example is based on [the vuetify docs](https://v2.vuetifyjs.com/en/components/sparklines/#custom-labels),
10
- Note that the "Go to report" button does not do anything yet.
11
-
12
- """
13
-
14
- from typing import Callable
15
-
16
- import numpy as np
17
- import solara
18
-
19
- seed = solara.reactive(42)
20
-
21
-
22
- @solara.component_vue("mycard.vue")
23
- def MyCard(
24
- event_goto_report: Callable[[dict], None],
25
- value=[1, 10, 30, 20, 3],
26
- caption="My Card",
27
- color="red",
28
- ):
29
- pass
30
-
31
-
32
- @solara.component
33
- def Page():
34
- gen = np.random.RandomState(seed=seed.value)
35
- sales_data = np.floor(np.cumsum(gen.random(7) - 0.5) * 100 + 100)
36
- show_report = solara.use_reactive(False)
37
-
38
- with solara.Column(style={"min-width": "600px"}):
39
- if show_report.value:
40
- with solara.Card("Report"):
41
- solara.Markdown("Lorum ipsum dolor sit amet")
42
- solara.Button("Go back", on_click=lambda: show_report.set(False))
43
- else:
44
-
45
- def new_seed():
46
- seed.value = np.random.randint(0, 100)
47
-
48
- solara.Button("Generate new data", on_click=new_seed)
49
-
50
- MyCard(value=sales_data.tolist(), color="green", caption="Sales Last 7 Days", event_goto_report=lambda data: show_report.set(True))
@@ -1,49 +0,0 @@
1
- # Disabled, sometimes crashes the webpage.
2
- # import ipycanvas
3
- # import numpy as np
4
- # import solara
5
- # from reacton import ipycanvas as c
6
- # from reacton import ipywidgets as w
7
-
8
-
9
- # def polygon(canvas, x, y, radius1, radius2, n_points):
10
- # index = np.arange(n_points)
11
- # angles = (2 * np.pi / n_points) * index
12
-
13
- # radius = np.where(index % 2, radius1, radius2)
14
- # v_x = x + np.cos(angles) * radius
15
- # v_y = y + np.sin(angles) * radius
16
-
17
- # points = np.stack((v_x, v_y), axis=1)
18
-
19
- # canvas.fill_polygon(points)
20
- # canvas.stroke_polygon(points)
21
-
22
-
23
- # @solara.component
24
- # def Page():
25
- # width, height = 800, 800
26
- # view_count, set_view_count = solara.use_state(0)
27
- # with w.ViewcountVBox(set_view_count) as main:
28
- # fill = w.color("#63934e", "fill color")
29
- # stroke = w.color("#4e6393", "stroke color")
30
- # line_width = w.slider_int(4, description="line width", min=0, max=30)
31
- # n_points = w.slider_int(5, "Points", min=1, max=8) * 2
32
- # radius_inner = w.slider_float(30, "Inner radius", min=0, max=100)
33
- # radius_outer = w.slider_float(80, "Outer radius", min=0, max=100)
34
-
35
- # def real_drawing():
36
- # canvas: ipycanvas.Canvas = solara.core.get_widget(canvas_element)
37
-
38
- # with ipycanvas.hold_canvas(canvas):
39
- # canvas.clear()
40
- # canvas.fill_style = fill
41
- # canvas.stroke_style = stroke
42
- # canvas.line_width = line_width
43
- # radius = width // 3
44
- # polygon(canvas, width // 2, height // 2, radius * radius_inner / 100, radius * radius_outer / 100, n_points)
45
-
46
- # solara.use_side_effect(real_drawing, [fill, stroke, line_width, n_points, view_count, radius_inner, radius_outer])
47
- # canvas_element = c.Canvas(width=width, height=height)
48
-
49
- # return main
@@ -1,9 +0,0 @@
1
- """ipywidget library example"""
2
- import solara
3
-
4
- redirect = None
5
-
6
-
7
- @solara.component
8
- def Page():
9
- return solara.Markdown("Should not see me")
@@ -1,63 +0,0 @@
1
- """# Altair
2
-
3
- [Altair](https://altair-viz.github.io/index.html) is a declarative statistical visualization library for Python.
4
-
5
- This example show how to use the [on_click handler](/documentation/components/viz/altair) to display data for a specific day in the chart.
6
-
7
- Based on [an Altair example](https://altair-viz.github.io/gallery/annual_weather_heatmap.html)
8
-
9
- """
10
- import altair as alt
11
- import pandas as pd
12
- import solara
13
- from vega_datasets import data
14
-
15
- # title = "Altair visualization"
16
- source = data.seattle_weather()
17
-
18
- selected_datum = solara.reactive(None)
19
-
20
-
21
- @solara.component
22
- def Page():
23
- def on_click(datum):
24
- selected_datum.value = datum
25
-
26
- chart = (
27
- alt.Chart(source, title="Daily Max Temperatures (C) in Seattle, WA")
28
- .mark_rect()
29
- .encode(
30
- alt.X("date(date):O").title("Day").axis(format="%e", labelAngle=0),
31
- alt.Y("month(date):O").title("Month"),
32
- alt.Color("max(temp_max)").title(None),
33
- tooltip=[
34
- alt.Tooltip("monthdate(date)", title="Date"),
35
- alt.Tooltip("max(temp_max)", title="Max Temp"),
36
- ],
37
- )
38
- .configure_view(step=13, strokeWidth=0)
39
- .configure_axis(domain=False)
40
- )
41
- with solara.Card("Annual Weather Heatmap for Seattle, WA"):
42
- solara.AltairChart(chart, on_click=on_click)
43
- df = source
44
- if selected_datum.value:
45
- month_date = selected_datum.value["monthdate_date_end"]
46
- dt = pd.to_datetime(month_date)
47
- df = df[(df["date"].dt.month == dt.month) & (df["date"].dt.day == dt.day)]
48
- solara.Markdown(f"Day of year: {dt.month_name()} - {dt.day}")
49
- solara.Button("Clear selection", on_click=lambda: selected_datum.set(None))
50
- solara.display(df)
51
-
52
- with solara.Details("Click data"):
53
- solara.Markdown(
54
- f"""
55
- Click data:
56
-
57
- ```
58
- {selected_datum.value}
59
- ```
60
- """
61
- )
62
- else:
63
- solara.Markdown("Click on the chart to see data for a specific day")
@@ -1,39 +0,0 @@
1
- """
2
- # bqplot
3
-
4
- [bqplot](https://github.com/bqplot/bqplot) is a 2-D visualization system for Jupyter, based on the constructs of the Grammar of Graphics.
5
- """
6
-
7
- import numpy as np
8
- import reacton.bqplot as bqplot
9
-
10
- import solara
11
-
12
- x0 = np.linspace(0, 2, 100)
13
-
14
- exponent = solara.reactive(1.0)
15
- log_scale = solara.reactive(False)
16
-
17
-
18
- @solara.component
19
- def Page(x=x0, ymax=5):
20
- y = x**exponent.value
21
- color = "red"
22
- display_legend = True
23
- label = "bqplot graph"
24
-
25
- solara.SliderFloat(value=exponent, min=0.1, max=3, label="Exponent")
26
- solara.Checkbox(value=log_scale, label="Log scale")
27
-
28
- x_scale = bqplot.LinearScale()
29
- if log_scale.value:
30
- y_scale = bqplot.LogScale(min=0.1, max=ymax)
31
- else:
32
- y_scale = bqplot.LinearScale(min=0, max=ymax)
33
-
34
- lines = bqplot.Lines(x=x, y=y, scales={"x": x_scale, "y": y_scale}, stroke_width=3, colors=[color], display_legend=display_legend, labels=[label])
35
- x_axis = bqplot.Axis(scale=x_scale)
36
- y_axis = bqplot.Axis(scale=y_scale, orientation="vertical")
37
- bqplot.Figure(axes=[x_axis, y_axis], marks=[lines], scale_x=x_scale, scale_y=y_scale, layout={"min_width": "800px"})
38
-
39
- # return main
@@ -1,32 +0,0 @@
1
- """
2
- # ipyleaflet
3
- Map visualization using [ipyleaflet](https://ipyleaflet.readthedocs.io/), a ipywidgets wrapper for [leaflet.js](https://leafletjs.com/)
4
- """
5
- import ipyleaflet
6
-
7
- import solara
8
-
9
- zoom = solara.reactive(5)
10
- center = solara.reactive((53.2305799, 6.5323552))
11
- bounds = solara.reactive(None)
12
-
13
-
14
- @solara.component
15
- def Page():
16
- # Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
17
- with solara.Column(style={"min-width": "500px", "height": "500px", "isolation": "isolate"}):
18
- # solara components support reactive variables
19
- solara.SliderInt(label="Zoom level", value=zoom, min=1, max=20)
20
- # using 3rd party widget library require wiring up the events manually
21
- # using zoom.value and zoom.set
22
- ipyleaflet.Map.element( # type: ignore
23
- zoom=zoom.value,
24
- on_zoom=zoom.set,
25
- center=center.value,
26
- on_center=center.set,
27
- on_bounds=bounds.set,
28
- scroll_wheel_zoom=True,
29
- )
30
- solara.Text(f"Zoom: {zoom.value}")
31
- solara.Text(f"Center: {center.value}")
32
- solara.Text(f"Bounds: {bounds.value}")
@@ -1,65 +0,0 @@
1
- """
2
- # ipyleaflet advanced
3
-
4
- Extends the [basic ipyleaflet example](/documentation/examples/libraries/ipyleaflet) with a marker that can be dragged around, and a
5
- dropdown to select the map style. Two buttons allow to reset the map to the default zoom and center and to zoom
6
- to the marker.
7
- """
8
- import ipyleaflet
9
-
10
- import solara
11
-
12
- center_default = (53.2305799, 6.5323552)
13
- zoom_default = 5
14
- maps = {
15
- "OpenStreetMap.Mapnik": ipyleaflet.basemaps.OpenStreetMap.Mapnik,
16
- "OpenTopoMap": ipyleaflet.basemaps.OpenTopoMap,
17
- "Esri.WorldTopoMap": ipyleaflet.basemaps.Esri.WorldTopoMap,
18
- }
19
-
20
- zoom = solara.reactive(zoom_default)
21
- center = solara.reactive(center_default)
22
- marker_location = solara.reactive(center_default)
23
-
24
- map_name = solara.reactive(list(maps)[0])
25
-
26
-
27
- @solara.component
28
- def Page():
29
- def location_changed(location):
30
- # do things with the location
31
- marker_location.set(location)
32
-
33
- with solara.Column(style={"min-width": "500px", "height": "500px"}):
34
- solara.Markdown(f"Market set to: {marker_location.value}", style={"color": "#6e6e6e"})
35
-
36
- map = maps[map_name.value]
37
- url = map.build_url()
38
-
39
- def goto_marker():
40
- center.value = marker_location.value
41
- zoom.value = 13
42
-
43
- def reset_view():
44
- center.value = center_default
45
- zoom.value = zoom_default
46
-
47
- solara.Select(label="Map", value=map_name, values=list(maps))
48
- solara.SliderInt(label="Zoom level", value=zoom, min=1, max=20)
49
- with solara.Row():
50
- solara.Button(label="Zoom to marker", on_click=goto_marker)
51
- solara.Button(label="Reset view", on_click=reset_view)
52
-
53
- # Isolation is required to prevent the map from overlapping navigation (when screen width < 960px)
54
- with solara.Column(style={"isolation": "isolate"}):
55
- ipyleaflet.Map.element( # type: ignore
56
- zoom=zoom.value,
57
- on_zoom=zoom.set,
58
- center=center.value,
59
- on_center=center.set,
60
- scroll_wheel_zoom=True,
61
- layers=[
62
- ipyleaflet.TileLayer.element(url=url),
63
- ipyleaflet.Marker.element(location=marker_location.value, draggable=True, on_location=location_changed),
64
- ],
65
- )
@@ -1,9 +0,0 @@
1
- """Utility apps, slightly more complex."""
2
- import solara
3
-
4
- redirect = None
5
-
6
-
7
- @solara.component
8
- def Page():
9
- return solara.Markdown("Should not see me")
@@ -1,157 +0,0 @@
1
- """# Calculator
2
-
3
- This shows how to use `use_reducer` to implement a simple calculator.
4
-
5
- Note that the `reducer` implements all the logic of the calculator, and the `Calculator` component is just a thin wrapper around it.
6
-
7
-
8
-
9
- """
10
-
11
- import ast
12
- import dataclasses
13
- import operator
14
- from typing import Any, Optional
15
-
16
- import solara
17
-
18
- DEBUG = False
19
- operator_map = {
20
- "x": operator.mul,
21
- "/": operator.truediv,
22
- "+": operator.add,
23
- "-": operator.sub,
24
- }
25
-
26
-
27
- @dataclasses.dataclass(frozen=True)
28
- class CalculatorState:
29
- input: str = ""
30
- output: str = ""
31
- left: float = 0
32
- right: Optional[float] = None
33
- operator: Any = operator.add
34
- error: str = ""
35
-
36
-
37
- initial_state = CalculatorState()
38
-
39
-
40
- def calculate(state: CalculatorState):
41
- result = state.operator(state.left, state.right)
42
- return dataclasses.replace(state, left=result)
43
-
44
-
45
- def calculator_reducer(state: CalculatorState, action):
46
- action_type, payload = action
47
- if DEBUG:
48
- print("reducer", state, action_type, payload) # noqa
49
- state = dataclasses.replace(state, error="")
50
-
51
- if action_type == "digit":
52
- digit = payload
53
- input = state.input + digit
54
- return dataclasses.replace(state, input=input, output=input)
55
- elif action_type == "percent":
56
- if state.input:
57
- try:
58
- value = ast.literal_eval(state.input)
59
- except Exception as e:
60
- return dataclasses.replace(state, error=str(e))
61
- state = dataclasses.replace(state, right=value / 100)
62
- state = calculate(state)
63
- output = f"{value / 100:,}"
64
- return dataclasses.replace(state, output=output, input="")
65
- else:
66
- output = f"{state.left / 100:,}"
67
- return dataclasses.replace(state, left=state.left / 100, output=output)
68
- elif action_type == "negate":
69
- if state.input:
70
- input = state.output
71
- input = input[1:] if input[0] == "-" else "-" + input
72
- output = input
73
- return dataclasses.replace(state, input=input, output=output)
74
- else:
75
- output = f"{-state.left:,}"
76
- return dataclasses.replace(state, left=-state.left, output=output)
77
- elif action_type == "clear":
78
- return dataclasses.replace(state, input="", output="")
79
- elif action_type == "reset":
80
- return initial_state
81
- elif action_type == "calculate":
82
- if state.input:
83
- try:
84
- value = ast.literal_eval(state.input)
85
- except Exception as e:
86
- return dataclasses.replace(state, error=str(e))
87
- state = dataclasses.replace(state, right=value)
88
- state = calculate(state)
89
- output = f"{state.left:,}"
90
- state = dataclasses.replace(state, output=output, input="")
91
- return state
92
- elif action_type == "operator":
93
- if state.input:
94
- state = calculator_reducer(state, ("calculate", None))
95
- state = dataclasses.replace(state, operator=payload, input="")
96
- else:
97
- # e.g. 2+3=*= should give 5,25
98
- state = dataclasses.replace(state, operator=payload, right=state.left)
99
- return state
100
- else:
101
- print("invalid action", action) # noqa
102
- return state
103
-
104
-
105
- @solara.component
106
- def Calculator():
107
- state, dispatch = solara.use_reducer(calculator_reducer, initial_state)
108
- if DEBUG:
109
- print("->", state) # noqa
110
- with solara.Card("Calculator", elevation=10, classes=["ma-4"]) as main:
111
- with solara.VBox(grow=False):
112
- solara.Text(state.error or state.output or "0")
113
- class_ = "pa-0 ma-1"
114
-
115
- with solara.HBox(grow=False):
116
- if state.input:
117
- solara.Button("C", on_click=lambda: dispatch(("clear", None)), dark=True, class_=class_)
118
- else:
119
- solara.Button("AC", on_click=lambda: dispatch(("reset", None)), dark=True, class_=class_)
120
- solara.Button("+/-", on_click=lambda: dispatch(("negate", None)), dark=True, class_=class_)
121
- solara.Button("%", on_click=lambda: dispatch(("percent", None)), dark=True, class_=class_)
122
- solara.Button("/", color="primary", on_click=lambda: dispatch(("operator", operator_map["/"])), class_=class_)
123
-
124
- column_op = ["x", "-", "+"]
125
- for i in range(3):
126
- with solara.HBox(grow=False):
127
- for j in range(3):
128
- digit = str(j + (2 - i) * 3 + 1)
129
-
130
- def on_click(digit=digit):
131
- dispatch(("digit", digit))
132
-
133
- solara.Button(digit, on_click=on_click, class_=class_)
134
- op_symbol = column_op[i]
135
- op = operator_map[op_symbol]
136
-
137
- def on_click_op(op=op):
138
- dispatch(("operator", op))
139
-
140
- solara.Button(op_symbol, color="primary", on_click=on_click_op, class_=class_)
141
- with solara.HBox(grow=False):
142
-
143
- def boom():
144
- print("boom") # noqa
145
- raise ValueError("lala")
146
-
147
- solara.Button("?", on_click=boom, class_=class_)
148
-
149
- solara.Button("0", on_click=lambda: dispatch(("digit", "0")), class_=class_)
150
- solara.Button(".", on_click=lambda: dispatch(("digit", ".")), class_=class_)
151
-
152
- solara.Button("=", color="primary", on_click=lambda: dispatch(("calculate", None)), class_=class_)
153
-
154
- return main
155
-
156
-
157
- Page = Calculator
@@ -1,64 +0,0 @@
1
- """# Countdown timer.
2
-
3
- This example shows how to use [use_thread](/documentation/api/hooks/use_thread) to create a countdown timer.
4
-
5
- The UI code demonstrates a lot of conditional rendering.
6
-
7
- """
8
-
9
- import time
10
-
11
- import solara
12
- from solara.alias import rv
13
-
14
-
15
- @solara.component
16
- def Page():
17
- seconds, set_seconds = solara.use_state(5)
18
- running, set_running = solara.use_state(False)
19
- duration, set_duration = solara.use_state(seconds)
20
-
21
- def on_duration(duration):
22
- try:
23
- set_duration(int(duration))
24
- set_seconds(int(duration))
25
- except ValueError:
26
- pass
27
-
28
- def run_timer():
29
- if running:
30
- time_start = time.time()
31
- next_tick = time_start + 1
32
- i = seconds
33
- while i:
34
- # instead of sleeping for 1 second, we sleep until the next second
35
- # this takes into account overhead and makes the timer more accurate
36
- time.sleep(max(0, next_tick - time.time()))
37
- i -= 1
38
- set_seconds(i)
39
- next_tick += 1
40
- set_running(False)
41
-
42
- solara.use_thread(run_timer, dependencies=[duration, running])
43
-
44
- with solara.VBox() as main:
45
- if not running:
46
- if duration < 1:
47
- solara.Error("Duration must be at least 1 second")
48
- else:
49
- solara.Markdown(f"# Timer set to {seconds} seconds")
50
- else:
51
- if seconds:
52
- solara.Markdown(f"# {seconds} seconds left")
53
- else:
54
- solara.solara.Markdown("# Time's up!")
55
- rv.TextField(type="number", v_model=duration, on_v_model=on_duration, disabled=running)
56
- with solara.HBox():
57
- if running:
58
- solara.Button("Stop", on_click=lambda: set_running(False), icon_name="mdi-stop")
59
- else:
60
- if duration != seconds:
61
- solara.Button("Reset", on_click=lambda: set_seconds(duration), icon_name="mdi-restart")
62
- else:
63
- solara.Button("Start", on_click=lambda: set_running(True), icon_name="mdi-play", disabled=seconds < 1)
64
- return main