solara 1.30.1__py2.py3-none-any.whl → 1.32.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. {solara-1.30.1.dist-info → solara-1.32.0.dist-info}/METADATA +12 -42
  2. solara-1.32.0.dist-info/RECORD +5 -0
  3. {solara-1.30.1.dist-info → solara-1.32.0.dist-info}/WHEEL +1 -1
  4. {solara/template/portal → solara-1.32.0.dist-info/licenses}/LICENSE +1 -1
  5. solara/__init__.py +0 -123
  6. solara/__main__.py +0 -734
  7. solara/alias.py +0 -6
  8. solara/autorouting.py +0 -545
  9. solara/cache.py +0 -294
  10. solara/checks.html +0 -71
  11. solara/checks.py +0 -224
  12. solara/comm.py +0 -28
  13. solara/components/__init__.py +0 -59
  14. solara/components/alert.py +0 -155
  15. solara/components/applayout.py +0 -393
  16. solara/components/button.py +0 -85
  17. solara/components/card.py +0 -87
  18. solara/components/checkbox.py +0 -50
  19. solara/components/code_highlight_css.py +0 -11
  20. solara/components/code_highlight_css.vue +0 -63
  21. solara/components/columns.py +0 -159
  22. solara/components/component_vue.py +0 -110
  23. solara/components/cross_filter.py +0 -335
  24. solara/components/dataframe.py +0 -546
  25. solara/components/datatable.py +0 -221
  26. solara/components/datatable.vue +0 -175
  27. solara/components/details.py +0 -21
  28. solara/components/download.vue +0 -35
  29. solara/components/echarts.py +0 -75
  30. solara/components/echarts.vue +0 -128
  31. solara/components/figure_altair.py +0 -39
  32. solara/components/file_browser.py +0 -182
  33. solara/components/file_download.py +0 -199
  34. solara/components/file_drop.py +0 -139
  35. solara/components/file_drop.vue +0 -83
  36. solara/components/file_list_widget.vue +0 -78
  37. solara/components/head.py +0 -27
  38. solara/components/head_tag.py +0 -49
  39. solara/components/head_tag.vue +0 -60
  40. solara/components/image.py +0 -173
  41. solara/components/input.py +0 -440
  42. solara/components/link.py +0 -55
  43. solara/components/markdown.py +0 -371
  44. solara/components/markdown_editor.py +0 -25
  45. solara/components/markdown_editor.vue +0 -362
  46. solara/components/matplotlib.py +0 -74
  47. solara/components/meta.py +0 -47
  48. solara/components/misc.py +0 -333
  49. solara/components/pivot_table.py +0 -258
  50. solara/components/pivot_table.vue +0 -158
  51. solara/components/progress.py +0 -47
  52. solara/components/select.py +0 -186
  53. solara/components/select.vue +0 -27
  54. solara/components/slider.py +0 -442
  55. solara/components/slider_date.vue +0 -56
  56. solara/components/spinner-solara.vue +0 -105
  57. solara/components/spinner.py +0 -30
  58. solara/components/sql_code.py +0 -33
  59. solara/components/sql_code.vue +0 -128
  60. solara/components/style.py +0 -105
  61. solara/components/switch.py +0 -68
  62. solara/components/tab_navigation.py +0 -37
  63. solara/components/title.py +0 -90
  64. solara/components/title.vue +0 -38
  65. solara/components/togglebuttons.py +0 -202
  66. solara/components/tooltip.py +0 -61
  67. solara/datatypes.py +0 -143
  68. solara/express.py +0 -241
  69. solara/hooks/__init__.py +0 -4
  70. solara/hooks/dataframe.py +0 -99
  71. solara/hooks/misc.py +0 -263
  72. solara/hooks/use_reactive.py +0 -129
  73. solara/hooks/use_thread.py +0 -129
  74. solara/kitchensink.py +0 -8
  75. solara/lab/__init__.py +0 -34
  76. solara/lab/components/__init__.py +0 -6
  77. solara/lab/components/chat.py +0 -203
  78. solara/lab/components/confirmation_dialog.py +0 -165
  79. solara/lab/components/cross_filter.py +0 -7
  80. solara/lab/components/input_date.py +0 -298
  81. solara/lab/components/menu.py +0 -181
  82. solara/lab/components/menu.vue +0 -38
  83. solara/lab/components/tabs.py +0 -274
  84. solara/lab/components/theming.py +0 -98
  85. solara/lab/components/theming.vue +0 -72
  86. solara/lab/hooks/__init__.py +0 -0
  87. solara/lab/hooks/dataframe.py +0 -12
  88. solara/lab/toestand.py +0 -3
  89. solara/lab/utils/__init__.py +0 -2
  90. solara/lab/utils/cookies.py +0 -5
  91. solara/lab/utils/dataframe.py +0 -115
  92. solara/lab/utils/headers.py +0 -5
  93. solara/layout.py +0 -44
  94. solara/minisettings.py +0 -133
  95. solara/py.typed +0 -0
  96. solara/reactive.py +0 -93
  97. solara/routing.py +0 -268
  98. solara/scope/__init__.py +0 -88
  99. solara/scope/types.py +0 -55
  100. solara/server/__init__.py +0 -0
  101. solara/server/app.py +0 -490
  102. solara/server/assets/custom.css +0 -1
  103. solara/server/assets/custom.js +0 -1
  104. solara/server/assets/favicon.png +0 -0
  105. solara/server/assets/favicon.svg +0 -5
  106. solara/server/assets/style.css +0 -1665
  107. solara/server/assets/theme-dark.css +0 -437
  108. solara/server/assets/theme-light.css +0 -420
  109. solara/server/assets/theme.js +0 -3
  110. solara/server/cdn_helper.py +0 -77
  111. solara/server/esm.py +0 -69
  112. solara/server/fastapi.py +0 -5
  113. solara/server/flask.py +0 -286
  114. solara/server/jupyter/__init__.py +0 -2
  115. solara/server/jupyter/cdn_handler.py +0 -28
  116. solara/server/jupyter/server_extension.py +0 -29
  117. solara/server/jupytertools.py +0 -46
  118. solara/server/kernel.py +0 -319
  119. solara/server/kernel_context.py +0 -396
  120. solara/server/patch.py +0 -552
  121. solara/server/reload.py +0 -242
  122. solara/server/server.py +0 -437
  123. solara/server/settings.py +0 -212
  124. solara/server/shell.py +0 -240
  125. solara/server/starlette.py +0 -597
  126. solara/server/static/ansi.js +0 -270
  127. solara/server/static/highlight-dark.css +0 -82
  128. solara/server/static/highlight.css +0 -43
  129. solara/server/static/main-vuetify.js +0 -260
  130. solara/server/static/main.js +0 -163
  131. solara/server/static/solara_bootstrap.py +0 -129
  132. solara/server/static/sun.svg +0 -23
  133. solara/server/static/webworker.js +0 -42
  134. solara/server/telemetry.py +0 -212
  135. solara/server/templates/index.html.j2 +0 -1
  136. solara/server/templates/loader-plain.css +0 -11
  137. solara/server/templates/loader-plain.html +0 -20
  138. solara/server/templates/loader-solara.css +0 -111
  139. solara/server/templates/loader-solara.html +0 -40
  140. solara/server/templates/plain.html +0 -82
  141. solara/server/templates/solara.html.j2 +0 -446
  142. solara/server/threaded.py +0 -75
  143. solara/server/utils.py +0 -30
  144. solara/server/websocket.py +0 -44
  145. solara/settings.py +0 -56
  146. solara/tasks.py +0 -847
  147. solara/template/button.py +0 -16
  148. solara/template/markdown.py +0 -42
  149. solara/template/portal/.flake8 +0 -6
  150. solara/template/portal/.pre-commit-config.yaml +0 -28
  151. solara/template/portal/Procfile +0 -7
  152. solara/template/portal/mypy.ini +0 -3
  153. solara/template/portal/pyproject.toml +0 -26
  154. solara/template/portal/solara_portal/__init__.py +0 -3
  155. solara/template/portal/solara_portal/components/__init__.py +0 -2
  156. solara/template/portal/solara_portal/components/article.py +0 -28
  157. solara/template/portal/solara_portal/components/data.py +0 -28
  158. solara/template/portal/solara_portal/components/header.py +0 -6
  159. solara/template/portal/solara_portal/components/layout.py +0 -6
  160. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +0 -85
  161. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +0 -70
  162. solara/template/portal/solara_portal/data.py +0 -60
  163. solara/template/portal/solara_portal/pages/__init__.py +0 -67
  164. solara/template/portal/solara_portal/pages/article/__init__.py +0 -26
  165. solara/template/portal/solara_portal/pages/tabular.py +0 -29
  166. solara/template/portal/solara_portal/pages/viz/__init__.py +0 -69
  167. solara/template/portal/solara_portal/pages/viz/overview.py +0 -14
  168. solara/test/__init__.py +0 -0
  169. solara/test/pytest_plugin.py +0 -698
  170. solara/toestand.py +0 -772
  171. solara/util.py +0 -308
  172. solara/website/__init__.py +0 -0
  173. solara/website/assets/custom.css +0 -462
  174. solara/website/assets/images/logo-small.png +0 -0
  175. solara/website/assets/images/logo.svg +0 -17
  176. solara/website/assets/images/logo_white.svg +0 -50
  177. solara/website/assets/theme.js +0 -8
  178. solara/website/components/__init__.py +0 -5
  179. solara/website/components/algolia.vue +0 -24
  180. solara/website/components/algolia_api.vue +0 -157
  181. solara/website/components/docs.py +0 -118
  182. solara/website/components/header.py +0 -72
  183. solara/website/components/hero.py +0 -15
  184. solara/website/components/mailchimp.py +0 -12
  185. solara/website/components/mailchimp.vue +0 -47
  186. solara/website/components/markdown.py +0 -30
  187. solara/website/components/notebook.py +0 -172
  188. solara/website/pages/__init__.py +0 -575
  189. solara/website/pages/apps/__init__.py +0 -16
  190. solara/website/pages/apps/authorization/__init__.py +0 -118
  191. solara/website/pages/apps/authorization/admin.py +0 -12
  192. solara/website/pages/apps/authorization/users.py +0 -12
  193. solara/website/pages/apps/jupyter-dashboard-1.py +0 -116
  194. solara/website/pages/apps/layout-demo.py +0 -40
  195. solara/website/pages/apps/multipage/__init__.py +0 -38
  196. solara/website/pages/apps/multipage/page1.py +0 -26
  197. solara/website/pages/apps/multipage/page2.py +0 -34
  198. solara/website/pages/apps/scatter.py +0 -136
  199. solara/website/pages/apps/scrolling.py +0 -63
  200. solara/website/pages/apps/tutorial-streamlit.py +0 -18
  201. solara/website/pages/changelog/__init__.py +0 -8
  202. solara/website/pages/changelog/changelog.md +0 -195
  203. solara/website/pages/contact/__init__.py +0 -8
  204. solara/website/pages/contact/contact.md +0 -17
  205. solara/website/pages/doc_use_download.py +0 -85
  206. solara/website/pages/documentation/__init__.py +0 -184
  207. solara/website/pages/documentation/advanced/__init__.py +0 -9
  208. solara/website/pages/documentation/advanced/content/00-overview.md +0 -1
  209. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +0 -6
  210. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +0 -196
  211. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +0 -125
  212. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +0 -154
  213. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +0 -69
  214. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +0 -49
  215. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +0 -124
  216. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +0 -10
  217. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +0 -35
  218. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +0 -42
  219. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +0 -28
  220. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +0 -108
  221. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +0 -23
  222. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +0 -7
  223. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +0 -166
  224. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +0 -18
  225. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +0 -240
  226. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +0 -86
  227. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +0 -12
  228. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +0 -1
  229. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +0 -171
  230. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  231. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +0 -45
  232. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +0 -76
  233. solara/website/pages/documentation/api/__init__.py +0 -19
  234. solara/website/pages/documentation/api/cross_filter/__init__.py +0 -9
  235. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +0 -23
  236. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +0 -22
  237. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +0 -22
  238. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +0 -22
  239. solara/website/pages/documentation/api/hooks/__init__.py +0 -9
  240. solara/website/pages/documentation/api/hooks/use_cross_filter.py +0 -25
  241. solara/website/pages/documentation/api/hooks/use_dark_effective.py +0 -13
  242. solara/website/pages/documentation/api/hooks/use_effect.md +0 -43
  243. solara/website/pages/documentation/api/hooks/use_effect.py +0 -9
  244. solara/website/pages/documentation/api/hooks/use_exception.py +0 -33
  245. solara/website/pages/documentation/api/hooks/use_memo.md +0 -16
  246. solara/website/pages/documentation/api/hooks/use_memo.py +0 -9
  247. solara/website/pages/documentation/api/hooks/use_previous.py +0 -32
  248. solara/website/pages/documentation/api/hooks/use_reactive.py +0 -15
  249. solara/website/pages/documentation/api/hooks/use_state.py +0 -11
  250. solara/website/pages/documentation/api/hooks/use_state_or_update.py +0 -68
  251. solara/website/pages/documentation/api/hooks/use_thread.md +0 -58
  252. solara/website/pages/documentation/api/hooks/use_thread.py +0 -44
  253. solara/website/pages/documentation/api/hooks/use_trait_observe.py +0 -13
  254. solara/website/pages/documentation/api/routing/__init__.py +0 -9
  255. solara/website/pages/documentation/api/routing/generate_routes.py +0 -11
  256. solara/website/pages/documentation/api/routing/generate_routes_directory.py +0 -11
  257. solara/website/pages/documentation/api/routing/resolve_path.py +0 -36
  258. solara/website/pages/documentation/api/routing/route.py +0 -32
  259. solara/website/pages/documentation/api/routing/use_route.py +0 -80
  260. solara/website/pages/documentation/api/routing/use_router.py +0 -15
  261. solara/website/pages/documentation/api/utilities/__init__.py +0 -9
  262. solara/website/pages/documentation/api/utilities/component_vue.py +0 -11
  263. solara/website/pages/documentation/api/utilities/computed.py +0 -16
  264. solara/website/pages/documentation/api/utilities/display.py +0 -15
  265. solara/website/pages/documentation/api/utilities/get_kernel_id.py +0 -16
  266. solara/website/pages/documentation/api/utilities/get_session_id.py +0 -16
  267. solara/website/pages/documentation/api/utilities/memoize.py +0 -36
  268. solara/website/pages/documentation/api/utilities/on_kernel_start.py +0 -27
  269. solara/website/pages/documentation/api/utilities/reactive.py +0 -15
  270. solara/website/pages/documentation/api/utilities/widget.py +0 -104
  271. solara/website/pages/documentation/components/__init__.py +0 -12
  272. solara/website/pages/documentation/components/advanced/__init__.py +0 -9
  273. solara/website/pages/documentation/components/advanced/link.py +0 -28
  274. solara/website/pages/documentation/components/advanced/meta.py +0 -21
  275. solara/website/pages/documentation/components/advanced/style.py +0 -44
  276. solara/website/pages/documentation/components/common.py +0 -9
  277. solara/website/pages/documentation/components/data/__init__.py +0 -9
  278. solara/website/pages/documentation/components/data/dataframe.py +0 -44
  279. solara/website/pages/documentation/components/data/pivot_table.py +0 -81
  280. solara/website/pages/documentation/components/enterprise/__init__.py +0 -9
  281. solara/website/pages/documentation/components/enterprise/avatar.py +0 -19
  282. solara/website/pages/documentation/components/enterprise/avatar_menu.py +0 -20
  283. solara/website/pages/documentation/components/input/__init__.py +0 -9
  284. solara/website/pages/documentation/components/input/button.py +0 -22
  285. solara/website/pages/documentation/components/input/checkbox.py +0 -12
  286. solara/website/pages/documentation/components/input/file_browser.py +0 -33
  287. solara/website/pages/documentation/components/input/file_drop.py +0 -75
  288. solara/website/pages/documentation/components/input/input.py +0 -18
  289. solara/website/pages/documentation/components/input/select.py +0 -21
  290. solara/website/pages/documentation/components/input/slider.py +0 -28
  291. solara/website/pages/documentation/components/input/switch.py +0 -12
  292. solara/website/pages/documentation/components/input/togglebuttons.py +0 -20
  293. solara/website/pages/documentation/components/lab/__init__.py +0 -9
  294. solara/website/pages/documentation/components/lab/chat.py +0 -108
  295. solara/website/pages/documentation/components/lab/confirmation_dialog.py +0 -55
  296. solara/website/pages/documentation/components/lab/cookies_headers.py +0 -48
  297. solara/website/pages/documentation/components/lab/input_date.py +0 -19
  298. solara/website/pages/documentation/components/lab/menu.py +0 -21
  299. solara/website/pages/documentation/components/lab/tab.py +0 -24
  300. solara/website/pages/documentation/components/lab/tabs.py +0 -44
  301. solara/website/pages/documentation/components/lab/task.py +0 -12
  302. solara/website/pages/documentation/components/lab/theming.py +0 -72
  303. solara/website/pages/documentation/components/lab/use_task.py +0 -12
  304. solara/website/pages/documentation/components/layout/__init__.py +0 -9
  305. solara/website/pages/documentation/components/layout/app_bar.py +0 -15
  306. solara/website/pages/documentation/components/layout/app_bar_title.py +0 -15
  307. solara/website/pages/documentation/components/layout/app_layout.py +0 -23
  308. solara/website/pages/documentation/components/layout/card.py +0 -14
  309. solara/website/pages/documentation/components/layout/card_actions.py +0 -15
  310. solara/website/pages/documentation/components/layout/column.py +0 -29
  311. solara/website/pages/documentation/components/layout/columns.py +0 -26
  312. solara/website/pages/documentation/components/layout/columns_responsive.py +0 -67
  313. solara/website/pages/documentation/components/layout/griddraggable.py +0 -61
  314. solara/website/pages/documentation/components/layout/gridfixed.py +0 -21
  315. solara/website/pages/documentation/components/layout/hbox.py +0 -17
  316. solara/website/pages/documentation/components/layout/row.py +0 -29
  317. solara/website/pages/documentation/components/layout/sidebar.py +0 -23
  318. solara/website/pages/documentation/components/layout/vbox.py +0 -19
  319. solara/website/pages/documentation/components/output/__init__.py +0 -9
  320. solara/website/pages/documentation/components/output/file_download.py +0 -12
  321. solara/website/pages/documentation/components/output/html.py +0 -22
  322. solara/website/pages/documentation/components/output/image.py +0 -12
  323. solara/website/pages/documentation/components/output/markdown.py +0 -59
  324. solara/website/pages/documentation/components/output/markdown_editor.py +0 -53
  325. solara/website/pages/documentation/components/output/sql_code.py +0 -84
  326. solara/website/pages/documentation/components/output/tooltip.py +0 -12
  327. solara/website/pages/documentation/components/page/__init__.py +0 -9
  328. solara/website/pages/documentation/components/page/head.py +0 -19
  329. solara/website/pages/documentation/components/page/title.py +0 -28
  330. solara/website/pages/documentation/components/status/__init__.py +0 -9
  331. solara/website/pages/documentation/components/status/error.py +0 -40
  332. solara/website/pages/documentation/components/status/info.py +0 -40
  333. solara/website/pages/documentation/components/status/progress.py +0 -10
  334. solara/website/pages/documentation/components/status/spinner.py +0 -10
  335. solara/website/pages/documentation/components/status/success.py +0 -40
  336. solara/website/pages/documentation/components/status/warning.py +0 -47
  337. solara/website/pages/documentation/components/viz/__init__.py +0 -9
  338. solara/website/pages/documentation/components/viz/altair.py +0 -44
  339. solara/website/pages/documentation/components/viz/echarts.py +0 -78
  340. solara/website/pages/documentation/components/viz/matplotlib.py +0 -32
  341. solara/website/pages/documentation/components/viz/plotly.py +0 -63
  342. solara/website/pages/documentation/components/viz/plotly_express.py +0 -41
  343. solara/website/pages/documentation/examples/__init__.py +0 -52
  344. solara/website/pages/documentation/examples/ai/__init__.py +0 -10
  345. solara/website/pages/documentation/examples/ai/chatbot.py +0 -96
  346. solara/website/pages/documentation/examples/ai/tokenizer.py +0 -106
  347. solara/website/pages/documentation/examples/basics/__init__.py +0 -2
  348. solara/website/pages/documentation/examples/basics/sine.py +0 -28
  349. solara/website/pages/documentation/examples/fullscreen/__init__.py +0 -9
  350. solara/website/pages/documentation/examples/fullscreen/authorization.py +0 -3
  351. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +0 -3
  352. solara/website/pages/documentation/examples/fullscreen/multipage.py +0 -3
  353. solara/website/pages/documentation/examples/fullscreen/scatter.py +0 -3
  354. solara/website/pages/documentation/examples/fullscreen/scrolling.py +0 -3
  355. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +0 -3
  356. solara/website/pages/documentation/examples/general/__init__.py +0 -9
  357. solara/website/pages/documentation/examples/general/custom_storage.py +0 -69
  358. solara/website/pages/documentation/examples/general/deploy_model.py +0 -114
  359. solara/website/pages/documentation/examples/general/live_update.py +0 -38
  360. solara/website/pages/documentation/examples/general/login_oauth.py +0 -76
  361. solara/website/pages/documentation/examples/general/mycard.vue +0 -58
  362. solara/website/pages/documentation/examples/general/pokemon_search.py +0 -51
  363. solara/website/pages/documentation/examples/general/vue_component.py +0 -50
  364. solara/website/pages/documentation/examples/ipycanvas.py +0 -49
  365. solara/website/pages/documentation/examples/libraries/__init__.py +0 -9
  366. solara/website/pages/documentation/examples/libraries/altair.py +0 -63
  367. solara/website/pages/documentation/examples/libraries/bqplot.py +0 -39
  368. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +0 -32
  369. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +0 -65
  370. solara/website/pages/documentation/examples/utilities/__init__.py +0 -9
  371. solara/website/pages/documentation/examples/utilities/calculator.py +0 -157
  372. solara/website/pages/documentation/examples/utilities/countdown_timer.py +0 -64
  373. solara/website/pages/documentation/examples/utilities/todo.py +0 -195
  374. solara/website/pages/documentation/examples/visualization/__init__.py +0 -6
  375. solara/website/pages/documentation/examples/visualization/annotator.py +0 -68
  376. solara/website/pages/documentation/examples/visualization/linked_views.py +0 -84
  377. solara/website/pages/documentation/examples/visualization/plotly.py +0 -43
  378. solara/website/pages/documentation/faq/__init__.py +0 -12
  379. solara/website/pages/documentation/faq/content/99-faq.md +0 -76
  380. solara/website/pages/documentation/getting_started/__init__.py +0 -9
  381. solara/website/pages/documentation/getting_started/content/00-quickstart.md +0 -89
  382. solara/website/pages/documentation/getting_started/content/01-introduction.md +0 -125
  383. solara/website/pages/documentation/getting_started/content/02-installing.md +0 -85
  384. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +0 -14
  385. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +0 -13
  386. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +0 -89
  387. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +0 -124
  388. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +0 -146
  389. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +0 -144
  390. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +0 -64
  391. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  392. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +0 -445
  393. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +0 -1000
  394. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +0 -11
  395. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +0 -223
  396. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +0 -88
  397. solara/website/pages/documentation/getting_started/content/06-reference/00-overview.md +0 -3
  398. solara/website/pages/documentation/getting_started/content/06-reference/40-static_files.md +0 -31
  399. solara/website/pages/documentation/getting_started/content/06-reference/41-asset-files.md +0 -36
  400. solara/website/pages/documentation/getting_started/content/06-reference/60-static-site-generation.md +0 -59
  401. solara/website/pages/documentation/getting_started/content/06-reference/70-search.md +0 -34
  402. solara/website/pages/documentation/getting_started/content/06-reference/80-reloading.md +0 -34
  403. solara/website/pages/documentation/getting_started/content/06-reference/90-notebook-support.md +0 -7
  404. solara/website/pages/documentation/getting_started/content/06-reference/95-caching.md +0 -148
  405. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +0 -7
  406. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +0 -273
  407. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +0 -80
  408. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +0 -7
  409. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +0 -26
  410. solara/website/pages/docutils.py +0 -38
  411. solara/website/pages/showcase/__init__.py +0 -105
  412. solara/website/pages/showcase/domino_code_assist.py +0 -60
  413. solara/website/pages/showcase/planeto_tessa.py +0 -19
  414. solara/website/pages/showcase/solara_dev.py +0 -54
  415. solara/website/pages/showcase/solarathon_2023_team_2.py +0 -22
  416. solara/website/pages/showcase/solarathon_2023_team_4.py +0 -22
  417. solara/website/pages/showcase/solarathon_2023_team_5.py +0 -23
  418. solara/website/pages/showcase/solarathon_2023_team_6.py +0 -34
  419. solara/website/pages/showcase/wanderlust.py +0 -27
  420. solara/website/public/beach.jpeg +0 -0
  421. solara/website/public/logo.svg +0 -6
  422. solara/website/public/social/discord.svg +0 -1
  423. solara/website/public/social/github.svg +0 -1
  424. solara/website/public/social/twitter.svg +0 -3
  425. solara/website/public/success.html +0 -25
  426. solara/website/templates/index.html.j2 +0 -117
  427. solara/website/utils.py +0 -51
  428. solara/widgets/__init__.py +0 -1
  429. solara/widgets/vue/gridlayout.vue +0 -110
  430. solara/widgets/vue/html.vue +0 -4
  431. solara/widgets/vue/navigator.vue +0 -104
  432. solara/widgets/vue/vegalite.vue +0 -115
  433. solara/widgets/widgets.py +0 -65
  434. solara-1.30.1.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -7
  435. solara-1.30.1.data/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -7
  436. solara-1.30.1.dist-info/RECORD +0 -437
  437. solara-1.30.1.dist-info/entry_points.txt +0 -5
  438. /solara-1.30.1.dist-info/licenses/LICENSE → /LICENSE +0 -0
@@ -1,203 +0,0 @@
1
- import uuid
2
- from typing import Callable, Dict, List, Optional, Union
3
-
4
- from typing_extensions import Literal
5
-
6
- import solara
7
- from solara.components.input import use_change
8
-
9
-
10
- @solara.component
11
- def ChatBox(
12
- children: List[solara.Element] = [],
13
- style: Optional[Union[str, Dict[str, str]]] = None,
14
- classes: List[str] = [],
15
- ):
16
- """
17
- The ChatBox component is a container for ChatMessage components.
18
- Its primary use is to ensure the proper ordering of messages,
19
- using `flex-direction: column-reverse` together with `reversed(messages)`.
20
-
21
- # Arguments
22
-
23
- * `children`: A list of child components.
24
- * `style`: CSS styles to apply to the component. Either a string or a dictionary.
25
- * `classes`: A list of CSS classes to apply to the component.
26
- """
27
- style_flat = solara.util._flatten_style(style)
28
- if "flex-grow" not in style_flat:
29
- style_flat += " flex-grow: 1;"
30
- if "flex-direction" not in style_flat:
31
- style_flat += " flex-direction: column-reverse;"
32
- if "overflow-y" not in style_flat:
33
- style_flat += " overflow-y: auto;"
34
-
35
- classes += ["chat-box"]
36
- with solara.Column(
37
- style=style_flat,
38
- classes=classes,
39
- ):
40
- for child in list(reversed(children)):
41
- solara.display(child)
42
-
43
-
44
- @solara.component
45
- def ChatInput(
46
- send_callback: Optional[Callable] = None,
47
- disabled: bool = False,
48
- style: Optional[Union[str, Dict[str, str]]] = None,
49
- classes: List[str] = [],
50
- ):
51
- """
52
- The ChatInput component renders a text input together with a send button.
53
-
54
- # Arguments
55
-
56
- * `send_callback`: A callback function for when the user presses enter or clicks the send button.
57
- * `disabled`: Whether the input should be disabled. Useful for disabling sending further messages while a chatbot is replying,
58
- among other things.
59
- * `style`: CSS styles to apply to the component. Either a string or a dictionary. These styles are applied to the container component.
60
- * `classes`: A list of CSS classes to apply to the component. Also applied to the container.
61
- """
62
- message, set_message = solara.use_state("") # type: ignore
63
- style_flat = solara.util._flatten_style(style)
64
-
65
- if "align-items" not in style_flat:
66
- style_flat += " align-items: center;"
67
-
68
- with solara.Row(style=style_flat, classes=classes):
69
-
70
- def send(*ignore_args):
71
- if message != "" and send_callback is not None:
72
- send_callback(message)
73
- set_message("")
74
-
75
- message_input = solara.v.TextField(
76
- label="Type a message...",
77
- v_model=message,
78
- on_v_model=set_message,
79
- rounded=True,
80
- filled=True,
81
- hide_details=True,
82
- style_="flex-grow: 1;",
83
- disabled=disabled,
84
- )
85
-
86
- use_change(message_input, send, update_events=["keyup.enter"])
87
-
88
- button = solara.v.Btn(color="primary", icon=True, children=[solara.v.Icon(children=["mdi-send"])], disabled=message == "")
89
-
90
- use_change(button, send, update_events=["click"])
91
-
92
-
93
- @solara.component
94
- def ChatMessage(
95
- children: Union[List[solara.Element], str],
96
- user: bool = False,
97
- avatar: Union[solara.Element, str, Literal[False], None] = None,
98
- name: Optional[str] = None,
99
- color: Optional[str] = "rgba(0,0,0,.06)",
100
- avatar_background_color: Optional[str] = None,
101
- border_radius: Optional[str] = None,
102
- notch: bool = False,
103
- style: Optional[Union[str, Dict[str, str]]] = None,
104
- classes: List[str] = [],
105
- ):
106
- """
107
- The ChatMessage component renders a message. Messages with `user=True` are rendered on the right side of the screen,
108
- all others on the left.
109
-
110
- # Arguments
111
-
112
- * `children`: A list of child components.
113
- * `user`: Whether the message is from the current user or not.
114
- * `avatar`: An avatar to display next to the message. Can be a string representation of a URL or Material design icon name,
115
- a solara Element, False to disable avatars altogether, or None to display initials based on `name`.
116
- * `name`: The name of the user who sent the message.
117
- * `color`: The background color of the message. Defaults to `rgba(0,0,0,.06)`. Can be any valid CSS color.
118
- * `avatar_background_color`: The background color of the avatar. Defaults to `color` if left as `None`.
119
- * `border_radius`: Sets the roundness of the corners of the message. Defaults to `None`,
120
- which applies the default border radius of a `solara.Column`, i.e. `4px`.
121
- * `notch`: Whether to display a speech bubble style notch on the side of the message.
122
- * `style`: CSS styles to apply to the component. Either a string or a dictionary. Applied to the container of the message.
123
- * `classes`: A list of CSS classes to apply to the component. Applied to the same container.
124
- """
125
- style_flat = solara.util._flatten_style(style)
126
-
127
- if "border-radius" not in style_flat:
128
- style_flat += f" border-radius: {border_radius if border_radius is not None else ''};"
129
- if f"border-top-{'right' if user else 'left'}-radius" not in style_flat:
130
- style_flat += f" border-top-{'right' if user else 'left'}-radius: 0;"
131
- if "padding" not in style_flat:
132
- style_flat += " padding: .5em 1.5em;"
133
-
134
- msg_uuid = solara.use_memo(lambda: str(uuid.uuid4()), dependencies=[])
135
- with solara.Row(
136
- justify="end" if user else "start",
137
- style={"flex-direction": "row-reverse" if user else "row", "padding": "5px"},
138
- ):
139
- if avatar is not False:
140
- with solara.v.Avatar(color=avatar_background_color if avatar_background_color is not None else color):
141
- if avatar is None and name is not None:
142
- initials = "".join([word[:1] for word in name.split(" ")])
143
- solara.HTML(tag="span", unsafe_innerHTML=initials, classes=["headline"])
144
- elif isinstance(avatar, solara.Element):
145
- solara.display(avatar)
146
- elif isinstance(avatar, str) and avatar.startswith("mdi-"):
147
- solara.v.Icon(children=[avatar])
148
- else:
149
- solara.HTML(tag="img", attributes={"src": avatar, "width": "100%"})
150
- classes_new = classes + ["chat-message-" + msg_uuid, "right" if user else "left"]
151
- with solara.Column(
152
- classes=classes_new,
153
- gap=0,
154
- style=style_flat,
155
- ):
156
- if name is not None:
157
- solara.Text(name, style="font-weight: bold;", classes=["message-name", "right" if user else "left"])
158
- for child in children:
159
- if isinstance(child, solara.Element):
160
- solara.display(child)
161
- else:
162
- solara.Markdown(child)
163
- # we use the uuid to generate 'scoped' CSS, i.e. css that only applies to the component instance.
164
- extra_styles = (
165
- f""".chat-message-{msg_uuid}:before{{
166
- content: '';
167
- position: absolute;
168
- width: 0;
169
- height: 0;
170
- border: 6px solid;
171
- top: 0;
172
- }}
173
- .chat-message-{msg_uuid}.left:before{{
174
- left: -12px;
175
- border-color: var(--color) var(--color) transparent transparent;
176
- }}
177
- .chat-message-{msg_uuid}.right:before{{
178
- right: -12px;
179
- border-color: var(--color) transparent transparent var(--color);
180
- }}"""
181
- if notch
182
- else ""
183
- )
184
- solara.Style(
185
- f"""
186
- .chat-message-{msg_uuid}{{
187
- --color: {color};
188
- max-width: 75%;
189
- position: relative;
190
- }}
191
- .chat-message-{msg_uuid}.left{{
192
- border-top-left-radius: 0;
193
- background-color:var(--color);
194
- { "margin-left: 10px !important;" if notch else ""}
195
- }}
196
- .chat-message-{msg_uuid}.right{{
197
- border-top-right-radius: 0;
198
- background-color:var(--color);
199
- { "margin-right: 10px !important;" if notch else ""}
200
- }}
201
- {extra_styles}
202
- """
203
- )
@@ -1,165 +0,0 @@
1
- from typing import Callable, List, Union, overload
2
-
3
- import reacton.ipyvuetify as v
4
-
5
- import solara
6
-
7
-
8
- @overload
9
- def ConfirmationDialog(
10
- open: solara.Reactive[bool],
11
- *,
12
- on_close: Union[None, Callable[[], None]] = None,
13
- content: Union[str, solara.Element] = "",
14
- title: str = "Confirm action",
15
- ok: Union[str, solara.Element] = "OK",
16
- on_ok: Callable[[], None] = lambda: None,
17
- cancel: Union[str, solara.Element] = "Cancel",
18
- on_cancel: Callable[[], None] = lambda: None,
19
- children: List[solara.Element] = [],
20
- max_width: Union[int, str] = 500,
21
- persistent: bool = False,
22
- ):
23
- ...
24
-
25
-
26
- # when open is a boolean, on_close should be given, otherwise a dialog can never be closed
27
- # TODO: copy this pattern to many other components
28
- @overload
29
- def ConfirmationDialog(
30
- open: bool,
31
- *,
32
- on_close: Callable[[], None],
33
- content: Union[str, solara.Element] = "",
34
- title: str = "Confirm action",
35
- ok: Union[str, solara.Element] = "OK",
36
- on_ok: Callable[[], None] = lambda: None,
37
- cancel: Union[str, solara.Element] = "Cancel",
38
- on_cancel: Callable[[], None] = lambda: None,
39
- children: List[solara.Element] = [],
40
- max_width: Union[int, str] = 500,
41
- persistent: bool = False,
42
- ):
43
- ...
44
-
45
-
46
- @solara.component
47
- def ConfirmationDialog(
48
- open: Union[solara.Reactive[bool], bool],
49
- *,
50
- on_close: Union[None, Callable[[], None]] = None,
51
- content: Union[str, solara.Element] = "",
52
- title: str = "Confirm action",
53
- ok: Union[str, solara.Element] = "OK",
54
- on_ok: Callable[[], None] = lambda: None,
55
- cancel: Union[str, solara.Element] = "Cancel",
56
- on_cancel: Callable[[], None] = lambda: None,
57
- children: List[solara.Element] = [],
58
- max_width: Union[int, str] = 500,
59
- persistent: bool = False,
60
- ):
61
- """A dialog used to confirm a user action.
62
-
63
- (*Note: [This component is experimental and its API may change in the future](/documentation/getting_started/lab).*)
64
-
65
- By default, has a title, a text explaining the
66
- decision to be made, and two buttons "OK" and "Cancel".
67
-
68
- ## Basic examples
69
-
70
- ```solara
71
- import solara
72
-
73
- open_delete_confirmation = solara.reactive(False)
74
-
75
- def delete_user():
76
- # put your code to perform the action here
77
- print("User being deleted...")
78
-
79
- @solara.component
80
- def Page():
81
- solara.Button(label="Delete user", on_click=lambda: open_delete_confirmation.set(True))
82
- solara.lab.ConfirmationDialog(open_delete_confirmation, ok="Ok, Delete", on_ok=delete_user, content="Are you sure you want to delete this user?")
83
- ```
84
-
85
- ## Arguments
86
-
87
- * `open`: Indicates whether the dialog is being shown or not.
88
- * `on_open`: Callback to call when the dialog opens of closes.
89
- * `content`: Message that is displayed.
90
- * `title`: Title of the dialog.
91
- * `ok`: If a string, this text will be displayed on the confirmation button (default is "OK"). If a Button, it will be used instead of the default button.
92
- * `on_ok`: Callback to be called when the OK button is clicked.
93
- * `cancel`: If a string, this text will be displayed on the cancellation button (default is "Cancel"). If a Button, it will be used instead of the default
94
- button.
95
- * `on_cancel`: Callback to be called when the Cancel button is clicked. When persistent is False, clicking outside of the element or pressing esc key will
96
- also trigger cancel.
97
- * `children`: Additional components that will be shown under the dialog message, but before the buttons.
98
- * `max_width`: Maximum width of the dialog window.
99
- * `persistent`: When False (the default), clicking outside of the element or pressing esc key will trigger cancel.
100
-
101
- """
102
-
103
- def on_open(open_value):
104
- if not open_value:
105
- if on_close:
106
- on_close()
107
-
108
- open_reactive = solara.use_reactive(open, on_open)
109
- del open
110
-
111
- def close():
112
- open_reactive.set(False)
113
-
114
- user_on_click_ok = None
115
- user_on_click_cancel = None
116
-
117
- def perform_ok():
118
- if user_on_click_ok:
119
- user_on_click_ok()
120
- on_ok()
121
- close()
122
-
123
- def perform_cancel():
124
- if user_on_click_cancel:
125
- user_on_click_cancel()
126
- on_cancel()
127
- close()
128
-
129
- def on_v_model(value):
130
- if not value:
131
- on_cancel()
132
- open_reactive.set(value)
133
-
134
- with v.Dialog(
135
- v_model=open_reactive.value,
136
- on_v_model=on_v_model,
137
- persistent=persistent,
138
- max_width=max_width,
139
- ):
140
- with solara.v.Card():
141
- solara.v.CardTitle(children=[title])
142
- with solara.v.CardText(style_="min-height: 64px"):
143
- if isinstance(content, str):
144
- solara.Text(content)
145
- else:
146
- solara.display(content)
147
- if children:
148
- solara.display(*children)
149
- with solara.v.CardActions(class_="justify-end"):
150
- if isinstance(cancel, str):
151
- solara.Button(label=cancel, on_click=perform_cancel, text=True, classes=["grey--text", "text--darken-2"])
152
- else:
153
- # the user may have passed in on_click already
154
- user_on_click_cancel = cancel.kwargs.get("on_click")
155
- # override or add our own on_click handler
156
- cancel.kwargs = {**cancel.kwargs, "on_click": perform_cancel}
157
- solara.display(cancel)
158
-
159
- # similar as cancel
160
- if isinstance(ok, str):
161
- solara.Button(label=ok, on_click=perform_ok, dark=True, color="primary", elevation=0)
162
- else:
163
- user_on_click_ok = ok.kwargs.get("on_click")
164
- ok.kwargs = {**ok.kwargs, "on_click": perform_ok}
165
- solara.display(ok)
@@ -1,7 +0,0 @@
1
- # for backwards compatibility
2
- from solara.components.cross_filter import ( # noqa: F401
3
- CrossFilterDataFrame,
4
- CrossFilterReport,
5
- CrossFilterSelect,
6
- CrossFilterSlider,
7
- )
@@ -1,298 +0,0 @@
1
- import datetime as dt
2
- from typing import Callable, Dict, List, Optional, Tuple, Union, cast
3
-
4
- import ipyvue
5
- import reacton
6
-
7
- import solara
8
- import solara.lab
9
- from solara.components.input import _use_input_type
10
-
11
-
12
- def use_close_menu(el: reacton.core.Element, is_open: solara.Reactive[bool]):
13
- is_open_ref = solara.use_ref(is_open)
14
- is_open_ref.current = is_open
15
-
16
- def monitor_events():
17
- def close_menu(*ignore_args):
18
- is_open_ref.current.set(False)
19
-
20
- widget = cast(ipyvue.VueWidget, solara.get_widget(el))
21
- widget.on_event("keyup.enter", close_menu)
22
- widget.on_event("keydown.tab", close_menu)
23
-
24
- def cleanup():
25
- widget.on_event("keyup.enter", close_menu, remove=True)
26
- widget.on_event("keydown.tab", close_menu, remove=True)
27
-
28
- return cleanup
29
-
30
- solara.use_effect(monitor_events, [])
31
-
32
-
33
- @solara.component
34
- def InputDate(
35
- value: Union[solara.Reactive[Optional[dt.date]], Optional[dt.date]],
36
- on_value: Optional[Callable[[Optional[dt.date]], None]] = None,
37
- label: str = "Pick a date",
38
- children: List[solara.Element] = [],
39
- open_value: Union[solara.Reactive[bool], bool] = False,
40
- on_open_value: Optional[Callable[[bool], None]] = None,
41
- optional: bool = False,
42
- date_format: str = "%Y/%m/%d",
43
- first_day_of_the_week: int = 1,
44
- style: Optional[Union[str, Dict[str, str]]] = None,
45
- classes: Optional[List[str]] = None,
46
- ):
47
- """
48
- Show a textfield, which when clicked, opens a datepicker. The input date should be of type `datetime.date`.
49
-
50
- ## Basic Example
51
-
52
- ```solara
53
- import solara
54
- import solara.lab
55
- import datetime as dt
56
-
57
-
58
- @solara.component
59
- def Page():
60
- date = solara.use_reactive(dt.date.today())
61
-
62
- solara.lab.InputDate(date)
63
- solara.Text(str(date.value))
64
- ```
65
-
66
- ## Arguments
67
-
68
- * value: Reactive variable of type `datetime.date`, or `None`. This date is selected the first time the component is rendered.
69
- * on_value: a callback function for when value changes. The callback function receives the new value as an argument.
70
- * label: Text used to label the text field that triggers the datepicker.
71
- * children: List of Elements to be rendered under the calendar. If empty, a close button is rendered.
72
- * open_value: Controls and communicates the state of the datepicker. If True, the datepicker is open. If False, the datepicker is closed.
73
- Intended to be used in conjunction with a custom set of controls to close the datepicker.
74
- * on_open_value: a callback function for when open_value changes. Also receives the new value as an argument.
75
- * optional: Determines whether to show an error when value is `None`. If `True`, no error is shown.
76
- * date_format: Sets the format of the date displayed in the text field. Defaults to `"%Y/%m/%d"`. For more information, see
77
- <a href="https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes" target="_blank">the Python documentation</a>.
78
- * first_day_of_the_week: Sets the first day of the week, as an `int` starting count from Sunday (`=0`). Defaults to `1`, which is Monday.
79
- * style: CSS style to apply to the text field. Either a string or a dictionary of CSS properties (i.e. `{"property": "value"}`).
80
- * classes: List of CSS classes to apply to the text field.
81
- """
82
- value_reactive = solara.use_reactive(value, on_value) # type: ignore
83
- del value, on_value
84
- datepicker_is_open = solara.use_reactive(open_value, on_open_value) # type: ignore
85
- del open_value, on_open_value
86
-
87
- def set_date_typed_cast(value: Optional[str]):
88
- if value:
89
- try:
90
- date_value = dt.datetime.strptime(value, date_format).date()
91
- return date_value
92
- except ValueError:
93
- raise ValueError(f"Date {value} does not match format {date_format.replace('%', '')}")
94
- elif optional:
95
- return None
96
- else:
97
- raise ValueError("Date cannot be empty")
98
-
99
- def date_to_str(date: Optional[dt.date]) -> str:
100
- if date is not None:
101
- return date.strftime(date_format)
102
- return ""
103
-
104
- def set_date_cast(new_value: Optional[str]):
105
- if new_value:
106
- date_value = dt.datetime.strptime(new_value, "%Y-%m-%d").date()
107
- datepicker_is_open.set(False)
108
- value_reactive.value = date_value
109
-
110
- def standard_strfy(date: Optional[dt.date]):
111
- if date is None:
112
- return None
113
- else:
114
- return date.strftime("%Y-%m-%d")
115
-
116
- date_standard_str = standard_strfy(value_reactive.value)
117
-
118
- style_flat = solara.util._flatten_style(style)
119
-
120
- internal_value, error_message, set_value_cast = _use_input_type(value_reactive, set_date_typed_cast, date_to_str)
121
-
122
- if error_message:
123
- label += f" ({error_message})"
124
- input = solara.v.TextField(
125
- label=label,
126
- v_model=internal_value,
127
- on_v_model=set_value_cast,
128
- append_icon="mdi-calendar",
129
- error=bool(error_message),
130
- style_="min-width: 290px;" + style_flat,
131
- class_=", ".join(classes) if classes else "",
132
- )
133
-
134
- use_close_menu(input, datepicker_is_open)
135
-
136
- with solara.lab.Menu(
137
- activator=input,
138
- close_on_content_click=False,
139
- open_value=datepicker_is_open,
140
- use_activator_width=False,
141
- ):
142
- with solara.v.DatePicker(
143
- v_model=date_standard_str,
144
- on_v_model=set_date_cast,
145
- first_day_of_week=first_day_of_the_week,
146
- style_="width: 100%;",
147
- ):
148
- if len(children) > 0:
149
- solara.display(*children)
150
-
151
-
152
- @solara.component
153
- def InputDateRange(
154
- value: Union[solara.Reactive[Tuple[Optional[dt.date], Optional[dt.date]]], Tuple[Optional[dt.date], Optional[dt.date]]],
155
- on_value: Optional[Callable[[Optional[Tuple[Optional[dt.date], Optional[dt.date]]]], None]] = None,
156
- label: str = "Select dates",
157
- children: List[solara.Element] = [],
158
- open_value: Union[solara.Reactive[bool], bool] = False,
159
- on_open_value: Optional[Callable[[bool], None]] = None,
160
- optional: bool = False,
161
- date_format: str = "%Y/%m/%d",
162
- first_day_of_the_week: int = 1,
163
- style: Optional[Union[str, Dict[str, str]]] = None,
164
- classes: Optional[List[str]] = None,
165
- ):
166
- """
167
- Show a textfield, which when clicked, opens a datepicker that allows users to select a range of dates by choosing a starting and ending date.
168
- The input dates should be stored in a reactive tuple of type `datetime.date`. The list should contain either precisely two elements.
169
- For an empty pre-selection of dates, pass a reactive empty list.
170
-
171
- ## Basic Example
172
-
173
- ```solara
174
- import solara
175
- import solara.lab
176
- import datetime as dt
177
-
178
-
179
- @solara.component
180
- def Page():
181
- dates = solara.use_reactive(tuple([dt.date.today(), dt.date.today() + dt.timedelta(days=1)]))
182
-
183
- solara.lab.InputDateRange(dates)
184
- solara.Text(str(dates.value))
185
- ```
186
-
187
- ## Arguments
188
-
189
- * value: Tuple with elements of type `datetime.date`. For an empty pre-selection of dates, pass an empty tuple.
190
- * on_value: a callback function for when value changes. The callback function receives the new value as an argument.
191
- * label: Text used to label the text field that triggers the datepicker.
192
- * children: List of Elements to be rendered under the calendar. If empty, a close button is rendered.
193
- * open_value: Controls and communicates the state of the datepicker. If True, the datepicker is open. If False, the datepicker is closed.
194
- Intended to be used in conjunction with a custom set of controls to close the datepicker.
195
- * on_open_value: a callback function for when open_value changes. Also receives the new value as an argument.
196
- * date_format: Sets the format of the date displayed in the text field. Defaults to `"%Y/%m/%d"`. For more information,
197
- * optional: Determines whether go show an error when value is `None`. If `True`, no error is shown.
198
- see <a href="https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes" target="_blank">the Python documentation</a>.
199
- * first_day_of_the_week: Sets the first day of the week, as an `int` starting count from Sunday (`=0`). Defaults to `1`, which is Monday.
200
- * style: CSS style to apply to the text field. Either a string or a dictionary of CSS properties (i.e. `{"property": "value"}`).
201
- * classes: List of CSS classes to apply to the text field.
202
-
203
- ## A More Advanced Example
204
-
205
- ```solara
206
- import solara
207
- import solara.lab
208
- import datetime as dt
209
-
210
-
211
- @solara.component
212
- def Page():
213
- date = solara.use_reactive(tuple([dt.date.today(), None]))
214
- range_is_open = solara.use_reactive(False)
215
- stay_length = solara.use_reactive(1)
216
-
217
- def set_end_date(value):
218
- if value and value[0]:
219
- value = value[0]
220
- second_date = value + dt.timedelta(days=stay_length.value)
221
- date.set([value, second_date])
222
-
223
- def book():
224
- # Do some stuff here
225
- range_is_open.set(False)
226
-
227
- solara.use_memo(lambda: set_end_date(date.value), [stay_length.value])
228
-
229
- with solara.Column(style="width: 400px;"):
230
- solara.IntSlider("Length of stay", stay_length, min=1, max=10)
231
- with solara.lab.InputDateRange(
232
- date,
233
- on_value=set_end_date,
234
- open_value=range_is_open,
235
- ):
236
- with solara.Row(justify="end", style="width: 100%;"):
237
- solara.Button(
238
- label="Book",
239
- color="primary",
240
- on_click=book,
241
- )
242
-
243
- ```
244
- """
245
- value_reactive = solara.use_reactive(value, on_value) # type: ignore
246
- del value, on_value
247
- date_standard_strings = [date.strftime("%Y-%m-%d") for date in value_reactive.value if date is not None]
248
- datepicker_is_open = solara.use_reactive(open_value, on_open_value) # type: ignore
249
- del open_value, on_open_value
250
- style_flat = solara.util._flatten_style(style)
251
-
252
- def dates_to_string(dates: Tuple[Optional[dt.date], Optional[dt.date]]):
253
- string_dates = [date.strftime(date_format) if date is not None else "" for date in dates]
254
- if (len(dates) < 2 or dates[1] is None) and not optional:
255
- return string_dates[0], "Please select two dates"
256
- return " - ".join(string_dates), None
257
-
258
- def set_dates_cast(values):
259
- date_value = cast(
260
- Tuple[Optional[dt.date], Optional[dt.date]], tuple([dt.datetime.strptime(item, "%Y-%m-%d").date() if item is not None else None for item in values])
261
- )
262
- if len(date_value) > 1 and date_value[1] is not None:
263
- datepicker_is_open.set(False)
264
- value_reactive.value = date_value
265
-
266
- string_dates, error_message = dates_to_string(value_reactive.value)
267
-
268
- if error_message:
269
- label += f" ({error_message})"
270
- input = solara.v.TextField(
271
- label=label,
272
- v_model=string_dates,
273
- append_icon="mdi-calendar",
274
- error=bool(error_message),
275
- style_="min-width: 290px;" + style_flat,
276
- readonly=True,
277
- class_=", ".join(classes) if classes else "",
278
- )
279
-
280
- # We include closing on tab in case users want to skip the field with tab
281
- use_close_menu(input, datepicker_is_open)
282
-
283
- with solara.lab.Menu(
284
- activator=input,
285
- close_on_content_click=False,
286
- open_value=datepicker_is_open,
287
- use_activator_width=False,
288
- ):
289
- with solara.v.DatePicker(
290
- v_model=date_standard_strings,
291
- on_v_model=set_dates_cast,
292
- range=True,
293
- first_day_of_week=first_day_of_the_week,
294
- style_="width: 100%;",
295
- ):
296
- if len(children) > 0:
297
- for el in children:
298
- solara.display(el)