reflex 0.5.10a3__py3-none-any.whl → 0.6.0a1__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 (237) hide show
  1. reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -4
  2. reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
  3. reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
  4. reflex/__init__.py +3 -2
  5. reflex/__init__.pyi +2 -2
  6. reflex/app.py +43 -9
  7. reflex/base.py +3 -2
  8. reflex/compiler/compiler.py +6 -6
  9. reflex/compiler/utils.py +5 -3
  10. reflex/components/base/app_wrap.py +2 -4
  11. reflex/components/base/app_wrap.pyi +17 -17
  12. reflex/components/base/bare.py +7 -4
  13. reflex/components/base/body.pyi +17 -17
  14. reflex/components/base/document.pyi +81 -81
  15. reflex/components/base/error_boundary.py +10 -8
  16. reflex/components/base/error_boundary.pyi +20 -19
  17. reflex/components/base/fragment.pyi +17 -17
  18. reflex/components/base/head.pyi +33 -33
  19. reflex/components/base/link.pyi +34 -33
  20. reflex/components/base/meta.pyi +65 -65
  21. reflex/components/base/script.py +2 -1
  22. reflex/components/base/script.pyi +21 -20
  23. reflex/components/component.py +116 -145
  24. reflex/components/core/banner.py +59 -60
  25. reflex/components/core/banner.pyi +86 -150
  26. reflex/components/core/client_side_routing.py +2 -1
  27. reflex/components/core/client_side_routing.pyi +34 -33
  28. reflex/components/core/clipboard.py +2 -2
  29. reflex/components/core/clipboard.pyi +19 -18
  30. reflex/components/core/cond.py +21 -44
  31. reflex/components/core/debounce.py +6 -8
  32. reflex/components/core/debounce.pyi +19 -18
  33. reflex/components/core/foreach.py +5 -14
  34. reflex/components/core/html.pyi +18 -17
  35. reflex/components/core/match.py +36 -43
  36. reflex/components/core/upload.py +32 -25
  37. reflex/components/core/upload.pyi +84 -73
  38. reflex/components/datadisplay/code.py +55 -28
  39. reflex/components/datadisplay/code.pyi +20 -17
  40. reflex/components/datadisplay/dataeditor.py +17 -11
  41. reflex/components/datadisplay/dataeditor.pyi +34 -33
  42. reflex/components/el/__init__.py +0 -1
  43. reflex/components/el/__init__.pyi +0 -11
  44. reflex/components/el/element.pyi +17 -17
  45. reflex/components/el/elements/__init__.py +1 -7
  46. reflex/components/el/elements/__init__.pyi +1 -15
  47. reflex/components/el/elements/base.pyi +18 -17
  48. reflex/components/el/elements/forms.py +24 -31
  49. reflex/components/el/elements/forms.pyi +237 -236
  50. reflex/components/el/elements/inline.pyi +450 -449
  51. reflex/components/el/elements/media.py +0 -21
  52. reflex/components/el/elements/media.pyi +338 -337
  53. reflex/components/el/elements/metadata.py +3 -2
  54. reflex/components/el/elements/metadata.pyi +98 -97
  55. reflex/components/el/elements/other.pyi +114 -113
  56. reflex/components/el/elements/scripts.pyi +50 -49
  57. reflex/components/el/elements/sectioning.pyi +242 -241
  58. reflex/components/el/elements/tables.pyi +162 -161
  59. reflex/components/el/elements/typography.pyi +242 -241
  60. reflex/components/gridjs/datatable.py +13 -14
  61. reflex/components/gridjs/datatable.pyi +34 -33
  62. reflex/components/lucide/icon.py +2 -126
  63. reflex/components/lucide/icon.pyi +34 -142
  64. reflex/components/markdown/markdown.py +30 -35
  65. reflex/components/markdown/markdown.pyi +29 -32
  66. reflex/components/moment/moment.pyi +19 -18
  67. reflex/components/next/base.pyi +17 -17
  68. reflex/components/next/image.py +0 -4
  69. reflex/components/next/image.pyi +20 -19
  70. reflex/components/next/link.pyi +18 -17
  71. reflex/components/next/video.pyi +18 -17
  72. reflex/components/plotly/plotly.py +16 -28
  73. reflex/components/plotly/plotly.pyi +36 -35
  74. reflex/components/props.py +21 -10
  75. reflex/components/radix/__init__.pyi +1 -1
  76. reflex/components/radix/primitives/__init__.pyi +0 -1
  77. reflex/components/radix/primitives/accordion.py +7 -8
  78. reflex/components/radix/primitives/accordion.pyi +117 -116
  79. reflex/components/radix/primitives/base.pyi +34 -33
  80. reflex/components/radix/primitives/drawer.pyi +169 -168
  81. reflex/components/radix/primitives/form.pyi +168 -167
  82. reflex/components/radix/primitives/progress.pyi +82 -81
  83. reflex/components/radix/primitives/slider.pyi +84 -83
  84. reflex/components/radix/themes/base.py +8 -4
  85. reflex/components/radix/themes/base.pyi +114 -113
  86. reflex/components/radix/themes/color_mode.py +12 -21
  87. reflex/components/radix/themes/color_mode.pyi +67 -67
  88. reflex/components/radix/themes/components/__init__.pyi +1 -0
  89. reflex/components/radix/themes/components/alert_dialog.pyi +118 -117
  90. reflex/components/radix/themes/components/aspect_ratio.pyi +18 -17
  91. reflex/components/radix/themes/components/avatar.pyi +18 -17
  92. reflex/components/radix/themes/components/badge.pyi +18 -17
  93. reflex/components/radix/themes/components/button.pyi +18 -17
  94. reflex/components/radix/themes/components/callout.pyi +82 -81
  95. reflex/components/radix/themes/components/card.pyi +18 -17
  96. reflex/components/radix/themes/components/checkbox.py +2 -3
  97. reflex/components/radix/themes/components/checkbox.pyi +53 -52
  98. reflex/components/radix/themes/components/checkbox_cards.pyi +34 -33
  99. reflex/components/radix/themes/components/checkbox_group.pyi +34 -33
  100. reflex/components/radix/themes/components/context_menu.pyi +140 -139
  101. reflex/components/radix/themes/components/data_list.py +5 -0
  102. reflex/components/radix/themes/components/data_list.pyi +71 -65
  103. reflex/components/radix/themes/components/dialog.pyi +121 -120
  104. reflex/components/radix/themes/components/dropdown_menu.pyi +142 -141
  105. reflex/components/radix/themes/components/hover_card.pyi +68 -67
  106. reflex/components/radix/themes/components/icon_button.py +2 -1
  107. reflex/components/radix/themes/components/icon_button.pyi +18 -17
  108. reflex/components/radix/themes/components/inset.pyi +18 -17
  109. reflex/components/radix/themes/components/popover.pyi +73 -72
  110. reflex/components/radix/themes/components/progress.pyi +18 -17
  111. reflex/components/radix/themes/components/radio.pyi +18 -17
  112. reflex/components/radix/themes/components/radio_cards.pyi +35 -34
  113. reflex/components/radix/themes/components/radio_group.py +35 -31
  114. reflex/components/radix/themes/components/radio_group.pyi +73 -66
  115. reflex/components/radix/themes/components/scroll_area.pyi +18 -17
  116. reflex/components/radix/themes/components/segmented_control.pyi +35 -34
  117. reflex/components/radix/themes/components/select.py +2 -1
  118. reflex/components/radix/themes/components/select.pyi +155 -154
  119. reflex/components/radix/themes/components/separator.py +2 -3
  120. reflex/components/radix/themes/components/separator.pyi +18 -17
  121. reflex/components/radix/themes/components/skeleton.pyi +18 -17
  122. reflex/components/radix/themes/components/slider.py +2 -1
  123. reflex/components/radix/themes/components/slider.pyi +20 -19
  124. reflex/components/radix/themes/components/spinner.pyi +18 -17
  125. reflex/components/radix/themes/components/switch.pyi +19 -18
  126. reflex/components/radix/themes/components/table.pyi +114 -113
  127. reflex/components/radix/themes/components/tabs.pyi +84 -83
  128. reflex/components/radix/themes/components/text_area.pyi +21 -20
  129. reflex/components/radix/themes/components/text_field.py +0 -79
  130. reflex/components/radix/themes/components/text_field.pyi +57 -63
  131. reflex/components/radix/themes/components/tooltip.pyi +21 -20
  132. reflex/components/radix/themes/layout/base.pyi +18 -17
  133. reflex/components/radix/themes/layout/box.pyi +18 -17
  134. reflex/components/radix/themes/layout/center.pyi +18 -17
  135. reflex/components/radix/themes/layout/container.py +2 -3
  136. reflex/components/radix/themes/layout/container.pyi +18 -17
  137. reflex/components/radix/themes/layout/flex.pyi +18 -17
  138. reflex/components/radix/themes/layout/grid.pyi +18 -17
  139. reflex/components/radix/themes/layout/list.py +5 -4
  140. reflex/components/radix/themes/layout/list.pyi +86 -85
  141. reflex/components/radix/themes/layout/section.py +2 -3
  142. reflex/components/radix/themes/layout/section.pyi +18 -17
  143. reflex/components/radix/themes/layout/spacer.pyi +18 -17
  144. reflex/components/radix/themes/layout/stack.pyi +50 -49
  145. reflex/components/radix/themes/typography/blockquote.pyi +18 -17
  146. reflex/components/radix/themes/typography/code.pyi +18 -17
  147. reflex/components/radix/themes/typography/heading.pyi +18 -17
  148. reflex/components/radix/themes/typography/link.pyi +18 -17
  149. reflex/components/radix/themes/typography/text.pyi +114 -113
  150. reflex/components/react_player/audio.pyi +34 -33
  151. reflex/components/react_player/react_player.pyi +34 -33
  152. reflex/components/react_player/video.pyi +34 -33
  153. reflex/components/recharts/cartesian.py +23 -19
  154. reflex/components/recharts/cartesian.pyi +297 -296
  155. reflex/components/recharts/charts.py +6 -5
  156. reflex/components/recharts/charts.pyi +179 -178
  157. reflex/components/recharts/general.py +8 -7
  158. reflex/components/recharts/general.pyi +82 -81
  159. reflex/components/recharts/polar.py +14 -13
  160. reflex/components/recharts/polar.pyi +76 -75
  161. reflex/components/recharts/recharts.pyi +33 -33
  162. reflex/components/sonner/toast.py +30 -33
  163. reflex/components/sonner/toast.pyi +27 -25
  164. reflex/components/suneditor/editor.py +2 -1
  165. reflex/components/suneditor/editor.pyi +27 -26
  166. reflex/components/tags/iter_tag.py +16 -16
  167. reflex/components/tags/tag.py +8 -10
  168. reflex/constants/base.py +3 -1
  169. reflex/constants/event.py +1 -0
  170. reflex/event.py +89 -79
  171. reflex/experimental/__init__.py +25 -6
  172. reflex/experimental/client_state.py +34 -58
  173. reflex/experimental/hooks.py +13 -18
  174. reflex/experimental/layout.py +5 -5
  175. reflex/experimental/layout.pyi +84 -83
  176. reflex/{experimental/vars → ivars}/__init__.py +0 -1
  177. reflex/ivars/base.py +2180 -0
  178. reflex/ivars/function.py +200 -0
  179. reflex/ivars/number.py +1137 -0
  180. reflex/ivars/object.py +564 -0
  181. reflex/ivars/sequence.py +1601 -0
  182. reflex/model.py +22 -0
  183. reflex/reflex.py +4 -0
  184. reflex/state.py +388 -73
  185. reflex/style.py +52 -34
  186. reflex/testing.py +8 -3
  187. reflex/utils/exceptions.py +12 -0
  188. reflex/utils/exec.py +0 -14
  189. reflex/utils/format.py +74 -223
  190. reflex/utils/net.py +43 -0
  191. reflex/utils/path_ops.py +13 -1
  192. reflex/utils/prerequisites.py +46 -26
  193. reflex/utils/pyi_generator.py +5 -4
  194. reflex/utils/serializers.py +13 -31
  195. reflex/utils/types.py +44 -9
  196. reflex/vars.py +127 -2230
  197. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/METADATA +4 -6
  198. reflex-0.6.0a1.dist-info/RECORD +384 -0
  199. reflex/.templates/apps/demo/.gitignore +0 -4
  200. reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  201. reflex/.templates/apps/demo/assets/github.svg +0 -10
  202. reflex/.templates/apps/demo/assets/icon.svg +0 -37
  203. reflex/.templates/apps/demo/assets/logo.svg +0 -68
  204. reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
  205. reflex/.templates/apps/demo/code/__init__.py +0 -1
  206. reflex/.templates/apps/demo/code/demo.py +0 -127
  207. reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
  208. reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
  209. reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
  210. reflex/.templates/apps/demo/code/pages/forms.py +0 -257
  211. reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
  212. reflex/.templates/apps/demo/code/pages/home.py +0 -56
  213. reflex/.templates/apps/demo/code/sidebar.py +0 -178
  214. reflex/.templates/apps/demo/code/state.py +0 -22
  215. reflex/.templates/apps/demo/code/states/form_state.py +0 -40
  216. reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
  217. reflex/.templates/apps/demo/code/styles.py +0 -68
  218. reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  219. reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
  220. reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
  221. reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
  222. reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
  223. reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
  224. reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
  225. reflex/.templates/apps/demo/code/webui/state.py +0 -146
  226. reflex/.templates/apps/demo/code/webui/styles.py +0 -88
  227. reflex/experimental/vars/base.py +0 -583
  228. reflex/experimental/vars/function.py +0 -290
  229. reflex/experimental/vars/number.py +0 -1458
  230. reflex/experimental/vars/object.py +0 -804
  231. reflex/experimental/vars/sequence.py +0 -1764
  232. reflex/utils/watch.py +0 -96
  233. reflex/vars.pyi +0 -218
  234. reflex-0.5.10a3.dist-info/RECORD +0 -413
  235. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/LICENSE +0 -0
  236. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/WHEEL +0 -0
  237. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/entry_points.txt +0 -0
@@ -1,178 +0,0 @@
1
- """Sidebar component for the app."""
2
-
3
- import reflex as rx
4
-
5
- from .state import State
6
- from .styles import *
7
-
8
-
9
- def sidebar_header() -> rx.Component:
10
- """Sidebar header.
11
-
12
- Returns:
13
- rx.Component: The sidebar header component.
14
- """
15
- return rx.chakra.hstack(
16
- rx.chakra.image(
17
- src="/icon.svg",
18
- height="2em",
19
- ),
20
- rx.chakra.spacer(),
21
- rx.chakra.link(
22
- rx.chakra.center(
23
- rx.chakra.image(
24
- src="/github.svg",
25
- height="3em",
26
- padding="0.5em",
27
- ),
28
- box_shadow=box_shadow,
29
- bg="transparent",
30
- border_radius=border_radius,
31
- _hover={
32
- "bg": accent_color,
33
- },
34
- ),
35
- href="https://github.com/reflex-dev/reflex",
36
- ),
37
- width="100%",
38
- border_bottom=border,
39
- padding="1em",
40
- )
41
-
42
-
43
- def sidebar_footer() -> rx.Component:
44
- """Sidebar footer.
45
-
46
- Returns:
47
- rx.Component: The sidebar footer component.
48
- """
49
- return rx.chakra.hstack(
50
- rx.chakra.link(
51
- rx.chakra.center(
52
- rx.chakra.image(
53
- src="/paneleft.svg",
54
- height="2em",
55
- padding="0.5em",
56
- ),
57
- bg="transparent",
58
- border_radius=border_radius,
59
- **hover_accent_bg,
60
- ),
61
- on_click=State.toggle_sidebar_displayed,
62
- transform=rx.cond(~State.sidebar_displayed, "rotate(180deg)", ""),
63
- transition="transform 0.5s, left 0.5s",
64
- position="relative",
65
- left=rx.cond(State.sidebar_displayed, "0px", "20.5em"),
66
- **overlapping_button_style,
67
- ),
68
- rx.chakra.spacer(),
69
- rx.chakra.link(
70
- rx.chakra.text(
71
- "Docs",
72
- ),
73
- href="https://reflex.dev/docs/getting-started/introduction/",
74
- ),
75
- rx.chakra.link(
76
- rx.chakra.text(
77
- "Blog",
78
- ),
79
- href="https://reflex.dev/blog/",
80
- ),
81
- width="100%",
82
- border_top=border,
83
- padding="1em",
84
- )
85
-
86
-
87
- def sidebar_item(text: str, icon: str, url: str) -> rx.Component:
88
- """Sidebar item.
89
-
90
- Args:
91
- text (str): The text of the item.
92
- icon (str): The icon of the item.
93
- url (str): The URL of the item.
94
-
95
- Returns:
96
- rx.Component: The sidebar item component.
97
- """
98
- return rx.chakra.link(
99
- rx.chakra.hstack(
100
- rx.chakra.image(
101
- src=icon,
102
- height="2.5em",
103
- padding="0.5em",
104
- ),
105
- rx.chakra.text(
106
- text,
107
- ),
108
- bg=rx.cond(
109
- State.origin_url == f"/{text.lower()}/",
110
- accent_color,
111
- "transparent",
112
- ),
113
- color=rx.cond(
114
- State.origin_url == f"/{text.lower()}/",
115
- accent_text_color,
116
- text_color,
117
- ),
118
- border_radius=border_radius,
119
- box_shadow=box_shadow,
120
- width="100%",
121
- padding_x="1em",
122
- ),
123
- href=url,
124
- width="100%",
125
- )
126
-
127
-
128
- def sidebar() -> rx.Component:
129
- """Sidebar.
130
-
131
- Returns:
132
- rx.Component: The sidebar component.
133
- """
134
- return rx.chakra.box(
135
- rx.chakra.vstack(
136
- sidebar_header(),
137
- rx.chakra.vstack(
138
- sidebar_item(
139
- "Welcome",
140
- "/github.svg",
141
- "/",
142
- ),
143
- sidebar_item(
144
- "Graphing Demo",
145
- "/github.svg",
146
- "/graphing",
147
- ),
148
- sidebar_item(
149
- "Data Table Demo",
150
- "/github.svg",
151
- "/datatable",
152
- ),
153
- sidebar_item(
154
- "Forms Demo",
155
- "/github.svg",
156
- "/forms",
157
- ),
158
- sidebar_item(
159
- "Chat App Demo",
160
- "/github.svg",
161
- "/chatapp",
162
- ),
163
- width="100%",
164
- overflow_y="auto",
165
- align_items="flex-start",
166
- padding="1em",
167
- ),
168
- rx.chakra.spacer(),
169
- sidebar_footer(),
170
- height="100dvh",
171
- ),
172
- display=["none", "none", "block"],
173
- min_width=sidebar_width,
174
- height="100%",
175
- position="sticky",
176
- top="0px",
177
- border_right=border,
178
- )
@@ -1,22 +0,0 @@
1
- """Base state for the app."""
2
-
3
- import reflex as rx
4
-
5
-
6
- class State(rx.State):
7
- """State for the app."""
8
-
9
- sidebar_displayed: bool = True
10
-
11
- @rx.var
12
- def origin_url(self) -> str:
13
- """Get the url of the current page.
14
-
15
- Returns:
16
- str: The url of the current page.
17
- """
18
- return self.router_data.get("asPath", "")
19
-
20
- def toggle_sidebar_displayed(self) -> None:
21
- """Toggle the sidebar displayed."""
22
- self.sidebar_displayed = not self.sidebar_displayed
@@ -1,40 +0,0 @@
1
- import reflex as rx
2
-
3
- from ..state import State
4
-
5
-
6
- class FormState(State):
7
- """Form state."""
8
-
9
- form_data: dict = {}
10
-
11
- def handle_submit(self, form_data: dict):
12
- """Handle the form submit.
13
-
14
- Args:
15
- form_data: The form data.
16
- """
17
- self.form_data = form_data
18
-
19
-
20
- class UploadState(State):
21
- """The app state."""
22
-
23
- # The images to show.
24
- img: list[str]
25
-
26
- async def handle_upload(self, files: list[rx.UploadFile]):
27
- """Handle the upload of file(s).
28
-
29
- Args:
30
- files: The uploaded files.
31
- """
32
- for file in files:
33
- upload_data = await file.read()
34
- outfile = rx.get_asset_path(file.filename)
35
- # Save the file.
36
- with open(outfile, "wb") as file_object:
37
- file_object.write(upload_data)
38
-
39
- # Update the img var.
40
- self.img.append(f"/{file.filename}")
@@ -1,47 +0,0 @@
1
- from typing import Any
2
-
3
- import reflex as rx
4
-
5
- from ..state import State
6
-
7
-
8
- class PieChartState(State):
9
- """Pie Chart State."""
10
-
11
- resources: list[dict[str, Any]] = [
12
- dict(type_="🏆", count=1),
13
- dict(type_="🪵", count=1),
14
- dict(type_="🥑", count=1),
15
- dict(type_="🧱", count=1),
16
- ]
17
-
18
- @rx.cached_var
19
- def resource_types(self) -> list[str]:
20
- """Get the resource types.
21
-
22
- Returns:
23
- The resource types.
24
- """
25
- return [r["type_"] for r in self.resources]
26
-
27
- def increment(self, type_: str):
28
- """Increment the count of a resource type.
29
-
30
- Args:
31
- type_: The type of resource to increment.
32
- """
33
- for resource in self.resources:
34
- if resource["type_"] == type_:
35
- resource["count"] += 1
36
- break
37
-
38
- def decrement(self, type_: str):
39
- """Decrement the count of a resource type.
40
-
41
- Args:
42
- type_: The type of resource to decrement.
43
- """
44
- for resource in self.resources:
45
- if resource["type_"] == type_ and resource["count"] > 0:
46
- resource["count"] -= 1
47
- break
@@ -1,68 +0,0 @@
1
- """Styles for the app."""
2
-
3
- import reflex as rx
4
-
5
- from .state import State
6
-
7
- border_radius = "0.375rem"
8
- box_shadow = "0px 0px 0px 1px rgba(84, 82, 95, 0.14)"
9
- border = "1px solid #F4F3F6"
10
- text_color = "black"
11
- accent_text_color = "#1A1060"
12
- accent_color = "#F5EFFE"
13
- hover_accent_color = {"_hover": {"color": accent_color}}
14
- hover_accent_bg = {"_hover": {"bg": accent_color}}
15
- content_width_vw = "90vw"
16
- sidebar_width = "20em"
17
-
18
- template_page_style = {
19
- "padding_top": "5em",
20
- "padding_x": "2em",
21
- }
22
-
23
- template_content_style = {
24
- "width": rx.cond(
25
- State.sidebar_displayed,
26
- f"calc({content_width_vw} - {sidebar_width})",
27
- content_width_vw,
28
- ),
29
- "min-width": sidebar_width,
30
- "align_items": "flex-start",
31
- "box_shadow": box_shadow,
32
- "border_radius": border_radius,
33
- "padding": "1em",
34
- "margin_bottom": "2em",
35
- }
36
-
37
- link_style = {
38
- "color": text_color,
39
- "text_decoration": "none",
40
- **hover_accent_color,
41
- }
42
-
43
- overlapping_button_style = {
44
- "background_color": "white",
45
- "border": border,
46
- "border_radius": border_radius,
47
- }
48
-
49
- base_style = {
50
- rx.chakra.MenuButton: {
51
- "width": "3em",
52
- "height": "3em",
53
- **overlapping_button_style,
54
- },
55
- rx.chakra.MenuItem: hover_accent_bg,
56
- }
57
-
58
- tab_style = {
59
- "color": "#494369",
60
- "font_weight": 600,
61
- "_selected": {
62
- "color": "#5646ED",
63
- "bg": "#F5EFFE",
64
- "padding_x": "0.5em",
65
- "padding_y": "0.25em",
66
- "border_radius": "8px",
67
- },
68
- }
File without changes
@@ -1,4 +0,0 @@
1
- from .loading_icon import loading_icon
2
- from .modal import modal
3
- from .navbar import navbar
4
- from .sidebar import sidebar
@@ -1,118 +0,0 @@
1
- import reflex as rx
2
-
3
- from ...webui import styles
4
- from ...webui.components import loading_icon
5
- from ...webui.state import QA, State
6
-
7
-
8
- def message(qa: QA) -> rx.Component:
9
- """A single question/answer message.
10
-
11
- Args:
12
- qa: The question/answer pair.
13
-
14
- Returns:
15
- A component displaying the question/answer pair.
16
- """
17
- return rx.chakra.box(
18
- rx.chakra.box(
19
- rx.chakra.text(
20
- qa.question,
21
- bg=styles.border_color,
22
- shadow=styles.shadow_light,
23
- **styles.message_style,
24
- ),
25
- text_align="right",
26
- margin_top="1em",
27
- ),
28
- rx.chakra.box(
29
- rx.chakra.text(
30
- qa.answer,
31
- bg=styles.accent_color,
32
- shadow=styles.shadow_light,
33
- **styles.message_style,
34
- ),
35
- text_align="left",
36
- padding_top="1em",
37
- ),
38
- width="100%",
39
- )
40
-
41
-
42
- def chat() -> rx.Component:
43
- """List all the messages in a single conversation.
44
-
45
- Returns:
46
- A component displaying all the messages in a single conversation.
47
- """
48
- return rx.chakra.vstack(
49
- rx.chakra.box(rx.foreach(State.chats[State.current_chat], message)),
50
- py="8",
51
- flex="1",
52
- width="100%",
53
- max_w="3xl",
54
- padding_x="4",
55
- align_self="center",
56
- overflow="hidden",
57
- padding_bottom="5em",
58
- **styles.base_style[rx.chakra.Vstack],
59
- )
60
-
61
-
62
- def action_bar() -> rx.Component:
63
- """The action bar to send a new message.
64
-
65
- Returns:
66
- The action bar to send a new message.
67
- """
68
- return rx.chakra.box(
69
- rx.chakra.vstack(
70
- rx.chakra.form(
71
- rx.chakra.form_control(
72
- rx.chakra.hstack(
73
- rx.chakra.input(
74
- placeholder="Type something...",
75
- value=State.question,
76
- on_change=State.set_question,
77
- _placeholder={"color": "#fffa"},
78
- _hover={"border_color": styles.accent_color},
79
- style=styles.input_style,
80
- ),
81
- rx.chakra.button(
82
- rx.cond(
83
- State.processing,
84
- loading_icon(height="1em"),
85
- rx.chakra.text("Send"),
86
- ),
87
- type_="submit",
88
- _hover={"bg": styles.accent_color},
89
- style=styles.input_style,
90
- ),
91
- **styles.base_style[rx.chakra.Hstack],
92
- ),
93
- is_disabled=State.processing,
94
- ),
95
- on_submit=State.process_question,
96
- width="100%",
97
- ),
98
- rx.chakra.text(
99
- "ReflexGPT may return factually incorrect or misleading responses. Use discretion.",
100
- font_size="xs",
101
- color="#fff6",
102
- text_align="center",
103
- ),
104
- width="100%",
105
- max_w="3xl",
106
- mx="auto",
107
- **styles.base_style[rx.chakra.Vstack],
108
- ),
109
- position="sticky",
110
- bottom="0",
111
- left="0",
112
- py="4",
113
- backdrop_filter="auto",
114
- backdrop_blur="lg",
115
- border_top=f"1px solid {styles.border_color}",
116
- align_items="stretch",
117
- width="100%",
118
- )
@@ -1,19 +0,0 @@
1
- import reflex as rx
2
-
3
-
4
- class LoadingIcon(rx.Component):
5
- """A custom loading icon component."""
6
-
7
- library = "react-loading-icons"
8
- tag = "SpinningCircles"
9
- stroke: rx.Var[str]
10
- stroke_opacity: rx.Var[str]
11
- fill: rx.Var[str]
12
- fill_opacity: rx.Var[str]
13
- stroke_width: rx.Var[str]
14
- speed: rx.Var[str]
15
- height: rx.Var[str]
16
- on_change: rx.EventHandler[lambda status: [status]]
17
-
18
-
19
- loading_icon = LoadingIcon.create
@@ -1,56 +0,0 @@
1
- import reflex as rx
2
-
3
- from ...webui.state import State
4
-
5
-
6
- def modal() -> rx.Component:
7
- """A modal to create a new chat.
8
-
9
- Returns:
10
- The modal component.
11
- """
12
- return rx.chakra.modal(
13
- rx.chakra.modal_overlay(
14
- rx.chakra.modal_content(
15
- rx.chakra.modal_header(
16
- rx.chakra.hstack(
17
- rx.chakra.text("Create new chat"),
18
- rx.chakra.icon(
19
- tag="close",
20
- font_size="sm",
21
- on_click=State.toggle_modal,
22
- color="#fff8",
23
- _hover={"color": "#fff"},
24
- cursor="pointer",
25
- ),
26
- align_items="center",
27
- justify_content="space-between",
28
- )
29
- ),
30
- rx.chakra.modal_body(
31
- rx.chakra.input(
32
- placeholder="Type something...",
33
- on_blur=State.set_new_chat_name,
34
- bg="#222",
35
- border_color="#fff3",
36
- _placeholder={"color": "#fffa"},
37
- ),
38
- ),
39
- rx.chakra.modal_footer(
40
- rx.chakra.button(
41
- "Create",
42
- bg="#5535d4",
43
- box_shadow="md",
44
- px="4",
45
- py="2",
46
- h="auto",
47
- _hover={"bg": "#4c2db3"},
48
- on_click=State.create_chat,
49
- ),
50
- ),
51
- bg="#222",
52
- color="#fff",
53
- ),
54
- ),
55
- is_open=State.modal_open,
56
- )
@@ -1,70 +0,0 @@
1
- import reflex as rx
2
-
3
- from ...webui import styles
4
- from ...webui.state import State
5
-
6
-
7
- def navbar():
8
- return rx.chakra.box(
9
- rx.chakra.hstack(
10
- rx.chakra.hstack(
11
- rx.chakra.icon(
12
- tag="hamburger",
13
- mr=4,
14
- on_click=State.toggle_drawer,
15
- cursor="pointer",
16
- ),
17
- rx.chakra.link(
18
- rx.chakra.box(
19
- rx.chakra.image(src="favicon.ico", width=30, height="auto"),
20
- p="1",
21
- border_radius="6",
22
- bg="#F0F0F0",
23
- mr="2",
24
- ),
25
- href="/",
26
- ),
27
- rx.chakra.breadcrumb(
28
- rx.chakra.breadcrumb_item(
29
- rx.chakra.heading("ReflexGPT", size="sm"),
30
- ),
31
- rx.chakra.breadcrumb_item(
32
- rx.chakra.text(
33
- State.current_chat, size="sm", font_weight="normal"
34
- ),
35
- ),
36
- ),
37
- ),
38
- rx.chakra.hstack(
39
- rx.chakra.button(
40
- "+ New chat",
41
- bg=styles.accent_color,
42
- px="4",
43
- py="2",
44
- h="auto",
45
- on_click=State.toggle_modal,
46
- ),
47
- rx.chakra.menu(
48
- rx.chakra.menu_button(
49
- rx.chakra.avatar(name="User", size="md"),
50
- rx.chakra.box(),
51
- ),
52
- rx.chakra.menu_list(
53
- rx.chakra.menu_item("Help"),
54
- rx.chakra.menu_divider(),
55
- rx.chakra.menu_item("Settings"),
56
- ),
57
- ),
58
- spacing="8",
59
- ),
60
- justify="space-between",
61
- ),
62
- bg=styles.bg_dark_color,
63
- backdrop_filter="auto",
64
- backdrop_blur="lg",
65
- p="4",
66
- border_bottom=f"1px solid {styles.border_color}",
67
- position="sticky",
68
- top="0",
69
- z_index="100",
70
- )
@@ -1,66 +0,0 @@
1
- import reflex as rx
2
-
3
- from ...webui import styles
4
- from ...webui.state import State
5
-
6
-
7
- def sidebar_chat(chat: str) -> rx.Component:
8
- """A sidebar chat item.
9
-
10
- Args:
11
- chat: The chat item.
12
-
13
- Returns:
14
- The sidebar chat item.
15
- """
16
- return rx.chakra.hstack(
17
- rx.chakra.box(
18
- chat,
19
- on_click=lambda: State.set_chat(chat),
20
- style=styles.sidebar_style,
21
- color=styles.icon_color,
22
- flex="1",
23
- ),
24
- rx.chakra.box(
25
- rx.chakra.icon(
26
- tag="delete",
27
- style=styles.icon_style,
28
- on_click=State.delete_chat,
29
- ),
30
- style=styles.sidebar_style,
31
- ),
32
- color=styles.text_light_color,
33
- cursor="pointer",
34
- )
35
-
36
-
37
- def sidebar() -> rx.Component:
38
- """The sidebar component.
39
-
40
- Returns:
41
- The sidebar component.
42
- """
43
- return rx.chakra.drawer(
44
- rx.chakra.drawer_overlay(
45
- rx.chakra.drawer_content(
46
- rx.chakra.drawer_header(
47
- rx.chakra.hstack(
48
- rx.chakra.text("Chats"),
49
- rx.chakra.icon(
50
- tag="close",
51
- on_click=State.toggle_drawer,
52
- style=styles.icon_style,
53
- ),
54
- )
55
- ),
56
- rx.chakra.drawer_body(
57
- rx.chakra.vstack(
58
- rx.foreach(State.chat_titles, lambda chat: sidebar_chat(chat)),
59
- align_items="stretch",
60
- )
61
- ),
62
- ),
63
- ),
64
- placement="left",
65
- is_open=State.drawer_open,
66
- )