reflex 0.7.10a1__py3-none-any.whl → 0.7.11__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 (53) hide show
  1. reflex/.templates/jinja/web/pages/_app.js.jinja2 +10 -10
  2. reflex/.templates/jinja/web/pages/_document.js.jinja2 +1 -1
  3. reflex/.templates/jinja/web/pages/index.js.jinja2 +1 -1
  4. reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +1 -1
  5. reflex/.templates/jinja/web/pages/utils.js.jinja2 +35 -72
  6. reflex/.templates/jinja/web/utils/context.js.jinja2 +6 -18
  7. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +7 -7
  8. reflex/.templates/web/components/shiki/code.js +5 -4
  9. reflex/compiler/compiler.py +20 -3
  10. reflex/components/base/bare.py +8 -5
  11. reflex/components/base/body.py +2 -4
  12. reflex/components/base/body.pyi +197 -3
  13. reflex/components/base/error_boundary.py +1 -1
  14. reflex/components/base/link.py +3 -3
  15. reflex/components/base/link.pyi +392 -4
  16. reflex/components/base/meta.py +5 -9
  17. reflex/components/base/meta.pyi +608 -28
  18. reflex/components/component.py +13 -27
  19. reflex/components/core/colors.py +35 -4
  20. reflex/components/core/cond.py +2 -2
  21. reflex/components/core/upload.py +2 -2
  22. reflex/components/datadisplay/shiki_code_block.py +2 -2
  23. reflex/components/dynamic.py +5 -2
  24. reflex/components/el/element.py +4 -0
  25. reflex/components/el/elements/forms.py +3 -1
  26. reflex/components/el/elements/inline.py +3 -1
  27. reflex/components/el/elements/metadata.py +1 -1
  28. reflex/components/el/elements/metadata.pyi +1 -0
  29. reflex/components/el/elements/typography.py +3 -1
  30. reflex/components/lucide/icon.py +47 -3
  31. reflex/components/lucide/icon.pyi +45 -0
  32. reflex/components/markdown/markdown.py +6 -7
  33. reflex/components/markdown/markdown.pyi +2 -2
  34. reflex/components/moment/moment.py +1 -1
  35. reflex/components/next/video.py +8 -1
  36. reflex/components/plotly/plotly.py +1 -1
  37. reflex/components/radix/primitives/drawer.py +1 -1
  38. reflex/components/radix/themes/layout/list.py +3 -2
  39. reflex/components/radix/themes/layout/list.pyi +391 -2
  40. reflex/components/suneditor/editor.py +1 -1
  41. reflex/config.py +3 -0
  42. reflex/constants/colors.py +23 -6
  43. reflex/constants/installer.py +2 -2
  44. reflex/state.py +30 -7
  45. reflex/utils/build.py +1 -2
  46. reflex/utils/format.py +16 -6
  47. reflex/utils/pyi_generator.py +1 -0
  48. reflex/utils/types.py +24 -8
  49. {reflex-0.7.10a1.dist-info → reflex-0.7.11.dist-info}/METADATA +1 -1
  50. {reflex-0.7.10a1.dist-info → reflex-0.7.11.dist-info}/RECORD +53 -53
  51. {reflex-0.7.10a1.dist-info → reflex-0.7.11.dist-info}/WHEEL +0 -0
  52. {reflex-0.7.10a1.dist-info → reflex-0.7.11.dist-info}/entry_points.txt +0 -0
  53. {reflex-0.7.10a1.dist-info → reflex-0.7.11.dist-info}/licenses/LICENSE +0 -0
@@ -268,6 +268,9 @@ class Component(BaseComponent, ABC):
268
268
  # The alias for the tag.
269
269
  alias: str | None = pydantic.v1.Field(default_factory=lambda: None)
270
270
 
271
+ # Whether the component is a global scope tag. True for tags like `html`, `head`, `body`.
272
+ _is_tag_in_global_scope: ClassVar[bool] = False
273
+
271
274
  # Whether the import is default or named.
272
275
  is_default: bool | None = pydantic.v1.Field(default_factory=lambda: False)
273
276
 
@@ -689,9 +692,14 @@ class Component(BaseComponent, ABC):
689
692
  Returns:
690
693
  The tag to render.
691
694
  """
695
+ # Create the base tag.
696
+ name = (self.tag if not self.alias else self.alias) or ""
697
+ if self._is_tag_in_global_scope and self.library is None:
698
+ name = '"' + name + '"'
699
+
692
700
  # Create the base tag.
693
701
  tag = Tag(
694
- name=(self.tag if not self.alias else self.alias) or "",
702
+ name=name,
695
703
  special_props=self.special_props,
696
704
  )
697
705
 
@@ -2570,12 +2578,12 @@ def render_dict_to_var(tag: dict | Component | str, imported_names: set[str]) ->
2570
2578
  special_props = []
2571
2579
 
2572
2580
  for prop_str in tag["props"]:
2573
- if "=" not in prop_str:
2581
+ if ":" not in prop_str:
2574
2582
  special_props.append(Var(prop_str).to(ObjectVar))
2575
2583
  continue
2576
- prop = prop_str.index("=")
2584
+ prop = prop_str.index(":")
2577
2585
  key = prop_str[:prop]
2578
- value = prop_str[prop + 2 : -1]
2586
+ value = prop_str[prop + 1 :]
2579
2587
  props[key] = value
2580
2588
 
2581
2589
  props = LiteralObjectVar.create(
@@ -2585,19 +2593,11 @@ def render_dict_to_var(tag: dict | Component | str, imported_names: set[str]) ->
2585
2593
  for prop in special_props:
2586
2594
  props = props.merge(prop)
2587
2595
 
2588
- contents = tag["contents"][1:-1] if tag["contents"] else None
2596
+ contents = tag["contents"] if tag["contents"] else None
2589
2597
 
2590
2598
  raw_tag_name = tag.get("name")
2591
2599
  tag_name = Var(raw_tag_name or "Fragment")
2592
2600
 
2593
- tag_name = (
2594
- LiteralStringVar.create(raw_tag_name)
2595
- if raw_tag_name
2596
- and raw_tag_name.split(".")[0] not in imported_names
2597
- and raw_tag_name.lower() == raw_tag_name
2598
- else tag_name
2599
- )
2600
-
2601
2601
  return FunctionStringVar.create(
2602
2602
  "jsx",
2603
2603
  ).call(
@@ -2642,23 +2642,9 @@ class LiteralComponentVar(CachedVarOperation, LiteralVar, ComponentVar):
2642
2642
  """
2643
2643
  return VarData.merge(
2644
2644
  self._var_data,
2645
- VarData(
2646
- imports={
2647
- "@emotion/react": [
2648
- ImportVar(tag="jsx"),
2649
- ],
2650
- }
2651
- ),
2652
2645
  VarData(
2653
2646
  imports=self._var_value._get_all_imports(),
2654
2647
  ),
2655
- VarData(
2656
- imports={
2657
- "react": [
2658
- ImportVar(tag="Fragment"),
2659
- ],
2660
- }
2661
- ),
2662
2648
  )
2663
2649
 
2664
2650
  def __hash__(self) -> int:
@@ -1,11 +1,22 @@
1
1
  """The colors used in Reflex are a wrapper around https://www.radix-ui.com/colors."""
2
2
 
3
- from reflex.constants.colors import Color, ColorType, ShadeType
4
- from reflex.utils.types import validate_parameter_literals
3
+ from reflex.constants.base import REFLEX_VAR_OPENING_TAG
4
+ from reflex.constants.colors import (
5
+ COLORS,
6
+ MAX_SHADE_VALUE,
7
+ MIN_SHADE_VALUE,
8
+ Color,
9
+ ColorType,
10
+ ShadeType,
11
+ )
12
+ from reflex.vars.base import Var
5
13
 
6
14
 
7
- @validate_parameter_literals
8
- def color(color: ColorType, shade: ShadeType = 7, alpha: bool = False) -> Color:
15
+ def color(
16
+ color: ColorType | Var[str],
17
+ shade: ShadeType | Var[int] = 7,
18
+ alpha: bool | Var[bool] = False,
19
+ ) -> Color:
9
20
  """Create a color object.
10
21
 
11
22
  Args:
@@ -15,5 +26,25 @@ def color(color: ColorType, shade: ShadeType = 7, alpha: bool = False) -> Color:
15
26
 
16
27
  Returns:
17
28
  The color object.
29
+
30
+ Raises:
31
+ ValueError: If the color, shade, or alpha are not valid.
18
32
  """
33
+ if isinstance(color, str):
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}")
36
+ elif not isinstance(color, Var):
37
+ raise ValueError("Color must be a string or a Var")
38
+
39
+ if isinstance(shade, int):
40
+ 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
+ )
44
+ elif not isinstance(shade, Var):
45
+ raise ValueError("Shade must be an integer or a Var")
46
+
47
+ if not isinstance(alpha, (bool, Var)):
48
+ raise ValueError("Alpha must be a boolean or a Var")
49
+
19
50
  return Color(color, shade, alpha)
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from typing import Any, overload
6
6
 
7
7
  from reflex.components.base.fragment import Fragment
8
- from reflex.components.component import BaseComponent, Component, MemoizationLeaf
8
+ from reflex.components.component import BaseComponent, Component
9
9
  from reflex.components.tags import CondTag, Tag
10
10
  from reflex.constants import Dirs
11
11
  from reflex.style import LIGHT_COLOR_MODE, resolved_color_mode
@@ -20,7 +20,7 @@ _IS_TRUE_IMPORT: ImportDict = {
20
20
  }
21
21
 
22
22
 
23
- class Cond(MemoizationLeaf):
23
+ class Cond(Component):
24
24
  """Render one of two components based on a condition."""
25
25
 
26
26
  # The cond to determine which component to render.
@@ -361,7 +361,7 @@ class Upload(MemoizationLeaf):
361
361
  upload = Input.create(type="file")
362
362
  upload.special_props = [
363
363
  Var(
364
- _js_expr=f"{{...{input_props_unique_name}()}}",
364
+ _js_expr=f"{input_props_unique_name}()",
365
365
  _var_type=None,
366
366
  _var_data=var_data,
367
367
  )
@@ -375,7 +375,7 @@ class Upload(MemoizationLeaf):
375
375
  )
376
376
  zone.special_props = [
377
377
  Var(
378
- _js_expr=f"{{...{root_props_unique_name}()}}",
378
+ _js_expr=f"{root_props_unique_name}()",
379
379
  _var_type=None,
380
380
  _var_data=var_data,
381
381
  )
@@ -421,7 +421,7 @@ class ShikiBaseTransformers(Base):
421
421
  class ShikiJsTransformer(ShikiBaseTransformers):
422
422
  """A Wrapped shikijs transformer."""
423
423
 
424
- library: str = "@shikijs/transformers"
424
+ library: str = "@shikijs/transformers@3.3.0"
425
425
  fns: list[FunctionStringVar] = [
426
426
  FunctionStringVar.create(fn) for fn in SHIKIJS_TRANSFORMER_FNS
427
427
  ]
@@ -538,7 +538,7 @@ class ShikiCodeBlock(Component, MarkdownComponentMap):
538
538
 
539
539
  alias = "ShikiCode"
540
540
 
541
- lib_dependencies: list[str] = ["shiki"]
541
+ lib_dependencies: list[str] = ["shiki@3.3.0"]
542
542
 
543
543
  # The language to use.
544
544
  language: Var[LiteralCodeLanguage] = Var.create("python")
@@ -72,7 +72,7 @@ def load_dynamic_serializer():
72
72
  The generated code
73
73
  """
74
74
  # Causes a circular import, so we import here.
75
- from reflex.compiler import templates, utils
75
+ from reflex.compiler import compiler, templates, utils
76
76
  from reflex.components.base.bare import Bare
77
77
 
78
78
  component = Bare.create(Var.create(component))
@@ -97,8 +97,11 @@ def load_dynamic_serializer():
97
97
 
98
98
  libs_in_window = bundled_libraries
99
99
 
100
+ component_imports = component._get_all_imports()
101
+ compiler._apply_common_imports(component_imports)
102
+
100
103
  imports = {}
101
- for lib, names in component._get_all_imports().items():
104
+ for lib, names in component_imports.items():
102
105
  formatted_lib_name = format_library_name(lib)
103
106
  if (
104
107
  not lib.startswith((".", "/", "$/"))
@@ -1,11 +1,15 @@
1
1
  """Base class definition for raw HTML elements."""
2
2
 
3
+ from typing import ClassVar
4
+
3
5
  from reflex.components.component import Component
4
6
 
5
7
 
6
8
  class Element(Component):
7
9
  """The base class for all raw HTML elements."""
8
10
 
11
+ _is_tag_in_global_scope: ClassVar[bool] = True
12
+
9
13
  def __eq__(self, other: object):
10
14
  """Two elements are equal if they have the same tag.
11
15
 
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from collections.abc import Iterator
6
6
  from hashlib import md5
7
- from typing import Any, Literal
7
+ from typing import Any, ClassVar, Literal
8
8
 
9
9
  from jinja2 import Environment
10
10
 
@@ -86,6 +86,8 @@ class Button(BaseHTML):
86
86
  # Value of the button, used when sending form data
87
87
  value: Var[str | int | float]
88
88
 
89
+ _invalid_children: ClassVar[list[str]] = ["Button"]
90
+
89
91
 
90
92
  class Datalist(BaseHTML):
91
93
  """Display the datalist element."""
@@ -1,6 +1,6 @@
1
1
  """Inline classes."""
2
2
 
3
- from typing import Literal
3
+ from typing import ClassVar, Literal
4
4
 
5
5
  from reflex.vars.base import Var
6
6
 
@@ -48,6 +48,8 @@ class A(BaseHTML): # Inherits common attributes from BaseMeta
48
48
  # Specifies where to open the linked document
49
49
  target: Var[str | Literal["_self", "_blank", "_parent", "_top"]]
50
50
 
51
+ _invalid_children: ClassVar[list[str]] = ["A"]
52
+
51
53
 
52
54
  class Abbr(BaseHTML):
53
55
  """Display the abbr element."""
@@ -89,7 +89,7 @@ class StyleEl(Element):
89
89
 
90
90
  media: Var[str]
91
91
 
92
- special_props: list[Var] = [Var(_js_expr="suppressHydrationWarning")]
92
+ suppress_hydration_warning: Var[bool] = Var.create(True)
93
93
 
94
94
 
95
95
  base = Base.create
@@ -1100,6 +1100,7 @@ class StyleEl(Element):
1100
1100
  cls,
1101
1101
  *children,
1102
1102
  media: Var[str] | str | None = None,
1103
+ suppress_hydration_warning: Var[bool] | bool | None = None,
1103
1104
  style: Sequence[Mapping[str, Any]]
1104
1105
  | Mapping[str, Any]
1105
1106
  | Var[Mapping[str, Any]]
@@ -1,6 +1,6 @@
1
1
  """Typography classes."""
2
2
 
3
- from typing import Literal
3
+ from typing import ClassVar, Literal
4
4
 
5
5
  from reflex.vars.base import Var
6
6
 
@@ -87,6 +87,8 @@ class P(BaseHTML):
87
87
 
88
88
  tag = "p"
89
89
 
90
+ _invalid_children: ClassVar[list] = ["P", "Ol", "Ul", "Div"]
91
+
90
92
 
91
93
  class Pre(BaseHTML):
92
94
  """Display the pre element."""
@@ -10,7 +10,7 @@ from reflex.vars.sequence import LiteralStringVar, StringVar
10
10
  class LucideIconComponent(Component):
11
11
  """Lucide Icon Component."""
12
12
 
13
- library = "lucide-react@0.471.1"
13
+ library = "lucide-react@0.508.0"
14
14
 
15
15
 
16
16
  class Icon(LucideIconComponent):
@@ -75,13 +75,12 @@ class Icon(LucideIconComponent):
75
75
  )
76
76
  console.warn(
77
77
  f"Invalid icon tag: {tag}. Please use one of the following: {', '.join(icons_sorted[0:10])}, ..."
78
- "\nSee full list at https://reflex.dev/docs/library/data-display/icon/#icons-list. Using 'circle-help' icon instead."
78
+ "\nSee full list at https://reflex.dev/docs/library/data-display/icon/#icons-list. Using 'circle_help' icon instead."
79
79
  )
80
80
  tag = "circle_help"
81
81
 
82
82
  props["tag"] = LUCIDE_ICON_MAPPING_OVERRIDE.get(tag, format.to_title_case(tag))
83
83
  props["alias"] = f"Lucide{props['tag']}"
84
- props.setdefault("color", "var(--current-color)")
85
84
  return super().create(**props)
86
85
 
87
86
 
@@ -234,6 +233,8 @@ LUCIDE_ICON_LIST = [
234
233
  "banana",
235
234
  "bandage",
236
235
  "banknote",
236
+ "banknote_arrow_down",
237
+ "banknote_x",
237
238
  "bar_chart",
238
239
  "bar_chart_2",
239
240
  "bar_chart_3",
@@ -249,6 +250,7 @@ LUCIDE_ICON_LIST = [
249
250
  "battery_full",
250
251
  "battery_low",
251
252
  "battery_medium",
253
+ "battery_plus",
252
254
  "battery_warning",
253
255
  "beaker",
254
256
  "bean",
@@ -321,6 +323,7 @@ LUCIDE_ICON_LIST = [
321
323
  "bot",
322
324
  "bot_message_square",
323
325
  "bot_off",
326
+ "bow_arrow",
324
327
  "box",
325
328
  "box_select",
326
329
  "boxes",
@@ -330,12 +333,15 @@ LUCIDE_ICON_LIST = [
330
333
  "brain_circuit",
331
334
  "brain_cog",
332
335
  "brick_wall",
336
+ "brick_wall_fire",
333
337
  "briefcase",
334
338
  "briefcase_business",
335
339
  "briefcase_conveyor_belt",
336
340
  "briefcase_medical",
337
341
  "bring_to_front",
338
342
  "brush",
343
+ "brush_cleaning",
344
+ "bubbles",
339
345
  "bug",
340
346
  "bug_off",
341
347
  "bug_play",
@@ -475,6 +481,7 @@ LUCIDE_ICON_LIST = [
475
481
  "circle_power",
476
482
  "circle_slash",
477
483
  "circle_slash_2",
484
+ "circle_small",
478
485
  "circle_stop",
479
486
  "circle_user",
480
487
  "circle_user_round",
@@ -509,6 +516,8 @@ LUCIDE_ICON_LIST = [
509
516
  "clock_alert",
510
517
  "clock_arrow_down",
511
518
  "clock_arrow_up",
519
+ "clock_fading",
520
+ "clock_plus",
512
521
  "cloud",
513
522
  "cloud_alert",
514
523
  "cloud_cog",
@@ -538,6 +547,7 @@ LUCIDE_ICON_LIST = [
538
547
  "coins",
539
548
  "columns_2",
540
549
  "columns_3",
550
+ "columns_3_cog",
541
551
  "columns_4",
542
552
  "combine",
543
553
  "command",
@@ -585,6 +595,8 @@ LUCIDE_ICON_LIST = [
585
595
  "database",
586
596
  "database_backup",
587
597
  "database_zap",
598
+ "decimals_arrow_left",
599
+ "decimals_arrow_right",
588
600
  "delete",
589
601
  "dessert",
590
602
  "diameter",
@@ -612,6 +624,7 @@ LUCIDE_ICON_LIST = [
612
624
  "dollar_sign",
613
625
  "donut",
614
626
  "door_closed",
627
+ "door_closed_locked",
615
628
  "door_open",
616
629
  "dot",
617
630
  "download",
@@ -785,6 +798,9 @@ LUCIDE_ICON_LIST = [
785
798
  "frown",
786
799
  "fuel",
787
800
  "fullscreen",
801
+ "funnel",
802
+ "funnel_plus",
803
+ "funnel_x",
788
804
  "gallery_horizontal",
789
805
  "gallery_horizontal_end",
790
806
  "gallery_thumbnails",
@@ -836,6 +852,7 @@ LUCIDE_ICON_LIST = [
836
852
  "group",
837
853
  "guitar",
838
854
  "ham",
855
+ "hamburger",
839
856
  "hammer",
840
857
  "hand",
841
858
  "hand_coins",
@@ -864,7 +881,9 @@ LUCIDE_ICON_LIST = [
864
881
  "heart",
865
882
  "heart_crack",
866
883
  "heart_handshake",
884
+ "heart_minus",
867
885
  "heart_off",
886
+ "heart_plus",
868
887
  "heart_pulse",
869
888
  "heater",
870
889
  "hexagon",
@@ -975,6 +994,7 @@ LUCIDE_ICON_LIST = [
975
994
  "locate",
976
995
  "locate_fixed",
977
996
  "locate_off",
997
+ "location_edit",
978
998
  "lock",
979
999
  "lock_keyhole",
980
1000
  "lock_keyhole_open",
@@ -1009,6 +1029,8 @@ LUCIDE_ICON_LIST = [
1009
1029
  "map_pin_x",
1010
1030
  "map_pin_x_inside",
1011
1031
  "map_pinned",
1032
+ "map_plus",
1033
+ "mars_stroke",
1012
1034
  "martini",
1013
1035
  "maximize",
1014
1036
  "maximize_2",
@@ -1107,6 +1129,7 @@ LUCIDE_ICON_LIST = [
1107
1129
  "network",
1108
1130
  "newspaper",
1109
1131
  "nfc",
1132
+ "non_binary",
1110
1133
  "notebook",
1111
1134
  "notebook_pen",
1112
1135
  "notebook_tabs",
@@ -1138,6 +1161,7 @@ LUCIDE_ICON_LIST = [
1138
1161
  "paintbrush_2",
1139
1162
  "paintbrush_vertical",
1140
1163
  "palette",
1164
+ "panda",
1141
1165
  "panel_bottom",
1142
1166
  "panel_bottom_close",
1143
1167
  "panel_bottom_dashed",
@@ -1249,6 +1273,7 @@ LUCIDE_ICON_LIST = [
1249
1273
  "receipt_swiss_franc",
1250
1274
  "receipt_text",
1251
1275
  "rectangle_ellipsis",
1276
+ "rectangle_goggles",
1252
1277
  "rectangle_horizontal",
1253
1278
  "rectangle_vertical",
1254
1279
  "recycle",
@@ -1276,6 +1301,7 @@ LUCIDE_ICON_LIST = [
1276
1301
  "roller_coaster",
1277
1302
  "rotate_3d",
1278
1303
  "rotate_ccw",
1304
+ "rotate_ccw_key",
1279
1305
  "rotate_ccw_square",
1280
1306
  "rotate_cw",
1281
1307
  "rotate_cw_square",
@@ -1287,12 +1313,14 @@ LUCIDE_ICON_LIST = [
1287
1313
  "rows_4",
1288
1314
  "rss",
1289
1315
  "ruler",
1316
+ "ruler_dimension_line",
1290
1317
  "russian_ruble",
1291
1318
  "sailboat",
1292
1319
  "salad",
1293
1320
  "sandwich",
1294
1321
  "satellite",
1295
1322
  "satellite_dish",
1323
+ "saudi_riyal",
1296
1324
  "save",
1297
1325
  "save_all",
1298
1326
  "save_off",
@@ -1348,6 +1376,7 @@ LUCIDE_ICON_LIST = [
1348
1376
  "shield_off",
1349
1377
  "shield_plus",
1350
1378
  "shield_question",
1379
+ "shield_user",
1351
1380
  "shield_x",
1352
1381
  "ship",
1353
1382
  "ship_wheel",
@@ -1357,6 +1386,8 @@ LUCIDE_ICON_LIST = [
1357
1386
  "shopping_cart",
1358
1387
  "shovel",
1359
1388
  "shower_head",
1389
+ "shredder",
1390
+ "shrimp",
1360
1391
  "shrink",
1361
1392
  "shrub",
1362
1393
  "shuffle",
@@ -1385,6 +1416,7 @@ LUCIDE_ICON_LIST = [
1385
1416
  "smile_plus",
1386
1417
  "snail",
1387
1418
  "snowflake",
1419
+ "soap_dispenser_droplet",
1388
1420
  "sofa",
1389
1421
  "soup",
1390
1422
  "space",
@@ -1396,6 +1428,7 @@ LUCIDE_ICON_LIST = [
1396
1428
  "spell_check",
1397
1429
  "spell_check_2",
1398
1430
  "spline",
1431
+ "spline_pointer",
1399
1432
  "split",
1400
1433
  "spray_can",
1401
1434
  "sprout",
@@ -1449,6 +1482,7 @@ LUCIDE_ICON_LIST = [
1449
1482
  "square_plus",
1450
1483
  "square_power",
1451
1484
  "square_radical",
1485
+ "square_round_corner",
1452
1486
  "square_scissors",
1453
1487
  "square_sigma",
1454
1488
  "square_slash",
@@ -1460,6 +1494,10 @@ LUCIDE_ICON_LIST = [
1460
1494
  "square_user",
1461
1495
  "square_user_round",
1462
1496
  "square_x",
1497
+ "squares_exclude",
1498
+ "squares_intersect",
1499
+ "squares_subtract",
1500
+ "squares_unite",
1463
1501
  "squircle",
1464
1502
  "squirrel",
1465
1503
  "stamp",
@@ -1556,6 +1594,7 @@ LUCIDE_ICON_LIST = [
1556
1594
  "train_front_tunnel",
1557
1595
  "train_track",
1558
1596
  "tram_front",
1597
+ "transgender",
1559
1598
  "trash",
1560
1599
  "trash_2",
1561
1600
  "tree_deciduous",
@@ -1572,6 +1611,7 @@ LUCIDE_ICON_LIST = [
1572
1611
  "triangle_right",
1573
1612
  "trophy",
1574
1613
  "truck",
1614
+ "truck_electric",
1575
1615
  "turtle",
1576
1616
  "tv",
1577
1617
  "tv_2",
@@ -1599,6 +1639,7 @@ LUCIDE_ICON_LIST = [
1599
1639
  "user",
1600
1640
  "user_check",
1601
1641
  "user_cog",
1642
+ "user_lock",
1602
1643
  "user_minus",
1603
1644
  "user_pen",
1604
1645
  "user_plus",
@@ -1621,6 +1662,8 @@ LUCIDE_ICON_LIST = [
1621
1662
  "vault",
1622
1663
  "vegan",
1623
1664
  "venetian_mask",
1665
+ "venus",
1666
+ "venus_and_mars",
1624
1667
  "vibrate",
1625
1668
  "vibrate_off",
1626
1669
  "video",
@@ -1658,6 +1701,7 @@ LUCIDE_ICON_LIST = [
1658
1701
  "wifi_high",
1659
1702
  "wifi_low",
1660
1703
  "wifi_off",
1704
+ "wifi_pen",
1661
1705
  "wifi_zero",
1662
1706
  "wind",
1663
1707
  "wind_arrow_down",