solara-ui 1.45.0__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 (464) 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 +765 -0
  5. solara/_stores.py +297 -0
  6. solara/alias.py +6 -0
  7. solara/autorouting.py +555 -0
  8. solara/cache.py +305 -0
  9. solara/checks.html +71 -0
  10. solara/checks.py +227 -0
  11. solara/comm.py +28 -0
  12. solara/components/__init__.py +77 -0
  13. solara/components/alert.py +155 -0
  14. solara/components/applayout.py +397 -0
  15. solara/components/button.py +85 -0
  16. solara/components/card.py +87 -0
  17. solara/components/checkbox.py +50 -0
  18. solara/components/code_highlight_css.py +11 -0
  19. solara/components/code_highlight_css.vue +63 -0
  20. solara/components/columns.py +159 -0
  21. solara/components/component_vue.py +134 -0
  22. solara/components/cross_filter.py +335 -0
  23. solara/components/dataframe.py +546 -0
  24. solara/components/datatable.py +214 -0
  25. solara/components/datatable.vue +175 -0
  26. solara/components/details.py +56 -0
  27. solara/components/download.vue +35 -0
  28. solara/components/echarts.py +86 -0
  29. solara/components/echarts.vue +139 -0
  30. solara/components/figure_altair.py +39 -0
  31. solara/components/file_browser.py +181 -0
  32. solara/components/file_download.py +199 -0
  33. solara/components/file_drop.py +159 -0
  34. solara/components/file_drop.vue +83 -0
  35. solara/components/file_list_widget.vue +78 -0
  36. solara/components/head.py +27 -0
  37. solara/components/head_tag.py +49 -0
  38. solara/components/head_tag.vue +60 -0
  39. solara/components/image.py +173 -0
  40. solara/components/input.py +456 -0
  41. solara/components/input_text_area.py +86 -0
  42. solara/components/link.py +55 -0
  43. solara/components/markdown.py +441 -0
  44. solara/components/markdown_editor.py +33 -0
  45. solara/components/markdown_editor.vue +359 -0
  46. solara/components/matplotlib.py +74 -0
  47. solara/components/meta.py +47 -0
  48. solara/components/misc.py +333 -0
  49. solara/components/pivot_table.py +258 -0
  50. solara/components/pivot_table.vue +158 -0
  51. solara/components/progress.py +47 -0
  52. solara/components/select.py +182 -0
  53. solara/components/select.vue +27 -0
  54. solara/components/slider.py +442 -0
  55. solara/components/slider_date.vue +56 -0
  56. solara/components/spinner-solara.vue +105 -0
  57. solara/components/spinner.py +45 -0
  58. solara/components/sql_code.py +41 -0
  59. solara/components/sql_code.vue +125 -0
  60. solara/components/style.py +105 -0
  61. solara/components/switch.py +71 -0
  62. solara/components/tab_navigation.py +37 -0
  63. solara/components/title.py +90 -0
  64. solara/components/title.vue +38 -0
  65. solara/components/togglebuttons.py +200 -0
  66. solara/components/tooltip.py +61 -0
  67. solara/core.py +42 -0
  68. solara/datatypes.py +143 -0
  69. solara/express.py +241 -0
  70. solara/hooks/__init__.py +4 -0
  71. solara/hooks/dataframe.py +99 -0
  72. solara/hooks/misc.py +263 -0
  73. solara/hooks/use_reactive.py +151 -0
  74. solara/hooks/use_thread.py +129 -0
  75. solara/kitchensink.py +8 -0
  76. solara/lab/__init__.py +34 -0
  77. solara/lab/components/__init__.py +7 -0
  78. solara/lab/components/chat.py +215 -0
  79. solara/lab/components/confirmation_dialog.py +163 -0
  80. solara/lab/components/cross_filter.py +7 -0
  81. solara/lab/components/input_date.py +339 -0
  82. solara/lab/components/input_time.py +133 -0
  83. solara/lab/components/menu.py +181 -0
  84. solara/lab/components/menu.vue +38 -0
  85. solara/lab/components/tabs.py +274 -0
  86. solara/lab/components/theming.py +98 -0
  87. solara/lab/components/theming.vue +72 -0
  88. solara/lab/hooks/__init__.py +0 -0
  89. solara/lab/hooks/dataframe.py +2 -0
  90. solara/lab/toestand.py +3 -0
  91. solara/lab/utils/__init__.py +2 -0
  92. solara/lab/utils/cookies.py +5 -0
  93. solara/lab/utils/dataframe.py +165 -0
  94. solara/lab/utils/headers.py +5 -0
  95. solara/layout.py +44 -0
  96. solara/lifecycle.py +46 -0
  97. solara/minisettings.py +141 -0
  98. solara/py.typed +0 -0
  99. solara/reactive.py +99 -0
  100. solara/routing.py +268 -0
  101. solara/scope/__init__.py +88 -0
  102. solara/scope/types.py +55 -0
  103. solara/server/__init__.py +0 -0
  104. solara/server/app.py +527 -0
  105. solara/server/assets/custom.css +1 -0
  106. solara/server/assets/custom.js +1 -0
  107. solara/server/assets/favicon.png +0 -0
  108. solara/server/assets/favicon.svg +5 -0
  109. solara/server/assets/style.css +1681 -0
  110. solara/server/assets/theme-dark.css +437 -0
  111. solara/server/assets/theme-light.css +420 -0
  112. solara/server/assets/theme.js +3 -0
  113. solara/server/cdn_helper.py +91 -0
  114. solara/server/esm.py +71 -0
  115. solara/server/fastapi.py +5 -0
  116. solara/server/flask.py +297 -0
  117. solara/server/jupyter/__init__.py +2 -0
  118. solara/server/jupyter/cdn_handler.py +28 -0
  119. solara/server/jupyter/server_extension.py +40 -0
  120. solara/server/jupyter/solara.py +91 -0
  121. solara/server/jupytertools.py +46 -0
  122. solara/server/kernel.py +388 -0
  123. solara/server/kernel_context.py +467 -0
  124. solara/server/patch.py +564 -0
  125. solara/server/pyinstaller/__init__.py +9 -0
  126. solara/server/pyinstaller/hook-ipyreact.py +5 -0
  127. solara/server/pyinstaller/hook-ipyvuetify.py +5 -0
  128. solara/server/pyinstaller/hook-solara.py +9 -0
  129. solara/server/qt.py +113 -0
  130. solara/server/reload.py +251 -0
  131. solara/server/server.py +484 -0
  132. solara/server/settings.py +249 -0
  133. solara/server/shell.py +269 -0
  134. solara/server/starlette.py +770 -0
  135. solara/server/static/ansi.js +270 -0
  136. solara/server/static/highlight-dark.css +82 -0
  137. solara/server/static/highlight.css +43 -0
  138. solara/server/static/main-vuetify.js +272 -0
  139. solara/server/static/main.js +163 -0
  140. solara/server/static/solara_bootstrap.py +129 -0
  141. solara/server/static/sun.svg +23 -0
  142. solara/server/static/webworker.js +42 -0
  143. solara/server/telemetry.py +212 -0
  144. solara/server/templates/index.html.j2 +1 -0
  145. solara/server/templates/loader-plain.css +11 -0
  146. solara/server/templates/loader-plain.html +20 -0
  147. solara/server/templates/loader-solara.css +111 -0
  148. solara/server/templates/loader-solara.html +40 -0
  149. solara/server/templates/plain.html +82 -0
  150. solara/server/templates/solara.html.j2 +486 -0
  151. solara/server/threaded.py +84 -0
  152. solara/server/utils.py +44 -0
  153. solara/server/websocket.py +45 -0
  154. solara/settings.py +86 -0
  155. solara/tasks.py +893 -0
  156. solara/template/button.py +16 -0
  157. solara/template/markdown.py +42 -0
  158. solara/template/portal/.flake8 +6 -0
  159. solara/template/portal/.pre-commit-config.yaml +28 -0
  160. solara/template/portal/LICENSE +21 -0
  161. solara/template/portal/Procfile +7 -0
  162. solara/template/portal/mypy.ini +3 -0
  163. solara/template/portal/pyproject.toml +26 -0
  164. solara/template/portal/solara_portal/__init__.py +4 -0
  165. solara/template/portal/solara_portal/components/__init__.py +2 -0
  166. solara/template/portal/solara_portal/components/article.py +28 -0
  167. solara/template/portal/solara_portal/components/data.py +28 -0
  168. solara/template/portal/solara_portal/components/header.py +6 -0
  169. solara/template/portal/solara_portal/components/layout.py +6 -0
  170. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
  171. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
  172. solara/template/portal/solara_portal/data.py +60 -0
  173. solara/template/portal/solara_portal/pages/__init__.py +67 -0
  174. solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
  175. solara/template/portal/solara_portal/pages/tabular.py +29 -0
  176. solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
  177. solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
  178. solara/test/__init__.py +0 -0
  179. solara/test/pytest_plugin.py +783 -0
  180. solara/toestand.py +998 -0
  181. solara/util.py +348 -0
  182. solara/validate_hooks.py +258 -0
  183. solara/website/__init__.py +0 -0
  184. solara/website/assets/custom.css +444 -0
  185. solara/website/assets/images/logo-small.png +0 -0
  186. solara/website/assets/images/logo.svg +17 -0
  187. solara/website/assets/images/logo_white.svg +50 -0
  188. solara/website/assets/theme.js +8 -0
  189. solara/website/components/__init__.py +5 -0
  190. solara/website/components/algolia.py +6 -0
  191. solara/website/components/algolia.vue +24 -0
  192. solara/website/components/algolia_api.vue +202 -0
  193. solara/website/components/breadcrumbs.py +28 -0
  194. solara/website/components/contact.py +144 -0
  195. solara/website/components/docs.py +143 -0
  196. solara/website/components/header.py +75 -0
  197. solara/website/components/mailchimp.py +12 -0
  198. solara/website/components/mailchimp.vue +47 -0
  199. solara/website/components/markdown.py +99 -0
  200. solara/website/components/markdown_nav.vue +34 -0
  201. solara/website/components/notebook.py +171 -0
  202. solara/website/components/sidebar.py +105 -0
  203. solara/website/pages/__init__.py +370 -0
  204. solara/website/pages/about/__init__.py +9 -0
  205. solara/website/pages/about/about.md +3 -0
  206. solara/website/pages/apps/__init__.py +16 -0
  207. solara/website/pages/apps/authorization/__init__.py +119 -0
  208. solara/website/pages/apps/authorization/admin.py +12 -0
  209. solara/website/pages/apps/authorization/users.py +12 -0
  210. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  211. solara/website/pages/apps/layout-demo.py +40 -0
  212. solara/website/pages/apps/multipage/__init__.py +38 -0
  213. solara/website/pages/apps/multipage/page1.py +26 -0
  214. solara/website/pages/apps/multipage/page2.py +34 -0
  215. solara/website/pages/apps/scatter.py +136 -0
  216. solara/website/pages/apps/scrolling.py +63 -0
  217. solara/website/pages/apps/tutorial-streamlit.py +18 -0
  218. solara/website/pages/careers/__init__.py +27 -0
  219. solara/website/pages/changelog/__init__.py +10 -0
  220. solara/website/pages/changelog/changelog.md +372 -0
  221. solara/website/pages/contact/__init__.py +34 -0
  222. solara/website/pages/doc_use_download.py +85 -0
  223. solara/website/pages/documentation/__init__.py +90 -0
  224. solara/website/pages/documentation/advanced/__init__.py +9 -0
  225. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  226. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
  227. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
  228. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
  229. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +417 -0
  230. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
  231. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +50 -0
  232. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
  233. solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
  234. solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
  235. solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +72 -0
  236. solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
  237. solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
  238. solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
  239. solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
  240. solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
  241. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  242. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
  243. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
  244. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
  245. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
  246. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
  247. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +192 -0
  248. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
  249. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
  250. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +256 -0
  251. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +108 -0
  252. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
  253. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +7 -0
  254. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +187 -0
  255. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  256. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
  257. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
  258. solara/website/pages/documentation/api/__init__.py +19 -0
  259. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  260. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +22 -0
  261. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +20 -0
  262. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +20 -0
  263. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +20 -0
  264. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  265. solara/website/pages/documentation/api/hooks/use_cross_filter.py +23 -0
  266. solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
  267. solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
  268. solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
  269. solara/website/pages/documentation/api/hooks/use_exception.py +31 -0
  270. solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
  271. solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
  272. solara/website/pages/documentation/api/hooks/use_previous.py +30 -0
  273. solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
  274. solara/website/pages/documentation/api/hooks/use_state.py +10 -0
  275. solara/website/pages/documentation/api/hooks/use_state_or_update.py +66 -0
  276. solara/website/pages/documentation/api/hooks/use_thread.md +64 -0
  277. solara/website/pages/documentation/api/hooks/use_thread.py +42 -0
  278. solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
  279. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  280. solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
  281. solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
  282. solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
  283. solara/website/pages/documentation/api/routing/route.py +29 -0
  284. solara/website/pages/documentation/api/routing/use_route.py +76 -0
  285. solara/website/pages/documentation/api/routing/use_router.py +16 -0
  286. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  287. solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
  288. solara/website/pages/documentation/api/utilities/computed.py +16 -0
  289. solara/website/pages/documentation/api/utilities/display.py +16 -0
  290. solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
  291. solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
  292. solara/website/pages/documentation/api/utilities/memoize.py +35 -0
  293. solara/website/pages/documentation/api/utilities/on_kernel_start.py +44 -0
  294. solara/website/pages/documentation/api/utilities/reactive.py +16 -0
  295. solara/website/pages/documentation/api/utilities/widget.py +104 -0
  296. solara/website/pages/documentation/components/__init__.py +12 -0
  297. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  298. solara/website/pages/documentation/components/advanced/link.py +25 -0
  299. solara/website/pages/documentation/components/advanced/meta.py +17 -0
  300. solara/website/pages/documentation/components/advanced/style.py +43 -0
  301. solara/website/pages/documentation/components/common.py +9 -0
  302. solara/website/pages/documentation/components/data/__init__.py +9 -0
  303. solara/website/pages/documentation/components/data/dataframe.py +44 -0
  304. solara/website/pages/documentation/components/data/pivot_table.py +81 -0
  305. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  306. solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
  307. solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
  308. solara/website/pages/documentation/components/input/__init__.py +9 -0
  309. solara/website/pages/documentation/components/input/button.py +23 -0
  310. solara/website/pages/documentation/components/input/checkbox.py +10 -0
  311. solara/website/pages/documentation/components/input/file_browser.py +30 -0
  312. solara/website/pages/documentation/components/input/file_drop.py +76 -0
  313. solara/website/pages/documentation/components/input/input.py +43 -0
  314. solara/website/pages/documentation/components/input/select.py +22 -0
  315. solara/website/pages/documentation/components/input/slider.py +29 -0
  316. solara/website/pages/documentation/components/input/switch.py +10 -0
  317. solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
  318. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  319. solara/website/pages/documentation/components/lab/chat.py +109 -0
  320. solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
  321. solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
  322. solara/website/pages/documentation/components/lab/input_date.py +20 -0
  323. solara/website/pages/documentation/components/lab/input_time.py +15 -0
  324. solara/website/pages/documentation/components/lab/menu.py +22 -0
  325. solara/website/pages/documentation/components/lab/tab.py +25 -0
  326. solara/website/pages/documentation/components/lab/tabs.py +45 -0
  327. solara/website/pages/documentation/components/lab/task.py +11 -0
  328. solara/website/pages/documentation/components/lab/theming.py +74 -0
  329. solara/website/pages/documentation/components/lab/use_task.py +11 -0
  330. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  331. solara/website/pages/documentation/components/layout/app_bar.py +16 -0
  332. solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
  333. solara/website/pages/documentation/components/layout/app_layout.py +24 -0
  334. solara/website/pages/documentation/components/layout/card.py +15 -0
  335. solara/website/pages/documentation/components/layout/card_actions.py +16 -0
  336. solara/website/pages/documentation/components/layout/column.py +30 -0
  337. solara/website/pages/documentation/components/layout/columns.py +27 -0
  338. solara/website/pages/documentation/components/layout/columns_responsive.py +66 -0
  339. solara/website/pages/documentation/components/layout/details.py +13 -0
  340. solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
  341. solara/website/pages/documentation/components/layout/gridfixed.py +19 -0
  342. solara/website/pages/documentation/components/layout/hbox.py +18 -0
  343. solara/website/pages/documentation/components/layout/row.py +30 -0
  344. solara/website/pages/documentation/components/layout/sidebar.py +24 -0
  345. solara/website/pages/documentation/components/layout/vbox.py +19 -0
  346. solara/website/pages/documentation/components/output/__init__.py +9 -0
  347. solara/website/pages/documentation/components/output/file_download.py +11 -0
  348. solara/website/pages/documentation/components/output/html.py +19 -0
  349. solara/website/pages/documentation/components/output/image.py +11 -0
  350. solara/website/pages/documentation/components/output/markdown.py +57 -0
  351. solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
  352. solara/website/pages/documentation/components/output/sql_code.py +83 -0
  353. solara/website/pages/documentation/components/output/tooltip.py +11 -0
  354. solara/website/pages/documentation/components/page/__init__.py +9 -0
  355. solara/website/pages/documentation/components/page/head.py +15 -0
  356. solara/website/pages/documentation/components/page/title.py +25 -0
  357. solara/website/pages/documentation/components/status/__init__.py +9 -0
  358. solara/website/pages/documentation/components/status/error.py +39 -0
  359. solara/website/pages/documentation/components/status/info.py +39 -0
  360. solara/website/pages/documentation/components/status/progress.py +10 -0
  361. solara/website/pages/documentation/components/status/spinner.py +11 -0
  362. solara/website/pages/documentation/components/status/success.py +40 -0
  363. solara/website/pages/documentation/components/status/warning.py +47 -0
  364. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  365. solara/website/pages/documentation/components/viz/altair.py +42 -0
  366. solara/website/pages/documentation/components/viz/echarts.py +77 -0
  367. solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
  368. solara/website/pages/documentation/components/viz/plotly.py +63 -0
  369. solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
  370. solara/website/pages/documentation/examples/__init__.py +54 -0
  371. solara/website/pages/documentation/examples/ai/__init__.py +11 -0
  372. solara/website/pages/documentation/examples/ai/chatbot.py +113 -0
  373. solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
  374. solara/website/pages/documentation/examples/basics/__init__.py +10 -0
  375. solara/website/pages/documentation/examples/basics/sine.py +28 -0
  376. solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
  377. solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
  378. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
  379. solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
  380. solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
  381. solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
  382. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
  383. solara/website/pages/documentation/examples/general/__init__.py +10 -0
  384. solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
  385. solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
  386. solara/website/pages/documentation/examples/general/live_update.py +32 -0
  387. solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
  388. solara/website/pages/documentation/examples/general/mycard.vue +58 -0
  389. solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
  390. solara/website/pages/documentation/examples/general/vue_component.py +50 -0
  391. solara/website/pages/documentation/examples/ipycanvas.py +49 -0
  392. solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
  393. solara/website/pages/documentation/examples/libraries/altair.py +65 -0
  394. solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
  395. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
  396. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
  397. solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
  398. solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
  399. solara/website/pages/documentation/examples/utilities/countdown_timer.py +62 -0
  400. solara/website/pages/documentation/examples/utilities/todo.py +196 -0
  401. solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
  402. solara/website/pages/documentation/examples/visualization/annotator.py +67 -0
  403. solara/website/pages/documentation/examples/visualization/linked_views.py +81 -0
  404. solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
  405. solara/website/pages/documentation/faq/__init__.py +12 -0
  406. solara/website/pages/documentation/faq/content/99-faq.md +112 -0
  407. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  408. solara/website/pages/documentation/getting_started/content/00-quickstart.md +107 -0
  409. solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
  410. solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
  411. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  412. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
  413. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
  414. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
  415. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
  416. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
  417. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +65 -0
  418. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  419. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
  420. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1021 -0
  421. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  422. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +228 -0
  423. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +278 -0
  424. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  425. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +305 -0
  426. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
  427. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  428. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
  429. solara/website/pages/docutils.py +38 -0
  430. solara/website/pages/home.vue +1199 -0
  431. solara/website/pages/our_team/__init__.py +83 -0
  432. solara/website/pages/pricing/__init__.py +31 -0
  433. solara/website/pages/roadmap/__init__.py +11 -0
  434. solara/website/pages/roadmap/roadmap.md +47 -0
  435. solara/website/pages/scale_ipywidgets.py +45 -0
  436. solara/website/pages/showcase/__init__.py +105 -0
  437. solara/website/pages/showcase/domino_code_assist.py +60 -0
  438. solara/website/pages/showcase/planeto_tessa.py +19 -0
  439. solara/website/pages/showcase/solara_dev.py +54 -0
  440. solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
  441. solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
  442. solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
  443. solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
  444. solara/website/pages/showcase/wanderlust.py +27 -0
  445. solara/website/public/beach.jpeg +0 -0
  446. solara/website/public/logo.svg +6 -0
  447. solara/website/public/social/discord.svg +1 -0
  448. solara/website/public/social/github.svg +1 -0
  449. solara/website/public/social/twitter.svg +3 -0
  450. solara/website/public/success.html +25 -0
  451. solara/website/templates/index.html.j2 +117 -0
  452. solara/website/utils.py +51 -0
  453. solara/widgets/__init__.py +1 -0
  454. solara/widgets/vue/gridlayout.vue +107 -0
  455. solara/widgets/vue/html.vue +4 -0
  456. solara/widgets/vue/navigator.vue +134 -0
  457. solara/widgets/vue/vegalite.vue +130 -0
  458. solara/widgets/widgets.py +74 -0
  459. solara_ui-1.45.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  460. solara_ui-1.45.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  461. solara_ui-1.45.0.dist-info/METADATA +162 -0
  462. solara_ui-1.45.0.dist-info/RECORD +464 -0
  463. solara_ui-1.45.0.dist-info/WHEEL +4 -0
  464. solara_ui-1.45.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,44 @@
1
+ """
2
+ # on_kernel_start
3
+
4
+ Run a function when a virtual kernel (re)starts and optionally run a cleanup function on shutdown.
5
+
6
+ ```python
7
+ def on_kernel_start(f: Callable[[], Optional[Callable[[], None]]]) -> Callable[[], None]:
8
+ ...
9
+ ```
10
+
11
+ `f` will be called on each virtual kernel (re)start. This (usually) happens each time a browser tab connects to the server
12
+ [see solara server for more details](https://solara.dev/docs/understanding/solara-server).
13
+ The (optional) function returned by `f` will be called on kernel shutdown.
14
+
15
+ Note that the cleanup functions are called in reverse order with respect to the order in which they were registered
16
+ (e.g. the cleanup function of the last call to `on_kernel_start` will be called first on kernel shutdown).
17
+
18
+ The return value of on_kernel_start is a cleanup function that will remove the callback from the list of callbacks to be called on kernel start.
19
+
20
+ During hot reload, the callbacks that are added from scripts or modules that will be reloaded will be removed before the app is loaded
21
+ again. This can cause the order of the callbacks to be different than at first run.
22
+
23
+ ## Example
24
+
25
+ ```
26
+ import solara
27
+ import solara.lab
28
+
29
+
30
+ @solara.lab.on_kernel_start
31
+ def on_kernel_start():
32
+ id = solara.get_kernel_id()
33
+ print("Kernel started", id)
34
+ def cleanup():
35
+ print("Kernel stopped", id)
36
+ return cleanup # this function will be called on kernel shutdown
37
+ ```
38
+
39
+ """
40
+
41
+ from solara.website.components import NoPage
42
+
43
+ title = "on_kernel_start"
44
+ Page = NoPage
@@ -0,0 +1,16 @@
1
+ """
2
+ # reactive
3
+
4
+ """
5
+
6
+ import solara
7
+ from solara.website.components import NoPage
8
+ from solara.website.utils import apidoc
9
+
10
+ title = "reactive"
11
+
12
+
13
+ Page = NoPage
14
+
15
+
16
+ __doc__ += apidoc(solara.reactive) # type: ignore
@@ -0,0 +1,104 @@
1
+ """
2
+
3
+ # Component.widget
4
+
5
+ Create a classic ipywidget from a component.
6
+
7
+ ```python
8
+ def widget(self, **kwargs):
9
+ ...
10
+ ```
11
+
12
+
13
+ This will create a widget from the component. The widget will be a
14
+ subclass of `ipywidgets.VBox` and `ipywidgets.ValueWidget`.
15
+
16
+ Example
17
+
18
+ ```python
19
+ import solara
20
+ widget = solara.FileDownload.widget(data="some text data", filename="solara-demo.txt")
21
+ ```
22
+
23
+ This is very useful if you are migrating your application from a classic
24
+ ipywidget to solara. See [also the ipywidgets tutorial](/documentation/getting_started/tutorials/ipywidgets).
25
+
26
+ The `ipywidgets.ValueWidget` is used to enable the use of the widget in
27
+ interact, or interactive. The `ipywidgets.VBox` is used to enable
28
+ nesting of widgets.
29
+
30
+ All keyword arguments will be passed to the component.
31
+ Each argument pair of `on_<name>` and `<name>` will
32
+ be added as a trait in the widget.
33
+
34
+ For example,
35
+
36
+ ```solara
37
+ import solara
38
+ import ipywidgets as widgets
39
+ import random
40
+
41
+
42
+ countries_demo_data = {
43
+ "Netherlands": ["Amsterdam", "Rotterdam", "The Hague"],
44
+ "Germany": ["Berlin", "Hamburg", "Munich"],
45
+ "France": ["Paris", "Marseille", "Lyon"],
46
+ }
47
+
48
+
49
+ # this component can be used in a component three, but ...
50
+ @solara.component
51
+ def LocationSelect(value, on_value, countries=countries_demo_data):
52
+ country, city = value
53
+ cities = countries.get(country, [])
54
+ # reset to None if not in the list of countries
55
+ if city not in cities:
56
+ city = None
57
+ # update the state if we changed/reset city
58
+ on_value((country, city))
59
+
60
+ with solara.Card("Location"):
61
+ solara.Select(label="country",
62
+ values=list(countries),
63
+ value=country,
64
+ on_value=lambda country: on_value((country, city)),
65
+ )
66
+ solara.Select(label="city",
67
+ values=cities,
68
+ value=city,
69
+ on_value=lambda city: on_value((country, city)),
70
+ )
71
+
72
+
73
+ # Using .widget(...) we can create a widget from it.
74
+ # For use with interact:
75
+ @widgets.interact(location=LocationSelect.widget(value=("Netherlands", "Amsterdam")))
76
+ def f(size=3.4, location=None):
77
+ print(size, location)
78
+
79
+
80
+ # Or to add to your VBox:
81
+ widgets.VBox(
82
+ [LocationSelect.widget(value=("Netherlands", "Amsterdam"))]
83
+ )
84
+
85
+ # this is how you'd use it as a component
86
+ @solara.component
87
+ def Page():
88
+ value, set_value = solara.use_state(("Netherlands", "Amsterdam"))
89
+ def pick():
90
+ country = random.choice(list(countries_demo_data))
91
+ city = random.choice(countries_demo_data[country])
92
+ set_value((country, city))
93
+
94
+ LocationSelect(value=value, on_value=set_value)
95
+ solara.Button("Pick random place", on_click=pick)
96
+
97
+ ```
98
+
99
+ """
100
+
101
+ from solara.website.components import NoPage
102
+
103
+ Page = NoPage
104
+ title = "widget"
@@ -0,0 +1,12 @@
1
+ import solara
2
+ from solara.website.components import CategoryLayout, Gallery
3
+
4
+
5
+ @solara.component
6
+ def Page(route_external=None):
7
+ Gallery(route_external)
8
+
9
+
10
+ @solara.component
11
+ def Layout(children=[]):
12
+ CategoryLayout(children=children)
@@ -0,0 +1,9 @@
1
+ import solara
2
+ from solara.website.components import NoPage, SubCategoryLayout
3
+
4
+ Page = NoPage
5
+
6
+
7
+ @solara.component
8
+ def Layout(children=[]):
9
+ SubCategoryLayout(children=children)
@@ -0,0 +1,25 @@
1
+ """# Link"""
2
+
3
+ import solara
4
+ from solara.website.utils import apidoc
5
+
6
+ routes = [
7
+ solara.Route(path="/"),
8
+ solara.Route(path="kiwi"),
9
+ solara.Route(path="banana"),
10
+ solara.Route(path="apple"),
11
+ ]
12
+
13
+
14
+ @solara.component
15
+ def Page():
16
+ route_current, routes = solara.use_route()
17
+ solara.Info("Note the address bar in the browser. It should change to the path of the link.")
18
+ with solara.Row():
19
+ for route in routes:
20
+ with solara.Link(route):
21
+ current = route_current is route
22
+ solara.Button(f"Go to {route.path}", color="red" if current else None)
23
+
24
+
25
+ __doc__ += apidoc(solara.Link.f) # type: ignore
@@ -0,0 +1,17 @@
1
+ """# Meta"""
2
+
3
+ import solara
4
+ from solara.website.utils import apidoc
5
+
6
+
7
+ @solara.component
8
+ def Page():
9
+ solara.Info("Nothing to see here, only in this page's source code, or by looking at the google search results for this page.")
10
+ with solara.Head():
11
+ solara.Meta(
12
+ name="description",
13
+ content="The Meta component can be used to set the description of a page. This is useful for SEO, or crawlers that index your page.",
14
+ )
15
+
16
+
17
+ __doc__ += apidoc(solara.Meta.f) # type: ignore
@@ -0,0 +1,43 @@
1
+ """
2
+ # Style
3
+
4
+ """
5
+
6
+ import solara
7
+ from solara.website.utils import apidoc
8
+
9
+
10
+ @solara.component
11
+ def Page():
12
+ insert_css, set_insert_css = solara.use_state(True)
13
+
14
+ css = """
15
+ .mybutton {
16
+ font-family: Serif;
17
+ }
18
+
19
+ /* this selector has to be very specific to override the vuetify style */
20
+ .v-btn.mybutton {
21
+ color: #4CAF50; /* Green */
22
+ }
23
+ /* vuetify's background color css has very high CSS-specificity, so we use !important */
24
+ .mybutton {
25
+ background-color: #FF9800 !important; /* Orange */
26
+ }
27
+ """
28
+
29
+ solara.Checkbox(label="Use CSS", value=insert_css, on_value=set_insert_css)
30
+ solara.Markdown(
31
+ f"""
32
+ ## CSS Example that styles the button below
33
+ ```css
34
+ {css}
35
+ ```
36
+ """
37
+ )
38
+ if insert_css:
39
+ solara.Style(css)
40
+ solara.Button(label="Advanced users might want to style this", icon_name="mdi-thumb-up", classes=["mybutton"])
41
+
42
+
43
+ __doc__ += apidoc(solara.Style.f) # type: ignore
@@ -0,0 +1,9 @@
1
+ import solara
2
+ from solara.alias import rv
3
+
4
+
5
+ @solara.component
6
+ def ColorCard(title, color):
7
+ with rv.Card(style_=f"background-color: {color}; width: 100%; height: 100%") as main:
8
+ rv.CardTitle(children=[title])
9
+ return main
@@ -0,0 +1,9 @@
1
+ import solara
2
+ from solara.website.components import NoPage, SubCategoryLayout
3
+
4
+ Page = NoPage
5
+
6
+
7
+ @solara.component
8
+ def Layout(children=[]):
9
+ SubCategoryLayout(children=children)
@@ -0,0 +1,44 @@
1
+ """
2
+ # DataFrame
3
+
4
+ """
5
+
6
+ from typing import Any, Dict, Optional, cast
7
+
8
+ import plotly
9
+
10
+ import solara
11
+ from solara.website.utils import apidoc
12
+
13
+ df = plotly.data.iris()
14
+
15
+
16
+ @solara.component
17
+ def Page():
18
+ column, set_column = solara.use_state(cast(Optional[str], None))
19
+ cell, set_cell = solara.use_state(cast(Dict[str, Any], {}))
20
+
21
+ def on_action_column(column):
22
+ set_column(column)
23
+
24
+ def on_action_cell(column, row_index):
25
+ set_cell(dict(column=column, row_index=row_index))
26
+
27
+ column_actions = [solara.ColumnAction(icon="mdi-sunglasses", name="User column action", on_click=on_action_column)]
28
+ cell_actions = [solara.CellAction(icon="mdi-white-balance-sunny", name="User cell action", on_click=on_action_cell)]
29
+ solara.Markdown(
30
+ f"""
31
+ ## Demo
32
+
33
+ Below we show display the titanic dataset, and demonstrate a user column and cell action. Try clicking on the triple icon when hovering
34
+ above a column or cell. And see the following values changes:
35
+
36
+ * Column action on: `{column}`
37
+ * Cell action on: `{cell}`
38
+
39
+ """
40
+ )
41
+ solara.DataFrame(df, column_actions=column_actions, cell_actions=cell_actions)
42
+
43
+
44
+ __doc__ += apidoc(solara.DataFrame.f) # type: ignore
@@ -0,0 +1,81 @@
1
+ """
2
+ # PivotTable
3
+
4
+ Interactive [Pivot Table](https://en.wikipedia.org/wiki/Pivot_table) showing aggregated data in groups.
5
+
6
+ We provide three version of the pivot table
7
+
8
+ * PivotTableView: Takes already aggregated data as input
9
+ * PivotTable: Takes a dataframe as input and aggregates it for you.
10
+ * PivotTableCard: Similar to PivotTable but with a card layout, and configuration options.
11
+
12
+ """
13
+
14
+ import solara
15
+
16
+ try:
17
+ import vaex.datasets
18
+
19
+ df = vaex.datasets.titanic()
20
+ except Exception:
21
+ df = None
22
+ vaex = None
23
+
24
+
25
+ @solara.component
26
+ def View():
27
+ # select on the 2nd x axis, index=3, which means (pclass=2, survived=true)
28
+ # Note: the indices refer to the header_x and header_y
29
+ selected, on_selected = solara.use_state({"x": [1, 3]})
30
+ data = solara.PivotTableData(
31
+ {
32
+ "x": ["pclass", "survived"],
33
+ "y": ["sex"],
34
+ "agg": "count",
35
+ "values": [["5", "118"], ["139", "61"], ["12", "146"], ["94", "25"], ["110", "418"], ["106", "75"]],
36
+ "values_x": ["123", "200", "158", "119", "528", "181"],
37
+ "values_y": ["466", "843"],
38
+ "headers_x": [["1", "1", "2", "2", "3", "3"], ["false", "true", "false", "true", "false", "true"]],
39
+ "headers_y": [["female", "male"]],
40
+ "counts_x": 6,
41
+ "counts_y": 2,
42
+ "total": "1,309",
43
+ }
44
+ )
45
+ with solara.VBox() as main:
46
+ solara.Markdown(f"`selected = {selected}`")
47
+ solara.PivotTableView(data=data, selected=selected, on_selected=on_selected)
48
+ return main
49
+
50
+
51
+ @solara.component
52
+ def Page():
53
+ if vaex is None:
54
+ return solara.Markdown("This example requires vaex, please install it with `pip install vaex`")
55
+ with solara.Div() as main:
56
+ solara.Markdown("# Titanic")
57
+ selected, on_selected = solara.use_state({"x": [0, 0]}) # noqa: SH101
58
+ solara.provide_cross_filter()
59
+ with solara.VBox():
60
+ type, set_type = solara.use_state("view") # noqa: SH101
61
+ with solara.ToggleButtonsSingle(type, on_value=set_type):
62
+ solara.Button("PivotTableView", value="view")
63
+ solara.Button("PivotTable", value="df")
64
+ solara.Button("PivotTableCard", value="card")
65
+ if type == "view":
66
+ solara.Markdown("# PivotTableView\nThis component will take aggregates data as input")
67
+ View()
68
+ elif type == "df":
69
+ solara.Markdown("# PivotTable\nThis component aggregates the dataframe for you")
70
+ solara.Markdown(f"`selected = {selected}`")
71
+ solara.PivotTable(df, ["pclass"], ["sex"], selected=selected, on_selected=on_selected)
72
+ elif type == "card":
73
+ solara.Markdown("# PivotTable\nThis component aggregates the dataframe for you, and gives a UI to configure the component")
74
+ solara.Markdown(f"`selected = {selected}`")
75
+ solara.PivotTableCard(df, ["pclass"], ["sex"], selected=selected, on_selected=on_selected)
76
+ return main
77
+
78
+
79
+ Component = Page
80
+ App = Component
81
+ app = Page()
@@ -0,0 +1,9 @@
1
+ import solara
2
+ from solara.website.components import NoPage, SubCategoryLayout
3
+
4
+ Page = NoPage
5
+
6
+
7
+ @solara.component
8
+ def Layout(children=[]):
9
+ SubCategoryLayout(children=children)
@@ -0,0 +1,24 @@
1
+ """
2
+ # Avatar
3
+
4
+ """
5
+
6
+ from types import ModuleType
7
+ from typing import Optional
8
+
9
+ auth: Optional[ModuleType]
10
+ try:
11
+ from solara_enterprise import auth
12
+ except ImportError:
13
+ auth = None
14
+ from solara.website.components import NoPage
15
+ from solara.website.utils import apidoc
16
+
17
+ title = "Avatar"
18
+
19
+ Page = NoPage
20
+
21
+ if auth:
22
+ __doc__ += apidoc(auth.Avatar.f) # type: ignore
23
+ else:
24
+ __doc__ += "solara-enterprise not installed."
@@ -0,0 +1,25 @@
1
+ """
2
+ # AvatarMenu
3
+
4
+ """
5
+
6
+ from types import ModuleType
7
+ from typing import Optional
8
+
9
+ auth: Optional[ModuleType]
10
+ try:
11
+ from solara_enterprise import auth
12
+ except ImportError:
13
+ auth = None
14
+ from solara.website.components import NoPage
15
+ from solara.website.utils import apidoc
16
+
17
+ title = "AvatarMenu"
18
+
19
+ Page = NoPage
20
+
21
+
22
+ if auth:
23
+ __doc__ += apidoc(auth.AvatarMenu.f) # type: ignore
24
+ else:
25
+ __doc__ += "solara-enterprise not installed."
@@ -0,0 +1,9 @@
1
+ import solara
2
+ from solara.website.components import NoPage, SubCategoryLayout
3
+
4
+ Page = NoPage
5
+
6
+
7
+ @solara.component
8
+ def Layout(children=[]):
9
+ SubCategoryLayout(children=children)
@@ -0,0 +1,23 @@
1
+ """
2
+ # Button
3
+
4
+ """
5
+
6
+ import solara
7
+ from solara.website.utils import apidoc
8
+
9
+
10
+ @solara.component
11
+ def Page():
12
+ count, set_count = solara.use_state(0)
13
+
14
+ def increment():
15
+ set_count(count + 1)
16
+
17
+ with solara.VBox() as main:
18
+ with solara.HBox():
19
+ solara.Button(label=f"Clicked {count} times", on_click=increment, icon_name="mdi-thumb-up")
20
+ return main
21
+
22
+
23
+ __doc__ += apidoc(solara.Button.f) # type: ignore
@@ -0,0 +1,10 @@
1
+ """# Checkbox"""
2
+
3
+ import solara
4
+ from solara.website.components import NoPage
5
+ from solara.website.utils import apidoc
6
+
7
+ Page = NoPage
8
+
9
+
10
+ __doc__ += apidoc(solara.Checkbox.f) # type: ignore
@@ -0,0 +1,30 @@
1
+ """# FileBrowser"""
2
+
3
+ from pathlib import Path
4
+ from typing import Optional, cast
5
+
6
+ import solara
7
+ from solara.website.utils import apidoc
8
+
9
+
10
+ @solara.component
11
+ def Page():
12
+ file, set_file = solara.use_state(cast(Optional[Path], None))
13
+ path, set_path = solara.use_state(cast(Optional[Path], None))
14
+ directory, set_directory = solara.use_state(Path("~").expanduser())
15
+
16
+ can_select = solara.ui_checkbox("Enable select")
17
+
18
+ def reset_path():
19
+ set_path(None)
20
+ set_file(None)
21
+
22
+ # reset path and file when can_select changes
23
+ solara.use_memo(reset_path, [can_select])
24
+ solara.FileBrowser(directory, on_directory_change=set_directory, on_path_select=set_path, on_file_open=set_file, can_select=can_select)
25
+ solara.Info(f"You are in directory: {directory}")
26
+ solara.Info(f"You selected path: {path}")
27
+ solara.Info(f"You opened file: {file}")
28
+
29
+
30
+ __doc__ += apidoc(solara.FileBrowser.f) # type: ignore
@@ -0,0 +1,76 @@
1
+ """
2
+ # FileDrop components
3
+
4
+ FileDrop comes in two flavours:
5
+
6
+ * `FileDrop` for a single file upload
7
+ * `FileDropMultiple` which allows for multiple file upload
8
+
9
+
10
+ """
11
+
12
+ import textwrap
13
+ from typing import List, cast
14
+
15
+ import solara
16
+ from solara.components.file_drop import FileInfo
17
+ from solara.website.utils import apidoc
18
+
19
+
20
+ @solara.component
21
+ def FileDropMultipleDemo():
22
+ content, set_content = solara.use_state(cast(List[bytes], []))
23
+ filename, set_filename = solara.use_state(cast(List[str], []))
24
+ size, set_size = solara.use_state(cast(List[int], []))
25
+
26
+ def on_file(files: List[FileInfo]):
27
+ set_filename([f["name"] for f in files])
28
+ set_size([f["size"] for f in files])
29
+ set_content([f["file_obj"].read(100) for f in files])
30
+
31
+ solara.FileDropMultiple(
32
+ label="Drag and drop files(s) here to read the first 100 bytes.",
33
+ on_file=on_file,
34
+ lazy=True, # We will only read the first 100 bytes
35
+ )
36
+ if content:
37
+ solara.Info(f"Number of uploaded files: {len(filename)}")
38
+ for f, s, c in zip(filename, size, content):
39
+ solara.Info(f"File {f} has total length: {s}\n, first 100 bytes:")
40
+ solara.Preformatted("\n".join(textwrap.wrap(repr(c))))
41
+
42
+
43
+ @solara.component
44
+ def FileDropDemo():
45
+ content, set_content = solara.use_state(b"")
46
+ filename, set_filename = solara.use_state("")
47
+ size, set_size = solara.use_state(0)
48
+
49
+ def on_file(f: FileInfo):
50
+ set_filename(f["name"])
51
+ set_size(f["size"])
52
+ set_content(f["file_obj"].read(100))
53
+
54
+ solara.FileDrop(
55
+ label="Drag and drop a file here to read the first 100 bytes.",
56
+ on_file=on_file,
57
+ lazy=True, # We will only read the first 100 bytes
58
+ )
59
+ if content:
60
+ solara.Info(f"File {filename} has total length: {size}\n, first 100 bytes:")
61
+ solara.Preformatted("\n".join(textwrap.wrap(repr(content))))
62
+
63
+
64
+ @solara.component
65
+ def Page():
66
+ with solara.Row():
67
+ with solara.Card(title="FileDrop"):
68
+ FileDropDemo()
69
+ with solara.Card(title="FileDropMultiple"):
70
+ FileDropMultipleDemo()
71
+
72
+
73
+ __doc__ += "# FileDrop"
74
+ __doc__ += apidoc(solara.FileDrop.f) # type: ignore
75
+ __doc__ += "# FileDropMultiple"
76
+ __doc__ += apidoc(solara.FileDropMultiple.f) # type: ignore
@@ -0,0 +1,43 @@
1
+ """# Input fields
2
+
3
+ This page contains all the input fields available in Solara.
4
+
5
+ # InputText
6
+ """
7
+
8
+ import solara
9
+ from solara.website.components import NoPage
10
+ from solara.website.utils import apidoc
11
+
12
+ Page = NoPage
13
+
14
+
15
+ __doc__ += apidoc(solara.InputText.f) # type: ignore
16
+ __doc__ += "# InputTextArea"
17
+ __doc__ += apidoc(solara.InputTextArea.f) # type: ignore
18
+ __doc__ += "# InputFloat"
19
+ __doc__ += apidoc(solara.InputFloat.f) # type: ignore
20
+ __doc__ += "# InputInt"
21
+ __doc__ += apidoc(solara.InputInt.f) # type: ignore
22
+
23
+ __doc__ += """
24
+ # Autofocus Example
25
+
26
+ ```solara
27
+ import solara
28
+ import solara.lab
29
+
30
+
31
+ @solara.component
32
+ def Page():
33
+ show_dialog = solara.use_reactive(False)
34
+ show_conditional = solara.use_reactive(False)
35
+ with solara.Row():
36
+ solara.Button("Show dialog", on_click=lambda: show_dialog.set(True))
37
+ solara.Button("Show conditionally rendered element", on_click=lambda: show_conditional.set(not show_conditional.value))
38
+ with solara.lab.ConfirmationDialog(open=show_dialog):
39
+ solara.InputFloat("Float here", autofocus=True)
40
+ if show_conditional.value:
41
+ solara.InputFloat("Float here", autofocus=True)
42
+ ```
43
+ """