solara-ui 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 (439) hide show
  1. prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  2. prefix/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  3. solara/__init__.py +124 -0
  4. solara/__main__.py +734 -0
  5. solara/alias.py +6 -0
  6. solara/autorouting.py +546 -0
  7. solara/cache.py +303 -0
  8. solara/checks.html +71 -0
  9. solara/checks.py +224 -0
  10. solara/comm.py +28 -0
  11. solara/components/__init__.py +59 -0
  12. solara/components/alert.py +155 -0
  13. solara/components/applayout.py +393 -0
  14. solara/components/button.py +85 -0
  15. solara/components/card.py +87 -0
  16. solara/components/checkbox.py +50 -0
  17. solara/components/code_highlight_css.py +11 -0
  18. solara/components/code_highlight_css.vue +63 -0
  19. solara/components/columns.py +159 -0
  20. solara/components/component_vue.py +110 -0
  21. solara/components/cross_filter.py +335 -0
  22. solara/components/dataframe.py +546 -0
  23. solara/components/datatable.py +221 -0
  24. solara/components/datatable.vue +175 -0
  25. solara/components/details.py +21 -0
  26. solara/components/download.vue +35 -0
  27. solara/components/echarts.py +75 -0
  28. solara/components/echarts.vue +128 -0
  29. solara/components/figure_altair.py +39 -0
  30. solara/components/file_browser.py +182 -0
  31. solara/components/file_download.py +199 -0
  32. solara/components/file_drop.py +139 -0
  33. solara/components/file_drop.vue +83 -0
  34. solara/components/file_list_widget.vue +78 -0
  35. solara/components/head.py +27 -0
  36. solara/components/head_tag.py +49 -0
  37. solara/components/head_tag.vue +60 -0
  38. solara/components/image.py +173 -0
  39. solara/components/input.py +436 -0
  40. solara/components/link.py +55 -0
  41. solara/components/markdown.py +378 -0
  42. solara/components/markdown_editor.py +25 -0
  43. solara/components/markdown_editor.vue +362 -0
  44. solara/components/matplotlib.py +74 -0
  45. solara/components/meta.py +47 -0
  46. solara/components/misc.py +333 -0
  47. solara/components/pivot_table.py +258 -0
  48. solara/components/pivot_table.vue +158 -0
  49. solara/components/progress.py +47 -0
  50. solara/components/select.py +182 -0
  51. solara/components/select.vue +27 -0
  52. solara/components/slider.py +442 -0
  53. solara/components/slider_date.vue +56 -0
  54. solara/components/spinner-solara.vue +105 -0
  55. solara/components/spinner.py +30 -0
  56. solara/components/sql_code.py +33 -0
  57. solara/components/sql_code.vue +128 -0
  58. solara/components/style.py +105 -0
  59. solara/components/switch.py +68 -0
  60. solara/components/tab_navigation.py +37 -0
  61. solara/components/title.py +90 -0
  62. solara/components/title.vue +38 -0
  63. solara/components/togglebuttons.py +200 -0
  64. solara/components/tooltip.py +61 -0
  65. solara/datatypes.py +143 -0
  66. solara/express.py +241 -0
  67. solara/hooks/__init__.py +4 -0
  68. solara/hooks/dataframe.py +99 -0
  69. solara/hooks/misc.py +263 -0
  70. solara/hooks/use_reactive.py +129 -0
  71. solara/hooks/use_thread.py +129 -0
  72. solara/kitchensink.py +8 -0
  73. solara/lab/__init__.py +34 -0
  74. solara/lab/components/__init__.py +6 -0
  75. solara/lab/components/chat.py +203 -0
  76. solara/lab/components/confirmation_dialog.py +163 -0
  77. solara/lab/components/cross_filter.py +7 -0
  78. solara/lab/components/input_date.py +298 -0
  79. solara/lab/components/menu.py +181 -0
  80. solara/lab/components/menu.vue +38 -0
  81. solara/lab/components/tabs.py +274 -0
  82. solara/lab/components/theming.py +98 -0
  83. solara/lab/components/theming.vue +72 -0
  84. solara/lab/hooks/__init__.py +0 -0
  85. solara/lab/hooks/dataframe.py +12 -0
  86. solara/lab/toestand.py +3 -0
  87. solara/lab/utils/__init__.py +2 -0
  88. solara/lab/utils/cookies.py +5 -0
  89. solara/lab/utils/dataframe.py +115 -0
  90. solara/lab/utils/headers.py +5 -0
  91. solara/layout.py +44 -0
  92. solara/lifecycle.py +46 -0
  93. solara/minisettings.py +133 -0
  94. solara/py.typed +0 -0
  95. solara/reactive.py +93 -0
  96. solara/routing.py +268 -0
  97. solara/scope/__init__.py +88 -0
  98. solara/scope/types.py +55 -0
  99. solara/server/__init__.py +0 -0
  100. solara/server/app.py +491 -0
  101. solara/server/assets/custom.css +1 -0
  102. solara/server/assets/custom.js +1 -0
  103. solara/server/assets/favicon.png +0 -0
  104. solara/server/assets/favicon.svg +5 -0
  105. solara/server/assets/style.css +1665 -0
  106. solara/server/assets/theme-dark.css +437 -0
  107. solara/server/assets/theme-light.css +420 -0
  108. solara/server/assets/theme.js +3 -0
  109. solara/server/cdn_helper.py +77 -0
  110. solara/server/esm.py +69 -0
  111. solara/server/fastapi.py +5 -0
  112. solara/server/flask.py +286 -0
  113. solara/server/jupyter/__init__.py +2 -0
  114. solara/server/jupyter/cdn_handler.py +28 -0
  115. solara/server/jupyter/server_extension.py +29 -0
  116. solara/server/jupytertools.py +46 -0
  117. solara/server/kernel.py +338 -0
  118. solara/server/kernel_context.py +357 -0
  119. solara/server/patch.py +552 -0
  120. solara/server/reload.py +242 -0
  121. solara/server/server.py +456 -0
  122. solara/server/settings.py +215 -0
  123. solara/server/shell.py +251 -0
  124. solara/server/starlette.py +601 -0
  125. solara/server/static/ansi.js +270 -0
  126. solara/server/static/highlight-dark.css +82 -0
  127. solara/server/static/highlight.css +43 -0
  128. solara/server/static/main-vuetify.js +260 -0
  129. solara/server/static/main.js +163 -0
  130. solara/server/static/solara_bootstrap.py +129 -0
  131. solara/server/static/sun.svg +23 -0
  132. solara/server/static/webworker.js +42 -0
  133. solara/server/telemetry.py +212 -0
  134. solara/server/templates/index.html.j2 +1 -0
  135. solara/server/templates/loader-plain.css +11 -0
  136. solara/server/templates/loader-plain.html +20 -0
  137. solara/server/templates/loader-solara.css +111 -0
  138. solara/server/templates/loader-solara.html +40 -0
  139. solara/server/templates/plain.html +82 -0
  140. solara/server/templates/solara.html.j2 +446 -0
  141. solara/server/threaded.py +75 -0
  142. solara/server/utils.py +30 -0
  143. solara/server/websocket.py +45 -0
  144. solara/settings.py +56 -0
  145. solara/tasks.py +837 -0
  146. solara/template/button.py +16 -0
  147. solara/template/markdown.py +42 -0
  148. solara/template/portal/.flake8 +6 -0
  149. solara/template/portal/.pre-commit-config.yaml +28 -0
  150. solara/template/portal/LICENSE +21 -0
  151. solara/template/portal/Procfile +7 -0
  152. solara/template/portal/mypy.ini +3 -0
  153. solara/template/portal/pyproject.toml +26 -0
  154. solara/template/portal/solara_portal/__init__.py +4 -0
  155. solara/template/portal/solara_portal/components/__init__.py +2 -0
  156. solara/template/portal/solara_portal/components/article.py +28 -0
  157. solara/template/portal/solara_portal/components/data.py +28 -0
  158. solara/template/portal/solara_portal/components/header.py +6 -0
  159. solara/template/portal/solara_portal/components/layout.py +6 -0
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
  162. solara/template/portal/solara_portal/data.py +60 -0
  163. solara/template/portal/solara_portal/pages/__init__.py +67 -0
  164. solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
  165. solara/template/portal/solara_portal/pages/tabular.py +29 -0
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
  167. solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +697 -0
  170. solara/toestand.py +772 -0
  171. solara/util.py +308 -0
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +468 -0
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +17 -0
  176. solara/website/assets/images/logo_white.svg +50 -0
  177. solara/website/assets/theme.js +8 -0
  178. solara/website/components/__init__.py +5 -0
  179. solara/website/components/algolia.vue +24 -0
  180. solara/website/components/algolia_api.vue +187 -0
  181. solara/website/components/docs.py +118 -0
  182. solara/website/components/header.py +72 -0
  183. solara/website/components/hero.py +15 -0
  184. solara/website/components/mailchimp.py +12 -0
  185. solara/website/components/mailchimp.vue +47 -0
  186. solara/website/components/markdown.py +30 -0
  187. solara/website/components/notebook.py +171 -0
  188. solara/website/pages/__init__.py +575 -0
  189. solara/website/pages/apps/__init__.py +16 -0
  190. solara/website/pages/apps/authorization/__init__.py +119 -0
  191. solara/website/pages/apps/authorization/admin.py +12 -0
  192. solara/website/pages/apps/authorization/users.py +12 -0
  193. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  194. solara/website/pages/apps/layout-demo.py +40 -0
  195. solara/website/pages/apps/multipage/__init__.py +38 -0
  196. solara/website/pages/apps/multipage/page1.py +26 -0
  197. solara/website/pages/apps/multipage/page2.py +34 -0
  198. solara/website/pages/apps/scatter.py +136 -0
  199. solara/website/pages/apps/scrolling.py +63 -0
  200. solara/website/pages/apps/tutorial-streamlit.py +18 -0
  201. solara/website/pages/changelog/__init__.py +8 -0
  202. solara/website/pages/changelog/changelog.md +204 -0
  203. solara/website/pages/contact/__init__.py +8 -0
  204. solara/website/pages/contact/contact.md +17 -0
  205. solara/website/pages/doc_use_download.py +85 -0
  206. solara/website/pages/documentation/__init__.py +184 -0
  207. solara/website/pages/documentation/advanced/__init__.py +9 -0
  208. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  209. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
  210. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
  211. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
  212. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +162 -0
  213. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
  214. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +49 -0
  215. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
  216. solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
  217. solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
  218. solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +36 -0
  219. solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
  220. solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
  221. solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
  222. solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
  223. solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
  224. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  225. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
  226. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
  227. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
  228. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
  229. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
  230. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +7 -0
  231. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
  232. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
  233. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +240 -0
  234. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +97 -0
  235. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
  236. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +1 -0
  237. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +171 -0
  238. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  239. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
  240. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
  241. solara/website/pages/documentation/api/__init__.py +19 -0
  242. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  243. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +23 -0
  244. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +22 -0
  245. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +22 -0
  246. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +22 -0
  247. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  248. solara/website/pages/documentation/api/hooks/use_cross_filter.py +25 -0
  249. solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
  250. solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
  251. solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
  252. solara/website/pages/documentation/api/hooks/use_exception.py +33 -0
  253. solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
  254. solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
  255. solara/website/pages/documentation/api/hooks/use_previous.py +33 -0
  256. solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
  257. solara/website/pages/documentation/api/hooks/use_state.py +10 -0
  258. solara/website/pages/documentation/api/hooks/use_state_or_update.py +69 -0
  259. solara/website/pages/documentation/api/hooks/use_thread.md +58 -0
  260. solara/website/pages/documentation/api/hooks/use_thread.py +44 -0
  261. solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
  262. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  263. solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
  264. solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
  265. solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
  266. solara/website/pages/documentation/api/routing/route.py +31 -0
  267. solara/website/pages/documentation/api/routing/use_route.py +80 -0
  268. solara/website/pages/documentation/api/routing/use_router.py +16 -0
  269. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  270. solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
  271. solara/website/pages/documentation/api/utilities/computed.py +16 -0
  272. solara/website/pages/documentation/api/utilities/display.py +16 -0
  273. solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
  274. solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
  275. solara/website/pages/documentation/api/utilities/memoize.py +35 -0
  276. solara/website/pages/documentation/api/utilities/on_kernel_start.py +27 -0
  277. solara/website/pages/documentation/api/utilities/reactive.py +16 -0
  278. solara/website/pages/documentation/api/utilities/widget.py +104 -0
  279. solara/website/pages/documentation/components/__init__.py +12 -0
  280. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  281. solara/website/pages/documentation/components/advanced/link.py +27 -0
  282. solara/website/pages/documentation/components/advanced/meta.py +20 -0
  283. solara/website/pages/documentation/components/advanced/style.py +45 -0
  284. solara/website/pages/documentation/components/common.py +9 -0
  285. solara/website/pages/documentation/components/data/__init__.py +9 -0
  286. solara/website/pages/documentation/components/data/dataframe.py +44 -0
  287. solara/website/pages/documentation/components/data/pivot_table.py +81 -0
  288. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  289. solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
  290. solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
  291. solara/website/pages/documentation/components/input/__init__.py +9 -0
  292. solara/website/pages/documentation/components/input/button.py +23 -0
  293. solara/website/pages/documentation/components/input/checkbox.py +10 -0
  294. solara/website/pages/documentation/components/input/file_browser.py +32 -0
  295. solara/website/pages/documentation/components/input/file_drop.py +76 -0
  296. solara/website/pages/documentation/components/input/input.py +19 -0
  297. solara/website/pages/documentation/components/input/select.py +22 -0
  298. solara/website/pages/documentation/components/input/slider.py +29 -0
  299. solara/website/pages/documentation/components/input/switch.py +10 -0
  300. solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
  301. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  302. solara/website/pages/documentation/components/lab/chat.py +109 -0
  303. solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
  304. solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
  305. solara/website/pages/documentation/components/lab/input_date.py +20 -0
  306. solara/website/pages/documentation/components/lab/menu.py +22 -0
  307. solara/website/pages/documentation/components/lab/tab.py +25 -0
  308. solara/website/pages/documentation/components/lab/tabs.py +45 -0
  309. solara/website/pages/documentation/components/lab/task.py +11 -0
  310. solara/website/pages/documentation/components/lab/theming.py +72 -0
  311. solara/website/pages/documentation/components/lab/use_task.py +11 -0
  312. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  313. solara/website/pages/documentation/components/layout/app_bar.py +16 -0
  314. solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
  315. solara/website/pages/documentation/components/layout/app_layout.py +24 -0
  316. solara/website/pages/documentation/components/layout/card.py +15 -0
  317. solara/website/pages/documentation/components/layout/card_actions.py +16 -0
  318. solara/website/pages/documentation/components/layout/column.py +30 -0
  319. solara/website/pages/documentation/components/layout/columns.py +27 -0
  320. solara/website/pages/documentation/components/layout/columns_responsive.py +68 -0
  321. solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
  322. solara/website/pages/documentation/components/layout/gridfixed.py +21 -0
  323. solara/website/pages/documentation/components/layout/hbox.py +18 -0
  324. solara/website/pages/documentation/components/layout/row.py +30 -0
  325. solara/website/pages/documentation/components/layout/sidebar.py +24 -0
  326. solara/website/pages/documentation/components/layout/vbox.py +19 -0
  327. solara/website/pages/documentation/components/output/__init__.py +9 -0
  328. solara/website/pages/documentation/components/output/file_download.py +11 -0
  329. solara/website/pages/documentation/components/output/html.py +21 -0
  330. solara/website/pages/documentation/components/output/image.py +11 -0
  331. solara/website/pages/documentation/components/output/markdown.py +57 -0
  332. solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
  333. solara/website/pages/documentation/components/output/sql_code.py +85 -0
  334. solara/website/pages/documentation/components/output/tooltip.py +11 -0
  335. solara/website/pages/documentation/components/page/__init__.py +9 -0
  336. solara/website/pages/documentation/components/page/head.py +18 -0
  337. solara/website/pages/documentation/components/page/title.py +27 -0
  338. solara/website/pages/documentation/components/status/__init__.py +9 -0
  339. solara/website/pages/documentation/components/status/error.py +40 -0
  340. solara/website/pages/documentation/components/status/info.py +40 -0
  341. solara/website/pages/documentation/components/status/progress.py +10 -0
  342. solara/website/pages/documentation/components/status/spinner.py +11 -0
  343. solara/website/pages/documentation/components/status/success.py +40 -0
  344. solara/website/pages/documentation/components/status/warning.py +47 -0
  345. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  346. solara/website/pages/documentation/components/viz/altair.py +42 -0
  347. solara/website/pages/documentation/components/viz/echarts.py +75 -0
  348. solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
  349. solara/website/pages/documentation/components/viz/plotly.py +63 -0
  350. solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
  351. solara/website/pages/documentation/examples/__init__.py +52 -0
  352. solara/website/pages/documentation/examples/ai/__init__.py +11 -0
  353. solara/website/pages/documentation/examples/ai/chatbot.py +95 -0
  354. solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
  355. solara/website/pages/documentation/examples/basics/__init__.py +10 -0
  356. solara/website/pages/documentation/examples/basics/sine.py +28 -0
  357. solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
  358. solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
  359. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
  360. solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
  361. solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
  362. solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
  363. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
  364. solara/website/pages/documentation/examples/general/__init__.py +10 -0
  365. solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
  366. solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
  367. solara/website/pages/documentation/examples/general/live_update.py +38 -0
  368. solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
  369. solara/website/pages/documentation/examples/general/mycard.vue +58 -0
  370. solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
  371. solara/website/pages/documentation/examples/general/vue_component.py +50 -0
  372. solara/website/pages/documentation/examples/ipycanvas.py +49 -0
  373. solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
  374. solara/website/pages/documentation/examples/libraries/altair.py +64 -0
  375. solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
  376. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
  377. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
  378. solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
  379. solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
  380. solara/website/pages/documentation/examples/utilities/countdown_timer.py +64 -0
  381. solara/website/pages/documentation/examples/utilities/todo.py +196 -0
  382. solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
  383. solara/website/pages/documentation/examples/visualization/annotator.py +69 -0
  384. solara/website/pages/documentation/examples/visualization/linked_views.py +84 -0
  385. solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
  386. solara/website/pages/documentation/faq/__init__.py +12 -0
  387. solara/website/pages/documentation/faq/content/99-faq.md +76 -0
  388. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  389. solara/website/pages/documentation/getting_started/content/00-quickstart.md +89 -0
  390. solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
  391. solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
  394. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
  395. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
  396. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
  397. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
  398. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +64 -0
  399. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  400. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
  401. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1000 -0
  402. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  403. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +223 -0
  404. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +88 -0
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +273 -0
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
  408. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
  410. solara/website/pages/docutils.py +38 -0
  411. solara/website/pages/showcase/__init__.py +105 -0
  412. solara/website/pages/showcase/domino_code_assist.py +60 -0
  413. solara/website/pages/showcase/planeto_tessa.py +19 -0
  414. solara/website/pages/showcase/solara_dev.py +54 -0
  415. solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
  416. solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
  417. solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
  418. solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
  419. solara/website/pages/showcase/wanderlust.py +27 -0
  420. solara/website/public/beach.jpeg +0 -0
  421. solara/website/public/logo.svg +6 -0
  422. solara/website/public/social/discord.svg +1 -0
  423. solara/website/public/social/github.svg +1 -0
  424. solara/website/public/social/twitter.svg +3 -0
  425. solara/website/public/success.html +25 -0
  426. solara/website/templates/index.html.j2 +117 -0
  427. solara/website/utils.py +51 -0
  428. solara/widgets/__init__.py +1 -0
  429. solara/widgets/vue/gridlayout.vue +110 -0
  430. solara/widgets/vue/html.vue +4 -0
  431. solara/widgets/vue/navigator.vue +104 -0
  432. solara/widgets/vue/vegalite.vue +115 -0
  433. solara/widgets/widgets.py +66 -0
  434. solara_ui-1.31.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  435. solara_ui-1.31.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  436. solara_ui-1.31.0.dist-info/METADATA +158 -0
  437. solara_ui-1.31.0.dist-info/RECORD +439 -0
  438. solara_ui-1.31.0.dist-info/WHEEL +5 -0
  439. solara_ui-1.31.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,436 @@
1
+ from typing import Any, Callable, Optional, TypeVar, Union, cast, overload, List, Dict
2
+
3
+ import ipyvue
4
+ import ipyvuetify as vw
5
+ import reacton
6
+ from typing_extensions import Literal
7
+
8
+ import solara
9
+ from solara.alias import rv as v
10
+
11
+ T = TypeVar("T")
12
+
13
+
14
+ def use_change(el: reacton.core.Element, on_value: Callable[[Any], Any], enabled=True, update_events=["blur", "keyup.enter"]):
15
+ """Trigger a callback when a blur events occurs or the enter key is pressed."""
16
+ on_value_ref = solara.use_ref(on_value)
17
+ on_value_ref.current = on_value
18
+
19
+ def add_events():
20
+ def on_change(widget, event, data):
21
+ if enabled:
22
+ on_value_ref.current(widget.v_model)
23
+
24
+ widget = cast(ipyvue.VueWidget, solara.get_widget(el))
25
+ if enabled:
26
+ for event in update_events:
27
+ widget.on_event(event, on_change)
28
+
29
+ def cleanup():
30
+ if enabled:
31
+ for event in update_events:
32
+ widget.on_event(event, on_change, remove=True)
33
+
34
+ return cleanup
35
+
36
+ solara.use_effect(add_events, [enabled])
37
+
38
+
39
+ @solara.component
40
+ def InputText(
41
+ label: str,
42
+ value: Union[str, solara.Reactive[str]] = "",
43
+ on_value: Callable[[str], None] = None,
44
+ disabled: bool = False,
45
+ password: bool = False,
46
+ continuous_update: bool = False,
47
+ update_events: List[str] = ["blur", "keyup.enter"],
48
+ error: Union[bool, str] = False,
49
+ message: Optional[str] = None,
50
+ classes: List[str] = [],
51
+ style: Optional[Union[str, Dict[str, str]]] = None,
52
+ ):
53
+ """Free form text input.
54
+
55
+ ### Basic example:
56
+
57
+ ```solara
58
+ import solara
59
+
60
+ text = solara.reactive("Hello world!")
61
+ continuous_update = solara.reactive(True)
62
+
63
+ @solara.component
64
+ def Page():
65
+ solara.Checkbox(label="Continuous update", value=continuous_update)
66
+ solara.InputText("Enter some text", value=text, continuous_update=continuous_update.value)
67
+ with solara.Row():
68
+ solara.Button("Clear", on_click=lambda: text.set(""))
69
+ solara.Button("Reset", on_click=lambda: text.set("Hello world"))
70
+ solara.Markdown(f"**You entered**: {text.value}")
71
+ ```
72
+
73
+ ### Password input:
74
+
75
+ This will not show the entered text.
76
+
77
+ ```solara
78
+ import solara
79
+
80
+ password = solara.reactive("Super secret")
81
+ continuous_update = solara.reactive(True)
82
+
83
+ @solara.component
84
+ def Page():
85
+ solara.Checkbox(label="Continuous update", value=continuous_update)
86
+ solara.InputText("Enter a password", value=password, continuous_update=continuous_update.value, password=True)
87
+ with solara.Row():
88
+ solara.Button("Clear", on_click=lambda: password.set(""))
89
+ solara.Button("Reset", on_click=lambda: password.set("Super secret"))
90
+ solara.Markdown(f"**You entered**: {password.value}")
91
+ ```
92
+
93
+
94
+ ## Arguments
95
+
96
+ * `label`: Label to display next to the slider.
97
+ * `value`: The currently entered value.
98
+ * `on_value`: Callback to call when the value changes.
99
+ * `disabled`: Whether the input is disabled.
100
+ * `password`: Whether the input is a password input (typically shows input text obscured with an asterisk).
101
+ * `continuous_update`: Whether to call the `on_value` callback on every change or only when the input loses focus or the enter key is pressed.
102
+ * `update_events`: A list of events that should trigger `on_value`. If continuous update is enabled, this will effectively be ignored,
103
+ since updates will happen every change.
104
+ * `error`: If truthy, show the input as having an error (in red). If a string is passed, it will be shown as the error message.
105
+ * `message`: Message to show below the input. If `error` is a string, this will be ignored.
106
+ * `classes`: List of CSS classes to apply to the input.
107
+ * `style`: CSS style to apply to the input.
108
+ """
109
+ reactive_value = solara.use_reactive(value, on_value)
110
+ del value, on_value
111
+ style_flat = solara.util._flatten_style(style)
112
+ classes_flat = solara.util._combine_classes(classes)
113
+
114
+ def set_value_cast(value):
115
+ reactive_value.value = str(value)
116
+
117
+ def on_v_model(value):
118
+ if continuous_update:
119
+ set_value_cast(value)
120
+
121
+ messages = []
122
+ if error and isinstance(error, str):
123
+ messages.append(error)
124
+ elif message:
125
+ messages.append(message)
126
+ text_field = v.TextField(
127
+ v_model=reactive_value.value,
128
+ on_v_model=on_v_model,
129
+ label=label,
130
+ disabled=disabled,
131
+ type="password" if password else None,
132
+ error=bool(error),
133
+ messages=messages,
134
+ class_=classes_flat,
135
+ style_=style_flat,
136
+ )
137
+ use_change(text_field, set_value_cast, enabled=not continuous_update, update_events=update_events)
138
+ return text_field
139
+
140
+
141
+ @overload
142
+ @solara.component
143
+ def InputFloat(
144
+ label: str,
145
+ value: Union[float, solara.Reactive[float]] = 0,
146
+ on_value: Optional[Callable[[float], None]] = ...,
147
+ disabled: bool = ...,
148
+ optional: Literal[False] = ...,
149
+ continuous_update: bool = ...,
150
+ clearable: bool = ...,
151
+ classes: List[str] = ...,
152
+ style: Optional[Union[str, Dict[str, str]]] = ...,
153
+ ) -> reacton.core.ValueElement[vw.TextField, Any]: ...
154
+
155
+
156
+ @overload
157
+ @solara.component
158
+ def InputFloat(
159
+ label: str,
160
+ value: Union[Optional[float], solara.Reactive[Optional[float]]] = 0,
161
+ on_value: Optional[Callable[[Optional[float]], None]] = ...,
162
+ disabled: bool = ...,
163
+ optional: Literal[True] = ...,
164
+ continuous_update: bool = ...,
165
+ clearable: bool = ...,
166
+ classes: List[str] = ...,
167
+ style: Optional[Union[str, Dict[str, str]]] = ...,
168
+ ) -> reacton.core.ValueElement[vw.TextField, Any]: ...
169
+
170
+
171
+ @solara.component
172
+ def InputFloat(
173
+ label: str,
174
+ value: Union[None, float, solara.Reactive[float], solara.Reactive[Optional[float]]] = 0,
175
+ on_value: Union[None, Callable[[Optional[float]], None], Callable[[float], None]] = None,
176
+ disabled: bool = False,
177
+ optional: bool = False,
178
+ continuous_update: bool = False,
179
+ clearable: bool = False,
180
+ classes: List[str] = [],
181
+ style: Optional[Union[str, Dict[str, str]]] = None,
182
+ ):
183
+ """Numeric input (floats).
184
+
185
+ Basic example:
186
+
187
+ ```solara
188
+ import solara
189
+
190
+ float_value = solara.reactive(42.0)
191
+ continuous_update = solara.reactive(True)
192
+
193
+ @solara.component
194
+ def Page():
195
+ solara.Checkbox(label="Continuous update", value=continuous_update)
196
+ solara.InputFloat("Enter a float number", value=float_value, continuous_update=continuous_update.value)
197
+ with solara.Row():
198
+ solara.Button("Clear", on_click=lambda: float_value.set(42.0))
199
+ solara.Markdown(f"**You entered**: {float_value.value}")
200
+ ```
201
+
202
+
203
+ ## Arguments
204
+
205
+ * `label`: Label to display next to the slider.
206
+ * `value`: The currently entered value.
207
+ * `on_value`: Callback to call when the value changes.
208
+ * `disabled`: Whether the input is disabled.
209
+ * `optional`: Whether the value can be None.
210
+ * `continuous_update`: Whether to call the `on_value` callback on every change or only when the input loses focus or the enter key is pressed.
211
+ * `clearable`: Whether the input can be cleared.
212
+ * `classes`: List of CSS classes to apply to the input.
213
+ * `style`: CSS style to apply to the input.
214
+
215
+ """
216
+
217
+ def str_to_float(value: Optional[str]):
218
+ if value:
219
+ try:
220
+ value = value.replace(",", ".")
221
+ return float(value)
222
+ except ValueError:
223
+ raise ValueError("Value must be a number")
224
+ else:
225
+ if optional:
226
+ return None
227
+ else:
228
+ raise ValueError("Value cannot be empty")
229
+
230
+ return _InputNumeric(
231
+ str_to_float,
232
+ label=label,
233
+ value=value,
234
+ on_value=on_value,
235
+ disabled=disabled,
236
+ continuous_update=continuous_update,
237
+ clearable=clearable,
238
+ classes=classes,
239
+ style=style,
240
+ )
241
+
242
+
243
+ @overload
244
+ @solara.component
245
+ def InputInt(
246
+ label: str,
247
+ value: Union[int, solara.Reactive[int]] = 0,
248
+ on_value: Optional[Callable[[int], None]] = ...,
249
+ disabled: bool = ...,
250
+ optional: Literal[False] = ...,
251
+ continuous_update: bool = ...,
252
+ clearable: bool = ...,
253
+ classes: List[str] = ...,
254
+ style: Optional[Union[str, Dict[str, str]]] = ...,
255
+ ) -> reacton.core.ValueElement[vw.TextField, Any]: ...
256
+
257
+
258
+ @overload
259
+ @solara.component
260
+ def InputInt(
261
+ label: str,
262
+ value: Union[Optional[int], solara.Reactive[Optional[int]]] = 0,
263
+ on_value: Optional[Callable[[Optional[int]], None]] = ...,
264
+ disabled: bool = ...,
265
+ optional: Literal[True] = ...,
266
+ continuous_update: bool = ...,
267
+ clearable: bool = ...,
268
+ classes: List[str] = ...,
269
+ style: Optional[Union[str, Dict[str, str]]] = ...,
270
+ ) -> reacton.core.ValueElement[vw.TextField, Any]: ...
271
+
272
+
273
+ @solara.component
274
+ def InputInt(
275
+ label: str,
276
+ value: Union[None, int, solara.Reactive[int], solara.Reactive[Optional[int]]] = 0,
277
+ on_value: Union[None, Callable[[Optional[int]], None], Callable[[int], None]] = None,
278
+ disabled: bool = False,
279
+ optional: bool = False,
280
+ continuous_update: bool = False,
281
+ clearable: bool = False,
282
+ classes: List[str] = [],
283
+ style: Optional[Union[str, Dict[str, str]]] = None,
284
+ ):
285
+ """Numeric input (integers).
286
+
287
+ Basic example:
288
+
289
+ ```solara
290
+ import solara
291
+
292
+ int_value = solara.reactive(42)
293
+ continuous_update = solara.reactive(True)
294
+
295
+ @solara.component
296
+ def Page():
297
+ solara.Checkbox(label="Continuous update", value=continuous_update)
298
+ solara.InputInt("Enter an integer number", value=int_value, continuous_update=continuous_update.value)
299
+ with solara.Row():
300
+ solara.Button("Clear", on_click=lambda: int_value.set(42))
301
+ solara.Markdown(f"**You entered**: {int_value.value}")
302
+ ```
303
+
304
+ ## Arguments
305
+
306
+ * `label`: Label to display next to the slider.
307
+ * `value`: The currently entered value.
308
+ * `on_value`: Callback to call when the value changes.
309
+ * `disabled`: Whether the input is disabled.
310
+ * `optional`: Whether the value can be None.
311
+ * `continuous_update`: Whether to call the `on_value` callback on every change or only when the input loses focus or the enter key is pressed.
312
+ * `clearable`: Whether the input can be cleared.
313
+ * `classes`: List of CSS classes to apply to the input.
314
+ * `style`: CSS style to apply to the input.
315
+ """
316
+
317
+ def str_to_int(value: Optional[str]):
318
+ if value:
319
+ try:
320
+ return int(value)
321
+ except ValueError:
322
+ raise ValueError("Value must be an integer")
323
+ else:
324
+ if optional:
325
+ return None
326
+ else:
327
+ raise ValueError("Value cannot be empty")
328
+
329
+ return _InputNumeric(
330
+ str_to_int,
331
+ label=label,
332
+ value=value,
333
+ on_value=on_value,
334
+ disabled=disabled,
335
+ continuous_update=continuous_update,
336
+ clearable=clearable,
337
+ classes=classes,
338
+ style=style,
339
+ )
340
+
341
+
342
+ def _use_input_type(
343
+ input_value: Union[None, T, solara.Reactive[Optional[T]], solara.Reactive[T]],
344
+ parse: Callable[[Optional[str]], T],
345
+ stringify: Callable[[Optional[T]], str],
346
+ on_value: Union[None, Callable[[Optional[T]], None], Callable[[T], None]] = None,
347
+ ):
348
+ reactive_value = solara.use_reactive(input_value, on_value) # type: ignore
349
+ del input_value, on_value
350
+ string_value, set_string_value = solara.use_state(stringify(reactive_value.value) if reactive_value.value is not None else None)
351
+ # Use a ref to make sure sync_back_input_value() does not get a stale string_value
352
+ string_value_ref = solara.use_ref(string_value)
353
+ string_value_ref.current = string_value
354
+
355
+ error_message = cast(Union[str, None], None)
356
+
357
+ try:
358
+ reactive_value.set(parse(string_value))
359
+ except ValueError as e:
360
+ error_message = str(e.args[0])
361
+
362
+ def sync_back_input_value():
363
+ def on_external_value_change(new_value: Optional[T]):
364
+ new_string_value = stringify(new_value)
365
+ try:
366
+ parse(string_value_ref.current)
367
+ except ValueError:
368
+ # String value could be invalid when external value is changed by a different component
369
+ set_string_value(new_string_value)
370
+ else:
371
+ if new_value != parse(string_value_ref.current):
372
+ set_string_value(new_string_value)
373
+
374
+ return reactive_value.subscribe(on_external_value_change)
375
+
376
+ solara.use_effect(sync_back_input_value, [reactive_value])
377
+
378
+ return string_value, error_message, set_string_value
379
+
380
+
381
+ @solara.component
382
+ def _InputNumeric(
383
+ str_to_numeric: Callable[[Optional[str]], T],
384
+ label: str,
385
+ value: Union[None, T, solara.Reactive[Optional[T]], solara.Reactive[T]],
386
+ on_value: Union[None, Callable[[Optional[T]], None], Callable[[T], None]] = None,
387
+ disabled: bool = False,
388
+ continuous_update: bool = False,
389
+ clearable: bool = False,
390
+ classes: List[str] = [],
391
+ style: Optional[Union[str, Dict[str, str]]] = None,
392
+ ):
393
+ """Numeric input.
394
+
395
+ ## Arguments
396
+
397
+ * `label`: Label to display next to the slider.
398
+ * `value`: The currently entered value.
399
+ * `on_value`: Callback to call when the value changes.
400
+ * `disabled`: Whether the input is disabled.
401
+ * `continuous_update`: Whether to call the `on_value` callback on every change or only when the input loses focus or the enter key is pressed.
402
+ * `classes`: List of CSS classes to apply to the input.
403
+ * `style`: CSS style to apply to the input.
404
+ """
405
+ style_flat = solara.util._flatten_style(style)
406
+ classes_flat = solara.util._combine_classes(classes)
407
+
408
+ internal_value, error, set_value_cast = _use_input_type(
409
+ value,
410
+ str_to_numeric,
411
+ str,
412
+ on_value,
413
+ )
414
+
415
+ def on_v_model(value):
416
+ if continuous_update:
417
+ set_value_cast(value)
418
+
419
+ if error:
420
+ label += f" ({error})"
421
+ text_field = v.TextField(
422
+ v_model=internal_value,
423
+ on_v_model=on_v_model,
424
+ label=label,
425
+ disabled=disabled,
426
+ # we are not using the number type, since we cannot validate invalid input
427
+ # see https://stackoverflow.blog/2022/12/26/why-the-number-input-is-the-worst-input/
428
+ # type="number",
429
+ hide_details=True,
430
+ clearable=clearable,
431
+ error=bool(error),
432
+ class_=classes_flat,
433
+ style_=style_flat,
434
+ )
435
+ use_change(text_field, set_value_cast, enabled=not continuous_update)
436
+ return text_field
@@ -0,0 +1,55 @@
1
+ from typing import Dict, List, Union
2
+
3
+ import ipyvue as vue
4
+ import reacton.ipyvue as vuer
5
+ import solara
6
+
7
+
8
+ @solara.component
9
+ def Link(
10
+ path_or_route: Union[str, solara.Route],
11
+ children=[],
12
+ nofollow=False,
13
+ style: Union[str, Dict[str, str], None] = None,
14
+ classes: List[str] = [],
15
+ ):
16
+ """Makes clicking on child elements navigate to a route.
17
+
18
+ See also:
19
+
20
+ * [Multipage](/documentation/advanced/howto/multipage).
21
+ * [Understanding Routing](/documentation/advanced/understanding/routing).
22
+
23
+ Most common usage is in combination with a button, e.g.:
24
+
25
+ ```python
26
+ with solara.Link("/fruit/banana"):
27
+ solara.Button("Go to banana")
28
+ ```
29
+
30
+
31
+ ## Arguments
32
+
33
+ * path_or_route: the path or route to navigate to. Paths should be absolute, e.g. '/fruit/banana'.
34
+ If a route is given, [`resolve_path`](/documentation/api/routing/resolve_path)] will be used to resolve to the absolute path.
35
+ * children: the children of the link. If a child is clicked, the link will be followed.
36
+ * nofollow: If True, the link will not be followed by web crawlers (such as google).
37
+ * style: CSS styles to apply to the HTML link element. Either a string or a dictionary.
38
+ * classes: A list of CSS classes to apply to the link.
39
+
40
+ """
41
+ path = solara.resolve_path(path_or_route, level=0)
42
+ attributes = {"href": path}
43
+ if nofollow:
44
+ attributes["rel"] = "nofollow"
45
+ style_flat = solara.util._flatten_style(style)
46
+ classes_flat = solara.util._combine_classes(classes)
47
+
48
+ link = vue.Html.element(tag="a", children=children, attributes=attributes, style_=style_flat, class_=classes_flat)
49
+ location = solara.use_context(solara.routing._location_context)
50
+
51
+ def go(*ignore):
52
+ location.pathname = path
53
+
54
+ vuer.use_event(link, "click.prevent.stop", go)
55
+ return link