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,144 +0,0 @@
1
- ---
2
- title: Using Solara as an alternative to Dash
3
- description: If you are familiar with Dash, Solara should be easy to adapt to. In Solara the state is managed and stored on the server, and components are declaratively reusable.
4
- ---
5
- # Tutorial: Dash users
6
-
7
- Dash is quite different from Solara. In Dash, state lives in your browser, and via callbacks your app will change from 1 state to another. In Solara, the state lives on the server, and also state transitions happen at the server.
8
-
9
- ## Dash example
10
- To see how Dash and Solara are different, let us start with a typical Dash example:
11
-
12
- ```python
13
- from dash import Dash, Input, Output, callback, dcc, html
14
-
15
- app = Dash(__name__)
16
-
17
- app.layout = html.Div(
18
- children=[
19
- dcc.Dropdown(id="dropdown", options=["red", "green", "blue", "orange"]),
20
- dcc.Markdown(id="markdown", children=["## Hello World"]),
21
- ]
22
- )
23
-
24
-
25
- @callback(
26
- Output("markdown", "style"),
27
- Input("dropdown", "value"),
28
- )
29
- def update_markdown_style(color):
30
- return {"color": color}
31
-
32
-
33
- if __name__ == "__main__":
34
- app.run_server(debug=True)
35
- ```
36
-
37
- *This example is inspired on [a dash example](https://dash.plotly.com/all-in-one-components).*
38
-
39
- This small app creates a dropdown (what we call Select in Solara), and some markdown text. The dropdown will trigger the callback at the server, which will update the markdown's style, which will cause the color of the text to change.
40
-
41
- ## Translated to Solara
42
-
43
- In Solara, we need to explicitly create application state using [`solara.reactive`](/documentation/api/utilities/reactive). We wire this up with the [Select][/documentation/components/input/select] via `value=color` and pass the color value down to the [Markdown](/documentation/components/output/markdown) component.
44
-
45
- ```solara
46
- import solara
47
-
48
- color = solara.reactive("red")
49
-
50
-
51
- @solara.component
52
- def Page():
53
- solara.Select(label="Color", values=["red", "green", "blue", "orange"], value=color)
54
- solara.Markdown("## Hello World", style={"color": color.value})
55
- ```
56
-
57
- Since this component combines two components, we have to put them together in a [container](/documentation/advanced/understanding/containers) component, here implicitly a [Column](/documentation/components/layout/column).
58
-
59
- ## Making a re-usable component
60
-
61
- ### In dash
62
-
63
- Following the [All in one component documentation](https://dash.plotly.com/all-in-one-components), we get:
64
-
65
- ```python
66
- import uuid
67
-
68
- from dash import MATCH, Dash, Input, Output, State, callback, dcc, html
69
-
70
-
71
- class MarkdownWithColorAIO(html.Div):
72
- class ids:
73
- dropdown = lambda aio_id: {"component": "MarkdownWithColorAIO", "subcomponent": "dropdown", "aio_id": aio_id}
74
- markdown = lambda aio_id: {"component": "MarkdownWithColorAIO", "subcomponent": "markdown", "aio_id": aio_id}
75
-
76
- ids = ids
77
-
78
- def __init__(self, text, colors=None, markdown_props=None, dropdown_props=None, aio_id=None):
79
- colors = colors if colors else ["red", "green", "blue", "orange"]
80
-
81
- if aio_id is None:
82
- aio_id = str(uuid.uuid4())
83
-
84
- dropdown_props = dropdown_props.copy() if dropdown_props else {}
85
- if "options" not in dropdown_props:
86
- dropdown_props["options"] = [{"label": i, "value": i} for i in colors]
87
- dropdown_props["value"] = dropdown_props["options"][0]["value"]
88
-
89
- markdown_props = markdown_props.copy() if markdown_props else {}
90
- if "style" not in markdown_props:
91
- markdown_props["style"] = {"color": dropdown_props["value"]}
92
- if "children" not in markdown_props:
93
- markdown_props["children"] = text
94
- super().__init__([dcc.Dropdown(id=self.ids.dropdown(aio_id), **dropdown_props), dcc.Markdown(id=self.ids.markdown(aio_id), **markdown_props)])
95
-
96
- @callback(
97
- Output(ids.markdown(MATCH), "style"),
98
- Input(ids.dropdown(MATCH), "value"),
99
- State(ids.markdown(MATCH), "style"),
100
- )
101
- def update_markdown_style(color, existing_style):
102
- existing_style["color"] = color
103
- return existing_style
104
-
105
-
106
- app = Dash(__name__)
107
-
108
- app.layout = html.Div(
109
- children=[
110
- MarkdownWithColorAIO("## Hello World1"),
111
- MarkdownWithColorAIO("## Hello World2"),
112
- ]
113
- )
114
-
115
- if __name__ == "__main__":
116
- app.run_server(debug=True)
117
-
118
- ```
119
-
120
- ### In Solara
121
-
122
- A big advantage of Solara is that components are reusable by default. However, we need to modify our component to have its own state, rather than using global application state. Creating local component state with [`use_reactive`](/documentation/api/hooks/use_reactive), or [`use_state`](/documentation/api/hooks/use_state) hook. Read more about state management in the [state management](/documentation/getting_started/fundamentals/state-management) section.
123
-
124
- We will rename (from `Page` to `MarkdownWithColor`) the component, add local state, and put in the markdown text as an argument.
125
-
126
- ```solara
127
- import solara
128
-
129
-
130
- @solara.component
131
- def MarkdownWithColor(markdown_text : str):
132
- # color = solara.use_reactive() # another possibility
133
- color, set_color = solara.use_state("red") # local state
134
- solara.Select(label="Color",values=["red", "green", "blue", "orange"],
135
- value=color, on_value=set_color)
136
- solara.Markdown(markdown_text, style={"color": color})
137
-
138
-
139
- @solara.component
140
- def Page():
141
- with solara.Columns():
142
- MarkdownWithColor("## Re-use is simple")
143
- MarkdownWithColor("## With solara")
144
- ```
@@ -1,64 +0,0 @@
1
- from pathlib import Path
2
-
3
- import solara
4
- from solara.website.components.mailchimp import MailChimp
5
- from solara.website.components.notebook import Notebook
6
-
7
- HERE = Path(__file__).parent
8
- title = "Jupyter Dashboard (1/3)"
9
-
10
-
11
- @solara.component
12
- def Page():
13
- title = "Build your Jupyter dashboard using Solara"
14
- solara.Meta(property="og:title", content=title)
15
- solara.Meta(name="twitter:title", content=title)
16
- solara.Title(title)
17
-
18
- img = "https://dxhl76zpt6fap.cloudfront.net/public/docs/tutorial/jupyter-dashboard1.webp"
19
- solara.Meta(name="twitter:image", content=img)
20
- solara.Meta(property="og:image", content=img)
21
-
22
- description = "Learn how to build a Jupyter dashboard and deploy it as a web app using Solara."
23
- solara.Meta(name="description", property="og:description", content=description)
24
- solara.Meta(name="twitter:description", content=description)
25
- tags = [
26
- "jupyter",
27
- "jupyter dashboard",
28
- "dashboard",
29
- "web app",
30
- "deploy",
31
- "solara",
32
- ]
33
- solara.Meta(name="keywords", content=", ".join(tags))
34
-
35
- Notebook(
36
- Path(HERE / "_jupyter_dashboard_1.ipynb"),
37
- show_last_expressions=True,
38
- execute=False,
39
- outputs={
40
- "a7d17a84": None, # empty output (7)
41
- # original: https://github.com/widgetti/solara/assets/1765949/e844acdb-c77d-4df4-ba4c-a629f92f18a3
42
- "82f1d2f7": solara.Image("https://dxhl76zpt6fap.cloudfront.net/pages/docs/content/60-jupyter-dashboard-part1/map.webp"), # map (11)
43
- "3e7ea361": None, # (13)
44
- # original: https://github.com/widgetti/solara/assets/1765949/daaa3a46-61f5-431f-8003-b42b5915da4b
45
- "56055643": solara.Image("https://dxhl76zpt6fap.cloudfront.net/pages/docs/content/60-jupyter-dashboard-part1/view.webp"), # View (15)
46
- # original: https://github.com/widgetti/solara/assets/1765949/2f4daf0f-b7d8-4f70-b04a-c27542cffdb0
47
- "c78010ec": solara.Image("https://dxhl76zpt6fap.cloudfront.net/pages/docs/content/60-jupyter-dashboard-part1/page.webp"), # Page (20)
48
- # original: https://github.com/widgetti/solara/assets/1765949/a691d9f1-f07b-4e06-b21b-20980476ad64
49
- "18290364": solara.Image("https://dxhl76zpt6fap.cloudfront.net/pages/docs/content/60-jupyter-dashboard-part1/controls.webp"), # Controls
50
- "0ca68fe8": None,
51
- "fef5d187": None,
52
- # original: https://github.com/widgetti/solara/assets/1765949/f0075ad1-808d-458c-8797-e460ce4dc06d
53
- "af686391": solara.Image("https://dxhl76zpt6fap.cloudfront.net/pages/docs/content/60-jupyter-dashboard-part1/full-app.webp"), # Full app
54
- },
55
- )
56
- solara.Markdown(
57
- """
58
- Explore this app live at [solara.dev](/apps/jupyter-dashboard-1).
59
-
60
- Don’t miss the next tutorial and stay updated with the latest techniques and insights by subscribing to our newsletter.
61
- """
62
- )
63
- location = solara.use_router().path
64
- MailChimp(location=location)
@@ -1,445 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "markdown",
5
- "id": "8a4ce07d",
6
- "metadata": {},
7
- "source": [
8
- "# Tutorial: Data Science\n",
9
- "\n",
10
- "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.\n",
11
- "It is therefore focused on data (Pandas), visualizations (plotly) and how to add interactivity.\n",
12
- "\n",
13
- "## You should know\n",
14
- "This tutorial will assume:\n",
15
- "\n",
16
- " * You have successfully installed Solara\n",
17
- " * You know how to display a Solara component in a notebook or script\n",
18
- "\n",
19
- "If not, please follow the [Quick start](/documentation/getting_started).\n",
20
- "\n",
21
- "## Extra packages you need to install\n",
22
- "\n",
23
- "For this tutorial, you need plotly and pandas, you can install them using pip:\n",
24
- "\n",
25
- "```\n",
26
- "$ pip install plotly pandas\n",
27
- "```\n",
28
- "\n",
29
- "*Note: You might want to refresh your browser after installing plotly when using Jupyter.*\n",
30
- "\n",
31
- "## You will learn\n",
32
- "\n",
33
- "In this tutorial, you will learn:\n",
34
- "\n",
35
- " * [To create a scatter plot using plotly.express](#our-first-scatter-plot)\n",
36
- " * [Display your plot in a Solara component](#our-first-scatter-plot).\n",
37
- " * [Build a UI to configure the X and Y axis](#configure-the-x-axis).\n",
38
- " * [Handle a click event and record which point was clicked on](#interactive-plot).\n",
39
- " * [Refactor your code to build a reusable Solara component](#make-a-reusable-component).\n",
40
- " * [Compose your newly built component into a larger application](#make-a-reusable-component)."
41
- ]
42
- },
43
- {
44
- "cell_type": "markdown",
45
- "id": "dfe143dc",
46
- "metadata": {},
47
- "source": [
48
- "## The dataset\n",
49
- "\n",
50
- "For this tutorial, we will use the [Iris flow data set](https://en.wikipedia.org/wiki/Iris_flower_data_set) which contains the lengths and widths of the petals and sepals of three species of Iris (setosa, virginica and versicolor).\n",
51
- "\n",
52
- "This dataset comes with many packages, but since we are doing to use plotly.express for this tutorial, we will use:\n",
53
- "\n",
54
- "```python\n",
55
- "import plotly.express as px\n",
56
- "df = px.data.iris()\n",
57
- "```"
58
- ]
59
- },
60
- {
61
- "cell_type": "code",
62
- "execution_count": null,
63
- "id": "e9e78d49",
64
- "metadata": {},
65
- "outputs": [],
66
- "source": [
67
- "## solara: skip\n",
68
- "import plotly.express as px\n",
69
- "\n",
70
- "\n",
71
- "df = px.data.iris()\n",
72
- "df\n"
73
- ]
74
- },
75
- {
76
- "cell_type": "markdown",
77
- "id": "0cccd2f7",
78
- "metadata": {},
79
- "source": [
80
- "## Our first scatter plot\n",
81
- "\n",
82
- "We use plotly express to create our scatter plot with just a single line.\n",
83
- "\n",
84
- "```python\n",
85
- "fig = px.scatter(df, \"sepal_length\", \"sepal_width\")\n",
86
- "```\n",
87
- "\n",
88
- "To display this figure in a Solara component, we should return an element that can render the plotly figure. [FigurePlotly](/documentation/components/viz/plotly) will do the job for us.\n",
89
- "\n",
90
- "Putting this together"
91
- ]
92
- },
93
- {
94
- "cell_type": "code",
95
- "execution_count": null,
96
- "id": "5d51ea0d",
97
- "metadata": {},
98
- "outputs": [],
99
- "source": [
100
- "import plotly.express as px\n",
101
- "import solara\n",
102
- "\n",
103
- "df = px.data.iris()\n",
104
- "\n",
105
- "\n",
106
- "@solara.component\n",
107
- "def Page():\n",
108
- " fig = px.scatter(df, \"sepal_length\", \"sepal_width\")\n",
109
- " solara.FigurePlotly(fig)"
110
- ]
111
- },
112
- {
113
- "cell_type": "code",
114
- "execution_count": null,
115
- "id": "b3307cf5",
116
- "metadata": {},
117
- "outputs": [],
118
- "source": [
119
- "## solara: skip\n",
120
- "Page()"
121
- ]
122
- },
123
- {
124
- "cell_type": "markdown",
125
- "id": "704b6061",
126
- "metadata": {},
127
- "source": [
128
- "## Configuring the X-axis\n",
129
- "\n",
130
- "To configure the X-axis, first, create a global application state using:\n",
131
- "\n",
132
- "```python\n",
133
- "x_axis = solara.reactive(\"sepal_length\")\n",
134
- "```\n",
135
- "\n",
136
- "This code creates a reactive variable. You can use this reactive variable in your component and pass it to a [`Select`](/documentation/components/input/select) component to control the selected column.\n",
137
- "\n",
138
- "\n",
139
- "```python\n",
140
- "columns = list(df.columns)\n",
141
- "solara.Select(label=\"X-axis\", values=columns, value=x_axis)\n",
142
- "```\n",
143
- "\n",
144
- "Now, when the Select component's value changes, it will also update the reactive variable x_axis.\n",
145
- "\n",
146
- "If your components use the reactive value to create the plot, for example:\n",
147
- "\n",
148
- "\n",
149
- "```python\n",
150
- "fig = px.scatter(df, x_axis.value, \"sepal_width\")\n",
151
- "```\n",
152
- "\n",
153
- "The component will automatically re-execute the render function when the `x_axis` value changes, updating the figure accordingly."
154
- ]
155
- },
156
- {
157
- "cell_type": "code",
158
- "execution_count": null,
159
- "id": "860bb9cd",
160
- "metadata": {},
161
- "outputs": [],
162
- "source": [
163
- "columns = list(df.columns)\n",
164
- "x_axis = solara.reactive(\"sepal_length\")\n",
165
- "\n",
166
- "@solara.component\n",
167
- "def Page():\n",
168
- " # Create a scatter plot by passing \"x_axis.value\" to px.scatter\n",
169
- " # This will automatically make the component listen to changes in x_axis\n",
170
- " # and re-execute this function when x_axis value changes\n",
171
- " fig = px.scatter(df, x_axis.value, \"sepal_width\")\n",
172
- " solara.FigurePlotly(fig)\n",
173
- " \n",
174
- " # Pass x_axis to Select component\n",
175
- " # The select will control the x_axis reactive variable\n",
176
- " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n"
177
- ]
178
- },
179
- {
180
- "cell_type": "code",
181
- "execution_count": null,
182
- "id": "0cb44e1d",
183
- "metadata": {},
184
- "outputs": [],
185
- "source": [
186
- "## solara: skip\n",
187
- "Page()"
188
- ]
189
- },
190
- {
191
- "cell_type": "markdown",
192
- "id": "9c8f3895",
193
- "metadata": {},
194
- "source": [
195
- "### Understanding (optional)\n",
196
- "\n",
197
- "#### State\n",
198
- "\n",
199
- "Understanding state management and how Solara re-renders component is crucial for understanding building larger applications. If you don't fully graps it now, that is ok. You should first get used to the pattern, and consider reading [About state management](/documentation/getting_started/fundamentals/state-management) later on to get a deeper understanding.\n",
200
- "\n"
201
- ]
202
- },
203
- {
204
- "cell_type": "markdown",
205
- "id": "fa60244f",
206
- "metadata": {},
207
- "source": [
208
- "## Configure the Y-axis.\n",
209
- "\n",
210
- "Now that we can configure the X-axis, we can repeat the same for the Y-axis. Try to do this yourself, without looking at the code, as a good practice."
211
- ]
212
- },
213
- {
214
- "cell_type": "code",
215
- "execution_count": null,
216
- "id": "1157505b",
217
- "metadata": {},
218
- "outputs": [],
219
- "source": [
220
- "y_axis = solara.reactive(\"sepal_width\")\n",
221
- "\n",
222
- "@solara.component\n",
223
- "def Page():\n",
224
- " fig = px.scatter(df, x_axis.value, y_axis.value)\n",
225
- " solara.FigurePlotly(fig)\n",
226
- " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
227
- " solara.Select(label=\"Y-axis\", value=y_axis, values=columns) "
228
- ]
229
- },
230
- {
231
- "cell_type": "code",
232
- "execution_count": null,
233
- "id": "eb348680",
234
- "metadata": {},
235
- "outputs": [],
236
- "source": [
237
- "## solara: skip\n",
238
- "Page()"
239
- ]
240
- },
241
- {
242
- "cell_type": "markdown",
243
- "id": "13b71701",
244
- "metadata": {},
245
- "source": [
246
- "## Interactive plot\n",
247
- "\n",
248
- "We now built a small UI to control a scatter plot. However, often we also want to interact with the data, for instance select a point in our scatter plot.\n",
249
- "\n",
250
- "We could look up in the plotly documentation how exactly we can extract the right data, but lets take a different approach. We are simply going to store the data we get from `on_click` into a new reactive variable (`click_data`) and display the raw data into a Markdown component."
251
- ]
252
- },
253
- {
254
- "cell_type": "code",
255
- "execution_count": null,
256
- "id": "e74ce31e",
257
- "metadata": {},
258
- "outputs": [],
259
- "source": [
260
- "click_data = solara.reactive(None)\n",
261
- "\n",
262
- "\n",
263
- "@solara.component\n",
264
- "def Page():\n",
265
- " fig = px.scatter(df, x_axis.value, y_axis.value)\n",
266
- " solara.FigurePlotly(fig, on_click=click_data.set)\n",
267
- " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
268
- " solara.Select(label=\"Y-axis\", value=y_axis, values=columns)\n",
269
- " # display it pre-formatted using the backticks `` using Markdown\n",
270
- " solara.Markdown(f\"`{click_data}`\")\n",
271
- " "
272
- ]
273
- },
274
- {
275
- "cell_type": "code",
276
- "execution_count": null,
277
- "id": "84497014",
278
- "metadata": {},
279
- "outputs": [],
280
- "source": [
281
- "## solara: skip\n",
282
- "Page()"
283
- ]
284
- },
285
- {
286
- "cell_type": "markdown",
287
- "id": "299460db",
288
- "metadata": {},
289
- "source": [
290
- "### Inspecting the on_click data\n",
291
- "\n",
292
- "Click a point and you should see the data printed out like:\n",
293
- "\n",
294
- "```python\n",
295
- "{'event_type': 'plotly_click', 'points': {'trace_indexes': [0], 'point_indexes': [32], 'xs': [5.2], 'ys': [4.1]}, 'device_state': {'alt': False, 'ctrl': False, 'meta': False, 'shift': False, 'button': 0, 'buttons': 1}, 'selector': None}\n",
296
- "```\n",
297
- "\n",
298
- "From this, we can get the row index, and the x and y coordinate.\n"
299
- ]
300
- },
301
- {
302
- "cell_type": "code",
303
- "execution_count": null,
304
- "id": "650752f6",
305
- "metadata": {},
306
- "outputs": [],
307
- "source": [
308
- "click_data = solara.reactive(None)\n",
309
- "\n",
310
- "\n",
311
- "@solara.component\n",
312
- "def Page():\n",
313
- " fig = px.scatter(df, x_axis.value, y_axis.value)\n",
314
- " solara.FigurePlotly(fig, on_click=click_data.set)\n",
315
- " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
316
- " solara.Select(label=\"Y-axis\", value=y_axis, values=columns)\n",
317
- " # display it pre-formatted using the backticks `` using Markdown\n",
318
- " if click_data.value:\n",
319
- " row_index = click_data.value[\"points\"][\"point_indexes\"][0]\n",
320
- " x = click_data.value[\"points\"][\"xs\"][0]\n",
321
- " y = click_data.value[\"points\"][\"ys\"][0]\n",
322
- " solara.Markdown(f\"`Click on index={row_index} x={x} y={y}`\")\n"
323
- ]
324
- },
325
- {
326
- "cell_type": "code",
327
- "execution_count": null,
328
- "id": "4a1db95d",
329
- "metadata": {
330
- "scrolled": false
331
- },
332
- "outputs": [],
333
- "source": [
334
- "## solara: skip\n",
335
- "Page()"
336
- ]
337
- },
338
- {
339
- "cell_type": "markdown",
340
- "id": "4762caa2",
341
- "metadata": {},
342
- "source": [
343
- "## Displaying the nearest neighbours\n",
344
- "\n",
345
- "We now have the point we clicked on, we will use that to improve our component, we will.\n",
346
- "\n",
347
- " 1. Add an indicator in the scatter plot to highlight which point we clicked on.\n",
348
- " 2. Find the nearest neighbours and display them in a table.\n",
349
- " \n",
350
- "For the first item, we simply use plotly express again, and add the single trace it generated to the existing figure (instead of displaying two separate figures).\n",
351
- "\n",
352
- "We add a function to find the `n` nearest neighbours:\n",
353
- "\n",
354
- "```python\n",
355
- "def find_nearest_neighbours(df, xcol, ycol, x, y, n=10):\n",
356
- " df = df.copy()\n",
357
- " df[\"distance\"] = ((df[xcol] - x)**2 + (df[ycol] - y)**2)**0.5\n",
358
- " return df.sort_values('distance')[1:n+1]\n",
359
- "```\n",
360
- "\n",
361
- "We now only find the nearest neighbours if `click_data.value` is not None, and display the dataframe using the [`DataFrame`](/documentation/components/data/dataframe) component.\n"
362
- ]
363
- },
364
- {
365
- "cell_type": "code",
366
- "execution_count": null,
367
- "id": "6bfbb986",
368
- "metadata": {},
369
- "outputs": [],
370
- "source": [
371
- "click_data = solara.reactive(None)\n",
372
- "\n",
373
- "\n",
374
- "def find_nearest_neighbours(df, xcol, ycol, x, y, n=10):\n",
375
- " df = df.copy()\n",
376
- " df[\"distance\"] = ((df[xcol] - x)**2 + (df[ycol] - y)**2)**0.5\n",
377
- " return df.sort_values('distance')[1:n+1]\n",
378
- "\n",
379
- "\n",
380
- "@solara.component\n",
381
- "def Page():\n",
382
- " fig = px.scatter(df, x_axis.value, y_axis.value, color=\"species\", custom_data=[df.index])\n",
383
- "\n",
384
- " if click_data.value is not None:\n",
385
- " x = click_data.value[\"points\"][\"xs\"][0]\n",
386
- " y = click_data.value[\"points\"][\"ys\"][0]\n",
387
- "\n",
388
- " # add an indicator \n",
389
- " fig.add_trace(px.scatter(x=[x], y=[y], text=[\"⭐️\"]).data[0])\n",
390
- " df_nearest = find_nearest_neighbours(df, x_axis.value, y_axis.value, x, y, n=3)\n",
391
- " else:\n",
392
- " df_nearest = None\n",
393
- "\n",
394
- "\n",
395
- " solara.FigurePlotly(fig, on_click=click_data.set)\n",
396
- " solara.Select(label=\"X-axis\", value=x_axis, values=columns)\n",
397
- " solara.Select(label=\"Y-axis\", value=y_axis, values=columns)\n",
398
- " if df_nearest is not None:\n",
399
- " solara.Markdown(\"## Nearest 3 neighbours\")\n",
400
- " solara.DataFrame(df_nearest)\n",
401
- " else:\n",
402
- " solara.Info(\"Click to select a point\")"
403
- ]
404
- },
405
- {
406
- "cell_type": "code",
407
- "execution_count": null,
408
- "id": "334d22b1",
409
- "metadata": {
410
- "scrolled": false
411
- },
412
- "outputs": [],
413
- "source": [
414
- "## solara: skip\n",
415
- "Page()"
416
- ]
417
- }
418
- ],
419
- "metadata": {
420
- "kernelspec": {
421
- "display_name": "Python 3 (ipykernel)",
422
- "language": "python",
423
- "name": "python3"
424
- },
425
- "language_info": {
426
- "codemirror_mode": {
427
- "name": "ipython",
428
- "version": 3
429
- },
430
- "file_extension": ".py",
431
- "mimetype": "text/x-python",
432
- "name": "python",
433
- "nbconvert_exporter": "python",
434
- "pygments_lexer": "ipython3",
435
- "version": "3.9.16"
436
- },
437
- "vscode": {
438
- "interpreter": {
439
- "hash": "3f54047370d637df4a365f9bae65e296d7b1c0737aca7baed81d825616d991e7"
440
- }
441
- }
442
- },
443
- "nbformat": 4,
444
- "nbformat_minor": 5
445
- }