pycafe-server 0.0.7__tar.gz

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 (330) hide show
  1. pycafe_server-0.0.7/.bumpversion.cfg +13 -0
  2. pycafe_server-0.0.7/.gitignore +53 -0
  3. pycafe_server-0.0.7/DEVELOPMENT.md +34 -0
  4. pycafe_server-0.0.7/LICENSE.txt +9 -0
  5. pycafe_server-0.0.7/PKG-INFO +60 -0
  6. pycafe_server-0.0.7/README.md +21 -0
  7. pycafe_server-0.0.7/pycafe-private/.eslintrc.json +3 -0
  8. pycafe_server-0.0.7/pycafe-private/.gitignore +36 -0
  9. pycafe_server-0.0.7/pycafe-private/README.md +36 -0
  10. pycafe_server-0.0.7/pycafe-private/app/admin/page.tsx +88 -0
  11. pycafe_server-0.0.7/pycafe-private/app/favicon.ico +0 -0
  12. pycafe_server-0.0.7/pycafe-private/app/fonts/GeistMonoVF.woff +0 -0
  13. pycafe_server-0.0.7/pycafe-private/app/fonts/GeistVF.woff +0 -0
  14. pycafe_server-0.0.7/pycafe-private/app/layout.tsx +32 -0
  15. pycafe_server-0.0.7/pycafe-private/app/page.module.css +168 -0
  16. pycafe_server-0.0.7/pycafe-private/app/page.tsx +86 -0
  17. pycafe_server-0.0.7/pycafe-private/app/sign-in/page.tsx +13 -0
  18. pycafe_server-0.0.7/pycafe-private/app/snippet/[type]/[version]/page.tsx +45 -0
  19. pycafe_server-0.0.7/pycafe-private/app/snippet/[type]/[version]/wrapper.tsx +20 -0
  20. pycafe_server-0.0.7/pycafe-private/app/view/page.tsx +1 -0
  21. pycafe_server-0.0.7/pycafe-private/next.config.mjs +39 -0
  22. pycafe_server-0.0.7/pycafe-private/package-lock.json +5497 -0
  23. pycafe_server-0.0.7/pycafe-private/package.json +44 -0
  24. pycafe_server-0.0.7/pycafe-private/public/app.py +102 -0
  25. pycafe_server-0.0.7/pycafe-private/public/backgrounds/image16.svg +9 -0
  26. pycafe_server-0.0.7/pycafe-private/public/backgrounds/image17.svg +9 -0
  27. pycafe_server-0.0.7/pycafe-private/public/backgrounds/image18.svg +9 -0
  28. pycafe_server-0.0.7/pycafe-private/public/badge.svg +1 -0
  29. pycafe_server-0.0.7/pycafe-private/public/bootstrap_jupyter_kernel.py +52 -0
  30. pycafe_server-0.0.7/pycafe-private/public/coffeecup.gif +0 -0
  31. pycafe_server-0.0.7/pycafe-private/public/dash_daq-0.5.0-py3-none-any.whl +0 -0
  32. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-app.webp +0 -0
  33. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-open.webp +0 -0
  34. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-preview.webp +0 -0
  35. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-share-app.webp +0 -0
  36. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-share-embed.webp +0 -0
  37. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-share.webp +0 -0
  38. pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-upload.webp +0 -0
  39. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-app.webp +0 -0
  40. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-open.webp +0 -0
  41. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-preview.webp +0 -0
  42. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-share-app.webp +0 -0
  43. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-share-embed.webp +0 -0
  44. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-share.webp +0 -0
  45. pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-upload.webp +0 -0
  46. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-app.webp +0 -0
  47. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-open.webp +0 -0
  48. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-preview.webp +0 -0
  49. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-share-app.webp +0 -0
  50. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-share-embed.webp +0 -0
  51. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-share.webp +0 -0
  52. pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-upload.webp +0 -0
  53. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-app.webp +0 -0
  54. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-open.webp +0 -0
  55. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-preview.webp +0 -0
  56. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-share-app.webp +0 -0
  57. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-share-embed.webp +0 -0
  58. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-share.webp +0 -0
  59. pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-upload.webp +0 -0
  60. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-app.webp +0 -0
  61. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-open.webp +0 -0
  62. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-preview.webp +0 -0
  63. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-share-app.webp +0 -0
  64. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-share-embed.webp +0 -0
  65. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-share.webp +0 -0
  66. pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-upload.webp +0 -0
  67. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-app.webp +0 -0
  68. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-open.webp +0 -0
  69. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-preview.webp +0 -0
  70. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-share-app.webp +0 -0
  71. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-share-embed.webp +0 -0
  72. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-share.webp +0 -0
  73. pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-upload.webp +0 -0
  74. pycafe_server-0.0.7/pycafe-private/public/docs/ipyreact-status.webp +0 -0
  75. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-enter-value.webp +0 -0
  76. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-manager.webp +0 -0
  77. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-printed.webp +0 -0
  78. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-prompt-with-reason.webp +0 -0
  79. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-prompt.webp +0 -0
  80. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-with-reason-enter-value.webp +0 -0
  81. pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-with-reason-printed.webp +0 -0
  82. pycafe_server-0.0.7/pycafe-private/public/docs/vizro-ci.webp +0 -0
  83. pycafe_server-0.0.7/pycafe-private/public/fs-worker.js +2 -0
  84. pycafe_server-0.0.7/pycafe-private/public/fs-worker.js.LICENSE.txt +12 -0
  85. pycafe_server-0.0.7/pycafe-private/public/google_crc32c-1.5.0-py3-none-any.whl +0 -0
  86. pycafe_server-0.0.7/pycafe-private/public/icons/discord.svg +1 -0
  87. pycafe_server-0.0.7/pycafe-private/public/icons/folder.svg +1 -0
  88. pycafe_server-0.0.7/pycafe-private/public/icons/terminal.svg +1 -0
  89. pycafe_server-0.0.7/pycafe-private/public/ipykernel-6.9.2-py3-none-any.whl +0 -0
  90. pycafe_server-0.0.7/pycafe-private/public/jupyterlite_pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
  91. pycafe_server-0.0.7/pycafe-private/public/logo.png +0 -0
  92. pycafe_server-0.0.7/pycafe-private/public/logos/gradio_logo_full.svg +20 -0
  93. pycafe_server-0.0.7/pycafe-private/public/logos/gradio_logo_full_dark.svg +23 -0
  94. pycafe_server-0.0.7/pycafe-private/public/logos/panel_logo.png +0 -0
  95. pycafe_server-0.0.7/pycafe-private/public/logos/panel_logo_full.png +0 -0
  96. pycafe_server-0.0.7/pycafe-private/public/logos/panel_logo_full_dark.png +0 -0
  97. pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo.png +0 -0
  98. pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo_full.png +0 -0
  99. pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo_full_white.png +0 -0
  100. pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo_white.png +0 -0
  101. pycafe_server-0.0.7/pycafe-private/public/logos/pycafe_logo.png +0 -0
  102. pycafe_server-0.0.7/pycafe-private/public/logos/python.svg +265 -0
  103. pycafe_server-0.0.7/pycafe-private/public/logos/shiny_logo.png +0 -0
  104. pycafe_server-0.0.7/pycafe-private/public/logos/shiny_logo_full.svg +80 -0
  105. pycafe_server-0.0.7/pycafe-private/public/logos/shiny_logo_full_white.svg +80 -0
  106. pycafe_server-0.0.7/pycafe-private/public/logos/solara_logo.svg +8 -0
  107. pycafe_server-0.0.7/pycafe-private/public/logos/streamlit_logo.png +0 -0
  108. pycafe_server-0.0.7/pycafe-private/public/logos/streamlit_logo_full.svg +6 -0
  109. pycafe_server-0.0.7/pycafe-private/public/logos/streamlit_logo_full_white.svg +6 -0
  110. pycafe_server-0.0.7/pycafe-private/public/logos/vizro_logo.svg +3 -0
  111. pycafe_server-0.0.7/pycafe-private/public/logos/vizro_logo_full.svg +9 -0
  112. pycafe_server-0.0.7/pycafe-private/public/logos/vizro_logo_full_white.svg +9 -0
  113. pycafe_server-0.0.7/pycafe-private/public/next.svg +1 -0
  114. pycafe_server-0.0.7/pycafe-private/public/pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
  115. pycafe_server-0.0.7/pycafe-private/public/pyperclip-1.8.2-py3-none-any.whl +0 -0
  116. pycafe_server-0.0.7/pycafe-private/public/qr_buy_eu.png +0 -0
  117. pycafe_server-0.0.7/pycafe-private/public/qr_buy_us.png +0 -0
  118. pycafe_server-0.0.7/pycafe-private/public/requirements.txt +16 -0
  119. pycafe_server-0.0.7/pycafe-private/public/service-worker.js +1 -0
  120. pycafe_server-0.0.7/pycafe-private/public/test_dash.py +59 -0
  121. pycafe_server-0.0.7/pycafe-private/public/test_ipykernel.py +40 -0
  122. pycafe_server-0.0.7/pycafe-private/public/test_jupyterlab.py +51 -0
  123. pycafe_server-0.0.7/pycafe-private/public/test_solara.py +77 -0
  124. pycafe_server-0.0.7/pycafe-private/public/test_starlette.py +65 -0
  125. pycafe_server-0.0.7/pycafe-private/public/test_streamlit.py +31 -0
  126. pycafe_server-0.0.7/pycafe-private/public/test_tornado.py +94 -0
  127. pycafe_server-0.0.7/pycafe-private/public/tor.py +18 -0
  128. pycafe_server-0.0.7/pycafe-private/public/tornado-6.4.2-py3-none-any.whl +0 -0
  129. pycafe_server-0.0.7/pycafe-private/public/vercel.svg +1 -0
  130. pycafe_server-0.0.7/pycafe-private/public/webworker.js +2 -0
  131. pycafe_server-0.0.7/pycafe-private/public/webworker.js.LICENSE.txt +5 -0
  132. pycafe_server-0.0.7/pycafe-private/tsconfig.json +29 -0
  133. pycafe_server-0.0.7/pyproject.toml +45 -0
  134. pycafe_server-0.0.7/release.md +24 -0
  135. pycafe_server-0.0.7/release.sh +7 -0
  136. pycafe_server-0.0.7/src/pycafe_server/__about__.py +4 -0
  137. pycafe_server-0.0.7/src/pycafe_server/__init__.py +3 -0
  138. pycafe_server-0.0.7/src/pycafe_server/asgi.py +345 -0
  139. pycafe_server-0.0.7/src/pycafe_server/auth.py +311 -0
  140. pycafe_server-0.0.7/src/pycafe_server/config.py +172 -0
  141. pycafe_server-0.0.7/src/pycafe_server/cookie.py +73 -0
  142. pycafe_server-0.0.7/src/pycafe_server/database.py +174 -0
  143. pycafe_server-0.0.7/src/pycafe_server/license.py +99 -0
  144. pycafe_server-0.0.7/src/pycafe_server/session.py +56 -0
  145. pycafe_server-0.0.7/src/pycafe_server/sign.py +14 -0
  146. pycafe_server-0.0.7/src/pycafe_server/static/404.html +1 -0
  147. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/-dsYd_IR6KZ1xCK1JGQIe/_buildManifest.js +1 -0
  148. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/-dsYd_IR6KZ1xCK1JGQIe/_ssgManifest.js +1 -0
  149. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/117-2d310aa1d3fedd11.js +2 -0
  150. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/144-86024bdc2248d212.js +1 -0
  151. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/250-778b8977023babac.js +1 -0
  152. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/36-fbf60547c50ddd6d.js +1 -0
  153. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/484.3e91a8877443b77f.js +1 -0
  154. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/684-92effdd3a90cbd04.js +2 -0
  155. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/686-7260ec324cabf91a.js +1 -0
  156. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/70-70f8b9c8e8b73c0d.js +1 -0
  157. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/83-e3a2a619fdeb083b.js +1 -0
  158. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/92-69451410f0d6b437.js +1 -0
  159. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/921-9ecc230270e58d5f.js +1 -0
  160. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/aaea2bcf-debd16af2e1ee8d8.js +1 -0
  161. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/_not-found/page-320d5b624e913067.js +1 -0
  162. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/admin/page-ad0c1dd3957e012a.js +1 -0
  163. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/layout-182dee2a35e31a08.js +1 -0
  164. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/page-a5c474768bb5f2e2.js +1 -0
  165. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/sign-in/page-4f90785e5fc83287.js +1 -0
  166. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/snippet/[type]/[version]/page-fb30ffc54630e8fd.js +1 -0
  167. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/view/page-e53355c1ed692ec4.js +1 -0
  168. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/bc0697a0-9b4145a23a803cb0.js +3 -0
  169. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/d8465030-fe21b9c8223e3143.js +1 -0
  170. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/fd9d1056-ad5bbc8af4b8126c.js +1 -0
  171. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/framework-00a8ba1a63cfdc9e.js +1 -0
  172. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/main-830d03220a87b2cf.js +1 -0
  173. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/main-app-fec1dc80d88c979a.js +1 -0
  174. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/pages/_app-15e2daefa259f0b5.js +1 -0
  175. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/pages/_error-28b803cb2479b966.js +1 -0
  176. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  177. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/webpack-a25853d04f8b4fca.js +1 -0
  178. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/00810e171700dd8c.css +1 -0
  179. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/107ede932147228b.css +1 -0
  180. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/2c73632f60809884.css +1 -0
  181. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/70765a0735f6401f.css +1 -0
  182. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/ac106bbd0da9ef31.css +1 -0
  183. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/c35ecba93103ef73.css +1 -0
  184. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/26a46d62cd723877-s.woff2 +0 -0
  185. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/55c55f0601d81cf3-s.woff2 +0 -0
  186. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/581909926a08bbc8-s.woff2 +0 -0
  187. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/6d93bde91c0c2823-s.woff2 +0 -0
  188. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/97e0cb1ae144a2a9-s.woff2 +0 -0
  189. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/a34f9d1faa5f3315-s.p.woff2 +0 -0
  190. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  191. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-outlined.78a93b20.woff +0 -0
  192. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-outlined.f86cb7b0.woff2 +0 -0
  193. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-round.92dc7ca2.woff +0 -0
  194. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-round.b10ec9db.woff2 +0 -0
  195. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-sharp.3885863e.woff2 +0 -0
  196. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-sharp.a71cb2bf.woff +0 -0
  197. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-two-tone.588d6313.woff +0 -0
  198. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-two-tone.675bd578.woff2 +0 -0
  199. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons.4ad034d2.woff +0 -0
  200. pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons.59322316.woff2 +0 -0
  201. pycafe_server-0.0.7/src/pycafe_server/static/admin.html +1 -0
  202. pycafe_server-0.0.7/src/pycafe_server/static/admin.txt +9 -0
  203. pycafe_server-0.0.7/src/pycafe_server/static/app.py +102 -0
  204. pycafe_server-0.0.7/src/pycafe_server/static/backgrounds/image16.svg +9 -0
  205. pycafe_server-0.0.7/src/pycafe_server/static/backgrounds/image17.svg +9 -0
  206. pycafe_server-0.0.7/src/pycafe_server/static/backgrounds/image18.svg +9 -0
  207. pycafe_server-0.0.7/src/pycafe_server/static/badge.svg +1 -0
  208. pycafe_server-0.0.7/src/pycafe_server/static/bootstrap_jupyter_kernel.py +52 -0
  209. pycafe_server-0.0.7/src/pycafe_server/static/coffeecup.gif +0 -0
  210. pycafe_server-0.0.7/src/pycafe_server/static/dash_daq-0.5.0-py3-none-any.whl +0 -0
  211. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-app.webp +0 -0
  212. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-open.webp +0 -0
  213. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-preview.webp +0 -0
  214. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-share-app.webp +0 -0
  215. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-share-embed.webp +0 -0
  216. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-share.webp +0 -0
  217. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-upload.webp +0 -0
  218. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-app.webp +0 -0
  219. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-open.webp +0 -0
  220. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-preview.webp +0 -0
  221. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-share-app.webp +0 -0
  222. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-share-embed.webp +0 -0
  223. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-share.webp +0 -0
  224. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-upload.webp +0 -0
  225. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-app.webp +0 -0
  226. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-open.webp +0 -0
  227. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-preview.webp +0 -0
  228. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-share-app.webp +0 -0
  229. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-share-embed.webp +0 -0
  230. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-share.webp +0 -0
  231. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-upload.webp +0 -0
  232. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-app.webp +0 -0
  233. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-open.webp +0 -0
  234. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-preview.webp +0 -0
  235. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-share-app.webp +0 -0
  236. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-share-embed.webp +0 -0
  237. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-share.webp +0 -0
  238. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-upload.webp +0 -0
  239. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-app.webp +0 -0
  240. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-open.webp +0 -0
  241. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-preview.webp +0 -0
  242. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-share-app.webp +0 -0
  243. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-share-embed.webp +0 -0
  244. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-share.webp +0 -0
  245. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-upload.webp +0 -0
  246. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-app.webp +0 -0
  247. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-open.webp +0 -0
  248. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-preview.webp +0 -0
  249. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-share-app.webp +0 -0
  250. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-share-embed.webp +0 -0
  251. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-share.webp +0 -0
  252. pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-upload.webp +0 -0
  253. pycafe_server-0.0.7/src/pycafe_server/static/docs/ipyreact-status.webp +0 -0
  254. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-enter-value.webp +0 -0
  255. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-manager.webp +0 -0
  256. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-printed.webp +0 -0
  257. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-prompt-with-reason.webp +0 -0
  258. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-prompt.webp +0 -0
  259. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-with-reason-enter-value.webp +0 -0
  260. pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-with-reason-printed.webp +0 -0
  261. pycafe_server-0.0.7/src/pycafe_server/static/docs/vizro-ci.webp +0 -0
  262. pycafe_server-0.0.7/src/pycafe_server/static/favicon.ico +0 -0
  263. pycafe_server-0.0.7/src/pycafe_server/static/fs-worker.js +2 -0
  264. pycafe_server-0.0.7/src/pycafe_server/static/fs-worker.js.LICENSE.txt +12 -0
  265. pycafe_server-0.0.7/src/pycafe_server/static/google_crc32c-1.5.0-py3-none-any.whl +0 -0
  266. pycafe_server-0.0.7/src/pycafe_server/static/icons/discord.svg +1 -0
  267. pycafe_server-0.0.7/src/pycafe_server/static/icons/folder.svg +1 -0
  268. pycafe_server-0.0.7/src/pycafe_server/static/icons/terminal.svg +1 -0
  269. pycafe_server-0.0.7/src/pycafe_server/static/index.html +1 -0
  270. pycafe_server-0.0.7/src/pycafe_server/static/index.txt +9 -0
  271. pycafe_server-0.0.7/src/pycafe_server/static/ipykernel-6.9.2-py3-none-any.whl +0 -0
  272. pycafe_server-0.0.7/src/pycafe_server/static/jupyterlite_pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
  273. pycafe_server-0.0.7/src/pycafe_server/static/logo.png +0 -0
  274. pycafe_server-0.0.7/src/pycafe_server/static/logos/gradio_logo_full.svg +20 -0
  275. pycafe_server-0.0.7/src/pycafe_server/static/logos/gradio_logo_full_dark.svg +23 -0
  276. pycafe_server-0.0.7/src/pycafe_server/static/logos/panel_logo.png +0 -0
  277. pycafe_server-0.0.7/src/pycafe_server/static/logos/panel_logo_full.png +0 -0
  278. pycafe_server-0.0.7/src/pycafe_server/static/logos/panel_logo_full_dark.png +0 -0
  279. pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo.png +0 -0
  280. pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo_full.png +0 -0
  281. pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo_full_white.png +0 -0
  282. pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo_white.png +0 -0
  283. pycafe_server-0.0.7/src/pycafe_server/static/logos/pycafe_logo.png +0 -0
  284. pycafe_server-0.0.7/src/pycafe_server/static/logos/python.svg +265 -0
  285. pycafe_server-0.0.7/src/pycafe_server/static/logos/shiny_logo.png +0 -0
  286. pycafe_server-0.0.7/src/pycafe_server/static/logos/shiny_logo_full.svg +80 -0
  287. pycafe_server-0.0.7/src/pycafe_server/static/logos/shiny_logo_full_white.svg +80 -0
  288. pycafe_server-0.0.7/src/pycafe_server/static/logos/solara_logo.svg +8 -0
  289. pycafe_server-0.0.7/src/pycafe_server/static/logos/streamlit_logo.png +0 -0
  290. pycafe_server-0.0.7/src/pycafe_server/static/logos/streamlit_logo_full.svg +6 -0
  291. pycafe_server-0.0.7/src/pycafe_server/static/logos/streamlit_logo_full_white.svg +6 -0
  292. pycafe_server-0.0.7/src/pycafe_server/static/logos/vizro_logo.svg +3 -0
  293. pycafe_server-0.0.7/src/pycafe_server/static/logos/vizro_logo_full.svg +9 -0
  294. pycafe_server-0.0.7/src/pycafe_server/static/logos/vizro_logo_full_white.svg +9 -0
  295. pycafe_server-0.0.7/src/pycafe_server/static/next.svg +1 -0
  296. pycafe_server-0.0.7/src/pycafe_server/static/pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
  297. pycafe_server-0.0.7/src/pycafe_server/static/pyperclip-1.8.2-py3-none-any.whl +0 -0
  298. pycafe_server-0.0.7/src/pycafe_server/static/qr_buy_eu.png +0 -0
  299. pycafe_server-0.0.7/src/pycafe_server/static/qr_buy_us.png +0 -0
  300. pycafe_server-0.0.7/src/pycafe_server/static/requirements.txt +16 -0
  301. pycafe_server-0.0.7/src/pycafe_server/static/service-worker.js +1 -0
  302. pycafe_server-0.0.7/src/pycafe_server/static/sign-in.html +1 -0
  303. pycafe_server-0.0.7/src/pycafe_server/static/sign-in.txt +9 -0
  304. pycafe_server-0.0.7/src/pycafe_server/static/snippet/dash/v1.html +1 -0
  305. pycafe_server-0.0.7/src/pycafe_server/static/snippet/dash/v1.txt +10 -0
  306. pycafe_server-0.0.7/src/pycafe_server/static/snippet/panel/v1.html +1 -0
  307. pycafe_server-0.0.7/src/pycafe_server/static/snippet/panel/v1.txt +10 -0
  308. pycafe_server-0.0.7/src/pycafe_server/static/snippet/shiny/v1.html +1 -0
  309. pycafe_server-0.0.7/src/pycafe_server/static/snippet/shiny/v1.txt +10 -0
  310. pycafe_server-0.0.7/src/pycafe_server/static/snippet/solara/v1.html +1 -0
  311. pycafe_server-0.0.7/src/pycafe_server/static/snippet/solara/v1.txt +10 -0
  312. pycafe_server-0.0.7/src/pycafe_server/static/snippet/streamlit/v1.html +1 -0
  313. pycafe_server-0.0.7/src/pycafe_server/static/snippet/streamlit/v1.txt +10 -0
  314. pycafe_server-0.0.7/src/pycafe_server/static/snippet/vizro/v1.html +1 -0
  315. pycafe_server-0.0.7/src/pycafe_server/static/snippet/vizro/v1.txt +10 -0
  316. pycafe_server-0.0.7/src/pycafe_server/static/test_dash.py +59 -0
  317. pycafe_server-0.0.7/src/pycafe_server/static/test_ipykernel.py +40 -0
  318. pycafe_server-0.0.7/src/pycafe_server/static/test_jupyterlab.py +51 -0
  319. pycafe_server-0.0.7/src/pycafe_server/static/test_solara.py +77 -0
  320. pycafe_server-0.0.7/src/pycafe_server/static/test_starlette.py +65 -0
  321. pycafe_server-0.0.7/src/pycafe_server/static/test_streamlit.py +31 -0
  322. pycafe_server-0.0.7/src/pycafe_server/static/test_tornado.py +94 -0
  323. pycafe_server-0.0.7/src/pycafe_server/static/tor.py +18 -0
  324. pycafe_server-0.0.7/src/pycafe_server/static/tornado-6.4.2-py3-none-any.whl +0 -0
  325. pycafe_server-0.0.7/src/pycafe_server/static/vercel.svg +1 -0
  326. pycafe_server-0.0.7/src/pycafe_server/static/view.html +1 -0
  327. pycafe_server-0.0.7/src/pycafe_server/static/view.txt +9 -0
  328. pycafe_server-0.0.7/src/pycafe_server/static/webworker.js +2 -0
  329. pycafe_server-0.0.7/src/pycafe_server/static/webworker.js.LICENSE.txt +5 -0
  330. pycafe_server-0.0.7/src/pycafe_server/uv_util.py +1 -0
@@ -0,0 +1,13 @@
1
+ [bumpversion]
2
+ current_version = 0.0.7
3
+ commit = True
4
+ tag = True
5
+ tag_name = v{new_version}
6
+ tag_message = Bump version pycafe-server: {current_version} → {new_version}
7
+ message = Bump version pycafe-server: {current_version} → {new_version}
8
+
9
+ [bumpversion:file:pycafe-private/package.json]
10
+
11
+ [bumpversion:file:src/pycafe_server/__about__.py]
12
+
13
+ [bumpversion:file:release.md]
@@ -0,0 +1,53 @@
1
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+ # dependencies
4
+ node_modules
5
+ /.pnp
6
+ .pnp.js
7
+
8
+ # testing
9
+ /coverage
10
+
11
+ # next.js
12
+ .next/
13
+ /out/
14
+
15
+ # production
16
+ /build
17
+
18
+ # misc
19
+ .DS_Store
20
+ *.pem
21
+
22
+ # debug
23
+ npm-debug.log*
24
+ yarn-debug.log*
25
+ yarn-error.log*
26
+
27
+ # local env files
28
+ .env*.local
29
+
30
+ # vercel
31
+ .vercel
32
+
33
+ # typescript
34
+ *.tsbuildinfo
35
+ next-env.d.ts
36
+
37
+ public/_jupyter
38
+ # pycache
39
+ __pycache__/
40
+
41
+ lib/
42
+ public/_wheels/
43
+ public/fs-worker.js
44
+ public/image-worker.js
45
+ public/service-worker.js
46
+ public/webworker.js
47
+
48
+ packages/jc/dist/
49
+
50
+ # Sentry Config File
51
+ .env.sentry-build-plugin
52
+
53
+ packages/pycafe_server/src/pycafe_server/static
@@ -0,0 +1,34 @@
1
+ # Development setup
2
+
3
+ ## Installation
4
+
5
+ ```bash
6
+ (cd pycafe-private && npm install)
7
+ pip install -e .
8
+ ```
9
+
10
+ ## Running the development server
11
+
12
+ Run nextjs in 1 terminal:
13
+
14
+ ```
15
+ $ (cd pycafe-private && npm run dev)
16
+ ```
17
+
18
+ Run the Python server in another terminal:
19
+
20
+ ```
21
+ $ ENV=dev uvicorn pycafe_server.asgi:app --port 8004
22
+ ```
23
+
24
+ Navigate to http://localhost:3002 to use the app with the development server (hot reloading).
25
+
26
+ If you run with `ENV=dev` it will set the CORS headers to allow requests from `http://localhost:3002` to reach the Python server.
27
+
28
+ ## Testing the production build
29
+
30
+ ```
31
+ $ (cd pycafe-private && npm run build)
32
+ ```
33
+
34
+ Now navigate to the Python server only: http://localhost:8004
@@ -0,0 +1,9 @@
1
+ Not open source, contact contact@py.cafe for licencing.
2
+
3
+ Copyright (c) 2024 JupyterCafe
4
+
5
+ All rights reserved.
6
+
7
+ This software and associated documentation files (the "Software") is licensed and not sold. Permission is hereby granted, free of charge, to use the Software strictly in accordance with the accompanying commercial agreement.
8
+
9
+ Redistribution, modification, or resale is strictly prohibited without express written permission.
@@ -0,0 +1,60 @@
1
+ Metadata-Version: 2.4
2
+ Name: pycafe-server
3
+ Version: 0.0.7
4
+ Summary: Run your own PyCafe server on on-premises
5
+ Project-URL: Documentation, https://py.cafe/docs/self-hosted
6
+ Project-URL: Issues, https://py.cafe/docs/self-hosted
7
+ Author-email: "Maarten A. Breddels" <maartenbreddels@gmail.com>
8
+ License: Not open source, contact contact@py.cafe for licencing.
9
+
10
+ Copyright (c) 2024 JupyterCafe
11
+
12
+ All rights reserved.
13
+
14
+ This software and associated documentation files (the "Software") is licensed and not sold. Permission is hereby granted, free of charge, to use the Software strictly in accordance with the accompanying commercial agreement.
15
+
16
+ Redistribution, modification, or resale is strictly prohibited without express written permission.
17
+ License-File: LICENSE.txt
18
+ Classifier: License :: Other/Proprietary License
19
+ Classifier: Programming Language :: Python
20
+ Classifier: Programming Language :: Python :: 3.7
21
+ Classifier: Programming Language :: Python :: 3.8
22
+ Classifier: Programming Language :: Python :: 3.9
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: Implementation :: CPython
26
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
27
+ Requires-Python: >=3.7
28
+ Requires-Dist: authlib
29
+ Requires-Dist: bump2version
30
+ Requires-Dist: httpx
31
+ Requires-Dist: itsdangerous
32
+ Requires-Dist: pyjwt
33
+ Requires-Dist: requests
34
+ Requires-Dist: sqlalchemy>=2
35
+ Requires-Dist: starlette
36
+ Requires-Dist: uv>=0.3.5
37
+ Requires-Dist: uvicorn
38
+ Description-Content-Type: text/markdown
39
+
40
+ # pycafe_server
41
+
42
+ [![PyPI - Version](https://img.shields.io/pypi/v/pycafe-server.svg)](https://pypi.org/project/pycafe-server)
43
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pycafe-server.svg)](https://pypi.org/project/pycafe-server)
44
+
45
+ ---
46
+
47
+ **Table of Contents**
48
+
49
+ - [Installation](#installation)
50
+ - [License](#license)
51
+
52
+ ## Installation
53
+
54
+ ```console
55
+ pip install pycafe-server
56
+ ```
57
+
58
+ ## License
59
+
60
+ You need a license for `pycafe-server`, it is not open source.
@@ -0,0 +1,21 @@
1
+ # pycafe_server
2
+
3
+ [![PyPI - Version](https://img.shields.io/pypi/v/pycafe-server.svg)](https://pypi.org/project/pycafe-server)
4
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pycafe-server.svg)](https://pypi.org/project/pycafe-server)
5
+
6
+ ---
7
+
8
+ **Table of Contents**
9
+
10
+ - [Installation](#installation)
11
+ - [License](#license)
12
+
13
+ ## Installation
14
+
15
+ ```console
16
+ pip install pycafe-server
17
+ ```
18
+
19
+ ## License
20
+
21
+ You need a license for `pycafe-server`, it is not open source.
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": ["next/core-web-vitals", "next/typescript"]
3
+ }
@@ -0,0 +1,36 @@
1
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+ # dependencies
4
+ /node_modules
5
+ /.pnp
6
+ .pnp.js
7
+ .yarn/install-state.gz
8
+
9
+ # testing
10
+ /coverage
11
+
12
+ # next.js
13
+ /.next/
14
+ /out/
15
+
16
+ # production
17
+ /build
18
+
19
+ # misc
20
+ .DS_Store
21
+ *.pem
22
+
23
+ # debug
24
+ npm-debug.log*
25
+ yarn-debug.log*
26
+ yarn-error.log*
27
+
28
+ # local env files
29
+ .env*.local
30
+
31
+ # vercel
32
+ .vercel
33
+
34
+ # typescript
35
+ *.tsbuildinfo
36
+ next-env.d.ts
@@ -0,0 +1,36 @@
1
+ This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2
+
3
+ ## Getting Started
4
+
5
+ First, run the development server:
6
+
7
+ ```bash
8
+ npm run dev
9
+ # or
10
+ yarn dev
11
+ # or
12
+ pnpm dev
13
+ # or
14
+ bun dev
15
+ ```
16
+
17
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
+
19
+ You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
+
21
+ This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22
+
23
+ ## Learn More
24
+
25
+ To learn more about Next.js, take a look at the following resources:
26
+
27
+ - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
+ - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
+
30
+ You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31
+
32
+ ## Deploy on Vercel
33
+
34
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35
+
36
+ Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
@@ -0,0 +1,88 @@
1
+ "use client";
2
+
3
+ import { settings } from "@/src/data";
4
+ import { useUser } from "@/src/user";
5
+ import { Button, Tooltip } from "@mui/material";
6
+ import useSWR from "swr";
7
+
8
+ export type Login = {
9
+ user_id: string;
10
+ email: string;
11
+ userinfo: string;
12
+ datetime: string;
13
+ is_admin: boolean;
14
+ is_editor: boolean;
15
+ };
16
+
17
+ const fetcher = async (...args: any[]): Promise<Login[]> => {
18
+ //@ts-ignore
19
+ const res = await fetch(...args);
20
+ if (!res.ok) {
21
+ throw new Error("Failed to fetch logins");
22
+ }
23
+ const data = await res.json();
24
+ return data["logins"] as Login[];
25
+ };
26
+
27
+ export default function Page() {
28
+ const user = useUser();
29
+ const { data, error, isLoading } = useSWR("/api/logins", fetcher);
30
+ if (settings.requireAuth) {
31
+ if (user === null) {
32
+ return (
33
+ <Button variant="contained" color="primary" href={`/_login?next_url=${window.location.pathname}`}>
34
+ Sign in
35
+ </Button>
36
+ );
37
+ }
38
+ if (!user.info.is_admin) {
39
+ return <h1>requires admin privileges</h1>;
40
+ }
41
+ }
42
+
43
+ if (isLoading) return <h1>Loading...</h1>;
44
+ if (error) return <h1>Error: {`${error}`}</h1>;
45
+ if (!data) return <h1>No data</h1>;
46
+
47
+ return (
48
+ <div>
49
+ <h1>Admin</h1>
50
+ <h2>Info</h2>
51
+ Instance ID: {settings.instanceId}
52
+ <h2>Logins</h2>
53
+ <>Last login, per user, per day:</>
54
+ <table>
55
+ <thead>
56
+ <tr>
57
+ <th>user_id</th>
58
+ <th>email</th>
59
+ {/* <th>userinfo</th> */}
60
+ <th>datetime</th>
61
+ <th>is_admin</th>
62
+ <th>is_editor</th>
63
+ </tr>
64
+ </thead>
65
+ <tbody>
66
+ {data.map((login) => {
67
+ const userInfo = JSON.stringify(login.userinfo);
68
+
69
+ return (
70
+ <tr key={login.user_id}>
71
+ <td>{login.user_id}</td>
72
+ <td>{login.email}</td>
73
+ {/* <td style={{ maxWidth: "200px", maxHeight: "30px", overflow: "hidden" }}>
74
+ <Tooltip title={userInfo}>
75
+ <p>{userInfo}</p>
76
+ </Tooltip>
77
+ </td> */}
78
+ <td>{`${login.datetime}`}</td>
79
+ <td>{login.is_admin.toString()}</td>
80
+ <td>{login.is_editor.toString()}</td>
81
+ </tr>
82
+ );
83
+ })}
84
+ </tbody>
85
+ </table>
86
+ </div>
87
+ );
88
+ }
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import "@/app/globals.css";
3
+ import { Inter } from "next/font/google";
4
+ import AutoTheme from "@/app/components/AutoTheme";
5
+ // import { Analytics } from "@vercel/analytics/react";
6
+ import { AppRouterCacheProvider } from "@mui/material-nextjs/v13-appRouter";
7
+ import { UserAndSettingsProvider } from "@/components/user-server";
8
+
9
+ const inter = Inter({ subsets: ["latin"] });
10
+
11
+ // const title = `PyCafe: ${tagline}`;
12
+ // const description = "Playground for Python web frameworks. Run and edit Python code snippets for web frameworks in a web browser.";
13
+
14
+ // export const metadata = {
15
+ // title,
16
+ // description,
17
+ // };
18
+
19
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
20
+ return (
21
+ <AppRouterCacheProvider>
22
+ <AutoTheme>
23
+ <html lang="en">
24
+ <body suppressHydrationWarning={true} className={inter.className}>
25
+ <UserAndSettingsProvider>{children}</UserAndSettingsProvider>
26
+ {/* <Analytics /> */}
27
+ </body>
28
+ </html>
29
+ </AutoTheme>
30
+ </AppRouterCacheProvider>
31
+ );
32
+ }
@@ -0,0 +1,168 @@
1
+ .page {
2
+ --gray-rgb: 0, 0, 0;
3
+ --gray-alpha-200: rgba(var(--gray-rgb), 0.08);
4
+ --gray-alpha-100: rgba(var(--gray-rgb), 0.05);
5
+
6
+ --button-primary-hover: #383838;
7
+ --button-secondary-hover: #f2f2f2;
8
+
9
+ display: grid;
10
+ grid-template-rows: 20px 1fr 20px;
11
+ align-items: center;
12
+ justify-items: center;
13
+ min-height: 100svh;
14
+ padding: 80px;
15
+ gap: 64px;
16
+ font-family: var(--font-geist-sans);
17
+ }
18
+
19
+ @media (prefers-color-scheme: dark) {
20
+ .page {
21
+ --gray-rgb: 255, 255, 255;
22
+ --gray-alpha-200: rgba(var(--gray-rgb), 0.145);
23
+ --gray-alpha-100: rgba(var(--gray-rgb), 0.06);
24
+
25
+ --button-primary-hover: #ccc;
26
+ --button-secondary-hover: #1a1a1a;
27
+ }
28
+ }
29
+
30
+ .main {
31
+ display: flex;
32
+ flex-direction: column;
33
+ gap: 32px;
34
+ grid-row-start: 2;
35
+ }
36
+
37
+ .main ol {
38
+ font-family: var(--font-geist-mono);
39
+ padding-left: 0;
40
+ margin: 0;
41
+ font-size: 14px;
42
+ line-height: 24px;
43
+ letter-spacing: -0.01em;
44
+ list-style-position: inside;
45
+ }
46
+
47
+ .main li:not(:last-of-type) {
48
+ margin-bottom: 8px;
49
+ }
50
+
51
+ .main code {
52
+ font-family: inherit;
53
+ background: var(--gray-alpha-100);
54
+ padding: 2px 4px;
55
+ border-radius: 4px;
56
+ font-weight: 600;
57
+ }
58
+
59
+ .ctas {
60
+ display: flex;
61
+ gap: 16px;
62
+ }
63
+
64
+ .ctas a {
65
+ appearance: none;
66
+ border-radius: 128px;
67
+ height: 48px;
68
+ padding: 0 20px;
69
+ border: none;
70
+ border: 1px solid transparent;
71
+ transition:
72
+ background 0.2s,
73
+ color 0.2s,
74
+ border-color 0.2s;
75
+ cursor: pointer;
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ font-size: 16px;
80
+ line-height: 20px;
81
+ font-weight: 500;
82
+ }
83
+
84
+ a.primary {
85
+ background: var(--foreground);
86
+ color: var(--background);
87
+ gap: 8px;
88
+ }
89
+
90
+ a.secondary {
91
+ border-color: var(--gray-alpha-200);
92
+ min-width: 180px;
93
+ }
94
+
95
+ .footer {
96
+ grid-row-start: 3;
97
+ display: flex;
98
+ gap: 24px;
99
+ }
100
+
101
+ .footer a {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 8px;
105
+ }
106
+
107
+ .footer img {
108
+ flex-shrink: 0;
109
+ }
110
+
111
+ /* Enable hover only on non-touch devices */
112
+ @media (hover: hover) and (pointer: fine) {
113
+ a.primary:hover {
114
+ background: var(--button-primary-hover);
115
+ border-color: transparent;
116
+ }
117
+
118
+ a.secondary:hover {
119
+ background: var(--button-secondary-hover);
120
+ border-color: transparent;
121
+ }
122
+
123
+ .footer a:hover {
124
+ text-decoration: underline;
125
+ text-underline-offset: 4px;
126
+ }
127
+ }
128
+
129
+ @media (max-width: 600px) {
130
+ .page {
131
+ padding: 32px;
132
+ padding-bottom: 80px;
133
+ }
134
+
135
+ .main {
136
+ align-items: center;
137
+ }
138
+
139
+ .main ol {
140
+ text-align: center;
141
+ }
142
+
143
+ .ctas {
144
+ flex-direction: column;
145
+ }
146
+
147
+ .ctas a {
148
+ font-size: 14px;
149
+ height: 40px;
150
+ padding: 0 16px;
151
+ }
152
+
153
+ a.secondary {
154
+ min-width: auto;
155
+ }
156
+
157
+ .footer {
158
+ flex-wrap: wrap;
159
+ align-items: center;
160
+ justify-content: center;
161
+ }
162
+ }
163
+
164
+ @media (prefers-color-scheme: dark) {
165
+ .logo {
166
+ filter: invert();
167
+ }
168
+ }
@@ -0,0 +1,86 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { ProjectPageProps } from "@/src/types";
4
+ import { getIconByType } from "@/components/dashboard";
5
+ import { useTheme } from "@mui/material/styles";
6
+ import { Box, Button, Theme, useMediaQuery } from "@mui/material";
7
+ import "material-icons/iconfont/material-icons.css";
8
+ import { frameworks, settings, tagline } from "@/src/data";
9
+ import { useUser } from "@/src/user";
10
+ import { CardButton } from "@/app/components/cardbutton";
11
+ import Link from "next/link";
12
+ import Header from "@/app/components/header";
13
+
14
+ export const dynamic = "force-static";
15
+
16
+ function CreateProjectBanner(props: { theme: Theme; isMobile?: boolean; showDescription?: boolean }) {
17
+ const showDescription = props.showDescription ?? false;
18
+ const isMobile = props.isMobile ?? false;
19
+ const darkMode = props.theme.palette.mode === "dark";
20
+ const user = useUser();
21
+ // either no logging in is configured (trial), or the user is an editor
22
+ const canEdit = !user || user.info.is_editor;
23
+ return (
24
+ <div className="create-banner">
25
+ <h2>{canEdit ? "Open the editor to create a new app" : "You are not an editor, and cannot create projects"}</h2>
26
+ <div className="create-buttons">
27
+ {canEdit &&
28
+ settings.frameworks.map((frameworkName) => {
29
+ const framework = frameworks[frameworkName];
30
+ return (
31
+ <a href={`/snippet/${framework.appType}/v1`} key={framework.appType} style={{ textDecoration: "none", color: "unset" }}>
32
+ <CardButton
33
+ title={framework.name}
34
+ description={showDescription ? framework.description2 : ""}
35
+ isMobile={isMobile}
36
+ image={getIconByType(framework.appType, showDescription, darkMode)}
37
+ actionIcon="add"
38
+ disabled={!canEdit}
39
+ />
40
+ </a>
41
+ );
42
+ })}
43
+ </div>
44
+ </div>
45
+ );
46
+ }
47
+
48
+ export default function Page({ params, searchParams }: ProjectPageProps, appview: boolean = false) {
49
+ const theme = useTheme();
50
+ const user = useUser();
51
+ const isMobile = useMediaQuery("(max-width: 1200px)");
52
+ return (
53
+ <>
54
+ {settings.trialmode && (
55
+ <h3>
56
+ PyCafe server is running in trial mode, please obtain a license key at{" "}
57
+ <a href="https://py.cafe/contact" target="_blank">
58
+ PyCafe
59
+ </a>
60
+ </h3>
61
+ )}
62
+ <Header subtitle={tagline} />
63
+ <div className="hero">
64
+ {!settings.requireAuth || user ? <CreateProjectBanner theme={theme} showDescription={true} isMobile={isMobile} /> : null}
65
+ {!settings.requireAuth || user ? null : (
66
+ <Button variant="contained" color="primary" href="/_login">
67
+ Sign in
68
+ </Button>
69
+ )}
70
+ </div>
71
+ {!settings.requireAuth || user ? (
72
+ <div className="framework-container" style={{ width: "800px" }}>
73
+ <Box sx={{ boxShadow: 2, p: 5 }} className="framework-box future-feature" style={{ paddingLeft: "0", paddingRight: "0" }}>
74
+ <div className="vote-container">
75
+ <div className="box-text" style={{ minWidth: "500px" }}>
76
+ <Link href="/view">Open the PyCafe viewer.</Link>
77
+ </div>
78
+ </div>
79
+ </Box>
80
+ </div>
81
+ ) : null}
82
+ </>
83
+ );
84
+ // return <App type="solara" version="v1" />;
85
+ // return <h1>hi</h1>
86
+ }
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import React from "react";
3
+
4
+ export default function Page() {
5
+ React.useEffect(() => {
6
+ if (window.opener) {
7
+ window.opener.postMessage({ type: "sign-in:loaded" }, "*");
8
+ // we can close ourselves, because we let the parent know we are loaded
9
+ window.close();
10
+ }
11
+ }, []);
12
+ return <>Checking your credentials...</>;
13
+ }