solara-ui 1.45.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  2. prefix/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  3. solara/__init__.py +124 -0
  4. solara/__main__.py +765 -0
  5. solara/_stores.py +297 -0
  6. solara/alias.py +6 -0
  7. solara/autorouting.py +555 -0
  8. solara/cache.py +305 -0
  9. solara/checks.html +71 -0
  10. solara/checks.py +227 -0
  11. solara/comm.py +28 -0
  12. solara/components/__init__.py +77 -0
  13. solara/components/alert.py +155 -0
  14. solara/components/applayout.py +397 -0
  15. solara/components/button.py +85 -0
  16. solara/components/card.py +87 -0
  17. solara/components/checkbox.py +50 -0
  18. solara/components/code_highlight_css.py +11 -0
  19. solara/components/code_highlight_css.vue +63 -0
  20. solara/components/columns.py +159 -0
  21. solara/components/component_vue.py +134 -0
  22. solara/components/cross_filter.py +335 -0
  23. solara/components/dataframe.py +546 -0
  24. solara/components/datatable.py +214 -0
  25. solara/components/datatable.vue +175 -0
  26. solara/components/details.py +56 -0
  27. solara/components/download.vue +35 -0
  28. solara/components/echarts.py +86 -0
  29. solara/components/echarts.vue +139 -0
  30. solara/components/figure_altair.py +39 -0
  31. solara/components/file_browser.py +181 -0
  32. solara/components/file_download.py +199 -0
  33. solara/components/file_drop.py +159 -0
  34. solara/components/file_drop.vue +83 -0
  35. solara/components/file_list_widget.vue +78 -0
  36. solara/components/head.py +27 -0
  37. solara/components/head_tag.py +49 -0
  38. solara/components/head_tag.vue +60 -0
  39. solara/components/image.py +173 -0
  40. solara/components/input.py +456 -0
  41. solara/components/input_text_area.py +86 -0
  42. solara/components/link.py +55 -0
  43. solara/components/markdown.py +441 -0
  44. solara/components/markdown_editor.py +33 -0
  45. solara/components/markdown_editor.vue +359 -0
  46. solara/components/matplotlib.py +74 -0
  47. solara/components/meta.py +47 -0
  48. solara/components/misc.py +333 -0
  49. solara/components/pivot_table.py +258 -0
  50. solara/components/pivot_table.vue +158 -0
  51. solara/components/progress.py +47 -0
  52. solara/components/select.py +182 -0
  53. solara/components/select.vue +27 -0
  54. solara/components/slider.py +442 -0
  55. solara/components/slider_date.vue +56 -0
  56. solara/components/spinner-solara.vue +105 -0
  57. solara/components/spinner.py +45 -0
  58. solara/components/sql_code.py +41 -0
  59. solara/components/sql_code.vue +125 -0
  60. solara/components/style.py +105 -0
  61. solara/components/switch.py +71 -0
  62. solara/components/tab_navigation.py +37 -0
  63. solara/components/title.py +90 -0
  64. solara/components/title.vue +38 -0
  65. solara/components/togglebuttons.py +200 -0
  66. solara/components/tooltip.py +61 -0
  67. solara/core.py +42 -0
  68. solara/datatypes.py +143 -0
  69. solara/express.py +241 -0
  70. solara/hooks/__init__.py +4 -0
  71. solara/hooks/dataframe.py +99 -0
  72. solara/hooks/misc.py +263 -0
  73. solara/hooks/use_reactive.py +151 -0
  74. solara/hooks/use_thread.py +129 -0
  75. solara/kitchensink.py +8 -0
  76. solara/lab/__init__.py +34 -0
  77. solara/lab/components/__init__.py +7 -0
  78. solara/lab/components/chat.py +215 -0
  79. solara/lab/components/confirmation_dialog.py +163 -0
  80. solara/lab/components/cross_filter.py +7 -0
  81. solara/lab/components/input_date.py +339 -0
  82. solara/lab/components/input_time.py +133 -0
  83. solara/lab/components/menu.py +181 -0
  84. solara/lab/components/menu.vue +38 -0
  85. solara/lab/components/tabs.py +274 -0
  86. solara/lab/components/theming.py +98 -0
  87. solara/lab/components/theming.vue +72 -0
  88. solara/lab/hooks/__init__.py +0 -0
  89. solara/lab/hooks/dataframe.py +2 -0
  90. solara/lab/toestand.py +3 -0
  91. solara/lab/utils/__init__.py +2 -0
  92. solara/lab/utils/cookies.py +5 -0
  93. solara/lab/utils/dataframe.py +165 -0
  94. solara/lab/utils/headers.py +5 -0
  95. solara/layout.py +44 -0
  96. solara/lifecycle.py +46 -0
  97. solara/minisettings.py +141 -0
  98. solara/py.typed +0 -0
  99. solara/reactive.py +99 -0
  100. solara/routing.py +268 -0
  101. solara/scope/__init__.py +88 -0
  102. solara/scope/types.py +55 -0
  103. solara/server/__init__.py +0 -0
  104. solara/server/app.py +527 -0
  105. solara/server/assets/custom.css +1 -0
  106. solara/server/assets/custom.js +1 -0
  107. solara/server/assets/favicon.png +0 -0
  108. solara/server/assets/favicon.svg +5 -0
  109. solara/server/assets/style.css +1681 -0
  110. solara/server/assets/theme-dark.css +437 -0
  111. solara/server/assets/theme-light.css +420 -0
  112. solara/server/assets/theme.js +3 -0
  113. solara/server/cdn_helper.py +91 -0
  114. solara/server/esm.py +71 -0
  115. solara/server/fastapi.py +5 -0
  116. solara/server/flask.py +297 -0
  117. solara/server/jupyter/__init__.py +2 -0
  118. solara/server/jupyter/cdn_handler.py +28 -0
  119. solara/server/jupyter/server_extension.py +40 -0
  120. solara/server/jupyter/solara.py +91 -0
  121. solara/server/jupytertools.py +46 -0
  122. solara/server/kernel.py +388 -0
  123. solara/server/kernel_context.py +467 -0
  124. solara/server/patch.py +564 -0
  125. solara/server/pyinstaller/__init__.py +9 -0
  126. solara/server/pyinstaller/hook-ipyreact.py +5 -0
  127. solara/server/pyinstaller/hook-ipyvuetify.py +5 -0
  128. solara/server/pyinstaller/hook-solara.py +9 -0
  129. solara/server/qt.py +113 -0
  130. solara/server/reload.py +251 -0
  131. solara/server/server.py +484 -0
  132. solara/server/settings.py +249 -0
  133. solara/server/shell.py +269 -0
  134. solara/server/starlette.py +770 -0
  135. solara/server/static/ansi.js +270 -0
  136. solara/server/static/highlight-dark.css +82 -0
  137. solara/server/static/highlight.css +43 -0
  138. solara/server/static/main-vuetify.js +272 -0
  139. solara/server/static/main.js +163 -0
  140. solara/server/static/solara_bootstrap.py +129 -0
  141. solara/server/static/sun.svg +23 -0
  142. solara/server/static/webworker.js +42 -0
  143. solara/server/telemetry.py +212 -0
  144. solara/server/templates/index.html.j2 +1 -0
  145. solara/server/templates/loader-plain.css +11 -0
  146. solara/server/templates/loader-plain.html +20 -0
  147. solara/server/templates/loader-solara.css +111 -0
  148. solara/server/templates/loader-solara.html +40 -0
  149. solara/server/templates/plain.html +82 -0
  150. solara/server/templates/solara.html.j2 +486 -0
  151. solara/server/threaded.py +84 -0
  152. solara/server/utils.py +44 -0
  153. solara/server/websocket.py +45 -0
  154. solara/settings.py +86 -0
  155. solara/tasks.py +893 -0
  156. solara/template/button.py +16 -0
  157. solara/template/markdown.py +42 -0
  158. solara/template/portal/.flake8 +6 -0
  159. solara/template/portal/.pre-commit-config.yaml +28 -0
  160. solara/template/portal/LICENSE +21 -0
  161. solara/template/portal/Procfile +7 -0
  162. solara/template/portal/mypy.ini +3 -0
  163. solara/template/portal/pyproject.toml +26 -0
  164. solara/template/portal/solara_portal/__init__.py +4 -0
  165. solara/template/portal/solara_portal/components/__init__.py +2 -0
  166. solara/template/portal/solara_portal/components/article.py +28 -0
  167. solara/template/portal/solara_portal/components/data.py +28 -0
  168. solara/template/portal/solara_portal/components/header.py +6 -0
  169. solara/template/portal/solara_portal/components/layout.py +6 -0
  170. solara/template/portal/solara_portal/content/articles/equis-in-vidi.md +85 -0
  171. solara/template/portal/solara_portal/content/articles/substiterat-vati.md +70 -0
  172. solara/template/portal/solara_portal/data.py +60 -0
  173. solara/template/portal/solara_portal/pages/__init__.py +67 -0
  174. solara/template/portal/solara_portal/pages/article/__init__.py +26 -0
  175. solara/template/portal/solara_portal/pages/tabular.py +29 -0
  176. solara/template/portal/solara_portal/pages/viz/__init__.py +70 -0
  177. solara/template/portal/solara_portal/pages/viz/overview.py +14 -0
  178. solara/test/__init__.py +0 -0
  179. solara/test/pytest_plugin.py +783 -0
  180. solara/toestand.py +998 -0
  181. solara/util.py +348 -0
  182. solara/validate_hooks.py +258 -0
  183. solara/website/__init__.py +0 -0
  184. solara/website/assets/custom.css +444 -0
  185. solara/website/assets/images/logo-small.png +0 -0
  186. solara/website/assets/images/logo.svg +17 -0
  187. solara/website/assets/images/logo_white.svg +50 -0
  188. solara/website/assets/theme.js +8 -0
  189. solara/website/components/__init__.py +5 -0
  190. solara/website/components/algolia.py +6 -0
  191. solara/website/components/algolia.vue +24 -0
  192. solara/website/components/algolia_api.vue +202 -0
  193. solara/website/components/breadcrumbs.py +28 -0
  194. solara/website/components/contact.py +144 -0
  195. solara/website/components/docs.py +143 -0
  196. solara/website/components/header.py +75 -0
  197. solara/website/components/mailchimp.py +12 -0
  198. solara/website/components/mailchimp.vue +47 -0
  199. solara/website/components/markdown.py +99 -0
  200. solara/website/components/markdown_nav.vue +34 -0
  201. solara/website/components/notebook.py +171 -0
  202. solara/website/components/sidebar.py +105 -0
  203. solara/website/pages/__init__.py +370 -0
  204. solara/website/pages/about/__init__.py +9 -0
  205. solara/website/pages/about/about.md +3 -0
  206. solara/website/pages/apps/__init__.py +16 -0
  207. solara/website/pages/apps/authorization/__init__.py +119 -0
  208. solara/website/pages/apps/authorization/admin.py +12 -0
  209. solara/website/pages/apps/authorization/users.py +12 -0
  210. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  211. solara/website/pages/apps/layout-demo.py +40 -0
  212. solara/website/pages/apps/multipage/__init__.py +38 -0
  213. solara/website/pages/apps/multipage/page1.py +26 -0
  214. solara/website/pages/apps/multipage/page2.py +34 -0
  215. solara/website/pages/apps/scatter.py +136 -0
  216. solara/website/pages/apps/scrolling.py +63 -0
  217. solara/website/pages/apps/tutorial-streamlit.py +18 -0
  218. solara/website/pages/careers/__init__.py +27 -0
  219. solara/website/pages/changelog/__init__.py +10 -0
  220. solara/website/pages/changelog/changelog.md +372 -0
  221. solara/website/pages/contact/__init__.py +34 -0
  222. solara/website/pages/doc_use_download.py +85 -0
  223. solara/website/pages/documentation/__init__.py +90 -0
  224. solara/website/pages/documentation/advanced/__init__.py +9 -0
  225. solara/website/pages/documentation/advanced/content/00-overview.md +1 -0
  226. solara/website/pages/documentation/advanced/content/10-howto/00-overview.md +6 -0
  227. solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md +196 -0
  228. solara/website/pages/documentation/advanced/content/10-howto/20-layout.md +125 -0
  229. solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +417 -0
  230. solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md +69 -0
  231. solara/website/pages/documentation/advanced/content/10-howto/40-embed.md +50 -0
  232. solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md +124 -0
  233. solara/website/pages/documentation/advanced/content/15-reference/00-overview.md +3 -0
  234. solara/website/pages/documentation/advanced/content/15-reference/40-static_files.md +31 -0
  235. solara/website/pages/documentation/advanced/content/15-reference/41-asset-files.md +72 -0
  236. solara/website/pages/documentation/advanced/content/15-reference/60-static-site-generation.md +59 -0
  237. solara/website/pages/documentation/advanced/content/15-reference/70-search.md +34 -0
  238. solara/website/pages/documentation/advanced/content/15-reference/80-reloading.md +34 -0
  239. solara/website/pages/documentation/advanced/content/15-reference/90-notebook-support.md +7 -0
  240. solara/website/pages/documentation/advanced/content/15-reference/95-caching.md +148 -0
  241. solara/website/pages/documentation/advanced/content/20-understanding/00-introduction.md +10 -0
  242. solara/website/pages/documentation/advanced/content/20-understanding/05-ipywidgets.md +35 -0
  243. solara/website/pages/documentation/advanced/content/20-understanding/06-ipyvuetify.md +42 -0
  244. solara/website/pages/documentation/advanced/content/20-understanding/10-reacton.md +28 -0
  245. solara/website/pages/documentation/advanced/content/20-understanding/12-reacton-basics.md +108 -0
  246. solara/website/pages/documentation/advanced/content/20-understanding/15-anatomy.md +23 -0
  247. solara/website/pages/documentation/advanced/content/20-understanding/17-rules-of-hooks.md +192 -0
  248. solara/website/pages/documentation/advanced/content/20-understanding/18-containers.md +166 -0
  249. solara/website/pages/documentation/advanced/content/20-understanding/20-solara.md +18 -0
  250. solara/website/pages/documentation/advanced/content/20-understanding/40-routing.md +256 -0
  251. solara/website/pages/documentation/advanced/content/20-understanding/50-solara-server.md +108 -0
  252. solara/website/pages/documentation/advanced/content/20-understanding/60-voila.md +12 -0
  253. solara/website/pages/documentation/advanced/content/30-enterprise/00-overview.md +7 -0
  254. solara/website/pages/documentation/advanced/content/30-enterprise/10-oauth.md +187 -0
  255. solara/website/pages/documentation/advanced/content/40-development/00-overview.md +0 -0
  256. solara/website/pages/documentation/advanced/content/40-development/01-contribute.md +45 -0
  257. solara/website/pages/documentation/advanced/content/40-development/10-setup.md +76 -0
  258. solara/website/pages/documentation/api/__init__.py +19 -0
  259. solara/website/pages/documentation/api/cross_filter/__init__.py +9 -0
  260. solara/website/pages/documentation/api/cross_filter/cross_filter_dataframe.py +22 -0
  261. solara/website/pages/documentation/api/cross_filter/cross_filter_report.py +20 -0
  262. solara/website/pages/documentation/api/cross_filter/cross_filter_select.py +20 -0
  263. solara/website/pages/documentation/api/cross_filter/cross_filter_slider.py +20 -0
  264. solara/website/pages/documentation/api/hooks/__init__.py +9 -0
  265. solara/website/pages/documentation/api/hooks/use_cross_filter.py +23 -0
  266. solara/website/pages/documentation/api/hooks/use_dark_effective.py +12 -0
  267. solara/website/pages/documentation/api/hooks/use_effect.md +43 -0
  268. solara/website/pages/documentation/api/hooks/use_effect.py +9 -0
  269. solara/website/pages/documentation/api/hooks/use_exception.py +31 -0
  270. solara/website/pages/documentation/api/hooks/use_memo.md +16 -0
  271. solara/website/pages/documentation/api/hooks/use_memo.py +9 -0
  272. solara/website/pages/documentation/api/hooks/use_previous.py +30 -0
  273. solara/website/pages/documentation/api/hooks/use_reactive.py +16 -0
  274. solara/website/pages/documentation/api/hooks/use_state.py +10 -0
  275. solara/website/pages/documentation/api/hooks/use_state_or_update.py +66 -0
  276. solara/website/pages/documentation/api/hooks/use_thread.md +64 -0
  277. solara/website/pages/documentation/api/hooks/use_thread.py +42 -0
  278. solara/website/pages/documentation/api/hooks/use_trait_observe.py +12 -0
  279. solara/website/pages/documentation/api/routing/__init__.py +9 -0
  280. solara/website/pages/documentation/api/routing/generate_routes.py +10 -0
  281. solara/website/pages/documentation/api/routing/generate_routes_directory.py +10 -0
  282. solara/website/pages/documentation/api/routing/resolve_path.py +35 -0
  283. solara/website/pages/documentation/api/routing/route.py +29 -0
  284. solara/website/pages/documentation/api/routing/use_route.py +76 -0
  285. solara/website/pages/documentation/api/routing/use_router.py +16 -0
  286. solara/website/pages/documentation/api/utilities/__init__.py +9 -0
  287. solara/website/pages/documentation/api/utilities/component_vue.py +10 -0
  288. solara/website/pages/documentation/api/utilities/computed.py +16 -0
  289. solara/website/pages/documentation/api/utilities/display.py +16 -0
  290. solara/website/pages/documentation/api/utilities/get_kernel_id.py +16 -0
  291. solara/website/pages/documentation/api/utilities/get_session_id.py +16 -0
  292. solara/website/pages/documentation/api/utilities/memoize.py +35 -0
  293. solara/website/pages/documentation/api/utilities/on_kernel_start.py +44 -0
  294. solara/website/pages/documentation/api/utilities/reactive.py +16 -0
  295. solara/website/pages/documentation/api/utilities/widget.py +104 -0
  296. solara/website/pages/documentation/components/__init__.py +12 -0
  297. solara/website/pages/documentation/components/advanced/__init__.py +9 -0
  298. solara/website/pages/documentation/components/advanced/link.py +25 -0
  299. solara/website/pages/documentation/components/advanced/meta.py +17 -0
  300. solara/website/pages/documentation/components/advanced/style.py +43 -0
  301. solara/website/pages/documentation/components/common.py +9 -0
  302. solara/website/pages/documentation/components/data/__init__.py +9 -0
  303. solara/website/pages/documentation/components/data/dataframe.py +44 -0
  304. solara/website/pages/documentation/components/data/pivot_table.py +81 -0
  305. solara/website/pages/documentation/components/enterprise/__init__.py +9 -0
  306. solara/website/pages/documentation/components/enterprise/avatar.py +24 -0
  307. solara/website/pages/documentation/components/enterprise/avatar_menu.py +25 -0
  308. solara/website/pages/documentation/components/input/__init__.py +9 -0
  309. solara/website/pages/documentation/components/input/button.py +23 -0
  310. solara/website/pages/documentation/components/input/checkbox.py +10 -0
  311. solara/website/pages/documentation/components/input/file_browser.py +30 -0
  312. solara/website/pages/documentation/components/input/file_drop.py +76 -0
  313. solara/website/pages/documentation/components/input/input.py +43 -0
  314. solara/website/pages/documentation/components/input/select.py +22 -0
  315. solara/website/pages/documentation/components/input/slider.py +29 -0
  316. solara/website/pages/documentation/components/input/switch.py +10 -0
  317. solara/website/pages/documentation/components/input/togglebuttons.py +21 -0
  318. solara/website/pages/documentation/components/lab/__init__.py +9 -0
  319. solara/website/pages/documentation/components/lab/chat.py +109 -0
  320. solara/website/pages/documentation/components/lab/confirmation_dialog.py +55 -0
  321. solara/website/pages/documentation/components/lab/cookies_headers.py +48 -0
  322. solara/website/pages/documentation/components/lab/input_date.py +20 -0
  323. solara/website/pages/documentation/components/lab/input_time.py +15 -0
  324. solara/website/pages/documentation/components/lab/menu.py +22 -0
  325. solara/website/pages/documentation/components/lab/tab.py +25 -0
  326. solara/website/pages/documentation/components/lab/tabs.py +45 -0
  327. solara/website/pages/documentation/components/lab/task.py +11 -0
  328. solara/website/pages/documentation/components/lab/theming.py +74 -0
  329. solara/website/pages/documentation/components/lab/use_task.py +11 -0
  330. solara/website/pages/documentation/components/layout/__init__.py +9 -0
  331. solara/website/pages/documentation/components/layout/app_bar.py +16 -0
  332. solara/website/pages/documentation/components/layout/app_bar_title.py +16 -0
  333. solara/website/pages/documentation/components/layout/app_layout.py +24 -0
  334. solara/website/pages/documentation/components/layout/card.py +15 -0
  335. solara/website/pages/documentation/components/layout/card_actions.py +16 -0
  336. solara/website/pages/documentation/components/layout/column.py +30 -0
  337. solara/website/pages/documentation/components/layout/columns.py +27 -0
  338. solara/website/pages/documentation/components/layout/columns_responsive.py +66 -0
  339. solara/website/pages/documentation/components/layout/details.py +13 -0
  340. solara/website/pages/documentation/components/layout/griddraggable.py +62 -0
  341. solara/website/pages/documentation/components/layout/gridfixed.py +19 -0
  342. solara/website/pages/documentation/components/layout/hbox.py +18 -0
  343. solara/website/pages/documentation/components/layout/row.py +30 -0
  344. solara/website/pages/documentation/components/layout/sidebar.py +24 -0
  345. solara/website/pages/documentation/components/layout/vbox.py +19 -0
  346. solara/website/pages/documentation/components/output/__init__.py +9 -0
  347. solara/website/pages/documentation/components/output/file_download.py +11 -0
  348. solara/website/pages/documentation/components/output/html.py +19 -0
  349. solara/website/pages/documentation/components/output/image.py +11 -0
  350. solara/website/pages/documentation/components/output/markdown.py +57 -0
  351. solara/website/pages/documentation/components/output/markdown_editor.py +51 -0
  352. solara/website/pages/documentation/components/output/sql_code.py +83 -0
  353. solara/website/pages/documentation/components/output/tooltip.py +11 -0
  354. solara/website/pages/documentation/components/page/__init__.py +9 -0
  355. solara/website/pages/documentation/components/page/head.py +15 -0
  356. solara/website/pages/documentation/components/page/title.py +25 -0
  357. solara/website/pages/documentation/components/status/__init__.py +9 -0
  358. solara/website/pages/documentation/components/status/error.py +39 -0
  359. solara/website/pages/documentation/components/status/info.py +39 -0
  360. solara/website/pages/documentation/components/status/progress.py +10 -0
  361. solara/website/pages/documentation/components/status/spinner.py +11 -0
  362. solara/website/pages/documentation/components/status/success.py +40 -0
  363. solara/website/pages/documentation/components/status/warning.py +47 -0
  364. solara/website/pages/documentation/components/viz/__init__.py +9 -0
  365. solara/website/pages/documentation/components/viz/altair.py +42 -0
  366. solara/website/pages/documentation/components/viz/echarts.py +77 -0
  367. solara/website/pages/documentation/components/viz/matplotlib.py +30 -0
  368. solara/website/pages/documentation/components/viz/plotly.py +63 -0
  369. solara/website/pages/documentation/components/viz/plotly_express.py +41 -0
  370. solara/website/pages/documentation/examples/__init__.py +54 -0
  371. solara/website/pages/documentation/examples/ai/__init__.py +11 -0
  372. solara/website/pages/documentation/examples/ai/chatbot.py +113 -0
  373. solara/website/pages/documentation/examples/ai/tokenizer.py +107 -0
  374. solara/website/pages/documentation/examples/basics/__init__.py +10 -0
  375. solara/website/pages/documentation/examples/basics/sine.py +28 -0
  376. solara/website/pages/documentation/examples/fullscreen/__init__.py +10 -0
  377. solara/website/pages/documentation/examples/fullscreen/authorization.py +3 -0
  378. solara/website/pages/documentation/examples/fullscreen/layout_demo.py +3 -0
  379. solara/website/pages/documentation/examples/fullscreen/multipage.py +3 -0
  380. solara/website/pages/documentation/examples/fullscreen/scatter.py +3 -0
  381. solara/website/pages/documentation/examples/fullscreen/scrolling.py +3 -0
  382. solara/website/pages/documentation/examples/fullscreen/tutorial_streamlit.py +3 -0
  383. solara/website/pages/documentation/examples/general/__init__.py +10 -0
  384. solara/website/pages/documentation/examples/general/custom_storage.py +70 -0
  385. solara/website/pages/documentation/examples/general/deploy_model.py +115 -0
  386. solara/website/pages/documentation/examples/general/live_update.py +32 -0
  387. solara/website/pages/documentation/examples/general/login_oauth.py +81 -0
  388. solara/website/pages/documentation/examples/general/mycard.vue +58 -0
  389. solara/website/pages/documentation/examples/general/pokemon_search.py +51 -0
  390. solara/website/pages/documentation/examples/general/vue_component.py +50 -0
  391. solara/website/pages/documentation/examples/ipycanvas.py +49 -0
  392. solara/website/pages/documentation/examples/libraries/__init__.py +10 -0
  393. solara/website/pages/documentation/examples/libraries/altair.py +65 -0
  394. solara/website/pages/documentation/examples/libraries/bqplot.py +39 -0
  395. solara/website/pages/documentation/examples/libraries/ipyleaflet.py +33 -0
  396. solara/website/pages/documentation/examples/libraries/ipyleaflet_advanced.py +66 -0
  397. solara/website/pages/documentation/examples/utilities/__init__.py +10 -0
  398. solara/website/pages/documentation/examples/utilities/calculator.py +157 -0
  399. solara/website/pages/documentation/examples/utilities/countdown_timer.py +62 -0
  400. solara/website/pages/documentation/examples/utilities/todo.py +196 -0
  401. solara/website/pages/documentation/examples/visualization/__init__.py +6 -0
  402. solara/website/pages/documentation/examples/visualization/annotator.py +67 -0
  403. solara/website/pages/documentation/examples/visualization/linked_views.py +81 -0
  404. solara/website/pages/documentation/examples/visualization/plotly.py +44 -0
  405. solara/website/pages/documentation/faq/__init__.py +12 -0
  406. solara/website/pages/documentation/faq/content/99-faq.md +112 -0
  407. solara/website/pages/documentation/getting_started/__init__.py +9 -0
  408. solara/website/pages/documentation/getting_started/content/00-quickstart.md +107 -0
  409. solara/website/pages/documentation/getting_started/content/01-introduction.md +125 -0
  410. solara/website/pages/documentation/getting_started/content/02-installing.md +134 -0
  411. solara/website/pages/documentation/getting_started/content/04-tutorials/00-overview.md +14 -0
  412. solara/website/pages/documentation/getting_started/content/04-tutorials/10_data_science.py +13 -0
  413. solara/website/pages/documentation/getting_started/content/04-tutorials/20-web-app.md +89 -0
  414. solara/website/pages/documentation/getting_started/content/04-tutorials/30-ipywidgets.md +124 -0
  415. solara/website/pages/documentation/getting_started/content/04-tutorials/40-streamlit.md +146 -0
  416. solara/website/pages/documentation/getting_started/content/04-tutorials/50-dash.md +144 -0
  417. solara/website/pages/documentation/getting_started/content/04-tutorials/60-jupyter-dashboard-part1.py +65 -0
  418. solara/website/pages/documentation/getting_started/content/04-tutorials/SF_crime_sample.csv.gz +0 -0
  419. solara/website/pages/documentation/getting_started/content/04-tutorials/_data_science.ipynb +445 -0
  420. solara/website/pages/documentation/getting_started/content/04-tutorials/_jupyter_dashboard_1.ipynb +1021 -0
  421. solara/website/pages/documentation/getting_started/content/05-fundamentals/00-overview.md +11 -0
  422. solara/website/pages/documentation/getting_started/content/05-fundamentals/10-components.md +228 -0
  423. solara/website/pages/documentation/getting_started/content/05-fundamentals/50-state-management.md +278 -0
  424. solara/website/pages/documentation/getting_started/content/07-deploying/00-overview.md +7 -0
  425. solara/website/pages/documentation/getting_started/content/07-deploying/10-self-hosted.md +305 -0
  426. solara/website/pages/documentation/getting_started/content/07-deploying/20-cloud-hosted.md +80 -0
  427. solara/website/pages/documentation/getting_started/content/80-what-is-lab.md +7 -0
  428. solara/website/pages/documentation/getting_started/content/90-troubleshoot.md +26 -0
  429. solara/website/pages/docutils.py +38 -0
  430. solara/website/pages/home.vue +1199 -0
  431. solara/website/pages/our_team/__init__.py +83 -0
  432. solara/website/pages/pricing/__init__.py +31 -0
  433. solara/website/pages/roadmap/__init__.py +11 -0
  434. solara/website/pages/roadmap/roadmap.md +47 -0
  435. solara/website/pages/scale_ipywidgets.py +45 -0
  436. solara/website/pages/showcase/__init__.py +105 -0
  437. solara/website/pages/showcase/domino_code_assist.py +60 -0
  438. solara/website/pages/showcase/planeto_tessa.py +19 -0
  439. solara/website/pages/showcase/solara_dev.py +54 -0
  440. solara/website/pages/showcase/solarathon_2023_team_2.py +22 -0
  441. solara/website/pages/showcase/solarathon_2023_team_4.py +22 -0
  442. solara/website/pages/showcase/solarathon_2023_team_5.py +23 -0
  443. solara/website/pages/showcase/solarathon_2023_team_6.py +34 -0
  444. solara/website/pages/showcase/wanderlust.py +27 -0
  445. solara/website/public/beach.jpeg +0 -0
  446. solara/website/public/logo.svg +6 -0
  447. solara/website/public/social/discord.svg +1 -0
  448. solara/website/public/social/github.svg +1 -0
  449. solara/website/public/social/twitter.svg +3 -0
  450. solara/website/public/success.html +25 -0
  451. solara/website/templates/index.html.j2 +117 -0
  452. solara/website/utils.py +51 -0
  453. solara/widgets/__init__.py +1 -0
  454. solara/widgets/vue/gridlayout.vue +107 -0
  455. solara/widgets/vue/html.vue +4 -0
  456. solara/widgets/vue/navigator.vue +134 -0
  457. solara/widgets/vue/vegalite.vue +130 -0
  458. solara/widgets/widgets.py +74 -0
  459. solara_ui-1.45.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json +7 -0
  460. solara_ui-1.45.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json +7 -0
  461. solara_ui-1.45.0.dist-info/METADATA +162 -0
  462. solara_ui-1.45.0.dist-info/RECORD +464 -0
  463. solara_ui-1.45.0.dist-info/WHEEL +4 -0
  464. solara_ui-1.45.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,270 @@
1
+ /* Copied from: https://github.com/jupyterlab/jupyterlab/blob/9284892500c9338852532d79d6c5b467c61d797b/packages/rendermime/src/renderers.ts#L881 */
2
+ const ANSI_COLORS = [
3
+ 'ansi-black',
4
+ 'ansi-red',
5
+ 'ansi-green',
6
+ 'ansi-yellow',
7
+ 'ansi-blue',
8
+ 'ansi-magenta',
9
+ 'ansi-cyan',
10
+ 'ansi-white',
11
+ 'ansi-black-intense',
12
+ 'ansi-red-intense',
13
+ 'ansi-green-intense',
14
+ 'ansi-yellow-intense',
15
+ 'ansi-blue-intense',
16
+ 'ansi-magenta-intense',
17
+ 'ansi-cyan-intense',
18
+ 'ansi-white-intense'
19
+ ];
20
+
21
+ /**
22
+ * Create HTML tags for a string with given foreground, background etc. and
23
+ * add them to the `out` array.
24
+ */
25
+ function pushColoredChunk(
26
+ chunk,
27
+ fg,
28
+ bg,
29
+ bold,
30
+ underline,
31
+ inverse,
32
+ out
33
+ ) {
34
+ if (chunk) {
35
+ const classes = [];
36
+ const styles = [];
37
+
38
+ if (bold && typeof fg === 'number' && 0 <= fg && fg < 8) {
39
+ fg += 8; // Bold text uses "intense" colors
40
+ }
41
+ if (inverse) {
42
+ [fg, bg] = [bg, fg];
43
+ }
44
+
45
+ if (typeof fg === 'number') {
46
+ classes.push(ANSI_COLORS[fg] + '-fg');
47
+ } else if (fg.length) {
48
+ styles.push(`color: rgb(${fg})`);
49
+ } else if (inverse) {
50
+ classes.push('ansi-default-inverse-fg');
51
+ }
52
+
53
+ if (typeof bg === 'number') {
54
+ classes.push(ANSI_COLORS[bg] + '-bg');
55
+ } else if (bg.length) {
56
+ styles.push(`background-color: rgb(${bg})`);
57
+ } else if (inverse) {
58
+ classes.push('ansi-default-inverse-bg');
59
+ }
60
+
61
+ if (bold) {
62
+ classes.push('ansi-bold');
63
+ }
64
+
65
+ if (underline) {
66
+ classes.push('ansi-underline');
67
+ }
68
+
69
+ if (classes.length || styles.length) {
70
+ out.push('<span');
71
+ if (classes.length) {
72
+ out.push(` class="${classes.join(' ')}"`);
73
+ }
74
+ if (styles.length) {
75
+ out.push(` style="${styles.join('; ')}"`);
76
+ }
77
+ out.push('>');
78
+ out.push(chunk);
79
+ out.push('</span>');
80
+ } else {
81
+ out.push(chunk);
82
+ }
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Convert ANSI extended colors to R/G/B triple.
88
+ */
89
+ function getExtendedColors(numbers) {
90
+ let r;
91
+ let g;
92
+ let b;
93
+ const n = numbers.shift();
94
+ if (n === 2 && numbers.length >= 3) {
95
+ // 24-bit RGB
96
+ r = numbers.shift();
97
+ g = numbers.shift();
98
+ b = numbers.shift();
99
+ if ([r, g, b].some(c => c < 0 || 255 < c)) {
100
+ throw new RangeError('Invalid range for RGB colors');
101
+ }
102
+ } else if (n === 5 && numbers.length >= 1) {
103
+ // 256 colors
104
+ const idx = numbers.shift();
105
+ if (idx < 0) {
106
+ throw new RangeError('Color index must be >= 0');
107
+ } else if (idx < 16) {
108
+ // 16 default terminal colors
109
+ return idx;
110
+ } else if (idx < 232) {
111
+ // 6x6x6 color cube, see https://stackoverflow.com/a/27165165/500098
112
+ r = Math.floor((idx - 16) / 36);
113
+ r = r > 0 ? 55 + r * 40 : 0;
114
+ g = Math.floor(((idx - 16) % 36) / 6);
115
+ g = g > 0 ? 55 + g * 40 : 0;
116
+ b = (idx - 16) % 6;
117
+ b = b > 0 ? 55 + b * 40 : 0;
118
+ } else if (idx < 256) {
119
+ // grayscale, see https://stackoverflow.com/a/27165165/500098
120
+ r = g = b = (idx - 232) * 10 + 8;
121
+ } else {
122
+ throw new RangeError('Color index must be < 256');
123
+ }
124
+ } else {
125
+ throw new RangeError('Invalid extended color specification');
126
+ }
127
+ return [r, g, b];
128
+ }
129
+
130
+ /**
131
+ * Transform ANSI color escape codes into HTML <span> tags with CSS
132
+ * classes such as "ansi-green-intense-fg".
133
+ * The actual colors used are set in the CSS file.
134
+ * This also removes non-color escape sequences.
135
+ * This is supposed to have the same behavior as nbconvert.filters.ansi2html()
136
+ */
137
+ function ansiSpan(str) {
138
+ const ansiRe = /\x1b\[(.*?)([@-~])/g; // eslint-disable-line no-control-regex
139
+ let fg = [];
140
+ let bg = [];
141
+ let bold = false;
142
+ let underline = false;
143
+ let inverse = false;
144
+ let match;
145
+ const out = [];
146
+ const numbers = [];
147
+ let start = 0;
148
+
149
+ //str = _.escape(str);
150
+
151
+ str += '\x1b[m'; // Ensure markup for trailing text
152
+ // tslint:disable-next-line
153
+ while ((match = ansiRe.exec(str))) {
154
+ if (match[2] === 'm') {
155
+ const items = match[1].split(';');
156
+ for (let i = 0; i < items.length; i++) {
157
+ const item = items[i];
158
+ if (item === '') {
159
+ numbers.push(0);
160
+ } else if (item.search(/^\d+$/) !== -1) {
161
+ numbers.push(parseInt(item, 10));
162
+ } else {
163
+ // Ignored: Invalid color specification
164
+ numbers.length = 0;
165
+ break;
166
+ }
167
+ }
168
+ } else {
169
+ // Ignored: Not a color code
170
+ }
171
+ const chunk = str.substring(start, match.index);
172
+ pushColoredChunk(chunk, fg, bg, bold, underline, inverse, out);
173
+ start = ansiRe.lastIndex;
174
+
175
+ while (numbers.length) {
176
+ const n = numbers.shift();
177
+ switch (n) {
178
+ case 0:
179
+ fg = bg = [];
180
+ bold = false;
181
+ underline = false;
182
+ inverse = false;
183
+ break;
184
+ case 1:
185
+ case 5:
186
+ bold = true;
187
+ break;
188
+ case 4:
189
+ underline = true;
190
+ break;
191
+ case 7:
192
+ inverse = true;
193
+ break;
194
+ case 21:
195
+ case 22:
196
+ bold = false;
197
+ break;
198
+ case 24:
199
+ underline = false;
200
+ break;
201
+ case 27:
202
+ inverse = false;
203
+ break;
204
+ case 30:
205
+ case 31:
206
+ case 32:
207
+ case 33:
208
+ case 34:
209
+ case 35:
210
+ case 36:
211
+ case 37:
212
+ fg = n - 30;
213
+ break;
214
+ case 38:
215
+ try {
216
+ fg = getExtendedColors(numbers);
217
+ } catch (e) {
218
+ numbers.length = 0;
219
+ }
220
+ break;
221
+ case 39:
222
+ fg = [];
223
+ break;
224
+ case 40:
225
+ case 41:
226
+ case 42:
227
+ case 43:
228
+ case 44:
229
+ case 45:
230
+ case 46:
231
+ case 47:
232
+ bg = n - 40;
233
+ break;
234
+ case 48:
235
+ try {
236
+ bg = getExtendedColors(numbers);
237
+ } catch (e) {
238
+ numbers.length = 0;
239
+ }
240
+ break;
241
+ case 49:
242
+ bg = [];
243
+ break;
244
+ case 90:
245
+ case 91:
246
+ case 92:
247
+ case 93:
248
+ case 94:
249
+ case 95:
250
+ case 96:
251
+ case 97:
252
+ fg = n - 90 + 8;
253
+ break;
254
+ case 100:
255
+ case 101:
256
+ case 102:
257
+ case 103:
258
+ case 104:
259
+ case 105:
260
+ case 106:
261
+ case 107:
262
+ bg = n - 100 + 8;
263
+ break;
264
+ default:
265
+ // Unknown codes are ignored
266
+ }
267
+ }
268
+ }
269
+ return out.join('');
270
+ }
@@ -0,0 +1,82 @@
1
+ /* generated using: pygmentize -S vs -f html -S one-dark -a ".theme--dark.v-application .highlight" >! solara/server/static/highlight-dark.css
2
+ and then remove the overlapping first lines with highlight.css
3
+ */
4
+ .theme--dark.v-application .highlight .hll { background-color: #ffffcc }
5
+ .theme--dark.v-application .highlight { background: #1d1f22; color: #ABB2BF }
6
+ .theme--dark.v-application .highlight .c { color: #7F848E } /* Comment */
7
+ .theme--dark.v-application .highlight .err { color: #ABB2BF } /* Error */
8
+ .theme--dark.v-application .highlight .esc { color: #ABB2BF } /* Escape */
9
+ .theme--dark.v-application .highlight .g { color: #ABB2BF } /* Generic */
10
+ .theme--dark.v-application .highlight .k { color: #C678DD } /* Keyword */
11
+ .theme--dark.v-application .highlight .l { color: #ABB2BF } /* Literal */
12
+ .theme--dark.v-application .highlight .n { color: #E06C75 } /* Name */
13
+ .theme--dark.v-application .highlight .o { color: #56B6C2 } /* Operator */
14
+ .theme--dark.v-application .highlight .x { color: #ABB2BF } /* Other */
15
+ .theme--dark.v-application .highlight .p { color: #ABB2BF } /* Punctuation */
16
+ .theme--dark.v-application .highlight .ch { color: #7F848E } /* Comment.Hashbang */
17
+ .theme--dark.v-application .highlight .cm { color: #7F848E } /* Comment.Multiline */
18
+ .theme--dark.v-application .highlight .cp { color: #7F848E } /* Comment.Preproc */
19
+ .theme--dark.v-application .highlight .cpf { color: #7F848E } /* Comment.PreprocFile */
20
+ .theme--dark.v-application .highlight .c1 { color: #7F848E } /* Comment.Single */
21
+ .theme--dark.v-application .highlight .cs { color: #7F848E } /* Comment.Special */
22
+ .theme--dark.v-application .highlight .gd { color: #ABB2BF } /* Generic.Deleted */
23
+ .theme--dark.v-application .highlight .ge { color: #ABB2BF } /* Generic.Emph */
24
+ .theme--dark.v-application .highlight .gr { color: #ABB2BF } /* Generic.Error */
25
+ .theme--dark.v-application .highlight .gh { color: #ABB2BF } /* Generic.Heading */
26
+ .theme--dark.v-application .highlight .gi { color: #ABB2BF } /* Generic.Inserted */
27
+ .theme--dark.v-application .highlight .go { color: #ABB2BF } /* Generic.Output */
28
+ .theme--dark.v-application .highlight .gp { color: #ABB2BF } /* Generic.Prompt */
29
+ .theme--dark.v-application .highlight .gs { color: #ABB2BF } /* Generic.Strong */
30
+ .theme--dark.v-application .highlight .gu { color: #ABB2BF } /* Generic.Subheading */
31
+ .theme--dark.v-application .highlight .gt { color: #ABB2BF } /* Generic.Traceback */
32
+ .theme--dark.v-application .highlight .kc { color: #E5C07B } /* Keyword.Constant */
33
+ .theme--dark.v-application .highlight .kd { color: #C678DD } /* Keyword.Declaration */
34
+ .theme--dark.v-application .highlight .kn { color: #C678DD } /* Keyword.Namespace */
35
+ .theme--dark.v-application .highlight .kp { color: #C678DD } /* Keyword.Pseudo */
36
+ .theme--dark.v-application .highlight .kr { color: #C678DD } /* Keyword.Reserved */
37
+ .theme--dark.v-application .highlight .kt { color: #E5C07B } /* Keyword.Type */
38
+ .theme--dark.v-application .highlight .ld { color: #ABB2BF } /* Literal.Date */
39
+ .theme--dark.v-application .highlight .m { color: #D19A66 } /* Literal.Number */
40
+ .theme--dark.v-application .highlight .s { color: #98C379 } /* Literal.String */
41
+ .theme--dark.v-application .highlight .na { color: #E06C75 } /* Name.Attribute */
42
+ .theme--dark.v-application .highlight .nb { color: #E5C07B } /* Name.Builtin */
43
+ .theme--dark.v-application .highlight .nc { color: #E5C07B } /* Name.Class */
44
+ .theme--dark.v-application .highlight .no { color: #E06C75 } /* Name.Constant */
45
+ .theme--dark.v-application .highlight .nd { color: #61AFEF } /* Name.Decorator */
46
+ .theme--dark.v-application .highlight .ni { color: #E06C75 } /* Name.Entity */
47
+ .theme--dark.v-application .highlight .ne { color: #E06C75 } /* Name.Exception */
48
+ .theme--dark.v-application .highlight .nf { color: #61AFEF; font-weight: bold } /* Name.Function */
49
+ .theme--dark.v-application .highlight .nl { color: #E06C75 } /* Name.Label */
50
+ .theme--dark.v-application .highlight .nn { color: #E06C75 } /* Name.Namespace */
51
+ .theme--dark.v-application .highlight .nx { color: #E06C75 } /* Name.Other */
52
+ .theme--dark.v-application .highlight .py { color: #E06C75 } /* Name.Property */
53
+ .theme--dark.v-application .highlight .nt { color: #E06C75 } /* Name.Tag */
54
+ .theme--dark.v-application .highlight .nv { color: #E06C75 } /* Name.Variable */
55
+ .theme--dark.v-application .highlight .ow { color: #56B6C2 } /* Operator.Word */
56
+ .theme--dark.v-application .highlight .p-Marker { color: #ABB2BF } /* Punctuation.Marker */
57
+ .theme--dark.v-application .highlight .w { color: #ABB2BF } /* Text.Whitespace */
58
+ .theme--dark.v-application .highlight .mb { color: #D19A66 } /* Literal.Number.Bin */
59
+ .theme--dark.v-application .highlight .mf { color: #D19A66 } /* Literal.Number.Float */
60
+ .theme--dark.v-application .highlight .mh { color: #D19A66 } /* Literal.Number.Hex */
61
+ .theme--dark.v-application .highlight .mi { color: #D19A66 } /* Literal.Number.Integer */
62
+ .theme--dark.v-application .highlight .mo { color: #D19A66 } /* Literal.Number.Oct */
63
+ .theme--dark.v-application .highlight .sa { color: #98C379 } /* Literal.String.Affix */
64
+ .theme--dark.v-application .highlight .sb { color: #98C379 } /* Literal.String.Backtick */
65
+ .theme--dark.v-application .highlight .sc { color: #98C379 } /* Literal.String.Char */
66
+ .theme--dark.v-application .highlight .dl { color: #98C379 } /* Literal.String.Delimiter */
67
+ .theme--dark.v-application .highlight .sd { color: #98C379 } /* Literal.String.Doc */
68
+ .theme--dark.v-application .highlight .s2 { color: #98C379 } /* Literal.String.Double */
69
+ .theme--dark.v-application .highlight .se { color: #98C379 } /* Literal.String.Escape */
70
+ .theme--dark.v-application .highlight .sh { color: #98C379 } /* Literal.String.Heredoc */
71
+ .theme--dark.v-application .highlight .si { color: #98C379 } /* Literal.String.Interpol */
72
+ .theme--dark.v-application .highlight .sx { color: #98C379 } /* Literal.String.Other */
73
+ .theme--dark.v-application .highlight .sr { color: #98C379 } /* Literal.String.Regex */
74
+ .theme--dark.v-application .highlight .s1 { color: #98C379 } /* Literal.String.Single */
75
+ .theme--dark.v-application .highlight .ss { color: #98C379 } /* Literal.String.Symbol */
76
+ .theme--dark.v-application .highlight .bp { color: #E5C07B } /* Name.Builtin.Pseudo */
77
+ .theme--dark.v-application .highlight .fm { color: #56B6C2; font-weight: bold } /* Name.Function.Magic */
78
+ .theme--dark.v-application .highlight .vc { color: #E06C75 } /* Name.Variable.Class */
79
+ .theme--dark.v-application .highlight .vg { color: #E06C75 } /* Name.Variable.Global */
80
+ .theme--dark.v-application .highlight .vi { color: #E06C75 } /* Name.Variable.Instance */
81
+ .theme--dark.v-application .highlight .vm { color: #E06C75 } /* Name.Variable.Magic */
82
+ .theme--dark.v-application .highlight .il { color: #D19A66 } /* Literal.Number.Integer.Long */
@@ -0,0 +1,43 @@
1
+ pre { line-height: 125%; }
2
+ td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
3
+ span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
4
+ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
5
+ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
6
+ .highlight .hll { background-color: #ffffcc }
7
+ .highlight { background: rgb(249 249 249); }
8
+ .highlight .c { color: #008000 } /* Comment */
9
+ .highlight .err { border: 1px solid #FF0000 } /* Error */
10
+ .highlight .k { color: #0000ff } /* Keyword */
11
+ .highlight .ch { color: #008000 } /* Comment.Hashbang */
12
+ .highlight .cm { color: #008000 } /* Comment.Multiline */
13
+ .highlight .cp { color: #0000ff } /* Comment.Preproc */
14
+ .highlight .cpf { color: #008000 } /* Comment.PreprocFile */
15
+ .highlight .c1 { color: #008000 } /* Comment.Single */
16
+ .highlight .cs { color: #008000 } /* Comment.Special */
17
+ .highlight .ge { font-style: italic } /* Generic.Emph */
18
+ .highlight .gh { font-weight: bold } /* Generic.Heading */
19
+ .highlight .gp { font-weight: bold } /* Generic.Prompt */
20
+ .highlight .gs { font-weight: bold } /* Generic.Strong */
21
+ .highlight .gu { font-weight: bold } /* Generic.Subheading */
22
+ .highlight .kc { color: #0000ff } /* Keyword.Constant */
23
+ .highlight .kd { color: #0000ff } /* Keyword.Declaration */
24
+ .highlight .kn { color: #0000ff } /* Keyword.Namespace */
25
+ .highlight .kp { color: #0000ff } /* Keyword.Pseudo */
26
+ .highlight .kr { color: #0000ff } /* Keyword.Reserved */
27
+ .highlight .kt { color: #2b91af } /* Keyword.Type */
28
+ .highlight .s { color: #a31515 } /* Literal.String */
29
+ .highlight .nc { color: #2b91af } /* Name.Class */
30
+ .highlight .ow { color: #0000ff } /* Operator.Word */
31
+ .highlight .sa { color: #a31515 } /* Literal.String.Affix */
32
+ .highlight .sb { color: #a31515 } /* Literal.String.Backtick */
33
+ .highlight .sc { color: #a31515 } /* Literal.String.Char */
34
+ .highlight .dl { color: #a31515 } /* Literal.String.Delimiter */
35
+ .highlight .sd { color: #a31515 } /* Literal.String.Doc */
36
+ .highlight .s2 { color: #a31515 } /* Literal.String.Double */
37
+ .highlight .se { color: #a31515 } /* Literal.String.Escape */
38
+ .highlight .sh { color: #a31515 } /* Literal.String.Heredoc */
39
+ .highlight .si { color: #a31515 } /* Literal.String.Interpol */
40
+ .highlight .sx { color: #a31515 } /* Literal.String.Other */
41
+ .highlight .sr { color: #a31515 } /* Literal.String.Regex */
42
+ .highlight .s1 { color: #a31515 } /* Literal.String.Single */
43
+ .highlight .ss { color: #a31515 } /* Literal.String.Symbol */
@@ -0,0 +1,272 @@
1
+
2
+ var jupyterWidgetMountPoint = {
3
+ data() {
4
+ return {
5
+ renderFn: undefined,
6
+ elem: undefined,
7
+ }
8
+ },
9
+ props: ['mount-id'],
10
+ created() {
11
+ requestWidget(this.mountId);
12
+ },
13
+ mounted() {
14
+ const vue3 = Vue.version.startsWith('3');
15
+ requestWidget(this.mountId)
16
+ .then(widgetView => {
17
+ if (['VuetifyView', 'VuetifyTemplateView'].includes(widgetView.model.get('_view_name'))) {
18
+ this.renderFn = createElement => widgetView.vueRender(createElement);
19
+ } else {
20
+ while (this.$el.firstChild) {
21
+ this.$el.removeChild(this.$el.firstChild);
22
+ }
23
+
24
+ requirejs(['@jupyter-widgets/base'], widgets =>
25
+ widgets.JupyterPhosphorWidget.attach(widgetView.pWidget, this.$el)
26
+ );
27
+ }
28
+ }
29
+ );
30
+ },
31
+ render(createElement) {
32
+ // in vue3 we have Vue.h, otherwise fall back to createElement (vue2)
33
+ let h = Vue.h || createElement;
34
+ if (this.renderFn) {
35
+ /* workaround for v-menu click */
36
+ if (!this.elem) {
37
+ this.elem = this.renderFn(createElement);
38
+ }
39
+ return this.elem;
40
+ }
41
+ return h('div', this.$slots.default ||
42
+ [h('v-chip', `[${this.mountId}]`)]);
43
+ }
44
+ };
45
+
46
+ const widgetResolveFns = {};
47
+ const widgetPromises = {};
48
+
49
+ function provideWidget(mountId, widgetView) {
50
+ if (widgetResolveFns[mountId]) {
51
+ widgetResolveFns[mountId](widgetView);
52
+ } else {
53
+ widgetPromises[mountId] = Promise.resolve(widgetView);
54
+ }
55
+ }
56
+
57
+ function requestWidget(mountId) {
58
+ if (!widgetPromises[mountId]) {
59
+ widgetPromises[mountId] = new Promise(resolve => widgetResolveFns[mountId] = resolve);
60
+ }
61
+ return widgetPromises[mountId];
62
+ }
63
+
64
+ function injectDebugMessageInterceptor(kernel) {
65
+ const _original_handle_message = kernel._handleMessage.bind(kernel)
66
+ kernel._handleMessage = ((msg) => {
67
+ if (msg.msg_type === 'error') {
68
+ app.$data.solaraDebugMessages.push({
69
+ cell: '_',
70
+ traceback: msg.content.traceback.map(line => ansiSpan(_.escape(line)))
71
+ });
72
+ } else if (msg.msg_type === 'stream' && (msg.content['name'] === 'stdout' || msg.content['name'] === 'stderr')) {
73
+ app.$data.solaraDebugMessages.push({
74
+ cell: '_',
75
+ name: msg.content.name,
76
+ text: msg.content.text
77
+ });
78
+ }
79
+ return _original_handle_message(msg);
80
+ })
81
+ }
82
+
83
+
84
+ function getCookiesMap(cookiesString) {
85
+ return cookiesString.split(";")
86
+ .map(function (cookieString) {
87
+ return cookieString.trim().split("=");
88
+ })
89
+ .reduce(function (acc, curr) {
90
+ acc[curr[0]] = curr[1];
91
+ return acc;
92
+ }, {});
93
+ }
94
+ const COOKIE_KEY_CONTEXT_ID = 'solara-session-id'
95
+
96
+
97
+ // from https://gist.github.com/outbreak/316637cde245160c2579898b21837c1c
98
+ function generateUuid() {
99
+ function getRandomSymbol(symbol) {
100
+ var array;
101
+
102
+ if (symbol === 'y') {
103
+ array = ['8', '9', 'a', 'b'];
104
+ return array[Math.floor(Math.random() * array.length)];
105
+ }
106
+
107
+ array = new Uint8Array(1);
108
+ window.crypto.getRandomValues(array);
109
+ return (array[0] % 16).toString(16);
110
+ }
111
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, getRandomSymbol);
112
+ }
113
+
114
+ async function solaraInit(mountId, appName) {
115
+ console.log('solara init', mountId, appName);
116
+ define("vue", [], () => Vue);
117
+ define("vuetify", [], () => Vuetify);
118
+ cookies = getCookiesMap(document.cookie);
119
+ const searchParams = new URLSearchParams(window.location.search);
120
+ let kernelId = searchParams.get('kernelid') || generateUuid()
121
+ let unloading = false;
122
+ window.addEventListener('beforeunload', function (e) {
123
+ unloading = true;
124
+ kernel.dispose()
125
+ // allow to opt-out to make testing easier
126
+ if (!searchParams.has('solara-no-close-beacon')) {
127
+ window.navigator.sendBeacon(close_url);
128
+ }
129
+ });
130
+ let kernel = await solara.connectKernel(solara.jupyterRootPath, kernelId)
131
+ if (!kernel) {
132
+ return;
133
+ }
134
+ const close_url = `${solara.rootPath}/_solara/api/close/${kernelId}?session_id=${kernel.clientId}`;
135
+ let skipReconnectedCheck = true;
136
+ kernel.statusChanged.connect(() => {
137
+ app.$data.kernelBusy = kernel.status == 'busy';
138
+ });
139
+
140
+ window.addEventListener('solara.router', function (event) {
141
+ app.$data.urlHasChanged = true;
142
+ if(kernel.status == 'busy') {
143
+ app.$data.loadingPage = true;
144
+ }
145
+ });
146
+ kernel.statusChanged.connect(() => {
147
+ // When navigation is triggered from the front-end, kernel.status becoming busy and
148
+ // solara.router event happen in a different order than when navigating through Python, so
149
+ // if the URL has changed when the kernel becomes busy, we set loadingPage to true
150
+ if (kernel.status == 'busy' && app.$data.urlHasChanged) {
151
+ app.$data.loadingPage = true;
152
+ }
153
+ // the first idle after a loadingPage == true (a router event)
154
+ // will be used as indicator that the page is loaded
155
+ if (app.$data.loadingPage && kernel.status == 'idle') {
156
+ app.$data.loadingPage = false;
157
+ app.$data.urlHasChanged = false;
158
+ const event = new Event('solara.pageReady');
159
+ window.dispatchEvent(event);
160
+ }
161
+ });
162
+
163
+
164
+ kernel.connectionStatusChanged.connect((s) => {
165
+ if (unloading) {
166
+ // we don't want to show ui changes when hitting refresh
167
+ return;
168
+ }
169
+ app.$data.connectionStatus = s.connectionStatus;
170
+ if (s.connectionStatus == 'connected') {
171
+ app.$data.wasConnected = true;
172
+ }
173
+ if (s.connectionStatus == 'connected' && !skipReconnectedCheck) {
174
+ (async () => {
175
+ if (app.$data.needsRefresh) {
176
+ // give up
177
+ return;
178
+ }
179
+ // if we are reconnected, we expected the app to be in a started
180
+ // state. If it is not started, we will shutdown the kernel and
181
+ // Recommend to refresh the page. This situation can happen if
182
+ // we reconnect to a different node/worker, or when the server
183
+ // was restarted.
184
+ const status = await widgetManager.appStatus()
185
+ if (!status.started) {
186
+ app.$data.needsRefresh = true;
187
+ await solara.shutdownKernel(kernel);
188
+ } else {
189
+ await widgetManager.fetchAll();
190
+ }
191
+ })();
192
+ }
193
+ })
194
+ const context = {
195
+ sessionContext: {
196
+ session: {
197
+ kernel,
198
+ kernelChanged: {
199
+ connect: () => {
200
+ }
201
+ },
202
+ },
203
+ statusChanged: {
204
+ connect: () => {
205
+ }
206
+ },
207
+ kernelChanged: {
208
+ connect: () => {
209
+ }
210
+ },
211
+ connectionStatusChanged: {
212
+ connect: (s) => {
213
+ }
214
+ },
215
+ },
216
+ saveState: {
217
+ connect: () => {
218
+ }
219
+ },
220
+ };
221
+
222
+ const settings = {
223
+ saveState: false
224
+ };
225
+
226
+ // override the latexTypesetter to use katex, in case there are any libraries that
227
+ // make use of that.
228
+ const rendermime = new solara.RenderMimeRegistry({
229
+ initialFactories: solara.extendedRendererFactories,
230
+ latexTypesetter: new solara.KatexTypesetter(),
231
+ });
232
+
233
+ let widgetManager = new solara.WidgetManager(context, rendermime, settings);
234
+ // it seems if we attach this to early, it will not be called
235
+ app.$data.loading_text = 'Loading app';
236
+ const path = window.location.pathname.slice(solara.rootPath.length) + window.location.search;
237
+ let widgetModelId = searchParams.get('modelid');
238
+ // if kernelid and modelid are given as query parameters, we will use them
239
+ // instead of running the current solara app. This allows usage such as
240
+ // ipypopout, which reconnects to an existing kernel and shows a particular
241
+ // widget.
242
+ if (kernelId && widgetModelId) {
243
+ await widgetManager.fetchAll();
244
+ } else {
245
+ widgetModelId = await widgetManager.run(appName, {path, dark: inDarkMode(), themes: vuetifyThemes});
246
+ }
247
+ await solaraMount(widgetManager, mountId || 'content', widgetModelId);
248
+ skipReconnectedCheck = false;
249
+ solara.renderKatex();
250
+ }
251
+
252
+ async function solaraMount(widgetManager, mountId, modelId) {
253
+ console.log(`will mount widget with id ${modelId} at mount id ${mountId}`)
254
+
255
+ async function init() {
256
+ await Promise.all(Object.values(widgetManager._models).map(async (modelPromise) => {
257
+ const model = await modelPromise;
258
+ if (model.model_id == modelId) {
259
+ const view = await widgetManager.create_view(model);
260
+ provideWidget(mountId, view);
261
+ }
262
+ }));
263
+ app.$data.loadingPercentage = 0;
264
+ app.$data.loading_text = 'Done';
265
+ app.$data.loading = false;
266
+ }
267
+ if (document.readyState === 'complete') {
268
+ init()
269
+ } else {
270
+ window.addEventListener('load', init);
271
+ }
272
+ }