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,157 +0,0 @@
1
- <template>
2
- <v-menu
3
- v-model="show_results"
4
- offset-y>
5
- <template v-slot:activator="{ on }">
6
- <v-text-field
7
- v-model="query"
8
- prepend-inner-icon="mdi-magnify"
9
- hide-details
10
- :placeholder="mac ? '⌘K to search' : 'Ctrl+K to search'"
11
- outlined
12
- rounded
13
- clearable
14
- ref="search"
15
- style="max-width: 50%; flex-grow: 1;"
16
- @click="show($event, on);"
17
- @keyup.enter="item = 0"
18
- ></v-text-field>
19
- </template>
20
- <v-list v-if="results != null && results.length == 0">
21
- <v-list-item>
22
- <v-list-item-content>
23
- {{this.query == "" ? "Start Typing to Search" : "No search results found."}}
24
- </v-list-item-content>
25
- </v-list-item>
26
- </v-list>
27
- <v-list v-else>
28
- <v-list-item-group v-model="item">
29
- <v-list-item v-for="(element, index) in this.results.hits" :key="element['url']">
30
- <v-list-item-content>
31
- <v-list-item-title>{{ element.hierarchy[element.type] }}</v-list-item-title>
32
- </v-list-item-content>
33
- </v-list-item>
34
- </v-list-item-group>
35
- <v-list-item>
36
- <v-list-item-content>
37
- <v-list-item-title>And {{ this.results.nbHits - 10}} More...</v-list-item-title>
38
- </v-list-item-content>
39
- </v-list-item>
40
- </v-list>
41
- </v-menu>
42
- </template>
43
- <script>
44
- const search = ref(null);
45
- module.exports = {
46
- async mounted() {
47
- window.search = this;
48
- await this.loadRequire();
49
- this.algoliasearch = (await this.import([`https://cdn.jsdelivr.net/npm/algoliasearch@4.20.0/dist/algoliasearch-lite.umd.js`]))[0];
50
- this.initSearch();
51
- window.search = this;
52
- },
53
- watch: {
54
- query ( value ) {
55
- this.show_results = true;
56
- this.search();
57
- },
58
- item ( value ) {
59
- if ( this.results.hits != null && this.results.hits.length > 0 ) {
60
- let url = this.results.hits[value].url;
61
- if (url.startsWith("https://solara.dev")) {
62
- url = url.slice(18);
63
- }
64
- solara.router.push( url );
65
- }
66
- },
67
- },
68
- methods: {
69
- show( e, on ) {
70
- this.show_results = false;
71
- this.$nextTick( () => {
72
- on.click( e )
73
- } );
74
- },
75
- initSearch() {
76
- this.client = this.algoliasearch( '9KW9L7O5EQ', '647ca12ba642437cc40c2adee4a78d08' );
77
- this.index = this.client.initIndex( 'solara' );
78
- this.mac = window.navigator.userAgent.indexOf("Mac") != -1;
79
- document.addEventListener( 'keydown', ( e ) => {
80
-
81
- if (this.mac) {
82
- if ( this.$refs.search && e.metaKey && e.key === 'k' ) {
83
- this.$refs.search.focus();
84
- }
85
- }else{
86
- if ( this.$refs.search && e.ctrlKey && e.key === 'k' ) {
87
- this.$refs.search.focus();
88
- }
89
- }
90
- });
91
- },
92
- async search() {
93
- results = await this.index.search( this.query, { hitsPerPage: 10 } );
94
- if (results) {
95
- this.results = results;
96
- }else{
97
- this.$set(this.results, []);
98
- }
99
- },
100
- import(dependencies) {
101
- return this.loadRequire().then(
102
- () => {
103
- if (window.jupyterVue) {
104
- // in jupyterlab, we take Vue from ipyvue/jupyterVue
105
- define("vue", [], () => window.jupyterVue.Vue);
106
- } else {
107
- define("vue", ['jupyter-vue'], jupyterVue => jupyterVue.Vue);
108
- }
109
- return new Promise((resolve, reject) => {
110
- requirejs(dependencies, (...modules) => resolve(modules));
111
- })
112
- }
113
- );
114
- },
115
- loadRequire() {
116
- return new Promise((resolve, reject) => {
117
- const script = document.createElement('script');
118
- script.src = `${this.getCdn()}/requirejs@2.3.6/require.js`;
119
- script.onload = resolve;
120
- script.onerror = reject;
121
- document.head.appendChild(script);
122
- });
123
- },
124
- getBaseUrl() {
125
- if (window.solara && window.solara.rootPath !== undefined) {
126
- return solara.rootPath + "/";
127
- }
128
- // if base url is set, we use ./ for relative paths compared to the base url
129
- if (document.getElementsByTagName("base").length) {
130
- return document.baseURI;
131
- }
132
- const labConfigData = document.getElementById('jupyter-config-data');
133
- if (labConfigData) {
134
- /* lab and Voila */
135
- return JSON.parse(labConfigData.textContent).baseUrl;
136
- }
137
- let base = document.body.dataset.baseUrl || document.baseURI;
138
- if (!base.endsWith('/')) {
139
- base += '/';
140
- }
141
- return base
142
- },
143
- getCdn() {
144
- return (typeof solara_cdn !== "undefined" && solara_cdn) || `${this.getBaseUrl()}_solara/cdn`;
145
- },
146
- },
147
- data(){
148
- return {
149
- query: '',
150
- results: [],
151
- item: null,
152
- show_results: false,
153
- mac: false,
154
- }
155
- },
156
- }
157
- </script>
@@ -1,118 +0,0 @@
1
- import solara
2
- from solara.alias import rv
3
-
4
-
5
- @solara.component
6
- def Gallery(route_external=None):
7
- if route_external is not None:
8
- route_current = route_external
9
- else:
10
- # show a gallery of all the examples
11
- router = solara.use_router()
12
- route_current = router.path_routes[-2]
13
-
14
- with solara.Column(gap="75px", align="center"):
15
- with solara.Row(justify="center", gap="30px", style={"margin": "30px 0 !important", "flex-wrap": "wrap", "align-items": "start", "row-gap": "30px"}):
16
- for child in route_current.children:
17
- if child.path == "/":
18
- continue
19
- with solara.v.Html(tag="a", attributes={"href": "#" + child.path}):
20
- solara.Button(
21
- child.label,
22
- color="primary",
23
- classes=["v-btn--rounded", "v-size--x-large"],
24
- )
25
-
26
- with solara.Column(gap="75px", style={"padding-bottom": "75px"}):
27
- for route in route_current.children:
28
- if route.children:
29
- with solara.Column(classes=["subcategory-row", "ps-md-10"]):
30
- solara.HTML(tag="h2", unsafe_innerHTML=route.label, attributes={"id": route.path}, style="padding-left: 10%;")
31
- with solara.Row(justify="center", gap="20px", style={"flex-wrap": "wrap", "row-gap": "20px", "max-width": "90rem"}):
32
- for child in route.children:
33
- if child.path == "/":
34
- continue
35
- path = route.path + "/" + child.path
36
- if child.path in [
37
- "button",
38
- "checkbox",
39
- "confirmation_dialog",
40
- "echarts",
41
- "file_browser",
42
- "file_download",
43
- "matplotlib",
44
- "select",
45
- "switch",
46
- "tooltip",
47
- ]:
48
- image_url = "https://dxhl76zpt6fap.cloudfront.net/public/api/" + child.path + ".gif"
49
- elif child.path in ["card", "dataframe", "pivot_table", "slider"]:
50
- image_url = "https://dxhl76zpt6fap.cloudfront.net/public/api/" + child.path + ".png"
51
- else:
52
- image_url = "https://dxhl76zpt6fap.cloudfront.net/public/logo.svg"
53
-
54
- if path:
55
- path = path if route_external is None else route_current.path + "/" + path
56
- title = solara.Link(path, children=[child.label])
57
- with solara.Card(title, classes=["component-card"], margin=0):
58
- with solara.Column(align="center"):
59
- with solara.Link(path):
60
- solara.Image(image_url, width="12rem")
61
-
62
-
63
- @solara.component
64
- def NoPage():
65
- raise RuntimeError("This page should not be rendered")
66
-
67
-
68
- @solara.component
69
- def WithCode(module):
70
- component = getattr(module, "Page", None)
71
- with rv.Sheet() as main:
72
- # It renders code better
73
- solara.Markdown(
74
- module.__doc__ or "# no docs yet",
75
- unsafe_solara_execute=True,
76
- )
77
- if component and component != NoPage:
78
- with solara.Card("Example", margin=0, classes=["mt-8"]):
79
- component()
80
- github_url = solara.util.github_url(module.__file__)
81
- solara.Button(
82
- label="View source",
83
- icon_name="mdi-github-circle",
84
- attributes={"href": github_url, "target": "_blank"},
85
- text=True,
86
- outlined=True,
87
- class_="mt-8",
88
- )
89
- return main
90
-
91
-
92
- @solara.component
93
- def SubCategoryLayout(children=[]):
94
- route_current, all_routes = solara.use_route()
95
- if route_current is None:
96
- return solara.Error("Page not found")
97
- elif route_current.path == "/":
98
- return solara.Error("Not supposed to be rendered")
99
- elif route_current.module:
100
- WithCode(route_current.module)
101
- else:
102
- with solara.Column(align="center", children=children, style={"flex-grow": 1, "padding": "0"}) as main:
103
- pass
104
- return main
105
-
106
-
107
- @solara.component
108
- def CategoryLayout(children=[]):
109
- route_current, all_routes = solara.use_route()
110
- if route_current is None:
111
- return solara.Error("Page not found")
112
-
113
- if route_current.path == "/":
114
- return Gallery()
115
- else:
116
- with solara.Column(align="stretch", style={"width": "1024px", "flex-grow": 1}, children=children) as main:
117
- pass
118
- return main
@@ -1,72 +0,0 @@
1
- from typing import Callable
2
-
3
- import solara
4
- import solara.lab
5
- from solara.alias import rv
6
- from solara.server import settings
7
-
8
-
9
- @solara.component_vue("algolia_api.vue")
10
- def Algolia():
11
- pass
12
-
13
-
14
- @solara.component
15
- def Header(
16
- on_toggle_left_menu: Callable[[], None] = None,
17
- on_toggle_right_menu: Callable[[], None] = None,
18
- ):
19
- # use routes of parent (assuming we are a child of a layout)
20
- route_current, all_routes = solara.use_route(level=-1)
21
- route_current_with_children, all_routes_with_children = solara.use_route()
22
- router = solara.use_router()
23
- dark_effective = solara.lab.use_dark_effective()
24
-
25
- # set states for menu
26
- with solara.Column(gap="0px"):
27
- with solara.Div(classes=["news"]):
28
- solara.HTML(
29
- "div",
30
- unsafe_innerHTML="<a href='https://github.com/widgetti/solara' target='_blank' >Star us on github 🤩</a>",
31
- )
32
- with solara.v.AppBar(tag="header", flat=True, class_="bg-primary-fade padding-40", height="auto", clipped_left=True):
33
- with rv.ToolbarTitle(class_="d-flex", style_="align-items:center"):
34
- if route_current and len(route_current.children) > 0:
35
- with solara.Button(icon=True, class_="hidden-md-and-up", on_click=lambda: on_toggle_left_menu and on_toggle_left_menu()):
36
- rv.Icon(children=["mdi-menu"])
37
- with solara.Link(path_or_route="/"):
38
- solara.Image(router.root_path + f"/static/assets/images/logo{'_white' if dark_effective else ''}.svg")
39
- rv.Spacer()
40
-
41
- if (
42
- route_current_with_children is not None
43
- and route_current is not None
44
- and route_current.path == "documentation"
45
- and route_current_with_children.path == "/"
46
- ):
47
- solara.v.Spacer()
48
- else:
49
- if settings.search.enabled:
50
- from solara_enterprise.search.search import Search
51
-
52
- Search()
53
- else:
54
- with solara.Row(justify="end", style={"align-items": "center", "flex-grow": "1", "background-color": "transparent"}):
55
- Algolia()
56
- with rv.Html(tag="ul", class_="main-menu menu d-none d-md-flex"):
57
- for route in all_routes:
58
- if route.path in ["apps", "contact", "changelog"]:
59
- continue
60
- current = route_current == route
61
- with rv.Html(tag="li", class_="active" if current else None):
62
- solara.Link("/" + route.path if route.path != "/" else "/", children=[route.label])
63
- with rv.Btn(icon=True, tag="a", class_="d-none d-md-flex", attributes={"href": solara.github_url, "target": "_blank"}):
64
- rv.Icon(children=["mdi-github-circle"])
65
-
66
- with rv.Btn(icon=True, tag="a", class_="d-none d-md-flex", attributes={"href": "https://discord.solara.dev", "target": "_blank"}):
67
- rv.Icon(children=["mdi-discord"])
68
-
69
- solara.lab.ThemeToggle()
70
-
71
- with solara.Button(icon=True, class_="hidden-md-and-up", on_click=lambda: on_toggle_right_menu and on_toggle_right_menu()):
72
- rv.Icon(children=["mdi-menu"])
@@ -1,15 +0,0 @@
1
- import solara
2
- from solara.alias import rv
3
-
4
-
5
- @solara.component
6
- def Hero(title, sub_title, button_text):
7
- with rv.Html(tag="section", class_="hero text-center") as main:
8
- with rv.Container():
9
- with rv.Row():
10
- with rv.Col(md=8, offset_md=2, sm=10, offset_sm=1):
11
- rv.Html(tag="h1", children=[title], class_="mb-4"),
12
- solara.HTML(tag="div", unsafe_innerHTML=f"<h2>{sub_title}</h2>", class_="mb-4"),
13
- with solara.Link("/documentation/getting_started"):
14
- solara.Button(label=button_text, elevation=0, large=True, class_="btn-size--xlarge solara-docs-button")
15
- return main
@@ -1,12 +0,0 @@
1
- from pathlib import Path
2
-
3
- import solara
4
-
5
- HERE = Path(__file__).parent
6
-
7
- # html = Path(HERE / "mailchimp.v").read_text()
8
-
9
-
10
- @solara.component_vue("mailchimp.vue")
11
- def MailChimp(location: str):
12
- pass
@@ -1,47 +0,0 @@
1
- <template>
2
- <div id="mc_embed_shell">
3
- <div id="mc_embed_signup">
4
- <form
5
- action="https://gmail.us13.list-manage.com/subscribe/post?u=1dcdd74de47214edace5b6f49&amp;id=c60b5def86&amp;f_id=00f4c1e2f0"
6
- method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate"
7
- target="_blank">
8
- <div id="mc_embed_signup_scroll">
9
- <div class="indicates-required"><span class="asterisk">*</span> indicates required</div>
10
- <div class="mc-field-group">
11
- <label for="mce-EMAIL">Email Address <span class="asterisk">*</span></label>
12
- <input type="email" name="EMAIL" class="required email" id="mce-EMAIL" required="" value=""></div>
13
- <div class="mc-field-group">
14
- <label for="mce-LOCATION">signup location </label>
15
- <input type="text" name="LOCATION" class=" text" id="mce-LOCATION" :value="location">
16
- </div>
17
- <!-- <div class="mc-field-group"><label for="mce-FNAME">First Name </label><input type="text" name="FNAME"
18
- class=" text" id="mce-FNAME" value=""></div>
19
- <div class="mc-field-group"><label for="mce-LNAME">Last Name </label><input type="text" name="LNAME"
20
- class=" text" id="mce-LNAME" value=""></div>
21
- <div class="mc-field-group"><label for="mce-COMPANY">Company </label><input type="text" name="COMPANY"
22
- class=" text" id="mce-COMPANY" value=""></div> -->
23
- <div id="mce-responses" class="clear foot">
24
- <div class="response" id="mce-error-response" style="display: none;"></div>
25
- <div class="response" id="mce-success-response" style="display: none;"></div>
26
- </div>
27
- <div aria-hidden="true" style="position: absolute; left: -5000px;">
28
- /* real people should not fill this in and expect good things - do not remove this or risk form bot
29
- signups */
30
- <input type="text" name="b_1dcdd74de47214edace5b6f49_c60b5def86" tabindex="-1" value="">
31
- </div>
32
- </div>
33
- <div class="optionalParent">
34
- <div class="clear foot">
35
- <v-btn type="submit" name="subscribe" id="mc-embedded-subscribe"
36
- class="button v-btn v-btn-contained"
37
- style="background-color: rgb(241, 159, 65); border-color: rgb(241, 159, 65);"
38
- value="Subscribe">Subscribe</v-btn>
39
- </div>
40
- </div>
41
- </form>
42
- </div>
43
- <!-- <script> (function ($) { window.fnames = new Array(); window.ftypes = new Array(); fnames[0] = 'EMAIL'; ftypes[0] = 'email'; fnames[1] = 'FNAME'; ftypes[1] = 'text'; fnames[2] = 'LNAME'; ftypes[2] = 'text'; fnames[7] = 'COMPANY'; ftypes[7] = 'text'; fnames[10] = 'WHYCLOUD'; ftypes[10] = 'text'; fnames[3] = 'ADDRESS'; ftypes[3] = 'address'; fnames[4] = 'PHONE'; ftypes[4] = 'phone'; fnames[5] = 'BIRTHDAY'; ftypes[5] = 'birthday'; fnames[6] = 'USECASE'; ftypes[6] = 'text'; fnames[8] = 'POSITION'; ftypes[8] = 'text'; fnames[9] = 'MMERGE9'; ftypes[9] = 'text'; }(jQuery)); var $mcj = jQuery.noConflict(true); </script> -->
44
- </div>
45
- </template>
46
- <script>
47
- </script>
@@ -1,30 +0,0 @@
1
- from typing import Dict, List, Union
2
-
3
- import yaml
4
-
5
- import solara
6
-
7
-
8
- # We want to separate metadata from the markdown files before rendering them, which solara.Markdown doesn't support
9
- @solara.component
10
- def MarkdownWithMetadata(content: str, unsafe_solara_execute=True):
11
- if "---" in content:
12
- pre_content, raw_metadata, post_content = content.split("---")
13
- metadata: Dict[str, Union[str, List[str]]] = yaml.safe_load(raw_metadata)
14
-
15
- if len(pre_content) == 0:
16
- content = post_content
17
- else:
18
- content = pre_content + post_content
19
-
20
- if "title" not in metadata.keys():
21
- metadata["title"] = content.split("#")[1].split("\n")[0]
22
-
23
- for key, value in metadata.items():
24
- if key == "title":
25
- solara.Title(value)
26
- elif ":" in key:
27
- solara.Meta(property=key, content=value)
28
- else:
29
- solara.Meta(name=key, content=value)
30
- solara.Markdown(content, unsafe_solara_execute=unsafe_solara_execute)
@@ -1,172 +0,0 @@
1
- import ast
2
- import linecache
3
- from pathlib import Path
4
- from typing import Any, Dict
5
-
6
- import IPython
7
- import nbformat
8
-
9
- import solara
10
- import solara.components.applayout
11
- import solara.toestand
12
- from solara.components.markdown import ExceptionGuard
13
-
14
- HERE = Path(__file__).parent
15
-
16
-
17
- def execute_notebook(path: Path):
18
- nb: nbformat.NotebookNode = nbformat.read(path, 4)
19
- stat = path.stat()
20
- scope: Dict[str, Any] = {}
21
- for cell_index, cell in enumerate(nb.cells):
22
- cell_index += 1 # used 1 based
23
- cell.scope_snapshot = {}
24
- if cell.cell_type == "code":
25
- if cell.source.startswith("## solara: skip"):
26
- continue
27
-
28
- def execute(cell=cell):
29
- source = cell.source
30
- cell_path = f"app.ipynb input cell {cell_index}"
31
- entry = (
32
- stat.st_size,
33
- stat.st_mtime,
34
- [line + "\n" for line in source.splitlines()],
35
- cell_path,
36
- )
37
-
38
- linecache.cache[cell_path] = entry
39
- code = ast.parse(source, cell_path, "exec")
40
- value = None
41
- with solara.Column():
42
- if code.body:
43
- last_statement = code.body[-1]
44
- if isinstance(last_statement, ast.Expr):
45
- code.body.pop()
46
- last = ast.Expression(last_statement.value)
47
- exec(compile(code, "<string>", mode="exec"), scope)
48
- value = eval(compile(last, "<string>", mode="eval"), scope)
49
- else:
50
- exec(compile(code, "<string>", mode="exec"), scope)
51
- import matplotlib_inline.backend_inline
52
-
53
- matplotlib_inline.backend_inline.flush_figures()
54
- scope_snapshot = {**scope}
55
- cell.__dict__["scope_snapshot"] = scope_snapshot
56
- return value
57
-
58
- # every cell gets a snapshot of the scope
59
- # avoid the buggy setitem of NotebookNode
60
- # which causes an recursion error
61
- yield cell_index, cell, execute
62
- elif cell.cell_type == "markdown":
63
- # last_expressions.append(None)
64
- yield cell_index, cell, lambda: None
65
- else:
66
- raise ValueError(f"Unknown cell type: {cell.cell_type}, supported types are: code, markdown")
67
-
68
-
69
- @solara.component
70
- def NotebookExecute(notebook_path: Path, show_last_expressions=False, auto_show_page=False):
71
- import IPython.core.pylabtools as pylabtools
72
-
73
- shell = IPython.get_ipython().kernel.shell
74
-
75
- # TODO: there is a change the cleanup will not be called
76
- pylabtools.select_figure_formats(shell, ["png"])
77
-
78
- def cleanup():
79
- def _cleanup():
80
- from matplotlib.figure import Figure
81
-
82
- png_formatter = shell.display_formatter.formatters["image/png"]
83
- png_formatter.pop(Figure)
84
-
85
- return _cleanup
86
-
87
- solara.use_effect(cleanup, [])
88
- values = list(solara.use_memo(lambda: execute_notebook(notebook_path)))
89
-
90
- last_page = None
91
-
92
- solara.components.applayout.should_use_embed.provide(True)
93
- with solara.Column(style={"max-width": "100%"}) as main:
94
-
95
- for cell_index, cell, executor in values:
96
- cell_index += 1 # used 1 based
97
- if cell.cell_type == "code":
98
- if cell.source.startswith("## solara: skip"):
99
- continue
100
- solara.Markdown(
101
- f"""
102
- ```python
103
- {cell.source}
104
- ```"""
105
- )
106
- # we execute here, such that any side effect (display, etc)
107
- # will be done under the context of the Column
108
- with ExceptionGuard():
109
- with solara.AppLayout(navigation=False, toolbar_dark=True):
110
- # we don't want to listen to reactive variables
111
- copy = set(solara.toestand.thread_local.reactive_used or [])
112
- try:
113
- last_expression = executor()
114
- finally:
115
- solara.toestand.thread_local.reactive_used = copy
116
- scope = cell.scope_snapshot
117
- page = scope.get("Page")
118
- if auto_show_page and page != last_page and page is not None:
119
- page()
120
- else:
121
- if show_last_expressions:
122
- if last_expression is not None:
123
- solara.display(last_expression)
124
- last_page = page
125
- elif cell.cell_type == "markdown":
126
- solara.Markdown(cell.source)
127
- else:
128
- raise ValueError(f"Unknown cell type: {cell.cell_type}, supported types are: code, markdown")
129
- return main
130
-
131
-
132
- @solara.component
133
- def Notebook(notebook_path: Path, show_last_expressions=False, auto_show_page=False, execute=True, outputs={}):
134
- if execute:
135
- return NotebookExecute(notebook_path, show_last_expressions, auto_show_page)
136
- else:
137
- with solara.Column(style={"max-width": "100%"}) as main:
138
- nb: nbformat.NotebookNode = nbformat.read(notebook_path, 4)
139
- for cell_index, cell in enumerate(nb.cells):
140
- cell_index += 1
141
- if cell.cell_type == "code":
142
- if cell.source.startswith("## solara: skip"):
143
- continue
144
- solara.Markdown(
145
- f"""
146
- ```python
147
- {cell.source}
148
- ```"""
149
- )
150
- if cell.outputs:
151
- for output in cell.outputs:
152
- if output.output_type == "display_data":
153
- solara.display(output.data, raw=True)
154
- elif output.output_type == "execute_result":
155
- if "text/html" in output.data:
156
- solara.display(output.data, raw=True)
157
- else:
158
- cell_id = str(cell.id)
159
- output = outputs.get(cell_id) or outputs.get(cell_index)
160
- if output is None:
161
- if cell_id in outputs or cell_index in outputs:
162
- pass # explicit None
163
- else:
164
- solara.display(f"Output missing for cell: {cell_index} id {cell_id}")
165
- else:
166
- solara.display(output)
167
-
168
- elif cell.cell_type == "markdown":
169
- solara.Markdown(cell.source)
170
- else:
171
- raise ValueError(f"Unknown cell type: {cell.cell_type}, supported types are: code, markdown")
172
- return main