reflex 0.4.5a1__py3-none-any.whl → 0.4.6__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 (199) hide show
  1. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +5 -15
  2. reflex/.templates/jinja/web/pages/index.js.jinja2 +4 -0
  3. reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +4 -0
  4. reflex/.templates/web/utils/state.js +3 -0
  5. reflex/__init__.py +12 -2
  6. reflex/__init__.pyi +4 -0
  7. reflex/app.py +23 -3
  8. reflex/base.py +16 -4
  9. reflex/compiler/compiler.py +1 -0
  10. reflex/compiler/utils.py +11 -2
  11. reflex/components/base/app_wrap.pyi +1 -1
  12. reflex/components/base/bare.py +3 -4
  13. reflex/components/base/body.pyi +1 -1
  14. reflex/components/base/document.pyi +1 -1
  15. reflex/components/base/fragment.pyi +1 -1
  16. reflex/components/base/head.pyi +1 -1
  17. reflex/components/base/link.pyi +1 -1
  18. reflex/components/base/meta.pyi +1 -1
  19. reflex/components/base/script.pyi +1 -1
  20. reflex/components/chakra/base.pyi +1 -1
  21. reflex/components/chakra/datadisplay/badge.pyi +1 -1
  22. reflex/components/chakra/datadisplay/code.pyi +1 -1
  23. reflex/components/chakra/datadisplay/divider.pyi +1 -1
  24. reflex/components/chakra/datadisplay/keyboard_key.pyi +1 -1
  25. reflex/components/chakra/datadisplay/list.pyi +1 -1
  26. reflex/components/chakra/datadisplay/stat.pyi +1 -1
  27. reflex/components/chakra/datadisplay/table.pyi +1 -1
  28. reflex/components/chakra/datadisplay/tag.pyi +1 -1
  29. reflex/components/chakra/disclosure/accordion.pyi +1 -1
  30. reflex/components/chakra/disclosure/tabs.pyi +1 -1
  31. reflex/components/chakra/disclosure/transition.pyi +1 -1
  32. reflex/components/chakra/disclosure/visuallyhidden.pyi +1 -1
  33. reflex/components/chakra/feedback/alert.pyi +1 -1
  34. reflex/components/chakra/feedback/circularprogress.pyi +1 -1
  35. reflex/components/chakra/feedback/progress.pyi +1 -1
  36. reflex/components/chakra/feedback/skeleton.pyi +1 -1
  37. reflex/components/chakra/feedback/spinner.pyi +1 -1
  38. reflex/components/chakra/forms/button.pyi +1 -1
  39. reflex/components/chakra/forms/checkbox.pyi +1 -1
  40. reflex/components/chakra/forms/colormodeswitch.pyi +1 -1
  41. reflex/components/chakra/forms/date_picker.pyi +1 -1
  42. reflex/components/chakra/forms/date_time_picker.pyi +1 -1
  43. reflex/components/chakra/forms/editable.pyi +1 -1
  44. reflex/components/chakra/forms/email.pyi +1 -1
  45. reflex/components/chakra/forms/form.pyi +1 -1
  46. reflex/components/chakra/forms/iconbutton.pyi +1 -1
  47. reflex/components/chakra/forms/input.pyi +1 -1
  48. reflex/components/chakra/forms/numberinput.pyi +1 -1
  49. reflex/components/chakra/forms/password.pyi +1 -1
  50. reflex/components/chakra/forms/pininput.pyi +1 -1
  51. reflex/components/chakra/forms/radio.pyi +1 -1
  52. reflex/components/chakra/forms/rangeslider.pyi +1 -1
  53. reflex/components/chakra/forms/select.pyi +1 -1
  54. reflex/components/chakra/forms/slider.pyi +1 -1
  55. reflex/components/chakra/forms/switch.pyi +1 -1
  56. reflex/components/chakra/forms/textarea.pyi +1 -1
  57. reflex/components/chakra/forms/time_picker.pyi +1 -1
  58. reflex/components/chakra/layout/aspect_ratio.pyi +1 -1
  59. reflex/components/chakra/layout/box.pyi +1 -1
  60. reflex/components/chakra/layout/card.pyi +1 -1
  61. reflex/components/chakra/layout/center.pyi +1 -1
  62. reflex/components/chakra/layout/container.pyi +1 -1
  63. reflex/components/chakra/layout/flex.pyi +1 -1
  64. reflex/components/chakra/layout/grid.pyi +1 -1
  65. reflex/components/chakra/layout/spacer.pyi +1 -1
  66. reflex/components/chakra/layout/stack.pyi +1 -1
  67. reflex/components/chakra/layout/wrap.pyi +1 -1
  68. reflex/components/chakra/media/avatar.pyi +1 -1
  69. reflex/components/chakra/media/icon.pyi +1 -1
  70. reflex/components/chakra/media/image.pyi +1 -1
  71. reflex/components/chakra/navigation/breadcrumb.pyi +1 -1
  72. reflex/components/chakra/navigation/link.pyi +1 -1
  73. reflex/components/chakra/navigation/linkoverlay.pyi +1 -1
  74. reflex/components/chakra/navigation/stepper.pyi +1 -1
  75. reflex/components/chakra/overlay/alertdialog.pyi +1 -1
  76. reflex/components/chakra/overlay/drawer.pyi +1 -1
  77. reflex/components/chakra/overlay/menu.pyi +1 -1
  78. reflex/components/chakra/overlay/modal.pyi +1 -1
  79. reflex/components/chakra/overlay/popover.pyi +1 -1
  80. reflex/components/chakra/overlay/tooltip.pyi +1 -1
  81. reflex/components/chakra/typography/heading.pyi +1 -1
  82. reflex/components/chakra/typography/highlight.pyi +1 -1
  83. reflex/components/chakra/typography/span.pyi +1 -1
  84. reflex/components/chakra/typography/text.pyi +1 -1
  85. reflex/components/component.py +82 -30
  86. reflex/components/core/banner.py +1 -2
  87. reflex/components/core/banner.pyi +1 -2
  88. reflex/components/core/client_side_routing.pyi +1 -1
  89. reflex/components/core/cond.py +1 -1
  90. reflex/components/core/debounce.pyi +1 -1
  91. reflex/components/core/html.pyi +1 -1
  92. reflex/components/core/responsive.py +1 -1
  93. reflex/components/core/upload.pyi +1 -1
  94. reflex/components/datadisplay/code.py +17 -9
  95. reflex/components/datadisplay/code.pyi +3 -1
  96. reflex/components/datadisplay/dataeditor.pyi +1 -1
  97. reflex/components/el/element.pyi +1 -1
  98. reflex/components/el/elements/base.pyi +1 -1
  99. reflex/components/el/elements/forms.py +78 -1
  100. reflex/components/el/elements/forms.pyi +10 -2
  101. reflex/components/el/elements/inline.pyi +1 -1
  102. reflex/components/el/elements/media.pyi +1 -1
  103. reflex/components/el/elements/metadata.pyi +1 -1
  104. reflex/components/el/elements/other.pyi +1 -1
  105. reflex/components/el/elements/scripts.pyi +1 -1
  106. reflex/components/el/elements/sectioning.pyi +1 -1
  107. reflex/components/el/elements/tables.pyi +1 -1
  108. reflex/components/el/elements/typography.pyi +1 -1
  109. reflex/components/gridjs/datatable.pyi +1 -1
  110. reflex/components/lucide/icon.py +275 -115
  111. reflex/components/lucide/icon.pyi +259 -114
  112. reflex/components/markdown/markdown.pyi +1 -1
  113. reflex/components/moment/moment.pyi +1 -1
  114. reflex/components/next/base.pyi +1 -1
  115. reflex/components/next/image.pyi +1 -1
  116. reflex/components/next/link.pyi +1 -1
  117. reflex/components/next/video.pyi +1 -1
  118. reflex/components/plotly/plotly.pyi +1 -1
  119. reflex/components/radix/primitives/accordion.pyi +1 -1
  120. reflex/components/radix/primitives/base.pyi +1 -1
  121. reflex/components/radix/primitives/drawer.pyi +1 -1
  122. reflex/components/radix/primitives/form.pyi +1 -1
  123. reflex/components/radix/primitives/progress.pyi +1 -1
  124. reflex/components/radix/primitives/slider.pyi +1 -1
  125. reflex/components/radix/themes/base.pyi +1 -1
  126. reflex/components/radix/themes/color_mode.pyi +1 -1
  127. reflex/components/radix/themes/components/alert_dialog.pyi +1 -1
  128. reflex/components/radix/themes/components/aspect_ratio.pyi +1 -1
  129. reflex/components/radix/themes/components/avatar.pyi +1 -1
  130. reflex/components/radix/themes/components/badge.pyi +1 -1
  131. reflex/components/radix/themes/components/button.pyi +1 -1
  132. reflex/components/radix/themes/components/callout.pyi +1 -1
  133. reflex/components/radix/themes/components/card.pyi +1 -1
  134. reflex/components/radix/themes/components/checkbox.pyi +1 -1
  135. reflex/components/radix/themes/components/context_menu.pyi +1 -1
  136. reflex/components/radix/themes/components/dialog.pyi +1 -1
  137. reflex/components/radix/themes/components/dropdown_menu.pyi +1 -1
  138. reflex/components/radix/themes/components/hover_card.pyi +1 -1
  139. reflex/components/radix/themes/components/icon_button.pyi +1 -1
  140. reflex/components/radix/themes/components/inset.pyi +1 -1
  141. reflex/components/radix/themes/components/popover.pyi +1 -1
  142. reflex/components/radix/themes/components/radio_group.pyi +1 -1
  143. reflex/components/radix/themes/components/scroll_area.pyi +1 -1
  144. reflex/components/radix/themes/components/select.py +4 -1
  145. reflex/components/radix/themes/components/select.pyi +5 -1
  146. reflex/components/radix/themes/components/separator.pyi +1 -1
  147. reflex/components/radix/themes/components/slider.pyi +1 -1
  148. reflex/components/radix/themes/components/switch.pyi +1 -1
  149. reflex/components/radix/themes/components/table.pyi +1 -1
  150. reflex/components/radix/themes/components/tabs.pyi +1 -1
  151. reflex/components/radix/themes/components/text_area.pyi +5 -1
  152. reflex/components/radix/themes/components/text_field.pyi +1 -1
  153. reflex/components/radix/themes/components/tooltip.pyi +1 -1
  154. reflex/components/radix/themes/layout/__init__.py +5 -4
  155. reflex/components/radix/themes/layout/base.pyi +1 -1
  156. reflex/components/radix/themes/layout/box.pyi +1 -1
  157. reflex/components/radix/themes/layout/center.pyi +1 -1
  158. reflex/components/radix/themes/layout/container.pyi +1 -1
  159. reflex/components/radix/themes/layout/flex.pyi +1 -1
  160. reflex/components/radix/themes/layout/grid.pyi +1 -1
  161. reflex/components/radix/themes/layout/list.py +21 -13
  162. reflex/components/radix/themes/layout/list.pyi +139 -481
  163. reflex/components/radix/themes/layout/section.pyi +1 -1
  164. reflex/components/radix/themes/layout/spacer.pyi +1 -1
  165. reflex/components/radix/themes/layout/stack.pyi +1 -1
  166. reflex/components/radix/themes/typography/blockquote.pyi +1 -1
  167. reflex/components/radix/themes/typography/code.pyi +1 -1
  168. reflex/components/radix/themes/typography/heading.pyi +1 -1
  169. reflex/components/radix/themes/typography/link.pyi +1 -1
  170. reflex/components/radix/themes/typography/text.pyi +1 -1
  171. reflex/components/react_player/audio.pyi +1 -1
  172. reflex/components/react_player/react_player.pyi +1 -1
  173. reflex/components/react_player/video.pyi +1 -1
  174. reflex/components/recharts/cartesian.pyi +1 -1
  175. reflex/components/recharts/charts.pyi +1 -1
  176. reflex/components/recharts/general.pyi +1 -1
  177. reflex/components/recharts/polar.pyi +1 -1
  178. reflex/components/recharts/recharts.pyi +1 -1
  179. reflex/components/suneditor/editor.pyi +1 -1
  180. reflex/config.py +12 -2
  181. reflex/custom_components/custom_components.py +305 -21
  182. reflex/event.py +36 -46
  183. reflex/reflex.py +19 -13
  184. reflex/state.py +184 -39
  185. reflex/testing.py +15 -11
  186. reflex/utils/console.py +15 -7
  187. reflex/utils/exec.py +9 -0
  188. reflex/utils/prerequisites.py +12 -1
  189. reflex/utils/processes.py +8 -25
  190. reflex/utils/pyi_generator.py +842 -0
  191. reflex/utils/telemetry.py +18 -1
  192. reflex/utils/types.py +14 -2
  193. reflex/vars.py +33 -3
  194. {reflex-0.4.5a1.dist-info → reflex-0.4.6.dist-info}/METADATA +31 -29
  195. {reflex-0.4.5a1.dist-info → reflex-0.4.6.dist-info}/RECORD +198 -198
  196. reflex/page.pyi +0 -17
  197. {reflex-0.4.5a1.dist-info → reflex-0.4.6.dist-info}/LICENSE +0 -0
  198. {reflex-0.4.5a1.dist-info → reflex-0.4.6.dist-info}/WHEEL +0 -0
  199. {reflex-0.4.5a1.dist-info → reflex-0.4.6.dist-info}/entry_points.txt +0 -0
reflex/utils/telemetry.py CHANGED
@@ -11,6 +11,7 @@ import psutil
11
11
 
12
12
  from reflex import constants
13
13
  from reflex.utils import console
14
+ from reflex.utils.exec import should_skip_compile
14
15
  from reflex.utils.prerequisites import ensure_reflex_installation_id, get_project_hash
15
16
 
16
17
  POSTHOG_API_URL: str = "https://app.posthog.com/capture/"
@@ -64,6 +65,22 @@ def get_memory() -> int:
64
65
  return 0
65
66
 
66
67
 
68
+ def _raise_on_missing_project_hash() -> bool:
69
+ """Check if an error should be raised when project hash is missing.
70
+
71
+ When running reflex with --backend-only, or doing database migration
72
+ operations, there is no requirement for a .web directory, so the reflex.json
73
+ file may not exist, and this should not be considered an error.
74
+
75
+ Returns:
76
+ False when compilation should be skipped (i.e. no .web directory is required).
77
+ Otherwise return True.
78
+ """
79
+ if should_skip_compile():
80
+ return False
81
+ return True
82
+
83
+
67
84
  def _prepare_event(event: str) -> dict:
68
85
  """Prepare the event to be sent to the PostHog server.
69
86
 
@@ -74,7 +91,7 @@ def _prepare_event(event: str) -> dict:
74
91
  The event data.
75
92
  """
76
93
  installation_id = ensure_reflex_installation_id()
77
- project_hash = get_project_hash(raise_on_fail=True)
94
+ project_hash = get_project_hash(raise_on_fail=_raise_on_missing_project_hash())
78
95
 
79
96
  if installation_id is None or project_hash is None:
80
97
  console.debug(
reflex/utils/types.py CHANGED
@@ -7,6 +7,7 @@ import inspect
7
7
  import types
8
8
  from functools import wraps
9
9
  from typing import (
10
+ TYPE_CHECKING,
10
11
  Any,
11
12
  Callable,
12
13
  Iterable,
@@ -22,7 +23,18 @@ from typing import (
22
23
  )
23
24
 
24
25
  import sqlalchemy
25
- from pydantic.fields import ModelField
26
+
27
+ try:
28
+ # TODO The type checking guard can be removed once
29
+ # reflex-hosting-cli tools are compatible with pydantic v2
30
+
31
+ if not TYPE_CHECKING:
32
+ import pydantic.v1.fields as ModelField
33
+ else:
34
+ raise ModuleNotFoundError
35
+ except ModuleNotFoundError:
36
+ from pydantic.fields import ModelField
37
+
26
38
  from sqlalchemy.ext.associationproxy import AssociationProxyInstance
27
39
  from sqlalchemy.ext.hybrid import hybrid_property
28
40
  from sqlalchemy.orm import DeclarativeBase, Mapped, QueryableAttribute, Relationship
@@ -202,7 +214,7 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
202
214
  attr.remote_attr.key, # type: ignore[attr-defined]
203
215
  )
204
216
  ]
205
- elif isinstance(cls, type) and issubclass(cls, Model):
217
+ elif isinstance(cls, type) and not is_generic_alias(cls) and issubclass(cls, Model):
206
218
  # Check in the annotations directly (for sqlmodel.Relationship)
207
219
  hints = get_type_hints(cls)
208
220
  if name in hints:
reflex/vars.py CHANGED
@@ -677,6 +677,33 @@ class Var:
677
677
  _var_is_string=False,
678
678
  )
679
679
 
680
+ def __getattribute__(self, name: str) -> Any:
681
+ """Get a var attribute.
682
+
683
+ Args:
684
+ name: The name of the attribute.
685
+
686
+ Returns:
687
+ The var attribute.
688
+
689
+ Raises:
690
+ AttributeError: If the attribute cannot be found, or if __getattr__ fallback should be used.
691
+ """
692
+ try:
693
+ var_attribute = super().__getattribute__(name)
694
+ if not name.startswith("_"):
695
+ # Check if the attribute should be accessed through the Var instead of
696
+ # accessing one of the Var operations
697
+ type_ = types.get_attribute_access_type(
698
+ super().__getattribute__("_var_type"), name
699
+ )
700
+ if type_ is not None:
701
+ raise AttributeError(f"{name} is being accessed through the Var.")
702
+ # Return the attribute as-is.
703
+ return var_attribute
704
+ except AttributeError:
705
+ raise # fall back to __getattr__ anyway
706
+
680
707
  def __getattr__(self, name: str) -> Var:
681
708
  """Get a var attribute.
682
709
 
@@ -1861,6 +1888,8 @@ class ComputedVar(Var, property):
1861
1888
  # handle caching
1862
1889
  if not hasattr(instance, self._cache_attr):
1863
1890
  setattr(instance, self._cache_attr, super().__get__(instance, owner))
1891
+ # Ensure the computed var gets serialized to redis.
1892
+ instance._was_touched = True
1864
1893
  return getattr(instance, self._cache_attr)
1865
1894
 
1866
1895
  def _deps(
@@ -1889,8 +1918,9 @@ class ComputedVar(Var, property):
1889
1918
  """
1890
1919
  d = set()
1891
1920
  if obj is None:
1892
- if self.fget is not None:
1893
- obj = cast(FunctionType, self.fget)
1921
+ fget = property.__getattribute__(self, "fget")
1922
+ if fget is not None:
1923
+ obj = cast(FunctionType, fget)
1894
1924
  else:
1895
1925
  return set()
1896
1926
  with contextlib.suppress(AttributeError):
@@ -1974,7 +2004,7 @@ class ComputedVar(Var, property):
1974
2004
  Returns:
1975
2005
  The type of the var.
1976
2006
  """
1977
- hints = get_type_hints(self.fget)
2007
+ hints = get_type_hints(property.__getattribute__(self, "fget"))
1978
2008
  if "return" in hints:
1979
2009
  return hints["return"]
1980
2010
  return Any
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: reflex
3
- Version: 0.4.5a1
3
+ Version: 0.4.6
4
4
  Summary: Web apps in pure Python.
5
5
  Home-page: https://reflex.dev
6
6
  License: Apache-2.0
@@ -15,36 +15,38 @@ Classifier: Programming Language :: Python :: 3.8
15
15
  Classifier: Programming Language :: Python :: 3.9
16
16
  Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
- Requires-Dist: alembic (>=1.11.1,<2.0.0)
19
- Requires-Dist: build (>=1.0.3,<2.0.0)
20
- Requires-Dist: charset-normalizer (>=3.3.2,<4.0.0)
21
- Requires-Dist: cloudpickle (>=2.2.1,<3.0.0)
22
- Requires-Dist: distro (>=1.8.0,<2.0.0) ; sys_platform == "linux"
23
- Requires-Dist: fastapi (>=0.96.0,<0.97.0)
24
- Requires-Dist: gunicorn (>=20.1.0,<21.0.0)
25
- Requires-Dist: httpx (>=0.25.1)
26
- Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
27
- Requires-Dist: packaging (>=23.1,<24.0)
28
- Requires-Dist: platformdirs (>=3.10.0,<4.0.0)
29
- Requires-Dist: psutil (>=5.9.4,<6.0.0)
30
- Requires-Dist: pydantic (>=1.10.2,<2.0.0)
18
+ Requires-Dist: alembic (>=1.11.1,<2.0)
19
+ Requires-Dist: build (>=1.0.3,<2.0)
20
+ Requires-Dist: charset-normalizer (>=3.3.2,<4.0)
21
+ Requires-Dist: dill (>=0.3.8,<0.4)
22
+ Requires-Dist: distro (>=1.8.0,<2.0) ; sys_platform == "linux"
23
+ Requires-Dist: fastapi (>=0.96.0,<1.0)
24
+ Requires-Dist: gunicorn (>=20.1.0,<22.0)
25
+ Requires-Dist: httpx (>=0.25.1,<1.0)
26
+ Requires-Dist: jinja2 (>=3.1.2,<4.0)
27
+ Requires-Dist: packaging (>=23.1,<25.0)
28
+ Requires-Dist: platformdirs (>=3.10.0,<5.0)
29
+ Requires-Dist: psutil (>=5.9.4,<6.0)
30
+ Requires-Dist: pydantic (>=1.10.2,<3.0)
31
31
  Requires-Dist: python-engineio (!=4.6.0)
32
- Requires-Dist: python-multipart (>=0.0.5,<0.0.6)
33
- Requires-Dist: python-socketio (>=5.7.0,<6.0.0)
34
- Requires-Dist: redis (>=4.3.5,<5.0.0)
35
- Requires-Dist: reflex-hosting-cli (>=0.1.2)
36
- Requires-Dist: rich (>=13.0.0,<14.0.0)
37
- Requires-Dist: setuptools (>=69.1.1,<70.0.0)
38
- Requires-Dist: sqlmodel (>=0.0.14,<0.0.15)
39
- Requires-Dist: starlette-admin (>=0.9.0,<0.10.0)
40
- Requires-Dist: typer (>=0.4.2,<1)
32
+ Requires-Dist: python-multipart (>=0.0.5,<0.1)
33
+ Requires-Dist: python-socketio (>=5.7.0,<6.0)
34
+ Requires-Dist: redis (>=4.3.5,<6.0)
35
+ Requires-Dist: reflex-hosting-cli (>=0.1.2,<2.0)
36
+ Requires-Dist: rich (>=13.0.0,<14.0)
37
+ Requires-Dist: setuptools (>=69.1.1,<70.0)
38
+ Requires-Dist: sqlmodel (>=0.0.14,<0.1)
39
+ Requires-Dist: starlette-admin (>=0.11.0,<1.0)
40
+ Requires-Dist: tomlkit (>=0.12.4,<1.0)
41
+ Requires-Dist: twine (>=4.0.0,<6.0)
42
+ Requires-Dist: typer (>=0.4.2,<1.0)
41
43
  Requires-Dist: uvicorn (>=0.20.0,<0.21.0) ; python_version < "3.12"
42
44
  Requires-Dist: uvicorn (>=0.24.0,<0.25.0) ; python_version >= "3.12"
43
- Requires-Dist: watchdog (>=2.3.1,<3.0.0)
44
- Requires-Dist: watchfiles (>=0.19.0,<0.20.0)
45
- Requires-Dist: wheel (>=0.42.0,<0.43.0)
46
- Requires-Dist: wrapt (>=1.11.0,<2.0.0) ; python_version < "3.11"
47
- Requires-Dist: wrapt (>=1.14.0,<2.0.0) ; python_version >= "3.11"
45
+ Requires-Dist: watchdog (>=2.3.1,<5.0)
46
+ Requires-Dist: watchfiles (>=0.19.0,<1.0)
47
+ Requires-Dist: wheel (>=0.42.0,<1.0)
48
+ Requires-Dist: wrapt (>=1.11.0,<2.0) ; python_version < "3.11"
49
+ Requires-Dist: wrapt (>=1.14.0,<2.0) ; python_version >= "3.11"
48
50
  Project-URL: Documentation, https://reflex.dev/docs/getting-started/introduction
49
51
  Project-URL: Repository, https://github.com/reflex-dev/reflex
50
52
  Description-Content-Type: text/markdown
@@ -256,7 +258,7 @@ You can create a multi-page app by adding more pages.
256
258
 
257
259
  <div align="center">
258
260
 
259
- 📑 [Docs](https://reflex.dev/docs/getting-started/introduction) &nbsp; | &nbsp; 🗞️ [Blog](https://reflex.dev/blog) &nbsp; | &nbsp; 📱 [Component Library](https://reflex.dev/docs/library) &nbsp; | &nbsp; 🖼️ [Gallery](https://reflex.dev/docs/gallery) &nbsp; | &nbsp; 🛸 [Deployment](https://reflex.dev/docs/hosting/deploy) &nbsp;
261
+ 📑 [Docs](https://reflex.dev/docs/getting-started/introduction) &nbsp; | &nbsp; 🗞️ [Blog](https://reflex.dev/blog) &nbsp; | &nbsp; 📱 [Component Library](https://reflex.dev/docs/library) &nbsp; | &nbsp; 🖼️ [Gallery](https://reflex.dev/docs/gallery) &nbsp; | &nbsp; 🛸 [Deployment](https://reflex.dev/docs/hosting/deploy-quick-start) &nbsp;
260
262
 
261
263
  </div>
262
264