reflex 0.7.12a1__tar.gz → 0.7.13a2__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.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (410) hide show
  1. {reflex-0.7.12a1 → reflex-0.7.13a2}/.gitignore +2 -1
  2. {reflex-0.7.12a1 → reflex-0.7.13a2}/PKG-INFO +2 -2
  3. {reflex-0.7.12a1 → reflex-0.7.13a2}/pyproject.toml +56 -5
  4. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +1 -0
  5. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/postcss.config.js +0 -1
  6. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/state.js +1 -1
  7. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/__init__.py +1 -0
  8. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/__init__.pyi +1 -0
  9. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/app.py +101 -29
  10. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/compiler/compiler.py +11 -62
  11. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/compiler/templates.py +12 -3
  12. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/compiler/utils.py +20 -4
  13. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/component.py +366 -88
  14. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/code.py +1 -1
  15. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/shiki_code_block.py +97 -86
  16. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/shiki_code_block.pyi +4 -2
  17. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/forms.py +1 -1
  18. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/lucide/icon.py +2 -1
  19. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/lucide/icon.pyi +1 -0
  20. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/plotly/plotly.py +2 -2
  21. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/plotly/plotly.pyi +2 -3
  22. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/accordion.py +1 -1
  23. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/drawer.py +1 -1
  24. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/form.py +1 -1
  25. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/base.py +4 -11
  26. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/icon_button.py +2 -2
  27. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/text_field.py +3 -0
  28. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/text_field.pyi +2 -0
  29. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/list.py +1 -1
  30. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/tags/iter_tag.py +3 -5
  31. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/config.py +57 -7
  32. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/__init__.py +0 -2
  33. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/event.py +154 -93
  34. reflex-0.7.13a2/reflex/plugins/__init__.py +7 -0
  35. reflex-0.7.13a2/reflex/plugins/base.py +101 -0
  36. reflex-0.7.13a2/reflex/plugins/tailwind_v3.py +255 -0
  37. reflex-0.7.13a2/reflex/plugins/tailwind_v4.py +258 -0
  38. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/state.py +24 -3
  39. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/build.py +1 -1
  40. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/console.py +1 -1
  41. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/exec.py +23 -0
  42. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/path_ops.py +26 -6
  43. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/prerequisites.py +21 -90
  44. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/pyi_generator.py +12 -2
  45. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/types.py +15 -1
  46. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/base.py +59 -4
  47. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/object.py +8 -0
  48. {reflex-0.7.12a1 → reflex-0.7.13a2}/scripts/hatch_build.py +17 -0
  49. reflex-0.7.12a1/reflex/.templates/jinja/web/tailwind.config.js.jinja2 +0 -66
  50. reflex-0.7.12a1/reflex/.templates/web/styles/tailwind.css +0 -6
  51. reflex-0.7.12a1/reflex/constants/style.py +0 -16
  52. {reflex-0.7.12a1 → reflex-0.7.13a2}/LICENSE +0 -0
  53. {reflex-0.7.12a1 → reflex-0.7.13a2}/README.md +0 -0
  54. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  55. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  56. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/apps/blank/code/blank.py +0 -0
  57. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  58. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  59. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  60. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  61. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  62. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  63. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  64. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  65. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  66. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  67. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  68. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  69. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -0
  70. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
  71. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  72. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  73. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  74. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  75. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  76. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/.gitignore +0 -0
  77. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  78. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/components/shiki/code.js +0 -0
  79. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/jsconfig.json +0 -0
  80. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/next.config.js +0 -0
  81. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  82. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  83. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  84. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  85. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/helpers/range.js +0 -0
  86. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  87. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/__main__.py +0 -0
  88. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/admin.py +0 -0
  89. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/app_mixins/__init__.py +0 -0
  90. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/app_mixins/lifespan.py +0 -0
  91. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/app_mixins/middleware.py +0 -0
  92. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/app_mixins/mixin.py +0 -0
  93. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/assets.py +0 -0
  94. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/base.py +0 -0
  95. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/compiler/__init__.py +0 -0
  96. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/__init__.py +0 -0
  97. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/__init__.pyi +0 -0
  98. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/__init__.py +0 -0
  99. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/__init__.pyi +0 -0
  100. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/app_wrap.py +0 -0
  101. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/app_wrap.pyi +0 -0
  102. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/bare.py +0 -0
  103. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/body.py +0 -0
  104. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/body.pyi +0 -0
  105. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/document.py +0 -0
  106. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/document.pyi +0 -0
  107. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/error_boundary.py +0 -0
  108. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/error_boundary.pyi +0 -0
  109. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/fragment.py +0 -0
  110. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/fragment.pyi +0 -0
  111. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/head.py +0 -0
  112. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/head.pyi +0 -0
  113. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/link.py +0 -0
  114. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/link.pyi +0 -0
  115. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/meta.py +0 -0
  116. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/meta.pyi +0 -0
  117. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/script.py +0 -0
  118. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/script.pyi +0 -0
  119. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/strict_mode.py +0 -0
  120. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/base/strict_mode.pyi +0 -0
  121. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/__init__.py +0 -0
  122. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/__init__.pyi +0 -0
  123. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/auto_scroll.py +0 -0
  124. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/auto_scroll.pyi +0 -0
  125. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/banner.py +0 -0
  126. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/banner.pyi +0 -0
  127. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/breakpoints.py +0 -0
  128. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/client_side_routing.py +0 -0
  129. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/client_side_routing.pyi +0 -0
  130. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/clipboard.py +0 -0
  131. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/clipboard.pyi +0 -0
  132. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/colors.py +0 -0
  133. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/cond.py +0 -0
  134. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/debounce.py +0 -0
  135. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/debounce.pyi +0 -0
  136. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/foreach.py +0 -0
  137. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/html.py +0 -0
  138. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/html.pyi +0 -0
  139. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/layout/__init__.py +0 -0
  140. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/match.py +0 -0
  141. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/responsive.py +0 -0
  142. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/sticky.py +0 -0
  143. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/sticky.pyi +0 -0
  144. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/upload.py +0 -0
  145. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/core/upload.pyi +0 -0
  146. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/__init__.py +0 -0
  147. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/__init__.pyi +0 -0
  148. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/code.pyi +0 -0
  149. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/dataeditor.py +0 -0
  150. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  151. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/datadisplay/logo.py +0 -0
  152. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/dynamic.py +0 -0
  153. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/__init__.py +0 -0
  154. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/__init__.pyi +0 -0
  155. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/constants/__init__.py +0 -0
  156. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/constants/html.py +0 -0
  157. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/constants/react.py +0 -0
  158. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/constants/reflex.py +0 -0
  159. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/element.py +0 -0
  160. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/element.pyi +0 -0
  161. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/__init__.py +0 -0
  162. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/__init__.pyi +0 -0
  163. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/base.py +0 -0
  164. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/base.pyi +0 -0
  165. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/forms.pyi +0 -0
  166. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/inline.py +0 -0
  167. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/inline.pyi +0 -0
  168. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/media.py +0 -0
  169. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/media.pyi +0 -0
  170. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/metadata.py +0 -0
  171. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/metadata.pyi +0 -0
  172. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/other.py +0 -0
  173. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/other.pyi +0 -0
  174. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/scripts.py +0 -0
  175. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/scripts.pyi +0 -0
  176. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/sectioning.py +0 -0
  177. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/sectioning.pyi +0 -0
  178. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/tables.py +0 -0
  179. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/tables.pyi +0 -0
  180. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/typography.py +0 -0
  181. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/el/elements/typography.pyi +0 -0
  182. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/gridjs/__init__.py +0 -0
  183. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/gridjs/datatable.py +0 -0
  184. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/gridjs/datatable.pyi +0 -0
  185. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/literals.py +0 -0
  186. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/lucide/__init__.py +0 -0
  187. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/markdown/__init__.py +0 -0
  188. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/markdown/markdown.py +0 -0
  189. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/markdown/markdown.pyi +0 -0
  190. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/moment/__init__.py +0 -0
  191. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/moment/moment.py +0 -0
  192. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/moment/moment.pyi +0 -0
  193. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/__init__.py +0 -0
  194. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/base.py +0 -0
  195. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/base.pyi +0 -0
  196. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/image.py +0 -0
  197. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/image.pyi +0 -0
  198. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/link.py +0 -0
  199. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/link.pyi +0 -0
  200. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/video.py +0 -0
  201. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/next/video.pyi +0 -0
  202. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/plotly/__init__.py +0 -0
  203. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/props.py +0 -0
  204. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/__init__.py +0 -0
  205. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/__init__.pyi +0 -0
  206. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/__init__.py +0 -0
  207. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/__init__.pyi +0 -0
  208. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/accordion.pyi +0 -0
  209. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/base.py +0 -0
  210. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/base.pyi +0 -0
  211. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/drawer.pyi +0 -0
  212. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/form.pyi +0 -0
  213. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/progress.py +0 -0
  214. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/progress.pyi +0 -0
  215. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/slider.py +0 -0
  216. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/primitives/slider.pyi +0 -0
  217. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/__init__.py +0 -0
  218. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/__init__.pyi +0 -0
  219. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/base.pyi +0 -0
  220. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/color_mode.py +0 -0
  221. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/color_mode.pyi +0 -0
  222. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/__init__.py +0 -0
  223. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  224. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  225. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  226. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  227. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  228. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/avatar.py +0 -0
  229. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  230. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/badge.py +0 -0
  231. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/badge.pyi +0 -0
  232. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/button.py +0 -0
  233. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/button.pyi +0 -0
  234. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/callout.py +0 -0
  235. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/callout.pyi +0 -0
  236. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/card.py +0 -0
  237. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/card.pyi +0 -0
  238. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/checkbox.py +0 -0
  239. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  240. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  241. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  242. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  243. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  244. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/context_menu.py +0 -0
  245. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  246. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/data_list.py +0 -0
  247. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  248. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/dialog.py +0 -0
  249. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  250. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  251. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  252. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/hover_card.py +0 -0
  253. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  254. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  255. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/inset.py +0 -0
  256. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/inset.pyi +0 -0
  257. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/popover.py +0 -0
  258. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/popover.pyi +0 -0
  259. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/progress.py +0 -0
  260. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/progress.pyi +0 -0
  261. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/radio.py +0 -0
  262. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/radio.pyi +0 -0
  263. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  264. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  265. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/radio_group.py +0 -0
  266. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  267. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  268. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  269. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  270. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  271. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/select.py +0 -0
  272. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/select.pyi +0 -0
  273. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/separator.py +0 -0
  274. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/separator.pyi +0 -0
  275. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/skeleton.py +0 -0
  276. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  277. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/slider.py +0 -0
  278. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/slider.pyi +0 -0
  279. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/spinner.py +0 -0
  280. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  281. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/switch.py +0 -0
  282. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/switch.pyi +0 -0
  283. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/table.py +0 -0
  284. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/table.pyi +0 -0
  285. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/tabs.py +0 -0
  286. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  287. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/text_area.py +0 -0
  288. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  289. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/tooltip.py +0 -0
  290. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  291. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/__init__.py +0 -0
  292. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  293. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/base.py +0 -0
  294. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/base.pyi +0 -0
  295. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/box.py +0 -0
  296. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/box.pyi +0 -0
  297. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/center.py +0 -0
  298. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/center.pyi +0 -0
  299. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/container.py +0 -0
  300. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/container.pyi +0 -0
  301. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/flex.py +0 -0
  302. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  303. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/grid.py +0 -0
  304. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  305. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/list.pyi +0 -0
  306. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/section.py +0 -0
  307. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/section.pyi +0 -0
  308. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/spacer.py +0 -0
  309. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  310. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/stack.py +0 -0
  311. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  312. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/__init__.py +0 -0
  313. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  314. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/base.py +0 -0
  315. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  316. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  317. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/code.py +0 -0
  318. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/code.pyi +0 -0
  319. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/heading.py +0 -0
  320. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  321. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/link.py +0 -0
  322. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/link.pyi +0 -0
  323. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/text.py +0 -0
  324. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/radix/themes/typography/text.pyi +0 -0
  325. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/__init__.py +0 -0
  326. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/audio.py +0 -0
  327. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/audio.pyi +0 -0
  328. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/react_player.py +0 -0
  329. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/react_player.pyi +0 -0
  330. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/video.py +0 -0
  331. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/react_player/video.pyi +0 -0
  332. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/__init__.py +0 -0
  333. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/__init__.pyi +0 -0
  334. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/cartesian.py +0 -0
  335. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/cartesian.pyi +0 -0
  336. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/charts.py +0 -0
  337. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/charts.pyi +0 -0
  338. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/general.py +0 -0
  339. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/general.pyi +0 -0
  340. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/polar.py +0 -0
  341. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/polar.pyi +0 -0
  342. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/recharts.py +0 -0
  343. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/recharts/recharts.pyi +0 -0
  344. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/sonner/__init__.py +0 -0
  345. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/sonner/toast.py +0 -0
  346. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/sonner/toast.pyi +0 -0
  347. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/suneditor/__init__.py +0 -0
  348. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/suneditor/editor.py +0 -0
  349. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/suneditor/editor.pyi +0 -0
  350. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/tags/__init__.py +0 -0
  351. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/tags/cond_tag.py +0 -0
  352. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/tags/match_tag.py +0 -0
  353. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/tags/tag.py +0 -0
  354. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/components/tags/tagless.py +0 -0
  355. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/base.py +0 -0
  356. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/colors.py +0 -0
  357. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/compiler.py +0 -0
  358. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/config.py +0 -0
  359. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/custom_components.py +0 -0
  360. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/event.py +0 -0
  361. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/installer.py +0 -0
  362. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/route.py +0 -0
  363. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/state.py +0 -0
  364. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/constants/utils.py +0 -0
  365. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/custom_components/__init__.py +0 -0
  366. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/custom_components/custom_components.py +0 -0
  367. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/experimental/__init__.py +0 -0
  368. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/experimental/client_state.py +0 -0
  369. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/experimental/hooks.py +0 -0
  370. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/experimental/layout.py +0 -0
  371. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/experimental/layout.pyi +0 -0
  372. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/__init__.py +0 -0
  373. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/data.py +0 -0
  374. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/dynamic.py +0 -0
  375. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/manager.py +0 -0
  376. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/proxy.py +0 -0
  377. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/storage.py +0 -0
  378. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/istate/wrappers.py +0 -0
  379. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/middleware/__init__.py +0 -0
  380. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/middleware/hydrate_middleware.py +0 -0
  381. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/middleware/middleware.py +0 -0
  382. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/model.py +0 -0
  383. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/page.py +0 -0
  384. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/py.typed +0 -0
  385. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/reflex.py +0 -0
  386. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/route.py +0 -0
  387. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/style.py +0 -0
  388. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/testing.py +0 -0
  389. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/__init__.py +0 -0
  390. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/codespaces.py +0 -0
  391. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/compat.py +0 -0
  392. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/decorator.py +0 -0
  393. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/exceptions.py +0 -0
  394. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/export.py +0 -0
  395. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/format.py +0 -0
  396. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/imports.py +0 -0
  397. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/lazy_loader.py +0 -0
  398. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/misc.py +0 -0
  399. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/net.py +0 -0
  400. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/processes.py +0 -0
  401. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/redir.py +0 -0
  402. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/registry.py +0 -0
  403. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/serializers.py +0 -0
  404. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/utils/telemetry.py +0 -0
  405. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/__init__.py +0 -0
  406. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/datetime.py +0 -0
  407. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/dep_tracking.py +0 -0
  408. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/function.py +0 -0
  409. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/number.py +0 -0
  410. {reflex-0.7.12a1 → reflex-0.7.13a2}/reflex/vars/sequence.py +0 -0
@@ -20,4 +20,5 @@ reflex.db
20
20
  .env.*
21
21
  node_modules
22
22
  package-lock.json
23
- *.pyi
23
+ *.pyi
24
+ .pre-commit-config.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.7.12a1
3
+ Version: 0.7.13a2
4
4
  Summary: Web apps in pure Python.
5
5
  Project-URL: homepage, https://reflex.dev
6
6
  Project-URL: repository, https://github.com/reflex-dev/reflex
@@ -30,7 +30,7 @@ Requires-Dist: psutil<8.0,>=7.0.0
30
30
  Requires-Dist: pydantic<3.0,>=1.10.21
31
31
  Requires-Dist: python-multipart<1.0,>=0.0.20
32
32
  Requires-Dist: python-socketio<6.0,>=5.12.0
33
- Requires-Dist: redis<6.0,>=5.2.1
33
+ Requires-Dist: redis<7.0,>=5.2.1
34
34
  Requires-Dist: reflex-hosting-cli>=0.1.47
35
35
  Requires-Dist: rich<15,>=13
36
36
  Requires-Dist: sqlmodel<0.1,>=0.0.24
@@ -1,8 +1,8 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.7.12a1"
3
+ version = "0.7.13a2"
4
4
  description = "Web apps in pure Python."
5
- license = { text = "Apache-2.0" }
5
+ license.text = "Apache-2.0"
6
6
  authors = [
7
7
  { name = "Nikhil Rao", email = "nikhil@reflex.dev" },
8
8
  { name = "Alek Petuskey", email = "alek@reflex.dev" },
@@ -31,7 +31,7 @@ dependencies = [
31
31
  "pydantic >=1.10.21,<3.0",
32
32
  "python-socketio >=5.12.0,<6.0",
33
33
  "python-multipart >=0.0.20,<1.0",
34
- "redis >=5.2.1,<6.0",
34
+ "redis >=5.2.1,<7.0",
35
35
  "reflex-hosting-cli >=0.1.47",
36
36
  "rich >=13,<15",
37
37
  "sqlmodel >=0.0.24,<0.1",
@@ -73,7 +73,7 @@ artifacts = ["*.pyi"]
73
73
 
74
74
  [tool.hatch.build.hooks.custom]
75
75
  path = "scripts/hatch_build.py"
76
- dependencies = ["plotly", "ruff"]
76
+ dependencies = ["plotly", "ruff", "pre_commit", "toml"]
77
77
  require-runtime-dependencies = true
78
78
 
79
79
  [tool.pyright]
@@ -149,7 +149,7 @@ dev = [
149
149
  "pillow >=11",
150
150
  "playwright >=1.51",
151
151
  "plotly >=6.0",
152
- "pre-commit >=4.2",
152
+ "pre-commit ==4.2.0",
153
153
  "psycopg[binary] >=3.2",
154
154
  "pyright >=1.1.400",
155
155
  "pytest >=8.3",
@@ -165,6 +165,7 @@ dev = [
165
165
  "ruff >=0.11",
166
166
  "selenium >=4.31",
167
167
  "starlette-admin >=0.14",
168
+ "toml >=0.10.2",
168
169
  "uvicorn >=0.34.0",
169
170
  ]
170
171
 
@@ -206,3 +207,53 @@ exclude_also = [
206
207
 
207
208
  [tool.coverage.html]
208
209
  directory = "coverage_html_report"
210
+
211
+ [tool.pre-commit]
212
+ fail_fast = true
213
+
214
+ [[tool.pre-commit.repos]]
215
+ repo = "https://github.com/astral-sh/ruff-pre-commit"
216
+ rev = "v0.11.8"
217
+ hooks = [
218
+ { id = "ruff-format", args = [
219
+ "reflex",
220
+ "tests",
221
+ ] },
222
+ { id = "ruff", args = [
223
+ "--fix",
224
+ "--exit-non-zero-on-fix",
225
+ ], exclude = "^integration/benchmarks/" },
226
+ ]
227
+
228
+ [[tool.pre-commit.repos]]
229
+ repo = "https://github.com/codespell-project/codespell"
230
+ rev = "v2.4.1"
231
+ hooks = [
232
+ { id = "codespell", args = [
233
+ "reflex",
234
+ ], additional_dependencies = [
235
+ "tomli",
236
+ ] },
237
+ ]
238
+
239
+ # Run pyi check before pyright because pyright can fail if pyi files are wrong.
240
+ [[tool.pre-commit.repos]]
241
+ repo = "local"
242
+ hooks = [
243
+ { id = "update-pyi-files", name = "update-pyi-files", always_run = true, language = "system", require_serial = true, description = "Update pyi files as needed", entry = "python3 scripts/make_pyi.py" },
244
+ ]
245
+
246
+ [[tool.pre-commit.repos]]
247
+ repo = "https://github.com/RobertCraigie/pyright-python"
248
+ rev = "v1.1.400"
249
+ hooks = [{ id = "pyright", args = ["reflex", "tests"], language = "system" }]
250
+
251
+ [[tool.pre-commit.repos]]
252
+ repo = "https://github.com/terrencepreilly/darglint"
253
+ rev = "v1.8.1"
254
+ hooks = [{ id = "darglint", exclude = "^reflex/reflex.py" }]
255
+
256
+ [[tool.pre-commit.repos]]
257
+ repo = "https://github.com/pre-commit/mirrors-prettier"
258
+ rev = "f62a70a3a7114896b062de517d72829ea1c884b6"
259
+ hooks = [{ id = "prettier", require_serial = true }]
@@ -2,4 +2,5 @@ import reflex as rx
2
2
 
3
3
  config = rx.Config(
4
4
  app_name="{{ app_name }}",
5
+ plugins=[rx.plugins.TailwindV3Plugin()],
5
6
  )
@@ -1,7 +1,6 @@
1
1
  module.exports = {
2
2
  plugins: {
3
3
  "postcss-import": {},
4
- tailwindcss: {},
5
4
  autoprefixer: {},
6
5
  },
7
6
  };
@@ -350,7 +350,7 @@ export const applyRestEvent = async (event, socket) => {
350
350
  if (event.handler === "uploadFiles") {
351
351
  if (event.payload.files === undefined || event.payload.files.length === 0) {
352
352
  // Submit the event over the websocket to trigger the event handler.
353
- return await applyEvent(Event(event.name), socket);
353
+ return await applyEvent(Event(event.name, { files: [] }), socket);
354
354
  }
355
355
 
356
356
  // Start upload, but do not wait for it, which would block other events.
@@ -361,6 +361,7 @@ _SUBMODULES: set[str] = {
361
361
  "vars",
362
362
  "config",
363
363
  "compiler",
364
+ "plugins",
364
365
  }
365
366
  _SUBMOD_ATTRS: dict = _MAPPING
366
367
  getattr, __dir__, __all__ = lazy_loader.attach(
@@ -12,6 +12,7 @@ from . import compiler as compiler
12
12
  from . import components as components
13
13
  from . import config as config
14
14
  from . import model as model
15
+ from . import plugins as plugins
15
16
  from . import style as style
16
17
  from . import testing as testing
17
18
  from . import utils as utils
@@ -18,7 +18,7 @@ from datetime import datetime
18
18
  from pathlib import Path
19
19
  from timeit import default_timer as timer
20
20
  from types import SimpleNamespace
21
- from typing import TYPE_CHECKING, Any, BinaryIO, get_args, get_type_hints
21
+ from typing import TYPE_CHECKING, Any, BinaryIO, ParamSpec, get_args, get_type_hints
22
22
 
23
23
  from fastapi import FastAPI
24
24
  from rich.progress import MofNCompleteColumn, Progress, TimeElapsedColumn
@@ -314,6 +314,9 @@ class UnevaluatedPage:
314
314
  )
315
315
 
316
316
 
317
+ P = ParamSpec("P")
318
+
319
+
317
320
  @dataclasses.dataclass()
318
321
  class App(MiddlewareMixin, LifespanMixin):
319
322
  """The main Reflex app that encapsulates the backend and frontend.
@@ -620,10 +623,12 @@ class App(MiddlewareMixin, LifespanMixin):
620
623
  compile_future = concurrent.futures.ThreadPoolExecutor(max_workers=1).submit(
621
624
  self._compile
622
625
  )
623
- compile_future.add_done_callback(
626
+
627
+ def callback(f: concurrent.futures.Future):
624
628
  # Force background compile errors to print eagerly
625
- lambda f: f.result()
626
- )
629
+ return f.result()
630
+
631
+ compile_future.add_done_callback(callback)
627
632
  # Wait for the compile to finish to ensure all optional endpoints are mounted.
628
633
  compile_future.result()
629
634
 
@@ -1029,11 +1034,6 @@ class App(MiddlewareMixin, LifespanMixin):
1029
1034
  frontend_packages = get_config().frontend_packages
1030
1035
  _frontend_packages = []
1031
1036
  for package in frontend_packages:
1032
- if package in (get_config().tailwind or {}).get("plugins", []):
1033
- console.warn(
1034
- f"Tailwind packages are inferred from 'plugins', remove `{package}` from `frontend_packages`"
1035
- )
1036
- continue
1037
1037
  if package in page_imports:
1038
1038
  console.warn(
1039
1039
  f"React packages and their dependencies are inferred from Component.library and Component.lib_dependencies, remove `{package}` from `frontend_packages`"
@@ -1166,6 +1166,7 @@ class App(MiddlewareMixin, LifespanMixin):
1166
1166
 
1167
1167
  Raises:
1168
1168
  ReflexRuntimeError: When any page uses state, but no rx.State subclass is defined.
1169
+ FileNotFoundError: When a plugin requires a file that does not exist.
1169
1170
  """
1170
1171
  from reflex.utils.exceptions import ReflexRuntimeError
1171
1172
 
@@ -1234,14 +1235,16 @@ class App(MiddlewareMixin, LifespanMixin):
1234
1235
 
1235
1236
  # try to be somewhat accurate - but still not 100%
1236
1237
  adhoc_steps_without_executor = 7
1237
- fixed_pages_within_executor = 5
1238
+ fixed_pages_within_executor = 4
1239
+ plugin_count = len(config.plugins)
1238
1240
  progress.start()
1239
1241
  task = progress.add_task(
1240
1242
  f"[{get_compilation_time()}] Compiling:",
1241
1243
  total=len(self._pages)
1242
1244
  + (len(self._unevaluated_pages) * 2)
1243
1245
  + fixed_pages_within_executor
1244
- + adhoc_steps_without_executor,
1246
+ + adhoc_steps_without_executor
1247
+ + plugin_count,
1245
1248
  )
1246
1249
 
1247
1250
  with console.timing("Evaluate Pages (Frontend)"):
@@ -1380,10 +1383,20 @@ class App(MiddlewareMixin, LifespanMixin):
1380
1383
 
1381
1384
  ExecutorSafeFunctions.STATE = self._state
1382
1385
 
1383
- with console.timing("Compile to Javascript"), executor as executor:
1384
- result_futures: list[concurrent.futures.Future[tuple[str, str]]] = []
1386
+ modify_files_tasks: list[tuple[str, str, Callable[[str], str]]] = []
1385
1387
 
1386
- def _submit_work(fn: Callable[..., tuple[str, str]], *args, **kwargs):
1388
+ with console.timing("Compile to Javascript"), executor as executor:
1389
+ result_futures: list[
1390
+ concurrent.futures.Future[
1391
+ list[tuple[str, str]] | tuple[str, str] | None
1392
+ ]
1393
+ ] = []
1394
+
1395
+ def _submit_work(
1396
+ fn: Callable[P, list[tuple[str, str]] | tuple[str, str] | None],
1397
+ *args: P.args,
1398
+ **kwargs: P.kwargs,
1399
+ ):
1387
1400
  f = executor.submit(fn, *args, **kwargs)
1388
1401
  f.add_done_callback(lambda _: progress.advance(task))
1389
1402
  result_futures.append(f)
@@ -1401,20 +1414,36 @@ class App(MiddlewareMixin, LifespanMixin):
1401
1414
  # Compile the theme.
1402
1415
  _submit_work(compile_theme, self.style)
1403
1416
 
1404
- # Compile the Tailwind config.
1405
- if config.tailwind is not None:
1406
- config.tailwind["content"] = config.tailwind.get(
1407
- "content", constants.Tailwind.CONTENT
1417
+ def _submit_work_without_advancing(
1418
+ fn: Callable[P, list[tuple[str, str]] | tuple[str, str] | None],
1419
+ *args: P.args,
1420
+ **kwargs: P.kwargs,
1421
+ ):
1422
+ f = executor.submit(fn, *args, **kwargs)
1423
+ result_futures.append(f)
1424
+
1425
+ for plugin in config.plugins:
1426
+ plugin.pre_compile(
1427
+ add_save_task=_submit_work_without_advancing,
1428
+ add_modify_task=(
1429
+ lambda *args, plugin=plugin: modify_files_tasks.append(
1430
+ (
1431
+ plugin.__class__.__module__ + plugin.__class__.__name__,
1432
+ *args,
1433
+ )
1434
+ )
1435
+ ),
1408
1436
  )
1409
- _submit_work(compiler.compile_tailwind, config.tailwind)
1410
- else:
1411
- _submit_work(compiler.remove_tailwind_from_postcss)
1412
1437
 
1413
1438
  # Wait for all compilation tasks to complete.
1414
- compile_results.extend(
1415
- future.result()
1416
- for future in concurrent.futures.as_completed(result_futures)
1417
- )
1439
+ for future in concurrent.futures.as_completed(result_futures):
1440
+ if (result := future.result()) is not None:
1441
+ if isinstance(result, list):
1442
+ compile_results.extend(result)
1443
+ else:
1444
+ compile_results.append(result)
1445
+
1446
+ progress.advance(task, advance=len(config.plugins))
1418
1447
 
1419
1448
  app_root = self._app_root(app_wrappers=app_wrappers)
1420
1449
 
@@ -1429,7 +1458,7 @@ class App(MiddlewareMixin, LifespanMixin):
1429
1458
  )
1430
1459
  if self.theme is not None:
1431
1460
  # Fix #2992 by removing the top-level appearance prop
1432
- self.theme.appearance = None
1461
+ self.theme.appearance = None # pyright: ignore[reportAttributeAccessIssue]
1433
1462
  progress.advance(task)
1434
1463
 
1435
1464
  # Compile the app root.
@@ -1443,7 +1472,7 @@ class App(MiddlewareMixin, LifespanMixin):
1443
1472
  custom_components_output,
1444
1473
  custom_components_result,
1445
1474
  custom_components_imports,
1446
- ) = compiler.compile_components(set(CUSTOM_COMPONENTS.values()))
1475
+ ) = compiler.compile_components(dict.fromkeys(CUSTOM_COMPONENTS.values()))
1447
1476
  compile_results.append((custom_components_output, custom_components_result))
1448
1477
  all_imports.update(custom_components_imports)
1449
1478
 
@@ -1481,9 +1510,45 @@ class App(MiddlewareMixin, LifespanMixin):
1481
1510
  # Remove pages that are no longer in the app.
1482
1511
  p.unlink()
1483
1512
 
1513
+ output_mapping: dict[Path, str] = {}
1514
+ for output_path, code in compile_results:
1515
+ path = compiler_utils.resolve_path_of_web_dir(output_path)
1516
+ if path in output_mapping:
1517
+ console.warn(
1518
+ f"Path {path} has two different outputs. The first one will be used."
1519
+ )
1520
+ else:
1521
+ output_mapping[path] = code
1522
+
1523
+ for plugin in config.plugins:
1524
+ for static_file_path, content in plugin.get_static_assets():
1525
+ path = compiler_utils.resolve_path_of_web_dir(static_file_path)
1526
+ if path in output_mapping:
1527
+ console.warn(
1528
+ f"Plugin {plugin.__class__.__name__} is trying to write to {path} but it already exists. The plugin file will be ignored."
1529
+ )
1530
+ else:
1531
+ output_mapping[path] = (
1532
+ content.decode("utf-8")
1533
+ if isinstance(content, bytes)
1534
+ else content
1535
+ )
1536
+
1537
+ for plugin_name, file_path, modify_fn in modify_files_tasks:
1538
+ path = compiler_utils.resolve_path_of_web_dir(file_path)
1539
+ file_content = output_mapping.get(path)
1540
+ if file_content is None:
1541
+ if path.exists():
1542
+ file_content = path.read_text()
1543
+ else:
1544
+ raise FileNotFoundError(
1545
+ f"Plugin {plugin_name} is trying to modify {path} but it does not exist."
1546
+ )
1547
+ output_mapping[path] = modify_fn(file_content)
1548
+
1484
1549
  with console.timing("Write to Disk"):
1485
- for output_path, code in compile_results:
1486
- compiler_utils.write_page(output_path, code)
1550
+ for output_path, code in output_mapping.items():
1551
+ compiler_utils.write_file(output_path, code)
1487
1552
 
1488
1553
  def _write_stateful_pages_marker(self):
1489
1554
  """Write list of routes that create dynamic states for the backend to use later."""
@@ -1996,6 +2061,13 @@ class EventNamespace(AsyncNamespace):
1996
2061
  update: The state update to send.
1997
2062
  sid: The Socket.IO session id.
1998
2063
  """
2064
+ if not sid:
2065
+ # If the sid is None, we are not connected to a client. Prevent sending
2066
+ # updates to all clients.
2067
+ return
2068
+ if sid not in self.sid_to_token:
2069
+ console.warn(f"Attempting to send delta to disconnected websocket {sid}")
2070
+ return
1999
2071
  # Creating a task prevents the update from being blocked behind other coroutines.
2000
2072
  await asyncio.create_task(
2001
2073
  self.emit(str(constants.SocketEvent.EVENT), update, to=sid)
@@ -223,6 +223,9 @@ def _validate_stylesheet(stylesheet_full_path: Path, assets_app_path: Path) -> N
223
223
  )
224
224
 
225
225
 
226
+ RADIX_THEMES_STYLESHEET = "@radix-ui/themes/styles.css"
227
+
228
+
226
229
  def _compile_root_stylesheet(stylesheets: list[str]) -> str:
227
230
  """Compile the root stylesheet.
228
231
 
@@ -235,12 +238,12 @@ def _compile_root_stylesheet(stylesheets: list[str]) -> str:
235
238
  Raises:
236
239
  FileNotFoundError: If a specified stylesheet in assets directory does not exist.
237
240
  """
238
- # Add tailwind css if enabled.
239
- sheets = (
240
- [constants.Tailwind.ROOT_STYLE_PATH]
241
- if get_config().tailwind is not None
242
- else []
243
- )
241
+ # Add stylesheets from plugins.
242
+ sheets = [RADIX_THEMES_STYLESHEET] + [
243
+ sheet
244
+ for plugin in get_config().plugins
245
+ for sheet in plugin.get_stylesheet_paths()
246
+ ]
244
247
 
245
248
  failed_to_import_sass = False
246
249
  assets_app_path = Path.cwd() / constants.Dirs.APP_ASSETS
@@ -326,7 +329,7 @@ def _compile_component(component: Component | StatefulComponent) -> str:
326
329
 
327
330
 
328
331
  def _compile_components(
329
- components: set[CustomComponent],
332
+ components: Iterable[CustomComponent],
330
333
  ) -> tuple[str, dict[str, list[ImportVar]]]:
331
334
  """Compile the components.
332
335
 
@@ -451,22 +454,6 @@ def _compile_stateful_components(
451
454
  )
452
455
 
453
456
 
454
- def _compile_tailwind(
455
- config: dict,
456
- ) -> str:
457
- """Compile the Tailwind config.
458
-
459
- Args:
460
- config: The Tailwind config.
461
-
462
- Returns:
463
- The compiled Tailwind config.
464
- """
465
- return templates.TAILWIND_CONFIG.render(
466
- **config,
467
- )
468
-
469
-
470
457
  def compile_document_root(
471
458
  head_components: list[Component],
472
459
  html_lang: str | None = None,
@@ -572,7 +559,7 @@ def compile_page(
572
559
 
573
560
 
574
561
  def compile_components(
575
- components: set[CustomComponent],
562
+ components: Iterable[CustomComponent],
576
563
  ) -> tuple[str, str, dict[str, list[ImportVar]]]:
577
564
  """Compile the custom components.
578
565
 
@@ -613,44 +600,6 @@ def compile_stateful_components(
613
600
  return output_path, code, page_components
614
601
 
615
602
 
616
- def compile_tailwind(
617
- config: dict,
618
- ):
619
- """Compile the Tailwind config.
620
-
621
- Args:
622
- config: The Tailwind config.
623
-
624
- Returns:
625
- The compiled Tailwind config.
626
- """
627
- # Get the path for the output file.
628
- output_path = str((get_web_dir() / constants.Tailwind.CONFIG).absolute())
629
-
630
- # Compile the config.
631
- code = _compile_tailwind(config)
632
- return output_path, code
633
-
634
-
635
- def remove_tailwind_from_postcss() -> tuple[str, str]:
636
- """If tailwind is not to be used, remove it from postcss.config.js.
637
-
638
- Returns:
639
- The path and code of the compiled postcss.config.js.
640
- """
641
- # Get the path for the output file.
642
- output_path = str(get_web_dir() / constants.Dirs.POSTCSS_JS)
643
-
644
- code = [
645
- line
646
- for line in Path(output_path).read_text().splitlines(keepends=True)
647
- if "tailwindcss: " not in line
648
- ]
649
-
650
- # Compile the config.
651
- return output_path, "".join(code)
652
-
653
-
654
603
  def purge_web_pages_dir():
655
604
  """Empty out .web/pages directory."""
656
605
  if not is_prod_mode() and environment.REFLEX_PERSIST_WEB_DIR.get():
@@ -98,6 +98,18 @@ def get_template(name: str) -> Template:
98
98
  return ReflexJinjaEnvironment().get_template(name=name)
99
99
 
100
100
 
101
+ def from_string(source: str) -> Template:
102
+ """Get render function that work with a template.
103
+
104
+ Args:
105
+ source: The template source.
106
+
107
+ Returns:
108
+ A render function.
109
+ """
110
+ return ReflexJinjaEnvironment().from_string(source=source)
111
+
112
+
101
113
  # Template for the Reflex config file.
102
114
  RXCONFIG = get_template("app/rxconfig.py.jinja2")
103
115
 
@@ -113,9 +125,6 @@ THEME = get_template("web/utils/theme.js.jinja2")
113
125
  # Template for the context file.
114
126
  CONTEXT = get_template("web/utils/context.js.jinja2")
115
127
 
116
- # Template for Tailwind config.
117
- TAILWIND_CONFIG = get_template("web/tailwind.config.js.jinja2")
118
-
119
128
  # Template to render a component tag.
120
129
  COMPONENT = get_template("web/pages/component.js.jinja2")
121
130
 
@@ -66,7 +66,7 @@ def compile_import_statement(fields: list[ImportVar]) -> tuple[str, list[str]]:
66
66
  default = next(iter({field.name for field in defaults}), "")
67
67
  rest = {field.name for field in fields_set - defaults}
68
68
 
69
- return default, list(rest)
69
+ return default, sorted(rest)
70
70
 
71
71
 
72
72
  def validate_imports(import_dict: ParsedImportDict):
@@ -309,7 +309,7 @@ def compile_custom_component(
309
309
  A tuple of the compiled component and the imports required by the component.
310
310
  """
311
311
  # Render the component.
312
- render = component.get_component(component)
312
+ render = component.get_component()
313
313
 
314
314
  # Get the imports.
315
315
  imports: ParsedImportDict = {
@@ -500,7 +500,23 @@ def add_meta(
500
500
  return page
501
501
 
502
502
 
503
- def write_page(path: str | Path, code: str):
503
+ def resolve_path_of_web_dir(path: str | Path) -> Path:
504
+ """Get the path under the web directory.
505
+
506
+ Args:
507
+ path: The path to get. It can be a relative or absolute path.
508
+
509
+ Returns:
510
+ The path under the web directory.
511
+ """
512
+ path = Path(path)
513
+ web_dir = get_web_dir()
514
+ if path.is_relative_to(web_dir):
515
+ return path.absolute()
516
+ return (web_dir / path).absolute()
517
+
518
+
519
+ def write_file(path: str | Path, code: str):
504
520
  """Write the given code to the given path.
505
521
 
506
522
  Args:
@@ -508,7 +524,7 @@ def write_page(path: str | Path, code: str):
508
524
  code: The code to write.
509
525
  """
510
526
  path = Path(path)
511
- path_ops.mkdir(path.parent)
527
+ path.parent.mkdir(parents=True, exist_ok=True)
512
528
  if path.exists() and path.read_text(encoding="utf-8") == code:
513
529
  return
514
530
  path.write_text(code, encoding="utf-8")