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,116 @@
1
+ from pathlib import Path
2
+
3
+ import folium
4
+ import folium.plugins
5
+ import matplotlib.pyplot as plt
6
+ import pandas as pd
7
+
8
+ import solara
9
+
10
+ districts = solara.reactive(
11
+ ["Bayview", "Northern"],
12
+ )
13
+ categories = solara.reactive(["Vandalism", "Assault", "Robbery"])
14
+ limit = solara.reactive(100)
15
+
16
+
17
+ ROOT = Path(solara.__file__).parent / "website" / "pages" / "documentation" / "getting_started" / "content" / "04-tutorials"
18
+ path = ROOT / Path("SF_crime_sample.csv.gz")
19
+ url = "https://raw.githubusercontent.com/widgetti/solara/master/solara/website/pages/docs/content/04-tutorial/SF_crime_sample.csv"
20
+
21
+ if path.exists():
22
+ df_crime = pd.read_csv(path)
23
+ else:
24
+ df_crime = pd.read_csv(url)
25
+
26
+ df_crime
27
+
28
+
29
+ df_crime["Category"] = df_crime["Category"].str.title()
30
+ df_crime["PdDistrict"] = df_crime["PdDistrict"].str.title()
31
+
32
+
33
+ def crime_filter(df, district_values, category_values):
34
+ df_dist = df.loc[df["PdDistrict"].isin(district_values)]
35
+ df_category = df_dist.loc[df_dist["Category"].isin(category_values)]
36
+ return df_category
37
+
38
+
39
+ def crime_charts(df):
40
+ cat_unique = df["Category"].value_counts()
41
+ cat_unique = cat_unique.reset_index()
42
+
43
+ dist_unique = df["PdDistrict"].value_counts()
44
+ dist_unique = dist_unique.reset_index()
45
+
46
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 10))
47
+
48
+ ax1.bar(cat_unique["Category"], cat_unique["count"])
49
+ ax1.set_title("Amount of Criminal Case Based on Category")
50
+ ax2.bar(dist_unique["PdDistrict"], dist_unique["count"])
51
+ ax2.set_title("Amount of Criminal Case in Selected District")
52
+
53
+ # this does not work on solara yet: https://github.com/widgetti/solara/issues/399
54
+ # display(fig)
55
+ # plt.close(fig)
56
+ solara.FigureMatplotlib(fig)
57
+
58
+
59
+ def crime_map(df):
60
+ latitude = 37.77
61
+ longitude = -122.42
62
+
63
+ sanfran_map = folium.Map(height=400, location=[latitude, longitude], zoom_start=12)
64
+
65
+ incidents = folium.plugins.MarkerCluster().add_to(sanfran_map)
66
+
67
+ # loop through the dataframe and add each data point to the mark cluster
68
+ for (
69
+ lat,
70
+ lng,
71
+ label,
72
+ ) in zip(df.Y, df.X, df.Category):
73
+ folium.Marker(
74
+ location=[lat, lng],
75
+ icon=None,
76
+ popup=label,
77
+ ).add_to(incidents)
78
+
79
+ # show map
80
+ solara.display(sanfran_map)
81
+
82
+
83
+ @solara.component
84
+ def View():
85
+ dff = crime_filter(df_crime, districts.value, categories.value)
86
+ row_count = len(dff)
87
+ if row_count > limit.value:
88
+ solara.Warning(f"Only showing the first {limit.value} of {row_count:,} crimes on map")
89
+ with solara.Column(style={"max-height": "400px"}):
90
+ crime_map(dff.iloc[: limit.value])
91
+ if row_count > 0:
92
+ crime_charts(dff)
93
+ else:
94
+ solara.Warning("You filtered out all the data, no charts shown")
95
+
96
+
97
+ @solara.component
98
+ def Controls():
99
+ solara.SelectMultiple("District", all_values=[str(k) for k in df_crime["PdDistrict"].unique().tolist()], values=districts) # type: ignore
100
+ solara.SelectMultiple("Category", all_values=[str(k) for k in df_crime["Category"].unique().tolist()], values=categories) # type: ignore
101
+ solara.Text("Maximum number of rows to show on map")
102
+ solara.SliderInt("", value=limit, min=1, max=1000)
103
+
104
+
105
+ @solara.component
106
+ def Page():
107
+ with solara.Sidebar():
108
+ Controls()
109
+ View()
110
+
111
+
112
+ # only needed on the solara website itself
113
+ @solara.component
114
+ def Layout(children):
115
+ route, routes = solara.use_route()
116
+ return solara.AppLayout(children=children)
@@ -0,0 +1,40 @@
1
+ import solara
2
+ import solara.lab
3
+
4
+ github_url = solara.util.github_url(__file__)
5
+
6
+
7
+ @solara.component
8
+ def Page():
9
+ with solara.Column():
10
+ solara.Title("I'm in the browser tab and the toolbar bar")
11
+ with solara.Sidebar():
12
+ with solara.Card("I am in the sidebar"):
13
+ with solara.Column():
14
+ solara.SliderInt(label="Ideal for placing controls")
15
+ solara.Button(
16
+ label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True
17
+ )
18
+
19
+ solara.Info("I'm in the main content area, put your main content here")
20
+ with solara.Card("Use solara.Columns to create relatively sized columns"):
21
+ with solara.Columns([1, 2]):
22
+ solara.Success("I'm in the first column")
23
+ solara.Warning("I'm in the second column, I am twice as wide")
24
+
25
+ with solara.Card("Use solara.Column to create a full width column"):
26
+ with solara.Column():
27
+ solara.Success("I'm first in this full with column")
28
+ solara.Warning("I'm second in this full with column")
29
+ solara.Error("I'm third in this full with column")
30
+
31
+ with solara.Card("Use solara.ColumnsResponsive to response to screen size"):
32
+ with solara.ColumnsResponsive(6, large=4):
33
+ for i in range(6):
34
+ solara.Info("two per column on small screens, three per column on large screens")
35
+
36
+
37
+ @solara.component
38
+ def Layout(children):
39
+ route, routes = solara.use_route()
40
+ return solara.AppLayout(children=children)
@@ -0,0 +1,38 @@
1
+ import solara
2
+
3
+ github_url = solara.util.github_url(__file__)
4
+ # some app state that outlives a single page
5
+ app_state = solara.reactive(0)
6
+
7
+
8
+ @solara.component
9
+ def SharedComponent():
10
+ with solara.Card("Shown on each page", style={"max-width": "500px"}, margin=0, classes=["my-2"]):
11
+ solara.Markdown(
12
+ f"""
13
+ This component will be used on each page.
14
+
15
+ It uses the `app_state` [reactive variable](https://solara.dev/documentation/api/utilities/reactive)
16
+ so that the state outlives each page
17
+
18
+
19
+ app_state: {app_state.value}
20
+ """
21
+ )
22
+ solara.Button(label="Increment app_state", icon_name="mdi-plus", on_click=lambda: app_state.set(app_state.value + 1), outlined=True)
23
+
24
+
25
+ @solara.component
26
+ def Page():
27
+ with solara.Sidebar():
28
+ solara.Markdown("This is the sidebar at the home page!")
29
+ with solara.Card("Home"):
30
+ solara.Markdown("This is the home page")
31
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
32
+
33
+ SharedComponent()
34
+
35
+
36
+ @solara.component
37
+ def Layout(children):
38
+ return solara.AppLayout(children=children)
@@ -0,0 +1,26 @@
1
+ import solara
2
+
3
+ from . import SharedComponent
4
+
5
+ github_url = solara.util.github_url(__file__)
6
+
7
+
8
+ @solara.component
9
+ def Sub():
10
+ with solara.Card("Sub component", margin=0, classes=["my-2"]):
11
+ solara.Markdown("This sub component is the best")
12
+ with solara.Sidebar():
13
+ with solara.Card("Sidebar of sub component", margin=0, elevation=0):
14
+ solara.Markdown("*Markdown* **is** 👍")
15
+ SharedComponent()
16
+
17
+
18
+ @solara.component
19
+ def Page():
20
+ with solara.Sidebar():
21
+ with solara.Card("Sidebar of page 1", margin=0, elevation=0):
22
+ solara.Markdown("Hi there 👋!")
23
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
24
+ with solara.Card("Page 1"):
25
+ Sub()
26
+ solara.Markdown("Page 1 is the best")
@@ -0,0 +1,34 @@
1
+ import solara
2
+
3
+ from . import SharedComponent
4
+
5
+ github_url = solara.util.github_url(__file__)
6
+
7
+
8
+ @solara.component
9
+ def Page():
10
+ component_state = solara.use_reactive(0)
11
+ solara.Title("Page 2 set with title")
12
+ with solara.Card("Page 2"):
13
+ solara.Markdown("Page 2 is even better, even though it has no sidebar.")
14
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
15
+ SharedComponent()
16
+
17
+ with solara.Card("Shown only on page2", style={"max-width": "500px"}, margin=0, classes=["my-2"]):
18
+ solara.Markdown(
19
+ f"""
20
+ The lifetime of `component_state` if bound to this page. If you navigate away from it,
21
+ the state will be reset.
22
+
23
+ It creates the `component_state` [using the use_reactive hook](https://solara.dev/api/use_reactive)
24
+ so that the state is bound to the component.
25
+
26
+ See also [about state management](https://solara.dev/documentation/getting_started/fundamentals/state-management) for more information.
27
+
28
+
29
+ component_state: {component_state.value}
30
+ """
31
+ )
32
+ solara.Button(
33
+ label="Increment component_state", icon_name="mdi-plus", on_click=lambda: component_state.set(component_state.value + 1), outlined=True
34
+ )
@@ -0,0 +1,136 @@
1
+ import pathlib
2
+ import sys
3
+ from typing import Optional, cast
4
+
5
+ import pandas as pd
6
+
7
+ import solara
8
+ import solara.express as solara_px # similar to plotly express, but comes with cross filters
9
+ import solara.lab
10
+ from solara.components.columns import Columns
11
+ from solara.components.file_drop import FileDrop
12
+
13
+ github_url = solara.util.github_url(__file__)
14
+ if sys.platform != "emscripten":
15
+ pycafe_url = solara.util.pycafe_url(path=pathlib.Path(__file__), requirements=["pandas", "plotly"])
16
+ else:
17
+ pycafe_url = None
18
+ df_sample = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")
19
+
20
+
21
+ class State:
22
+ size_max = solara.reactive(40.0)
23
+ size = solara.reactive(cast(Optional[str], None))
24
+ color = solara.reactive(cast(Optional[str], None))
25
+ x = solara.reactive(cast(Optional[str], None))
26
+ y = solara.reactive(cast(Optional[str], None))
27
+ logx = solara.reactive(False)
28
+ logy = solara.reactive(False)
29
+ df = solara.reactive(cast(Optional[pd.DataFrame], None))
30
+
31
+ @staticmethod
32
+ def load_sample():
33
+ State.x.value = "gdpPercap"
34
+ State.y.value = "lifeExp"
35
+ State.size.value = "pop"
36
+ State.color.value = "continent"
37
+ State.logx.value = True
38
+ State.df.value = df_sample
39
+
40
+ @staticmethod
41
+ def load_from_file(file):
42
+ df = pd.read_csv(file["file_obj"])
43
+ State.x.value = str(df.columns[0])
44
+ State.y.value = str(df.columns[1])
45
+ State.size.value = str(df.columns[2])
46
+ State.color.value = str(df.columns[3])
47
+ State.df.value = df
48
+
49
+ @staticmethod
50
+ def reset():
51
+ State.df.value = None
52
+
53
+
54
+ @solara.component
55
+ def Page():
56
+ df = State.df.value
57
+ dark_effective = solara.lab.use_dark_effective()
58
+
59
+ # the .scatter will set this cross filter
60
+ filter, _set_filter = solara.use_cross_filter(id(df))
61
+
62
+ # only apply the filter if the filter or dataframe changes
63
+ def filter_df():
64
+ if filter is not None and df is not None:
65
+ return df.loc[filter]
66
+
67
+ dff = solara.use_memo(filter_df, dependencies=[df, filter])
68
+
69
+ with solara.AppBar():
70
+ solara.lab.ThemeToggle()
71
+ with solara.Sidebar():
72
+ with solara.Card("Controls", margin=0, elevation=0):
73
+ with solara.Column():
74
+ with solara.Row():
75
+ solara.Button("Sample dataset", color="primary", text=True, outlined=True, on_click=State.load_sample, disabled=df is not None)
76
+ solara.Button("Clear dataset", color="primary", text=True, outlined=True, on_click=State.reset)
77
+ if sys.platform != "emscripten":
78
+ FileDrop(on_file=State.load_from_file, on_total_progress=lambda *args: None, label="Drag file here")
79
+ else:
80
+ solara.Info("File upload not supported in this environment")
81
+
82
+ if df is not None:
83
+ solara.SliderFloat(label="Size", value=State.size_max, min=1, max=100)
84
+ solara.Checkbox(label="Log x", value=State.logx)
85
+ solara.Checkbox(label="Log y", value=State.logy)
86
+ columns = list(map(str, df.columns))
87
+ solara.Select("Column x", values=columns, value=State.x)
88
+ solara.Select("Column y", values=columns, value=State.y)
89
+ solara.Select("Size", values=columns, value=State.size)
90
+ solara.Select("Color", values=columns, value=State.color)
91
+ if filter is None:
92
+ solara.Info("If you select points in the scatter plot, you can download the points here.")
93
+ else:
94
+
95
+ def get_data():
96
+ return dff.to_csv(index=False)
97
+
98
+ solara.FileDownload(get_data, label=f"Download {len(dff):,} selected points", filename="selected.csv")
99
+
100
+ if df is not None:
101
+ with Columns(widths=[2, 4]):
102
+ if State.x.value and State.y.value:
103
+ solara_px.scatter(
104
+ df,
105
+ State.x.value,
106
+ State.y.value,
107
+ size=State.size.value,
108
+ color=State.color.value,
109
+ size_max=State.size_max.value,
110
+ log_x=State.logx.value,
111
+ log_y=State.logy.value,
112
+ template="plotly_dark" if dark_effective else "plotly_white",
113
+ )
114
+ else:
115
+ solara.Warning("Select x and y columns")
116
+
117
+ else:
118
+ solara.Info("No data loaded, click on the sample dataset button to load a sample dataset, or upload a file.")
119
+
120
+ with solara.Column(style={"max-width": "400px"}):
121
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
122
+ if sys.platform != "emscripten":
123
+ solara.Button(
124
+ label="Edit this example live on py.cafe",
125
+ icon_name="mdi-coffee-to-go-outline",
126
+ attributes={"href": pycafe_url, "target": "_blank"},
127
+ text=True,
128
+ outlined=True,
129
+ )
130
+
131
+
132
+ @solara.component
133
+ def Layout(children):
134
+ route, routes = solara.use_route()
135
+ dark_effective = solara.lab.use_dark_effective()
136
+ return solara.AppLayout(children=children, toolbar_dark=dark_effective, color=None) # if dark_effective else "primary")
@@ -0,0 +1,63 @@
1
+ import solara
2
+
3
+ github_url = solara.util.github_url(__file__)
4
+
5
+ # list of nice soft colors
6
+ colors = [
7
+ "#e6194b",
8
+ "#3cb44b",
9
+ "#ffe119",
10
+ "#4363d8",
11
+ "#f58231",
12
+ "#911eb4",
13
+ ]
14
+
15
+
16
+ @solara.component
17
+ def Page1():
18
+ with solara.Sidebar():
19
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
20
+ solara.Markdown("The sidebar will get scrollbars automatically, independently of the main content.")
21
+ for i in range(10):
22
+ with solara.Card(f"Card {i}"):
23
+ solara.Info(f"Text {i}", color=colors[i % len(colors)])
24
+
25
+ solara.Markdown("The main content will get scrollbars automatically, independently of the sidebar.")
26
+ for i in range(10):
27
+ with solara.Card(f"Card {i}"):
28
+ solara.Info(f"Text {i}", color=colors[i % len(colors)])
29
+
30
+
31
+ @solara.component
32
+ def Page2():
33
+ # it is important we do not interrupt the height 100% chain
34
+ limit_content_height = solara.use_reactive(True)
35
+ # warning: if we add "margin": "10px" to the style, we will trigger
36
+ # scrollbars in the parent div, if you really need to add margins,
37
+ # you should correct for that in the height using "calc(100% - 20px)"
38
+ with solara.Column(style={"height": "100%"}):
39
+ with solara.Sidebar():
40
+ solara.Button(label="View source", icon_name="mdi-github-circle", attributes={"href": github_url, "target": "_blank"}, text=True, outlined=True)
41
+ solara.Markdown("Main content columns will scroll together, or independently if we limit height to 100%")
42
+ solara.Checkbox(label="Limit content height", value=limit_content_height)
43
+
44
+ # if we do not limit height to 100%, solara's AppLayout will add a scroll bar
45
+ # to the main content, which will be independent of the sidebar's scroll bar
46
+ # but both columns will scroll together
47
+ with solara.Columns([2, 4], style={"height": "100%"} if limit_content_height.value else {}):
48
+ with solara.Card("I have my own scroll bar"):
49
+ solara.Markdown("")
50
+ for i in range(10):
51
+ with solara.Card(f"Card {i}"):
52
+ solara.Info(f"Text {i}", color=colors[i % len(colors)])
53
+ with solara.Card("I also have my own scroll bar"):
54
+ solara.Markdown("")
55
+ for i in range(20):
56
+ with solara.Card(f"Card {i}"):
57
+ solara.Info(f"Text {i}", color=colors[i % len(colors)])
58
+
59
+
60
+ routes = [
61
+ solara.Route(path="/", component=Page1, label="Scrolling"),
62
+ solara.Route(path="custom", component=Page2, label="Custom scrolling"),
63
+ ]
@@ -0,0 +1,18 @@
1
+ import solara
2
+
3
+
4
+ @solara.component
5
+ def Page():
6
+ x, set_x = solara.use_state(2)
7
+ x_squared = x**2
8
+
9
+ with solara.Sidebar():
10
+ solara.Markdown("## My First Solara app ☀️")
11
+ solara.SliderInt(label="x", value=x, on_value=set_x)
12
+ solara.Markdown(f"{x} squared = {x_squared}")
13
+
14
+
15
+ @solara.component
16
+ def Layout(children):
17
+ route, routes = solara.use_route()
18
+ return solara.AppLayout(children=children)
@@ -0,0 +1,27 @@
1
+ import solara
2
+
3
+
4
+ @solara.component
5
+ def Page():
6
+ with solara.Column():
7
+ solara.Markdown(
8
+ """
9
+ # Careers
10
+ We are always looking for talented individuals to join our team. If you're still be interested after reading the rest of this page, reach out at [contact@widgetti.io](mailto:contact@widgetti.io).
11
+
12
+ ## Who Are We?
13
+ We are a small team of developers working in the gap between Jupyter notebooks and web applications. We are passionate about making data science more accessible and app development painless.
14
+ We are based in Groningen, The Netherlands, but work remote first.
15
+
16
+ ## What Do We Offer?
17
+ We offer a flexible work environment, competitive salary, and the opportunity to do meaningful, crossdisciplinary work with scientists and companies worldwide.
18
+ We are a small team, so you will have a lot of freedom in your work, and the chance to get your hands dirty with many projects.
19
+
20
+ ### Open Source
21
+ We are strong believers in open source software. When working with us, you can expect the majority of the software you write to be open source, with contributions to Solara as well as other open source projects.
22
+
23
+ ## Who Are We Looking For?
24
+ We are looking for developers, technical writers, designers, and everything in between.
25
+ """,
26
+ style={"max-width": "90%", "margin": "0 auto"},
27
+ )
@@ -0,0 +1,10 @@
1
+ from pathlib import Path
2
+
3
+ from solara.website.components.sidebar import Sidebar
4
+ from solara.website.components import MarkdownWithMetadata
5
+
6
+ title = "Changelog"
7
+ HERE = Path(__file__)
8
+
9
+ Page = MarkdownWithMetadata(Path(HERE.parent / "changelog.md").read_text())
10
+ Sidebar = Sidebar