reflex 0.7.13a2__py3-none-any.whl → 0.7.14a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (256) hide show
  1. reflex/.templates/apps/blank/code/blank.py +0 -2
  2. reflex/app.py +64 -69
  3. reflex/app_mixins/lifespan.py +2 -3
  4. reflex/app_mixins/middleware.py +1 -0
  5. reflex/app_mixins/mixin.py +0 -1
  6. reflex/assets.py +6 -3
  7. reflex/base.py +3 -2
  8. reflex/compiler/compiler.py +77 -64
  9. reflex/compiler/utils.py +8 -6
  10. reflex/components/base/app_wrap.pyi +0 -1
  11. reflex/components/base/bare.py +5 -7
  12. reflex/components/base/body.pyi +0 -1
  13. reflex/components/base/document.pyi +0 -5
  14. reflex/components/base/error_boundary.pyi +0 -1
  15. reflex/components/base/fragment.pyi +0 -1
  16. reflex/components/base/head.pyi +0 -2
  17. reflex/components/base/link.pyi +0 -2
  18. reflex/components/base/meta.py +2 -1
  19. reflex/components/base/meta.pyi +0 -4
  20. reflex/components/base/script.py +2 -1
  21. reflex/components/base/script.pyi +0 -1
  22. reflex/components/base/strict_mode.pyi +0 -1
  23. reflex/components/component.py +49 -41
  24. reflex/components/core/auto_scroll.pyi +0 -1
  25. reflex/components/core/banner.pyi +0 -6
  26. reflex/components/core/breakpoints.py +9 -11
  27. reflex/components/core/client_side_routing.pyi +0 -2
  28. reflex/components/core/clipboard.pyi +0 -1
  29. reflex/components/core/colors.py +10 -7
  30. reflex/components/core/cond.py +4 -2
  31. reflex/components/core/debounce.py +5 -3
  32. reflex/components/core/debounce.pyi +0 -1
  33. reflex/components/core/foreach.py +8 -6
  34. reflex/components/core/html.py +3 -3
  35. reflex/components/core/html.pyi +0 -1
  36. reflex/components/core/match.py +19 -17
  37. reflex/components/core/sticky.pyi +0 -4
  38. reflex/components/core/upload.pyi +0 -5
  39. reflex/components/datadisplay/code.py +1 -2
  40. reflex/components/datadisplay/code.pyi +0 -2
  41. reflex/components/datadisplay/dataeditor.py +7 -10
  42. reflex/components/datadisplay/dataeditor.pyi +0 -1
  43. reflex/components/datadisplay/logo.py +3 -4
  44. reflex/components/datadisplay/shiki_code_block.py +8 -11
  45. reflex/components/datadisplay/shiki_code_block.pyi +0 -3
  46. reflex/components/dynamic.py +2 -3
  47. reflex/components/el/__init__.pyi +2 -0
  48. reflex/components/el/element.pyi +0 -1
  49. reflex/components/el/elements/__init__.py +1 -0
  50. reflex/components/el/elements/__init__.pyi +3 -0
  51. reflex/components/el/elements/base.pyi +0 -1
  52. reflex/components/el/elements/forms.py +14 -15
  53. reflex/components/el/elements/forms.pyi +15 -32
  54. reflex/components/el/elements/inline.pyi +0 -28
  55. reflex/components/el/elements/media.py +26 -0
  56. reflex/components/el/elements/media.pyi +259 -25
  57. reflex/components/el/elements/metadata.py +0 -1
  58. reflex/components/el/elements/metadata.pyi +0 -6
  59. reflex/components/el/elements/other.pyi +0 -7
  60. reflex/components/el/elements/scripts.pyi +0 -3
  61. reflex/components/el/elements/sectioning.pyi +0 -15
  62. reflex/components/el/elements/tables.pyi +0 -10
  63. reflex/components/el/elements/typography.pyi +0 -15
  64. reflex/components/gridjs/datatable.py +10 -13
  65. reflex/components/gridjs/datatable.pyi +0 -2
  66. reflex/components/lucide/icon.py +10 -9
  67. reflex/components/lucide/icon.pyi +0 -3
  68. reflex/components/markdown/markdown.py +6 -8
  69. reflex/components/markdown/markdown.pyi +0 -1
  70. reflex/components/moment/moment.pyi +0 -1
  71. reflex/components/next/base.py +0 -2
  72. reflex/components/next/base.pyi +0 -3
  73. reflex/components/next/image.pyi +0 -1
  74. reflex/components/next/link.pyi +0 -1
  75. reflex/components/next/video.pyi +0 -1
  76. reflex/components/plotly/plotly.pyi +0 -9
  77. reflex/components/props.py +4 -3
  78. reflex/components/radix/primitives/accordion.pyi +0 -7
  79. reflex/components/radix/primitives/base.py +1 -3
  80. reflex/components/radix/primitives/base.pyi +0 -2
  81. reflex/components/radix/primitives/drawer.pyi +0 -11
  82. reflex/components/radix/primitives/form.py +4 -8
  83. reflex/components/radix/primitives/form.pyi +0 -12
  84. reflex/components/radix/primitives/progress.py +1 -1
  85. reflex/components/radix/primitives/progress.pyi +0 -5
  86. reflex/components/radix/primitives/slider.py +1 -1
  87. reflex/components/radix/primitives/slider.pyi +0 -5
  88. reflex/components/radix/themes/base.pyi +0 -8
  89. reflex/components/radix/themes/color_mode.pyi +0 -3
  90. reflex/components/radix/themes/components/alert_dialog.py +4 -2
  91. reflex/components/radix/themes/components/alert_dialog.pyi +4 -9
  92. reflex/components/radix/themes/components/aspect_ratio.py +1 -2
  93. reflex/components/radix/themes/components/aspect_ratio.pyi +1 -3
  94. reflex/components/radix/themes/components/avatar.py +5 -2
  95. reflex/components/radix/themes/components/avatar.pyi +1 -3
  96. reflex/components/radix/themes/components/badge.py +5 -2
  97. reflex/components/radix/themes/components/badge.pyi +1 -3
  98. reflex/components/radix/themes/components/button.py +2 -3
  99. reflex/components/radix/themes/components/button.pyi +1 -3
  100. reflex/components/radix/themes/components/callout.py +1 -2
  101. reflex/components/radix/themes/components/callout.pyi +1 -7
  102. reflex/components/radix/themes/components/card.py +1 -2
  103. reflex/components/radix/themes/components/card.pyi +1 -3
  104. reflex/components/radix/themes/components/checkbox.py +7 -4
  105. reflex/components/radix/themes/components/checkbox.pyi +1 -5
  106. reflex/components/radix/themes/components/checkbox_cards.py +1 -2
  107. reflex/components/radix/themes/components/checkbox_cards.pyi +1 -4
  108. reflex/components/radix/themes/components/checkbox_group.py +1 -2
  109. reflex/components/radix/themes/components/checkbox_group.pyi +1 -4
  110. reflex/components/radix/themes/components/context_menu.py +1 -1
  111. reflex/components/radix/themes/components/context_menu.pyi +1 -14
  112. reflex/components/radix/themes/components/data_list.py +1 -2
  113. reflex/components/radix/themes/components/data_list.pyi +1 -6
  114. reflex/components/radix/themes/components/dialog.py +4 -2
  115. reflex/components/radix/themes/components/dialog.pyi +4 -9
  116. reflex/components/radix/themes/components/dropdown_menu.py +5 -2
  117. reflex/components/radix/themes/components/dropdown_menu.pyi +4 -10
  118. reflex/components/radix/themes/components/hover_card.py +4 -2
  119. reflex/components/radix/themes/components/hover_card.pyi +4 -6
  120. reflex/components/radix/themes/components/icon_button.py +7 -8
  121. reflex/components/radix/themes/components/icon_button.pyi +1 -3
  122. reflex/components/radix/themes/components/inset.py +1 -2
  123. reflex/components/radix/themes/components/inset.pyi +1 -3
  124. reflex/components/radix/themes/components/popover.py +4 -2
  125. reflex/components/radix/themes/components/popover.pyi +4 -6
  126. reflex/components/radix/themes/components/progress.py +1 -2
  127. reflex/components/radix/themes/components/progress.pyi +1 -3
  128. reflex/components/radix/themes/components/radio.py +1 -2
  129. reflex/components/radix/themes/components/radio.pyi +1 -3
  130. reflex/components/radix/themes/components/radio_cards.py +1 -2
  131. reflex/components/radix/themes/components/radio_cards.pyi +1 -4
  132. reflex/components/radix/themes/components/radio_group.py +7 -5
  133. reflex/components/radix/themes/components/radio_group.pyi +1 -6
  134. reflex/components/radix/themes/components/scroll_area.py +1 -2
  135. reflex/components/radix/themes/components/scroll_area.pyi +1 -3
  136. reflex/components/radix/themes/components/segmented_control.py +1 -2
  137. reflex/components/radix/themes/components/segmented_control.pyi +1 -4
  138. reflex/components/radix/themes/components/select.py +5 -2
  139. reflex/components/radix/themes/components/select.pyi +1 -11
  140. reflex/components/radix/themes/components/separator.py +1 -2
  141. reflex/components/radix/themes/components/separator.pyi +1 -3
  142. reflex/components/radix/themes/components/skeleton.py +1 -2
  143. reflex/components/radix/themes/components/skeleton.pyi +1 -3
  144. reflex/components/radix/themes/components/slider.py +1 -2
  145. reflex/components/radix/themes/components/slider.pyi +1 -3
  146. reflex/components/radix/themes/components/spinner.py +1 -2
  147. reflex/components/radix/themes/components/spinner.pyi +1 -3
  148. reflex/components/radix/themes/components/switch.py +1 -2
  149. reflex/components/radix/themes/components/switch.pyi +1 -3
  150. reflex/components/radix/themes/components/table.py +1 -2
  151. reflex/components/radix/themes/components/table.pyi +1 -9
  152. reflex/components/radix/themes/components/tabs.py +1 -2
  153. reflex/components/radix/themes/components/tabs.pyi +1 -7
  154. reflex/components/radix/themes/components/text_area.py +5 -2
  155. reflex/components/radix/themes/components/text_area.pyi +2 -4
  156. reflex/components/radix/themes/components/text_field.py +5 -2
  157. reflex/components/radix/themes/components/text_field.pyi +1 -5
  158. reflex/components/radix/themes/components/tooltip.py +1 -2
  159. reflex/components/radix/themes/components/tooltip.pyi +1 -3
  160. reflex/components/radix/themes/layout/base.py +5 -2
  161. reflex/components/radix/themes/layout/base.pyi +5 -3
  162. reflex/components/radix/themes/layout/box.py +1 -2
  163. reflex/components/radix/themes/layout/box.pyi +1 -3
  164. reflex/components/radix/themes/layout/center.pyi +0 -1
  165. reflex/components/radix/themes/layout/container.py +1 -2
  166. reflex/components/radix/themes/layout/container.pyi +1 -3
  167. reflex/components/radix/themes/layout/flex.py +6 -2
  168. reflex/components/radix/themes/layout/flex.pyi +1 -3
  169. reflex/components/radix/themes/layout/grid.py +6 -2
  170. reflex/components/radix/themes/layout/grid.pyi +1 -3
  171. reflex/components/radix/themes/layout/list.py +2 -1
  172. reflex/components/radix/themes/layout/list.pyi +0 -5
  173. reflex/components/radix/themes/layout/section.py +1 -2
  174. reflex/components/radix/themes/layout/section.pyi +1 -3
  175. reflex/components/radix/themes/layout/spacer.pyi +0 -1
  176. reflex/components/radix/themes/layout/stack.py +1 -1
  177. reflex/components/radix/themes/layout/stack.pyi +0 -3
  178. reflex/components/radix/themes/typography/blockquote.py +1 -1
  179. reflex/components/radix/themes/typography/blockquote.pyi +1 -3
  180. reflex/components/radix/themes/typography/code.py +5 -1
  181. reflex/components/radix/themes/typography/code.pyi +1 -3
  182. reflex/components/radix/themes/typography/heading.py +1 -1
  183. reflex/components/radix/themes/typography/heading.pyi +1 -3
  184. reflex/components/radix/themes/typography/link.py +3 -2
  185. reflex/components/radix/themes/typography/link.pyi +1 -3
  186. reflex/components/radix/themes/typography/text.py +1 -1
  187. reflex/components/radix/themes/typography/text.pyi +1 -9
  188. reflex/components/react_player/audio.py +0 -2
  189. reflex/components/react_player/audio.pyi +0 -3
  190. reflex/components/react_player/react_player.pyi +0 -1
  191. reflex/components/react_player/video.py +0 -2
  192. reflex/components/react_player/video.pyi +0 -3
  193. reflex/components/recharts/__init__.py +1 -1
  194. reflex/components/recharts/__init__.pyi +1 -1
  195. reflex/components/recharts/cartesian.py +20 -25
  196. reflex/components/recharts/cartesian.pyi +20 -37
  197. reflex/components/recharts/charts.py +2 -1
  198. reflex/components/recharts/charts.pyi +0 -12
  199. reflex/components/recharts/general.pyi +0 -6
  200. reflex/components/recharts/polar.py +5 -4
  201. reflex/components/recharts/polar.pyi +4 -10
  202. reflex/components/recharts/recharts.py +12 -10
  203. reflex/components/recharts/recharts.pyi +10 -11
  204. reflex/components/sonner/toast.py +2 -2
  205. reflex/components/sonner/toast.pyi +0 -2
  206. reflex/components/suneditor/editor.py +2 -1
  207. reflex/components/suneditor/editor.pyi +0 -1
  208. reflex/components/tags/iter_tag.py +4 -2
  209. reflex/config.py +47 -35
  210. reflex/constants/base.py +3 -3
  211. reflex/constants/compiler.py +8 -6
  212. reflex/constants/installer.py +24 -15
  213. reflex/custom_components/custom_components.py +1 -2
  214. reflex/event.py +58 -60
  215. reflex/experimental/__init__.py +2 -2
  216. reflex/experimental/client_state.py +9 -4
  217. reflex/experimental/layout.pyi +0 -5
  218. reflex/istate/manager.py +15 -19
  219. reflex/istate/proxy.py +19 -12
  220. reflex/model.py +6 -4
  221. reflex/plugins/base.py +8 -0
  222. reflex/plugins/tailwind_v3.py +8 -0
  223. reflex/plugins/tailwind_v4.py +8 -0
  224. reflex/reflex.py +9 -11
  225. reflex/route.py +7 -9
  226. reflex/state.py +66 -70
  227. reflex/style.py +3 -1
  228. reflex/testing.py +46 -29
  229. reflex/utils/build.py +2 -1
  230. reflex/utils/console.py +9 -17
  231. reflex/utils/exec.py +9 -11
  232. reflex/utils/format.py +21 -24
  233. reflex/utils/imports.py +4 -3
  234. reflex/utils/lazy_loader.py +3 -3
  235. reflex/utils/misc.py +2 -1
  236. reflex/utils/net.py +2 -2
  237. reflex/utils/path_ops.py +2 -1
  238. reflex/utils/prerequisites.py +67 -38
  239. reflex/utils/processes.py +4 -6
  240. reflex/utils/pyi_generator.py +46 -41
  241. reflex/utils/redir.py +1 -1
  242. reflex/utils/serializers.py +4 -4
  243. reflex/utils/telemetry.py +20 -2
  244. reflex/utils/types.py +16 -13
  245. reflex/vars/base.py +96 -109
  246. reflex/vars/datetime.py +2 -1
  247. reflex/vars/dep_tracking.py +19 -28
  248. reflex/vars/number.py +6 -7
  249. reflex/vars/object.py +5 -6
  250. reflex/vars/sequence.py +11 -11
  251. {reflex-0.7.13a2.dist-info → reflex-0.7.14a2.dist-info}/METADATA +1 -1
  252. reflex-0.7.14a2.dist-info/RECORD +407 -0
  253. reflex-0.7.13a2.dist-info/RECORD +0 -407
  254. {reflex-0.7.13a2.dist-info → reflex-0.7.14a2.dist-info}/WHEEL +0 -0
  255. {reflex-0.7.13a2.dist-info → reflex-0.7.14a2.dist-info}/entry_points.txt +0 -0
  256. {reflex-0.7.13a2.dist-info → reflex-0.7.14a2.dist-info}/licenses/LICENSE +0 -0
@@ -50,4 +50,3 @@ class AppWrap(Fragment):
50
50
  Returns:
51
51
  A new AppWrap component containing {children}.
52
52
  """
53
- ...
@@ -43,9 +43,8 @@ def validate_str(value: str):
43
43
  f"Output includes {value!s} which will be displayed as a string. If you are calling `str` on a Var, consider using .to_string() instead."
44
44
  )
45
45
  elif perf_mode == PerformanceMode.RAISE:
46
- raise ValueError(
47
- f"Output includes {value!s} which will be displayed as a string. If you are calling `str` on a Var, consider using .to_string() instead."
48
- )
46
+ msg = f"Output includes {value!s} which will be displayed as a string. If you are calling `str` on a Var, consider using .to_string() instead."
47
+ raise ValueError(msg)
49
48
 
50
49
 
51
50
  def _components_from_var(var: Var) -> Sequence[BaseComponent]:
@@ -72,10 +71,9 @@ class Bare(Component):
72
71
  if isinstance(contents, LiteralStringVar):
73
72
  validate_str(contents._var_value)
74
73
  return cls._unsafe_create(children=[], contents=contents)
75
- else:
76
- if isinstance(contents, str):
77
- validate_str(contents)
78
- contents = Var.create(contents if contents is not None else "")
74
+ if isinstance(contents, str):
75
+ validate_str(contents)
76
+ contents = Var.create(contents if contents is not None else "")
79
77
 
80
78
  return cls._unsafe_create(children=[], contents=contents)
81
79
 
@@ -255,4 +255,3 @@ class Body(elements.Body):
255
255
  Returns:
256
256
  The component.
257
257
  """
258
- ...
@@ -61,7 +61,6 @@ class NextDocumentLib(Component):
61
61
  Returns:
62
62
  The component.
63
63
  """
64
- ...
65
64
 
66
65
  class Html(NextDocumentLib):
67
66
  @overload
@@ -114,7 +113,6 @@ class Html(NextDocumentLib):
114
113
  Returns:
115
114
  The component.
116
115
  """
117
- ...
118
116
 
119
117
  class DocumentHead(NextDocumentLib):
120
118
  @overload
@@ -166,7 +164,6 @@ class DocumentHead(NextDocumentLib):
166
164
  Returns:
167
165
  The component.
168
166
  """
169
- ...
170
167
 
171
168
  class Main(NextDocumentLib):
172
169
  @overload
@@ -218,7 +215,6 @@ class Main(NextDocumentLib):
218
215
  Returns:
219
216
  The component.
220
217
  """
221
- ...
222
218
 
223
219
  class NextScript(NextDocumentLib):
224
220
  @overload
@@ -270,4 +266,3 @@ class NextScript(NextDocumentLib):
270
266
  Returns:
271
267
  The component.
272
268
  """
273
- ...
@@ -70,6 +70,5 @@ class ErrorBoundary(Component):
70
70
  Returns:
71
71
  The ErrorBoundary component.
72
72
  """
73
- ...
74
73
 
75
74
  error_boundary = ErrorBoundary.create
@@ -61,6 +61,5 @@ class Fragment(Component):
61
61
  Returns:
62
62
  The component.
63
63
  """
64
- ...
65
64
 
66
65
  fragment = Fragment.create
@@ -61,7 +61,6 @@ class NextHeadLib(Component):
61
61
  Returns:
62
62
  The component.
63
63
  """
64
- ...
65
64
 
66
65
  class Head(NextHeadLib, MemoizationLeaf):
67
66
  @overload
@@ -113,6 +112,5 @@ class Head(NextHeadLib, MemoizationLeaf):
113
112
  Returns:
114
113
  The memoization leaf
115
114
  """
116
- ...
117
115
 
118
116
  head = Head.create
@@ -259,7 +259,6 @@ class RawLink(BaseHTML):
259
259
  Returns:
260
260
  The component.
261
261
  """
262
- ...
263
262
 
264
263
  class ScriptTag(BaseHTML):
265
264
  @overload
@@ -519,4 +518,3 @@ class ScriptTag(BaseHTML):
519
518
  Returns:
520
519
  The component.
521
520
  """
522
- ...
@@ -20,7 +20,8 @@ class Title(elements.Title):
20
20
  """
21
21
  # Make sure the title is a single string.
22
22
  if len(self.children) != 1 or not isinstance(self.children[0], Bare):
23
- raise ValueError("Title must be a single string.")
23
+ msg = "Title must be a single string."
24
+ raise ValueError(msg)
24
25
  return super().render()
25
26
 
26
27
 
@@ -62,7 +62,6 @@ class Title(elements.Title):
62
62
  Returns:
63
63
  The component.
64
64
  """
65
- ...
66
65
 
67
66
  class Meta(elements.Meta):
68
67
  @overload
@@ -318,7 +317,6 @@ class Meta(elements.Meta):
318
317
  Returns:
319
318
  The component.
320
319
  """
321
- ...
322
320
 
323
321
  class Description(elements.Meta):
324
322
  @overload
@@ -572,7 +570,6 @@ class Description(elements.Meta):
572
570
  Returns:
573
571
  The component.
574
572
  """
575
- ...
576
573
 
577
574
  class Image(elements.Meta):
578
575
  @overload
@@ -828,4 +825,3 @@ class Image(elements.Meta):
828
825
  Returns:
829
826
  The component.
830
827
  """
831
- ...
@@ -68,7 +68,8 @@ class Script(Component):
68
68
  ValueError: when neither children nor `src` are specified.
69
69
  """
70
70
  if not children and not props.get("src"):
71
- raise ValueError("Must provide inline script or `src` prop.")
71
+ msg = "Must provide inline script or `src` prop."
72
+ raise ValueError(msg)
72
73
  return super().create(*children, **props)
73
74
 
74
75
 
@@ -86,6 +86,5 @@ class Script(Component):
86
86
  Raises:
87
87
  ValueError: when neither children nor `src` are specified.
88
88
  """
89
- ...
90
89
 
91
90
  script = Script.create
@@ -61,4 +61,3 @@ class StrictMode(Component):
61
61
  Returns:
62
62
  The component.
63
63
  """
64
- ...
@@ -157,7 +157,8 @@ class ComponentField(Generic[FIELD_TYPE]):
157
157
  return self.default
158
158
  if self.default_factory is not None:
159
159
  return self.default_factory()
160
- raise ValueError("No default value or factory provided.")
160
+ msg = "No default value or factory provided."
161
+ raise ValueError(msg)
161
162
 
162
163
  def __repr__(self) -> str:
163
164
  """Represent the field in a readable format.
@@ -194,7 +195,8 @@ def field(
194
195
  ValueError: If both default and default_factory are specified.
195
196
  """
196
197
  if default is not MISSING and default_factory is not None:
197
- raise ValueError("cannot specify both default and default_factory")
198
+ msg = "cannot specify both default and default_factory"
199
+ raise ValueError(msg)
198
200
  return ComponentField( # pyright: ignore [reportReturnType]
199
201
  default=default,
200
202
  default_factory=default_factory,
@@ -286,10 +288,11 @@ class BaseComponentMeta(ABCMeta):
286
288
 
287
289
  namespace["_own_fields"] = own_fields
288
290
  namespace["_inherited_fields"] = inherited_fields
289
- namespace["_fields"] = inherited_fields | own_fields
291
+ all_fields = inherited_fields | own_fields
292
+ namespace["_fields"] = all_fields
290
293
  namespace["_js_fields"] = {
291
294
  key: value
292
- for key, value in own_fields.items()
295
+ for key, value in all_fields.items()
293
296
  if value.is_javascript is True
294
297
  }
295
298
  return super().__new__(cls, name, bases, namespace)
@@ -769,11 +772,12 @@ class Component(BaseComponent, ABC):
769
772
  and key not in component_specific_triggers
770
773
  and key not in props
771
774
  ):
772
- raise ValueError(
775
+ msg = (
773
776
  f"The {(comp_name := type(self).__name__)} does not take in an `{key}` event trigger. If {comp_name}"
774
777
  f" is a third party component make sure to add `{key}` to the component's event triggers. "
775
778
  f"visit https://reflex.dev/docs/wrapping-react/guide/#event-triggers for more info."
776
779
  )
780
+ raise ValueError(msg)
777
781
  if key in component_specific_triggers:
778
782
  # Event triggers are bound to event chains.
779
783
  is_var = False
@@ -844,7 +848,8 @@ class Component(BaseComponent, ABC):
844
848
  style = kwargs.get("style", {})
845
849
  if isinstance(style, Sequence):
846
850
  if any(not isinstance(s, Mapping) for s in style):
847
- raise TypeError("Style must be a dictionary or a list of dictionaries.")
851
+ msg = "Style must be a dictionary or a list of dictionaries."
852
+ raise TypeError(msg)
848
853
  # Merge styles, the later ones overriding keys in the earlier ones.
849
854
  style = {
850
855
  k: v
@@ -879,14 +884,12 @@ class Component(BaseComponent, ABC):
879
884
  if not isinstance(c, StringVar) and not issubclass(
880
885
  c._var_type, str
881
886
  ):
882
- raise TypeError(
883
- f"Invalid class_name passed for prop {type(self).__name__}.class_name, expected type str, got value {c._js_expr} of type {c._var_type}."
884
- )
887
+ msg = f"Invalid class_name passed for prop {type(self).__name__}.class_name, expected type str, got value {c._js_expr} of type {c._var_type}."
888
+ raise TypeError(msg)
885
889
  has_var = True
886
890
  else:
887
- raise TypeError(
888
- f"Invalid class_name passed for prop {type(self).__name__}.class_name, expected type str, got value {c} of type {type(c)}."
889
- )
891
+ msg = f"Invalid class_name passed for prop {type(self).__name__}.class_name, expected type str, got value {c} of type {type(c)}."
892
+ raise TypeError(msg)
890
893
  if has_var:
891
894
  kwargs["class_name"] = LiteralArrayVar.create(
892
895
  class_name, _var_type=list[str]
@@ -898,9 +901,8 @@ class Component(BaseComponent, ABC):
898
901
  and not isinstance(class_name, StringVar)
899
902
  and not issubclass(class_name._var_type, str)
900
903
  ):
901
- raise TypeError(
902
- f"Invalid class_name passed for prop {type(self).__name__}.class_name, expected type str, got value {class_name._js_expr} of type {class_name._var_type}."
903
- )
904
+ msg = f"Invalid class_name passed for prop {type(self).__name__}.class_name, expected type str, got value {class_name._js_expr} of type {class_name._var_type}."
905
+ raise TypeError(msg)
904
906
  # Construct the component.
905
907
  for key, value in kwargs.items():
906
908
  setattr(self, key, value)
@@ -1015,7 +1017,7 @@ class Component(BaseComponent, ABC):
1015
1017
  Returns:
1016
1018
  The unique fields.
1017
1019
  """
1018
- return set(cls.get_fields()) - set(Component.get_fields())
1020
+ return set(cls.get_js_fields())
1019
1021
 
1020
1022
  @classmethod
1021
1023
  @functools.cache
@@ -1227,9 +1229,8 @@ class Component(BaseComponent, ABC):
1227
1229
  """
1228
1230
  # 1. Default style from `_add_style`/`add_style`.
1229
1231
  if type(self)._add_style != Component._add_style:
1230
- raise UserWarning(
1231
- "Do not override _add_style directly. Use add_style instead."
1232
- )
1232
+ msg = "Do not override _add_style directly. Use add_style instead."
1233
+ raise UserWarning(msg)
1233
1234
  new_style = self._add_style()
1234
1235
  style_vars = [new_style._var_data]
1235
1236
 
@@ -1347,9 +1348,8 @@ class Component(BaseComponent, ABC):
1347
1348
  validate_child(child.default)
1348
1349
 
1349
1350
  if self._invalid_children and child_name in self._invalid_children:
1350
- raise ValueError(
1351
- f"The component `{comp_name}` cannot have `{child_name}` as a child component"
1352
- )
1351
+ msg = f"The component `{comp_name}` cannot have `{child_name}` as a child component"
1352
+ raise ValueError(msg)
1353
1353
 
1354
1354
  if self._valid_children and child_name not in [
1355
1355
  *self._valid_children,
@@ -1358,9 +1358,8 @@ class Component(BaseComponent, ABC):
1358
1358
  valid_child_list = ", ".join(
1359
1359
  [f"`{v_child}`" for v_child in self._valid_children]
1360
1360
  )
1361
- raise ValueError(
1362
- f"The component `{comp_name}` only allows the components: {valid_child_list} as children. Got `{child_name}` instead."
1363
- )
1361
+ msg = f"The component `{comp_name}` only allows the components: {valid_child_list} as children. Got `{child_name}` instead."
1362
+ raise ValueError(msg)
1364
1363
 
1365
1364
  if child._valid_parents and all(
1366
1365
  clz_name not in [*child._valid_parents, *allowed_components]
@@ -1369,9 +1368,8 @@ class Component(BaseComponent, ABC):
1369
1368
  valid_parent_list = ", ".join(
1370
1369
  [f"`{v_parent}`" for v_parent in child._valid_parents]
1371
1370
  )
1372
- raise ValueError(
1373
- f"The component `{child_name}` can only be a child of the components: {valid_parent_list}. Got `{comp_name}` instead."
1374
- )
1371
+ msg = f"The component `{child_name}` can only be a child of the components: {valid_parent_list}. Got `{comp_name}` instead."
1372
+ raise ValueError(msg)
1375
1373
 
1376
1374
  for child in children:
1377
1375
  validate_child(child)
@@ -1502,13 +1500,9 @@ class Component(BaseComponent, ABC):
1502
1500
  """
1503
1501
  if self.event_triggers and self._event_trigger_values_use_state():
1504
1502
  return True
1505
- else:
1506
- for child in self.children:
1507
- if (
1508
- isinstance(child, Component)
1509
- and child._has_stateful_event_triggers()
1510
- ):
1511
- return True
1503
+ for child in self.children:
1504
+ if isinstance(child, Component) and child._has_stateful_event_triggers():
1505
+ return True
1512
1506
  return False
1513
1507
 
1514
1508
  @classmethod
@@ -1767,6 +1761,7 @@ class Component(BaseComponent, ABC):
1767
1761
  {on_unmount or ""}
1768
1762
  }}
1769
1763
  }}, []);"""
1764
+ return None
1770
1765
 
1771
1766
  def _get_ref_hook(self) -> Var | None:
1772
1767
  """Generate the ref hook for the component.
@@ -1780,6 +1775,7 @@ class Component(BaseComponent, ABC):
1780
1775
  f"const {ref} = useRef(null); {Var(_js_expr=ref)._as_ref()!s} = {ref};",
1781
1776
  _var_data=VarData(position=Hooks.HookPosition.INTERNAL),
1782
1777
  )
1778
+ return None
1783
1779
 
1784
1780
  def _get_vars_hooks(self) -> dict[str, VarData | None]:
1785
1781
  """Get the hooks required by vars referenced in this component.
@@ -2198,7 +2194,17 @@ class CustomComponent(Component):
2198
2194
  Returns:
2199
2195
  The code to render the component.
2200
2196
  """
2201
- return self.component_fn(*self.get_prop_vars())
2197
+ component = self.component_fn(*self.get_prop_vars())
2198
+
2199
+ try:
2200
+ from reflex.utils.prerequisites import get_and_validate_app
2201
+
2202
+ style = get_and_validate_app().app.style
2203
+ except Exception:
2204
+ style = {}
2205
+
2206
+ component._add_style_recursive(style)
2207
+ return component
2202
2208
 
2203
2209
 
2204
2210
  CUSTOM_COMPONENTS: dict[str, CustomComponent] = {}
@@ -2222,7 +2228,7 @@ def _register_custom_component(
2222
2228
  _var_type=unwrap_var_annotation(annotation),
2223
2229
  ).guess_type()
2224
2230
  if not types.safe_issubclass(annotation, EventHandler)
2225
- else EventSpec(handler=EventHandler(fn=lambda: []))
2231
+ else EventSpec(handler=EventHandler(fn=no_args_event_spec))
2226
2232
  )
2227
2233
  for prop, annotation in typing.get_type_hints(component_fn).items()
2228
2234
  if prop != "return"
@@ -2233,7 +2239,8 @@ def _register_custom_component(
2233
2239
  **dummy_props,
2234
2240
  )
2235
2241
  if dummy_component.tag is None:
2236
- raise TypeError(f"Could not determine the tag name for {component_fn!r}")
2242
+ msg = f"Could not determine the tag name for {component_fn!r}"
2243
+ raise TypeError(msg)
2237
2244
  CUSTOM_COMPONENTS[dummy_component.tag] = dummy_component
2238
2245
 
2239
2246
 
@@ -2312,7 +2319,8 @@ class NoSSRComponent(Component):
2312
2319
  # extract the correct import name from library name
2313
2320
  base_import_name = self._get_import_name()
2314
2321
  if base_import_name is None:
2315
- raise ValueError("Undefined library for NoSSRComponent")
2322
+ msg = "Undefined library for NoSSRComponent"
2323
+ raise ValueError(msg)
2316
2324
  import_name = format.format_library_name(base_import_name)
2317
2325
 
2318
2326
  library_import = f"const {self.alias if self.alias else self.tag} = dynamic(() => import('{import_name}')"
@@ -2320,7 +2328,7 @@ class NoSSRComponent(Component):
2320
2328
  # https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#with-named-exports
2321
2329
  f".then((mod) => mod.{self.tag})" if not self.is_default else ""
2322
2330
  )
2323
- return "".join((library_import, mod_import, opts_fragment))
2331
+ return library_import + mod_import + opts_fragment
2324
2332
 
2325
2333
 
2326
2334
  class StatefulComponent(BaseComponent):
@@ -2540,7 +2548,7 @@ class StatefulComponent(BaseComponent):
2540
2548
  var_name = var_name.strip()
2541
2549
 
2542
2550
  # Break up array and object destructuring if used.
2543
- if var_name.startswith("[") or var_name.startswith("{"):
2551
+ if var_name.startswith(("[", "{")):
2544
2552
  return [
2545
2553
  v.strip().replace("...", "") for v in var_name.strip("[]{}").split(",")
2546
2554
  ]
@@ -256,7 +256,6 @@ class AutoScroll(Div):
256
256
  Returns:
257
257
  An AutoScroll component.
258
258
  """
259
- ...
260
259
 
261
260
  def add_imports(self) -> ImportDict | list[ImportDict]: ...
262
261
  def add_hooks(self) -> list[str | Var]: ...
@@ -93,7 +93,6 @@ class ConnectionToaster(Fragment):
93
93
  Returns:
94
94
  The connection toaster component.
95
95
  """
96
- ...
97
96
 
98
97
  class ConnectionBanner(Component):
99
98
  @overload
@@ -137,7 +136,6 @@ class ConnectionBanner(Component):
137
136
  Returns:
138
137
  The connection banner component.
139
138
  """
140
- ...
141
139
 
142
140
  class ConnectionModal(Component):
143
141
  @overload
@@ -181,7 +179,6 @@ class ConnectionModal(Component):
181
179
  Returns:
182
180
  The connection banner component.
183
181
  """
184
- ...
185
182
 
186
183
  class WifiOffPulse(Icon):
187
184
  @overload
@@ -235,7 +232,6 @@ class WifiOffPulse(Icon):
235
232
  Returns:
236
233
  The icon component with default props applied.
237
234
  """
238
- ...
239
235
 
240
236
  def add_imports(self) -> dict[str, str | ImportVar | list[str | ImportVar]]: ...
241
237
 
@@ -482,7 +478,6 @@ class ConnectionPulser(Div):
482
478
  Returns:
483
479
  The connection pulser component.
484
480
  """
485
- ...
486
481
 
487
482
  class BackendDisabled(Div):
488
483
  @overload
@@ -727,7 +722,6 @@ class BackendDisabled(Div):
727
722
  Returns:
728
723
  The backend disabled component.
729
724
  """
730
- ...
731
725
 
732
726
  connection_banner = ConnectionBanner.create
733
727
  connection_modal = ConnectionModal.create
@@ -75,19 +75,17 @@ class Breakpoints(dict[K, V]):
75
75
 
76
76
  if custom is not None:
77
77
  if any(threshold is not None for threshold in thresholds):
78
- raise ValueError("Named props cannot be used with custom thresholds")
78
+ msg = "Named props cannot be used with custom thresholds"
79
+ raise ValueError(msg)
79
80
 
80
81
  return Breakpoints(custom)
81
- else:
82
- return Breakpoints(
83
- {
84
- k: v
85
- for k, v in zip(
86
- ["initial", *breakpoint_names], thresholds, strict=True
87
- )
88
- if v is not None
89
- }
90
- )
82
+ return Breakpoints(
83
+ {
84
+ k: v
85
+ for k, v in zip(["initial", *breakpoint_names], thresholds, strict=True)
86
+ if v is not None
87
+ }
88
+ )
91
89
 
92
90
 
93
91
  breakpoints = Breakpoints.create
@@ -65,7 +65,6 @@ class ClientSideRouting(Component):
65
65
  Returns:
66
66
  The component.
67
67
  """
68
- ...
69
68
 
70
69
  def wait_for_client_redirect(component: Component) -> Component: ...
71
70
 
@@ -120,4 +119,3 @@ class Default404Page(Component):
120
119
  Returns:
121
120
  The component.
122
121
  """
123
- ...
@@ -70,7 +70,6 @@ class Clipboard(Fragment):
70
70
  Returns:
71
71
  The Clipboard Component.
72
72
  """
73
- ...
74
73
 
75
74
  def add_imports(self) -> dict[str, ImportVar]: ...
76
75
  def add_hooks(self) -> list[str | Var[str]]: ...
@@ -32,19 +32,22 @@ def color(
32
32
  """
33
33
  if isinstance(color, str):
34
34
  if color not in COLORS and REFLEX_VAR_OPENING_TAG not in color:
35
- raise ValueError(f"Color must be one of {COLORS}, received {color}")
35
+ msg = f"Color must be one of {COLORS}, received {color}"
36
+ raise ValueError(msg)
36
37
  elif not isinstance(color, Var):
37
- raise ValueError("Color must be a string or a Var")
38
+ msg = "Color must be a string or a Var"
39
+ raise ValueError(msg)
38
40
 
39
41
  if isinstance(shade, int):
40
42
  if shade < MIN_SHADE_VALUE or shade > MAX_SHADE_VALUE:
41
- raise ValueError(
42
- f"Shade must be between {MIN_SHADE_VALUE} and {MAX_SHADE_VALUE}"
43
- )
43
+ msg = f"Shade must be between {MIN_SHADE_VALUE} and {MAX_SHADE_VALUE}"
44
+ raise ValueError(msg)
44
45
  elif not isinstance(shade, Var):
45
- raise ValueError("Shade must be an integer or a Var")
46
+ msg = "Shade must be an integer or a Var"
47
+ raise ValueError(msg)
46
48
 
47
49
  if not isinstance(alpha, (bool, Var)):
48
- raise ValueError("Alpha must be a boolean or a Var")
50
+ msg = "Alpha must be a boolean or a Var"
51
+ raise ValueError(msg)
49
52
 
50
53
  return Color(color, shade, alpha)
@@ -132,7 +132,8 @@ def cond(condition: Any, c1: Any, c2: Any = types.Unset(), /) -> Component | Var
132
132
  # Convert the condition to a Var.
133
133
  cond_var = LiteralVar.create(condition)
134
134
  if cond_var is None:
135
- raise ValueError("The condition must be set.")
135
+ msg = "The condition must be set."
136
+ raise ValueError(msg)
136
137
 
137
138
  # If the first component is a component, create a Cond component.
138
139
  if isinstance(c1, BaseComponent):
@@ -145,7 +146,8 @@ def cond(condition: Any, c1: Any, c2: Any = types.Unset(), /) -> Component | Var
145
146
  if isinstance(c2, BaseComponent):
146
147
  return Cond.create(cond_var.bool(), Fragment.create(c1), c2)
147
148
  if isinstance(c2, types.Unset):
148
- raise ValueError("For conditional vars, the second argument must be set.")
149
+ msg = "For conditional vars, the second argument must be set."
150
+ raise ValueError(msg)
149
151
 
150
152
  # convert the truth and false cond parts into vars so the _var_data can be obtained.
151
153
  c1_var = Var.create(c1)
@@ -70,14 +70,16 @@ class DebounceInput(Component):
70
70
  ValueError: if the child element does not have an on_change handler.
71
71
  """
72
72
  if len(children) != 1:
73
- raise RuntimeError(
73
+ msg = (
74
74
  "Provide a single child for DebounceInput, such as rx.input() or "
75
- "rx.text_area()",
75
+ "rx.text_area()"
76
76
  )
77
+ raise RuntimeError(msg)
77
78
 
78
79
  child = children[0]
79
80
  if "on_change" not in child.event_triggers:
80
- raise ValueError("DebounceInput child requires an on_change handler")
81
+ msg = "DebounceInput child requires an on_change handler"
82
+ raise ValueError(msg)
81
83
 
82
84
  # Carry known props and event_triggers from the child.
83
85
  props_from_child = {
@@ -74,6 +74,5 @@ class DebounceInput(Component):
74
74
  RuntimeError: unless exactly one child element is provided.
75
75
  ValueError: if the child element does not have an on_change handler.
76
76
  """
77
- ...
78
77
 
79
78
  debounce_input = DebounceInput.create