solara-ui 1.31.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  2. prefix/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  3. solara/__init__.py +124 -0
  4. solara/__main__.py +734 -0
  5. solara/alias.py +6 -0
  6. solara/autorouting.py +546 -0
  7. solara/cache.py +303 -0
  8. solara/checks.html +71 -0
  9. solara/checks.py +224 -0
  10. solara/comm.py +28 -0
  11. solara/components/__init__.py +59 -0
  12. solara/components/alert.py +155 -0
  13. solara/components/applayout.py +393 -0
  14. solara/components/button.py +85 -0
  15. solara/components/card.py +87 -0
  16. solara/components/checkbox.py +50 -0
  17. solara/components/code_highlight_css.py +11 -0
  18. solara/components/code_highlight_css.vue +63 -0
  19. solara/components/columns.py +159 -0
  20. solara/components/component_vue.py +110 -0
  21. solara/components/cross_filter.py +335 -0
  22. solara/components/dataframe.py +546 -0
  23. solara/components/datatable.py +221 -0
  24. solara/components/datatable.vue +175 -0
  25. solara/components/details.py +21 -0
  26. solara/components/download.vue +35 -0
  27. solara/components/echarts.py +75 -0
  28. solara/components/echarts.vue +128 -0
  29. solara/components/figure_altair.py +39 -0
  30. solara/components/file_browser.py +182 -0
  31. solara/components/file_download.py +199 -0
  32. solara/components/file_drop.py +139 -0
  33. solara/components/file_drop.vue +83 -0
  34. solara/components/file_list_widget.vue +78 -0
  35. solara/components/head.py +27 -0
  36. solara/components/head_tag.py +49 -0
  37. solara/components/head_tag.vue +60 -0
  38. solara/components/image.py +173 -0
  39. solara/components/input.py +436 -0
  40. solara/components/link.py +55 -0
  41. solara/components/markdown.py +378 -0
  42. solara/components/markdown_editor.py +25 -0
  43. solara/components/markdown_editor.vue +362 -0
  44. solara/components/matplotlib.py +74 -0
  45. solara/components/meta.py +47 -0
  46. solara/components/misc.py +333 -0
  47. solara/components/pivot_table.py +258 -0
  48. solara/components/pivot_table.vue +158 -0
  49. solara/components/progress.py +47 -0
  50. solara/components/select.py +182 -0
  51. solara/components/select.vue +27 -0
  52. solara/components/slider.py +442 -0
  53. solara/components/slider_date.vue +56 -0
  54. solara/components/spinner-solara.vue +105 -0
  55. solara/components/spinner.py +30 -0
  56. solara/components/sql_code.py +33 -0
  57. solara/components/sql_code.vue +128 -0
  58. solara/components/style.py +105 -0
  59. solara/components/switch.py +68 -0
  60. solara/components/tab_navigation.py +37 -0
  61. solara/components/title.py +90 -0
  62. solara/components/title.vue +38 -0
  63. solara/components/togglebuttons.py +200 -0
  64. solara/components/tooltip.py +61 -0
  65. solara/datatypes.py +143 -0
  66. solara/express.py +241 -0
  67. solara/hooks/__init__.py +4 -0
  68. solara/hooks/dataframe.py +99 -0
  69. solara/hooks/misc.py +263 -0
  70. solara/hooks/use_reactive.py +129 -0
  71. solara/hooks/use_thread.py +129 -0
  72. solara/kitchensink.py +8 -0
  73. solara/lab/__init__.py +34 -0
  74. solara/lab/components/__init__.py +6 -0
  75. solara/lab/components/chat.py +203 -0
  76. solara/lab/components/confirmation_dialog.py +163 -0
  77. solara/lab/components/cross_filter.py +7 -0
  78. solara/lab/components/input_date.py +298 -0
  79. solara/lab/components/menu.py +181 -0
  80. solara/lab/components/menu.vue +38 -0
  81. solara/lab/components/tabs.py +274 -0
  82. solara/lab/components/theming.py +98 -0
  83. solara/lab/components/theming.vue +72 -0
  84. solara/lab/hooks/__init__.py +0 -0
  85. solara/lab/hooks/dataframe.py +12 -0
  86. solara/lab/toestand.py +3 -0
  87. solara/lab/utils/__init__.py +2 -0
  88. solara/lab/utils/cookies.py +5 -0
  89. solara/lab/utils/dataframe.py +115 -0
  90. solara/lab/utils/headers.py +5 -0
  91. solara/layout.py +44 -0
  92. solara/lifecycle.py +46 -0
  93. solara/minisettings.py +133 -0
  94. solara/py.typed +0 -0
  95. solara/reactive.py +93 -0
  96. solara/routing.py +268 -0
  97. solara/scope/__init__.py +88 -0
  98. solara/scope/types.py +55 -0
  99. solara/server/__init__.py +0 -0
  100. solara/server/app.py +491 -0
  101. solara/server/assets/custom.css +1 -0
  102. solara/server/assets/custom.js +1 -0
  103. solara/server/assets/favicon.png +0 -0
  104. solara/server/assets/favicon.svg +5 -0
  105. solara/server/assets/style.css +1665 -0
  106. solara/server/assets/theme-dark.css +437 -0
  107. solara/server/assets/theme-light.css +420 -0
  108. solara/server/assets/theme.js +3 -0
  109. solara/server/cdn_helper.py +77 -0
  110. solara/server/esm.py +69 -0
  111. solara/server/fastapi.py +5 -0
  112. solara/server/flask.py +286 -0
  113. solara/server/jupyter/__init__.py +2 -0
  114. solara/server/jupyter/cdn_handler.py +28 -0
  115. solara/server/jupyter/server_extension.py +29 -0
  116. solara/server/jupytertools.py +46 -0
  117. solara/server/kernel.py +338 -0
  118. solara/server/kernel_context.py +357 -0
  119. solara/server/patch.py +552 -0
  120. solara/server/reload.py +242 -0
  121. solara/server/server.py +456 -0
  122. solara/server/settings.py +215 -0
  123. solara/server/shell.py +251 -0
  124. solara/server/starlette.py +601 -0
  125. solara/server/static/ansi.js +270 -0
  126. solara/server/static/highlight-dark.css +82 -0
  127. solara/server/static/highlight.css +43 -0
  128. solara/server/static/main-vuetify.js +260 -0
  129. solara/server/static/main.js +163 -0
  130. solara/server/static/solara_bootstrap.py +129 -0
  131. solara/server/static/sun.svg +23 -0
  132. solara/server/static/webworker.js +42 -0
  133. solara/server/telemetry.py +212 -0
  134. solara/server/templates/index.html.j2 +1 -0
  135. solara/server/templates/loader-plain.css +11 -0
  136. solara/server/templates/loader-plain.html +20 -0
  137. solara/server/templates/loader-solara.css +111 -0
  138. solara/server/templates/loader-solara.html +40 -0
  139. solara/server/templates/plain.html +82 -0
  140. solara/server/templates/solara.html.j2 +446 -0
  141. solara/server/threaded.py +75 -0
  142. solara/server/utils.py +30 -0
  143. solara/server/websocket.py +45 -0
  144. solara/settings.py +56 -0
  145. solara/tasks.py +837 -0
  146. solara/template/button.py +16 -0
  147. solara/template/markdown.py +42 -0
  148. solara/template/portal/.flake8 +6 -0
  149. solara/template/portal/.pre-commit-config.yaml +28 -0
  150. solara/template/portal/LICENSE +21 -0
  151. solara/template/portal/Procfile +7 -0
  152. solara/template/portal/mypy.ini +3 -0
  153. solara/template/portal/pyproject.toml +26 -0
  154. solara/template/portal/solara_portal/__init__.py +4 -0
  155. solara/template/portal/solara_portal/components/__init__.py +2 -0
  156. solara/template/portal/solara_portal/components/article.py +28 -0
  157. solara/template/portal/solara_portal/components/data.py +28 -0
  158. solara/template/portal/solara_portal/components/header.py +6 -0
  159. solara/template/portal/solara_portal/components/layout.py +6 -0
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
  162. solara/template/portal/solara_portal/data.py +60 -0
  163. solara/template/portal/solara_portal/pages/__init__.py +67 -0
  164. solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
  165. solara/template/portal/solara_portal/pages/tabular.py +29 -0
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
  167. solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +697 -0
  170. solara/toestand.py +772 -0
  171. solara/util.py +308 -0
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +468 -0
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +17 -0
  176. solara/website/assets/images/logo_white.svg +50 -0
  177. solara/website/assets/theme.js +8 -0
  178. solara/website/components/__init__.py +5 -0
  179. solara/website/components/algolia.vue +24 -0
  180. solara/website/components/algolia_api.vue +187 -0
  181. solara/website/components/docs.py +118 -0
  182. solara/website/components/header.py +72 -0
  183. solara/website/components/hero.py +15 -0
  184. solara/website/components/mailchimp.py +12 -0
  185. solara/website/components/mailchimp.vue +47 -0
  186. solara/website/components/markdown.py +30 -0
  187. solara/website/components/notebook.py +171 -0
  188. solara/website/pages/__init__.py +575 -0
  189. solara/website/pages/apps/__init__.py +16 -0
  190. solara/website/pages/apps/authorization/__init__.py +119 -0
  191. solara/website/pages/apps/authorization/admin.py +12 -0
  192. solara/website/pages/apps/authorization/users.py +12 -0
  193. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  194. solara/website/pages/apps/layout-demo.py +40 -0
  195. solara/website/pages/apps/multipage/__init__.py +38 -0
  196. solara/website/pages/apps/multipage/page1.py +26 -0
  197. solara/website/pages/apps/multipage/page2.py +34 -0
  198. solara/website/pages/apps/scatter.py +136 -0
  199. solara/website/pages/apps/scrolling.py +63 -0
  200. solara/website/pages/apps/tutorial-streamlit.py +18 -0
  201. solara/website/pages/changelog/__init__.py +8 -0
  202. solara/website/pages/changelog/changelog.md +204 -0
  203. solara/website/pages/contact/__init__.py +8 -0
  204. solara/website/pages/contact/contact.md +17 -0
  205. solara/website/pages/doc_use_download.py +85 -0
  206. solara/website/pages/documentation/__init__.py +184 -0
  207. solara/website/pages/documentation/advanced/__init__.py +9 -0
  208. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  209. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
  210. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
  211. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
  212. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +162 -0
  213. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
  214. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +49 -0
  215. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
  216. solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
  217. solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
  218. solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +36 -0
  219. solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
  220. solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
  221. solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
  222. solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
  223. solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
  224. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  225. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
  226. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
  227. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
  228. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
  229. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
  230. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +7 -0
  231. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
  232. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
  233. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +240 -0
  234. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +97 -0
  235. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
  236. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +1 -0
  237. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +171 -0
  238. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  239. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
  240. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
  241. solara/website/pages/documentation/api/__init__.py +19 -0
  242. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  243. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +23 -0
  244. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +22 -0
  245. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +22 -0
  246. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +22 -0
  247. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  248. solara/website/pages/documentation/api/hooks/use_cross_filter.py +25 -0
  249. solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
  250. solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
  251. solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
  252. solara/website/pages/documentation/api/hooks/use_exception.py +33 -0
  253. solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
  254. solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
  255. solara/website/pages/documentation/api/hooks/use_previous.py +33 -0
  256. solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
  257. solara/website/pages/documentation/api/hooks/use_state.py +10 -0
  258. solara/website/pages/documentation/api/hooks/use_state_or_update.py +69 -0
  259. solara/website/pages/documentation/api/hooks/use_thread.md +58 -0
  260. solara/website/pages/documentation/api/hooks/use_thread.py +44 -0
  261. solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
  262. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  263. solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
  264. solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
  265. solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
  266. solara/website/pages/documentation/api/routing/route.py +31 -0
  267. solara/website/pages/documentation/api/routing/use_route.py +80 -0
  268. solara/website/pages/documentation/api/routing/use_router.py +16 -0
  269. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  270. solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
  271. solara/website/pages/documentation/api/utilities/computed.py +16 -0
  272. solara/website/pages/documentation/api/utilities/display.py +16 -0
  273. solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
  274. solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
  275. solara/website/pages/documentation/api/utilities/memoize.py +35 -0
  276. solara/website/pages/documentation/api/utilities/on_kernel_start.py +27 -0
  277. solara/website/pages/documentation/api/utilities/reactive.py +16 -0
  278. solara/website/pages/documentation/api/utilities/widget.py +104 -0
  279. solara/website/pages/documentation/components/__init__.py +12 -0
  280. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  281. solara/website/pages/documentation/components/advanced/link.py +27 -0
  282. solara/website/pages/documentation/components/advanced/meta.py +20 -0
  283. solara/website/pages/documentation/components/advanced/style.py +45 -0
  284. solara/website/pages/documentation/components/common.py +9 -0
  285. solara/website/pages/documentation/components/data/__init__.py +9 -0
  286. solara/website/pages/documentation/components/data/dataframe.py +44 -0
  287. solara/website/pages/documentation/components/data/pivot_table.py +81 -0
  288. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  289. solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
  290. solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
  291. solara/website/pages/documentation/components/input/__init__.py +9 -0
  292. solara/website/pages/documentation/components/input/button.py +23 -0
  293. solara/website/pages/documentation/components/input/checkbox.py +10 -0
  294. solara/website/pages/documentation/components/input/file_browser.py +32 -0
  295. solara/website/pages/documentation/components/input/file_drop.py +76 -0
  296. solara/website/pages/documentation/components/input/input.py +19 -0
  297. solara/website/pages/documentation/components/input/select.py +22 -0
  298. solara/website/pages/documentation/components/input/slider.py +29 -0
  299. solara/website/pages/documentation/components/input/switch.py +10 -0
  300. solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
  301. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  302. solara/website/pages/documentation/components/lab/chat.py +109 -0
  303. solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
  304. solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
  305. solara/website/pages/documentation/components/lab/input_date.py +20 -0
  306. solara/website/pages/documentation/components/lab/menu.py +22 -0
  307. solara/website/pages/documentation/components/lab/tab.py +25 -0
  308. solara/website/pages/documentation/components/lab/tabs.py +45 -0
  309. solara/website/pages/documentation/components/lab/task.py +11 -0
  310. solara/website/pages/documentation/components/lab/theming.py +72 -0
  311. solara/website/pages/documentation/components/lab/use_task.py +11 -0
  312. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  313. solara/website/pages/documentation/components/layout/app_bar.py +16 -0
  314. solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
  315. solara/website/pages/documentation/components/layout/app_layout.py +24 -0
  316. solara/website/pages/documentation/components/layout/card.py +15 -0
  317. solara/website/pages/documentation/components/layout/card_actions.py +16 -0
  318. solara/website/pages/documentation/components/layout/column.py +30 -0
  319. solara/website/pages/documentation/components/layout/columns.py +27 -0
  320. solara/website/pages/documentation/components/layout/columns_responsive.py +68 -0
  321. solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
  322. solara/website/pages/documentation/components/layout/gridfixed.py +21 -0
  323. solara/website/pages/documentation/components/layout/hbox.py +18 -0
  324. solara/website/pages/documentation/components/layout/row.py +30 -0
  325. solara/website/pages/documentation/components/layout/sidebar.py +24 -0
  326. solara/website/pages/documentation/components/layout/vbox.py +19 -0
  327. solara/website/pages/documentation/components/output/__init__.py +9 -0
  328. solara/website/pages/documentation/components/output/file_download.py +11 -0
  329. solara/website/pages/documentation/components/output/html.py +21 -0
  330. solara/website/pages/documentation/components/output/image.py +11 -0
  331. solara/website/pages/documentation/components/output/markdown.py +57 -0
  332. solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
  333. solara/website/pages/documentation/components/output/sql_code.py +85 -0
  334. solara/website/pages/documentation/components/output/tooltip.py +11 -0
  335. solara/website/pages/documentation/components/page/__init__.py +9 -0
  336. solara/website/pages/documentation/components/page/head.py +18 -0
  337. solara/website/pages/documentation/components/page/title.py +27 -0
  338. solara/website/pages/documentation/components/status/__init__.py +9 -0
  339. solara/website/pages/documentation/components/status/error.py +40 -0
  340. solara/website/pages/documentation/components/status/info.py +40 -0
  341. solara/website/pages/documentation/components/status/progress.py +10 -0
  342. solara/website/pages/documentation/components/status/spinner.py +11 -0
  343. solara/website/pages/documentation/components/status/success.py +40 -0
  344. solara/website/pages/documentation/components/status/warning.py +47 -0
  345. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  346. solara/website/pages/documentation/components/viz/altair.py +42 -0
  347. solara/website/pages/documentation/components/viz/echarts.py +75 -0
  348. solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
  349. solara/website/pages/documentation/components/viz/plotly.py +63 -0
  350. solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
  351. solara/website/pages/documentation/examples/__init__.py +52 -0
  352. solara/website/pages/documentation/examples/ai/__init__.py +11 -0
  353. solara/website/pages/documentation/examples/ai/chatbot.py +95 -0
  354. solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
  355. solara/website/pages/documentation/examples/basics/__init__.py +10 -0
  356. solara/website/pages/documentation/examples/basics/sine.py +28 -0
  357. solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
  358. solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
  359. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
  360. solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
  361. solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
  362. solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
  363. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
  364. solara/website/pages/documentation/examples/general/__init__.py +10 -0
  365. solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
  366. solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
  367. solara/website/pages/documentation/examples/general/live_update.py +38 -0
  368. solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
  369. solara/website/pages/documentation/examples/general/mycard.vue +58 -0
  370. solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
  371. solara/website/pages/documentation/examples/general/vue_component.py +50 -0
  372. solara/website/pages/documentation/examples/ipycanvas.py +49 -0
  373. solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
  374. solara/website/pages/documentation/examples/libraries/altair.py +64 -0
  375. solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
  376. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
  377. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
  378. solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
  379. solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
  380. solara/website/pages/documentation/examples/utilities/countdown_timer.py +64 -0
  381. solara/website/pages/documentation/examples/utilities/todo.py +196 -0
  382. solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
  383. solara/website/pages/documentation/examples/visualization/annotator.py +69 -0
  384. solara/website/pages/documentation/examples/visualization/linked_views.py +84 -0
  385. solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
  386. solara/website/pages/documentation/faq/__init__.py +12 -0
  387. solara/website/pages/documentation/faq/content/99-faq.md +76 -0
  388. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  389. solara/website/pages/documentation/getting_started/content/00-quickstart.md +89 -0
  390. solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
  391. solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
  394. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
  395. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
  396. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
  397. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
  398. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +64 -0
  399. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  400. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
  401. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1000 -0
  402. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  403. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +223 -0
  404. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +88 -0
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +273 -0
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
  408. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
  410. solara/website/pages/docutils.py +38 -0
  411. solara/website/pages/showcase/__init__.py +105 -0
  412. solara/website/pages/showcase/domino_code_assist.py +60 -0
  413. solara/website/pages/showcase/planeto_tessa.py +19 -0
  414. solara/website/pages/showcase/solara_dev.py +54 -0
  415. solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
  416. solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
  417. solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
  418. solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
  419. solara/website/pages/showcase/wanderlust.py +27 -0
  420. solara/website/public/beach.jpeg +0 -0
  421. solara/website/public/logo.svg +6 -0
  422. solara/website/public/social/discord.svg +1 -0
  423. solara/website/public/social/github.svg +1 -0
  424. solara/website/public/social/twitter.svg +3 -0
  425. solara/website/public/success.html +25 -0
  426. solara/website/templates/index.html.j2 +117 -0
  427. solara/website/utils.py +51 -0
  428. solara/widgets/__init__.py +1 -0
  429. solara/widgets/vue/gridlayout.vue +110 -0
  430. solara/widgets/vue/html.vue +4 -0
  431. solara/widgets/vue/navigator.vue +104 -0
  432. solara/widgets/vue/vegalite.vue +115 -0
  433. solara/widgets/widgets.py +66 -0
  434. solara_ui-1.31.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  435. solara_ui-1.31.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  436. solara_ui-1.31.0.dist-info/METADATA +158 -0
  437. solara_ui-1.31.0.dist-info/RECORD +439 -0
  438. solara_ui-1.31.0.dist-info/WHEEL +5 -0
  439. solara_ui-1.31.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,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,27 @@
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
+ with solara.VBox() as main:
18
+ solara.Info("Note the address bar in the browser. It should change to the path of the link.")
19
+ with solara.HBox():
20
+ for route in routes:
21
+ with solara.Link(route):
22
+ current = route_current is route
23
+ solara.Button(f"Go to {route.path}", color="red" if current else None)
24
+ return main
25
+
26
+
27
+ __doc__ += apidoc(solara.Link.f) # type: ignore
@@ -0,0 +1,20 @@
1
+ """# Meta"""
2
+
3
+ import solara
4
+ from solara.website.utils import apidoc
5
+
6
+
7
+ @solara.component
8
+ def Page():
9
+ with solara.VBox() as main:
10
+ solara.Info("Nothing to see here, only in this page's source code, or by looking at the google search results for this page.")
11
+ with solara.Head():
12
+ solara.Meta(
13
+ name="description",
14
+ 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.",
15
+ )
16
+
17
+ return main
18
+
19
+
20
+ __doc__ += apidoc(solara.Meta.f) # type: ignore
@@ -0,0 +1,45 @@
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
+ with solara.VBox() as main:
30
+ solara.Checkbox(label="Use CSS", value=insert_css, on_value=set_insert_css)
31
+ solara.Markdown(
32
+ f"""
33
+ ## CSS Example that styles the button below
34
+ ```css
35
+ {css}
36
+ ```
37
+ """
38
+ )
39
+ if insert_css:
40
+ solara.Style(css)
41
+ solara.Button(label="Advanced users might want to style this", icon_name="mdi-thumb-up", classes=["mybutton"])
42
+ return main
43
+
44
+
45
+ __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]})
58
+ solara.provide_cross_filter()
59
+ with solara.VBox():
60
+ type, set_type = solara.use_state("view")
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,32 @@
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
+ with solara.VBox() as main:
17
+ can_select = solara.ui_checkbox("Enable select")
18
+
19
+ def reset_path():
20
+ set_path(None)
21
+ set_file(None)
22
+
23
+ # reset path and file when can_select changes
24
+ solara.use_memo(reset_path, [can_select])
25
+ solara.FileBrowser(directory, on_directory_change=set_directory, on_path_select=set_path, on_file_open=set_file, can_select=can_select)
26
+ solara.Info(f"You are in directory: {directory}")
27
+ solara.Info(f"You selected path: {path}")
28
+ solara.Info(f"You opened file: {file}")
29
+ return main
30
+
31
+
32
+ __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,19 @@
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__ += "# InputFloat"
17
+ __doc__ += apidoc(solara.InputFloat.f) # type: ignore
18
+ __doc__ += "# InputInt"
19
+ __doc__ += apidoc(solara.InputInt.f) # type: ignore
@@ -0,0 +1,22 @@
1
+ """
2
+ # Select components
3
+
4
+ Select comes in two flavours:
5
+
6
+ * `Select` for a singular selection
7
+ * `SelectMultiple` which allows for multiple selections
8
+
9
+
10
+ """
11
+
12
+ import solara
13
+ from solara.website.components import NoPage
14
+ from solara.website.utils import apidoc
15
+
16
+ Page = NoPage
17
+
18
+
19
+ __doc__ += "# Select"
20
+ __doc__ += apidoc(solara.Select.f) # type: ignore
21
+ __doc__ += "# SelectMultiple"
22
+ __doc__ += apidoc(solara.SelectMultiple.f) # type: ignore
@@ -0,0 +1,29 @@
1
+ """
2
+ # Sliders
3
+
4
+ To support proper typechecks, we have multiple slider (all wrapping the ipyvuetify sliders).
5
+
6
+
7
+ """
8
+
9
+ import solara
10
+ from solara.website.components import NoPage
11
+ from solara.website.utils import apidoc
12
+
13
+ Page = NoPage
14
+
15
+ __doc__ += "# SliderInt"
16
+ __doc__ += apidoc(solara.SliderInt.f) # type: ignore
17
+ __doc__ += "# SliderRangeInt"
18
+ __doc__ += apidoc(solara.SliderRangeInt.f) # type: ignore
19
+
20
+ __doc__ += "# SliderFloat"
21
+ __doc__ += apidoc(solara.SliderFloat.f) # type: ignore
22
+ __doc__ += "# SliderRangeFloat"
23
+ __doc__ += apidoc(solara.SliderRangeFloat.f) # type: ignore
24
+
25
+ __doc__ += "# SliderValue"
26
+ __doc__ += apidoc(solara.SliderValue.f) # type: ignore
27
+
28
+ __doc__ += "# SliderDate"
29
+ __doc__ += apidoc(solara.SliderDate.f) # type: ignore
@@ -0,0 +1,10 @@
1
+ """# Switch"""
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.Switch.f) # type: ignore
@@ -0,0 +1,21 @@
1
+ """
2
+ # ToggleButtons
3
+
4
+ ToggleButtons are in two flavours, for single, and for multiple selections.
5
+
6
+
7
+ """
8
+
9
+ import solara
10
+ from solara.website.components import NoPage
11
+ from solara.website.utils import apidoc
12
+
13
+ title = "ToggleButtons"
14
+
15
+ Page = NoPage
16
+
17
+
18
+ __doc__ += "# ToggleButtonsSingle"
19
+ __doc__ += apidoc(solara.ToggleButtonsSingle.f) # type: ignore
20
+ __doc__ += "# ToggleButtonsMultiple"
21
+ __doc__ += apidoc(solara.ToggleButtonsMultiple.f) # type: ignore
@@ -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)