ex4nicegui 0.2.18__py3-none-any.whl → 0.3.1__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.
Files changed (33) hide show
  1. ex4nicegui/__init__.py +1 -1
  2. ex4nicegui/bi/__init__.py +13 -0
  3. ex4nicegui/bi/dataSource.py +203 -0
  4. ex4nicegui/bi/dataSourceFacade.py +148 -0
  5. ex4nicegui/bi/elements/__init__.py +0 -0
  6. ex4nicegui/bi/elements/containers.py +13 -0
  7. ex4nicegui/bi/elements/layouts.py +28 -0
  8. ex4nicegui/bi/elements/models.py +55 -0
  9. ex4nicegui/bi/elements/text.py +33 -0
  10. ex4nicegui/bi/elements/ui_aggrid.py +46 -0
  11. ex4nicegui/bi/elements/ui_date_picker.js +35 -0
  12. ex4nicegui/bi/elements/ui_date_picker.py +77 -0
  13. ex4nicegui/bi/elements/ui_echarts.py +72 -0
  14. ex4nicegui/bi/elements/ui_radio.py +60 -0
  15. ex4nicegui/bi/elements/ui_range.py +119 -0
  16. ex4nicegui/bi/elements/ui_select.py +105 -0
  17. ex4nicegui/bi/elements/ui_slider.py +59 -0
  18. ex4nicegui/bi/index.py +76 -0
  19. ex4nicegui/bi/protocols.py +158 -0
  20. ex4nicegui/bi/types.py +13 -0
  21. ex4nicegui/reactive/EChartsComponent/ECharts.js +1 -2
  22. ex4nicegui/reactive/EChartsComponent/ECharts.py +1 -0
  23. ex4nicegui/reactive/officials/base.py +12 -1
  24. ex4nicegui/reactive/officials/button.py +1 -1
  25. ex4nicegui/reactive/officials/drawer.py +1 -2
  26. ex4nicegui/reactive/officials/echarts.py +1 -1
  27. ex4nicegui/utils/clientScope.py +42 -0
  28. ex4nicegui/utils/signals.py +54 -5
  29. {ex4nicegui-0.2.18.dist-info → ex4nicegui-0.3.1.dist-info}/METADATA +2 -2
  30. {ex4nicegui-0.2.18.dist-info → ex4nicegui-0.3.1.dist-info}/RECORD +33 -13
  31. {ex4nicegui-0.2.18.dist-info → ex4nicegui-0.3.1.dist-info}/LICENSE +0 -0
  32. {ex4nicegui-0.2.18.dist-info → ex4nicegui-0.3.1.dist-info}/WHEEL +0 -0
  33. {ex4nicegui-0.2.18.dist-info → ex4nicegui-0.3.1.dist-info}/top_level.txt +0 -0
@@ -29,7 +29,7 @@ from nicegui.elements.mixins.text_element import TextElement
29
29
 
30
30
  T = TypeVar("T")
31
31
 
32
- TWidget = TypeVar("TWidget")
32
+ TWidget = TypeVar("TWidget", bound=ui.element)
33
33
 
34
34
 
35
35
  class BindableUi(Generic[TWidget]):
@@ -61,6 +61,13 @@ class BindableUi(Generic[TWidget]):
61
61
  cast(ui.element, self.element).style(add, remove=remove, replace=replace)
62
62
  return self
63
63
 
64
+ def __enter__(self) -> Self:
65
+ self.element.__enter__()
66
+ return self
67
+
68
+ def __exit__(self, *_):
69
+ self.element.default_slot.__exit__(*_)
70
+
64
71
  def tooltip(self, text: str) -> Self:
65
72
  cast(ui.element, self.element).tooltip(text)
66
73
  return self
@@ -78,6 +85,10 @@ class BindableUi(Generic[TWidget]):
78
85
  def element(self):
79
86
  return self.__element
80
87
 
88
+ def delete(self) -> None:
89
+ """Delete the element."""
90
+ self.element.delete()
91
+
81
92
  def bind_prop(self, prop: str, ref_ui: ReadonlyRef):
82
93
  if prop == "visible":
83
94
  return self.bind_visible(ref_ui)
@@ -57,7 +57,7 @@ class ButtonBindableUi(SingleValueBindableUi[str, ui.button]):
57
57
  @effect
58
58
  def _():
59
59
  ele = self.element
60
- ele._props["text"] = ref_ui.value
60
+ ele._props["label"] = ref_ui.value
61
61
  ele.update()
62
62
 
63
63
  return self
@@ -51,8 +51,7 @@ class DrawerBindableUi(SingleValueBindableUi[bool, Drawer]):
51
51
  else:
52
52
  element = ui.right_drawer(**value_kws)
53
53
 
54
- element.style(f"background-color:rgba(25, 118, 210,0.3)")
55
- element.classes("flex flex-col gap-4")
54
+ element.classes("flex flex-col gap-4 backdrop-blur-md bg-[#5898d4]/30")
56
55
 
57
56
  init_value = (
58
57
  element._props["model-value"]
@@ -26,7 +26,7 @@ class EChartsBindableUi(BindableUi[echarts]):
26
26
 
27
27
  value_kws = _convert_kws_ref2value(kws)
28
28
 
29
- element = echarts(**value_kws)
29
+ element = echarts(**value_kws).classes("grow self-stretch h-[16rem]")
30
30
 
31
31
  super().__init__(element)
32
32
 
@@ -0,0 +1,42 @@
1
+ from typing import Dict, List
2
+ from signe.core.effect import Effect
3
+ from signe.core.scope import IScope
4
+ from nicegui import globals as ng_globals, Client
5
+
6
+
7
+ _TClientID = str
8
+
9
+
10
+ class NgClientScope(IScope):
11
+ def __init__(self) -> None:
12
+ self._effects: List[Effect] = []
13
+
14
+ def add_effect(self, effect: Effect):
15
+ self._effects.append(effect)
16
+
17
+ def dispose(self):
18
+ for effect in self._effects:
19
+ effect.dispose()
20
+
21
+
22
+ class NgClientScopeManager:
23
+ def __init__(self) -> None:
24
+ self._client_scope_map: Dict[_TClientID, NgClientScope] = {}
25
+
26
+ def get_scope(self):
27
+ if len(ng_globals.get_slot_stack()) <= 0:
28
+ return
29
+
30
+ client = ng_globals.get_client()
31
+ if client.shared:
32
+ return
33
+
34
+ if client.id not in self._client_scope_map:
35
+ self._client_scope_map[client.id] = NgClientScope()
36
+
37
+ @client.on_disconnect
38
+ def _(e: Client):
39
+ if e.id in self._client_scope_map:
40
+ self._client_scope_map[e.id].dispose()
41
+
42
+ return self._client_scope_map[client.id]
@@ -1,9 +1,12 @@
1
- from signe import createSignal, effect, computed, on as signe_on
1
+ from signe import createSignal, effect as signe_effect, computed, on as signe_on
2
2
  from signe.core.signal import Signal, SignalOption
3
+ from signe.core.effect import Effect
3
4
  from signe import utils as signe_utils
5
+ from .clientScope import NgClientScopeManager
4
6
  from signe.types import TSetter, TGetter
5
7
  from typing import (
6
8
  Any,
9
+ Dict,
7
10
  TypeVar,
8
11
  Generic,
9
12
  overload,
@@ -17,6 +20,8 @@ from nicegui import ui
17
20
 
18
21
  T = TypeVar("T")
19
22
 
23
+ _CLIENT_SCOPE_MANAGER = NgClientScopeManager()
24
+
20
25
 
21
26
  class ReadonlyRef(Generic[T]):
22
27
  def __init__(self, getter: TGetter[T]) -> None:
@@ -115,6 +120,43 @@ def ref(value: T):
115
120
  return cast(Ref[T], Ref(s.getValue, s.setValue, s))
116
121
 
117
122
 
123
+ @overload
124
+ def effect(
125
+ fn: None = ...,
126
+ *,
127
+ priority_level=1,
128
+ debug_trigger: Optional[Callable] = None,
129
+ debug_name: Optional[str] = None,
130
+ ) -> signe_utils._TEffect_Fn[None]:
131
+ ...
132
+
133
+
134
+ @overload
135
+ def effect(
136
+ fn: Callable[..., None],
137
+ *,
138
+ priority_level=1,
139
+ debug_trigger: Optional[Callable] = None,
140
+ debug_name: Optional[str] = None,
141
+ ) -> Effect[None]:
142
+ ...
143
+
144
+
145
+ def effect(
146
+ fn: Optional[Callable[..., None]] = None,
147
+ *,
148
+ priority_level=1,
149
+ debug_trigger: Optional[Callable] = None,
150
+ debug_name: Optional[str] = None,
151
+ ) -> Union[signe_utils._TEffect_Fn[None], Effect[None]]:
152
+ kws = {
153
+ "debug_trigger": debug_trigger,
154
+ "priority_level": priority_level,
155
+ "debug_name": debug_name,
156
+ }
157
+ return signe_effect(fn, **kws, scope=_CLIENT_SCOPE_MANAGER.get_scope())
158
+
159
+
118
160
  @overload
119
161
  def ref_computed(
120
162
  fn: Callable[[], T],
@@ -122,6 +164,7 @@ def ref_computed(
122
164
  desc="",
123
165
  debug_trigger: Optional[Callable[..., None]] = None,
124
166
  priority_level: int = 1,
167
+ debug_name: Optional[str] = None,
125
168
  ) -> ReadonlyRef[T]:
126
169
  ...
127
170
 
@@ -133,6 +176,7 @@ def ref_computed(
133
176
  desc="",
134
177
  debug_trigger: Optional[Callable[..., None]] = None,
135
178
  priority_level: int = 1,
179
+ debug_name: Optional[str] = None,
136
180
  ) -> Callable[[Callable[..., T]], ReadonlyRef[T]]:
137
181
  ...
138
182
 
@@ -143,14 +187,16 @@ def ref_computed(
143
187
  desc="",
144
188
  debug_trigger: Optional[Callable[..., None]] = None,
145
189
  priority_level: int = 1,
190
+ debug_name: Optional[str] = None,
146
191
  ) -> Union[ReadonlyRef[T], Callable[[Callable[..., T]], ReadonlyRef[T]]]:
147
192
  kws = {
148
193
  "debug_trigger": debug_trigger,
149
194
  "priority_level": priority_level,
195
+ "debug_name": debug_name,
150
196
  }
151
197
 
152
198
  if fn:
153
- getter = computed(fn, **kws)
199
+ getter = computed(fn, **kws, scope=_CLIENT_SCOPE_MANAGER.get_scope())
154
200
  return cast(DescReadonlyRef[T], DescReadonlyRef(getter, desc))
155
201
  else:
156
202
 
@@ -192,20 +238,23 @@ class effect_refreshable:
192
238
  re_func.refresh()
193
239
 
194
240
  if len(self._refs) == 0:
195
- runner = effect(runner)
241
+ runner = signe_effect(runner)
196
242
  else:
197
243
  runner = on(self._refs)(runner)
198
244
 
199
245
  return runner
200
246
 
201
247
 
202
- def on(refs: Union[ReadonlyRef, Sequence[ReadonlyRef]]):
248
+ def on(
249
+ refs: Union[ReadonlyRef, Sequence[ReadonlyRef]],
250
+ effect_kws: Optional[Dict[str, Any]] = None,
251
+ ):
203
252
  if not isinstance(refs, Sequence):
204
253
  refs = [refs]
205
254
 
206
255
  getters = [getattr(r, "_ReadonlyRef___getter") for r in refs]
207
256
 
208
257
  def wrap(fn: Callable):
209
- return signe_on(getters, fn)
258
+ return signe_on(getters, fn, effect_kws=effect_kws)
210
259
 
211
260
  return wrap
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ex4nicegui
3
- Version: 0.2.18
3
+ Version: 0.3.1
4
4
  Summary: ...
5
5
  Home-page:
6
6
  Author: carson_jia
@@ -13,7 +13,7 @@ Classifier: Natural Language :: English
13
13
  Classifier: Programming Language :: Python :: 3.8
14
14
  Requires-Python: >=3.8
15
15
  License-File: LICENSE
16
- Requires-Dist: signe (>=0.1.8)
16
+ Requires-Dist: signe (>=0.2.4)
17
17
  Requires-Dist: nicegui (>=1.3.13)
18
18
  Requires-Dist: typing-extensions
19
19
 
@@ -1,4 +1,23 @@
1
- ex4nicegui/__init__.py,sha256=_MbAAhRG7NTi391YxBHeqLpmetZrRQLlqtgHG8Nqebs,397
1
+ ex4nicegui/__init__.py,sha256=AHJ1FEv2tIq1TO8OrKZezKp-Ce9ykXJxqrJRiqJfFy8,396
2
+ ex4nicegui/bi/__init__.py,sha256=eu-2CuzzrcHCyKQOfoo87v6C9nSwFDdeLhjY0cRV13M,315
3
+ ex4nicegui/bi/dataSource.py,sha256=SJyYySHZBjzQnPW8x3P3sSHaKlzB21spkbw9DM8Sfgs,6212
4
+ ex4nicegui/bi/dataSourceFacade.py,sha256=RyglhsZVJT7qBTqER5kuQ7qKhMHrlo8oSybM6VtLR70,4786
5
+ ex4nicegui/bi/index.py,sha256=Zuo8V_7IZnayo8vxEMFbx-BkZTkEca-QhHVrmVTHjuc,1883
6
+ ex4nicegui/bi/protocols.py,sha256=RNEXeV30rFdM8RTxLzyPp37JcbZCqJuJoPZCyMczLOA,4736
7
+ ex4nicegui/bi/types.py,sha256=jMaEnFZw94R8FoAaOAJGqbCa1FJm841PSbwsajZfaVQ,293
8
+ ex4nicegui/bi/elements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ ex4nicegui/bi/elements/containers.py,sha256=5a9ZkzyVNLnK7DftDYdbVRo0bQFvuMHRI9LBGR__YuI,358
10
+ ex4nicegui/bi/elements/layouts.py,sha256=teb0Vp-fgsByBNPTiW73kXEu2JponRRj4QQanaalcA0,898
11
+ ex4nicegui/bi/elements/models.py,sha256=l1sEeapYsub2Cgm8X6Mb3pBhim6JyV-N6MD53CuXnRQ,1436
12
+ ex4nicegui/bi/elements/text.py,sha256=vZYD0vplZIq2Wjdhv0e2NGuSch4y0zrvflndQnCE9DQ,801
13
+ ex4nicegui/bi/elements/ui_aggrid.py,sha256=lS01HhwdpDlt_4sI8WOiDS_FVPI5dDj8r8UuaVZR3sk,1390
14
+ ex4nicegui/bi/elements/ui_date_picker.js,sha256=Tk6NACKVsCnqhWZtuNA6Xt2e-AWI54AnjfHPIldaM5A,852
15
+ ex4nicegui/bi/elements/ui_date_picker.py,sha256=UfUioMmVQyZMzp_hZLQi96xbP0Hk1UGRRQUL1p8r8H0,2238
16
+ ex4nicegui/bi/elements/ui_echarts.py,sha256=YvUmYD0LbdAOVvGS-KVzM6aGj7cQUkvyDXEsVqZfyyc,2358
17
+ ex4nicegui/bi/elements/ui_radio.py,sha256=8qJoml1WgLETdc_SIIPsJ4Z5xNV340g-pIhSn7vga4I,1788
18
+ ex4nicegui/bi/elements/ui_range.py,sha256=aYAl4Z78GbPSPHamjlO8mE96GCeF_IWrOm4Z2IxPPgM,3750
19
+ ex4nicegui/bi/elements/ui_select.py,sha256=ZpFCGXag374Z78quGu7kqTRJO2CxViiUWsxy6DAPaq4,3171
20
+ ex4nicegui/bi/elements/ui_slider.py,sha256=4nuyroQEq_FTUItyLV7h687OGNdSg78Iw-QRIq4edw8,1820
2
21
  ex4nicegui/experimental_/__init__.py,sha256=LSDd_U6eQ9g9St9kC4daau3MFGlVCRHGZJC4E0JRH34,36
3
22
  ex4nicegui/experimental_/gridLayout/__init__.py,sha256=48y_Pm0xxgC_PRnixQB5R_5rPL4FuyeoeOao_W7pm7A,49
4
23
  ex4nicegui/experimental_/gridLayout/index.py,sha256=zFXuvFroo5EC1CFjt-b4hMiEy67hGP5J1GYTKH6kpUU,4737
@@ -18,8 +37,8 @@ ex4nicegui/reactive/local_file_picker.py,sha256=DWNzm_IP02sY-nZWN6WEWJxlwpABW6tN
18
37
  ex4nicegui/reactive/q_pagination.py,sha256=ITXBrjLnI1a5bz3Rbn7j8lZs9UJaFuMHrM9_FW_V7NA,1217
19
38
  ex4nicegui/reactive/rxui.py,sha256=NZUgvItxqqgzHKrt4oGZnxxV9dlEudGiv4J3fhJdvdQ,24
20
39
  ex4nicegui/reactive/usePagination.py,sha256=IP1NeLxaH3413KTEjtbyuzq0FVdtnKQsTZqM-W7iEgY,2468
21
- ex4nicegui/reactive/EChartsComponent/ECharts.js,sha256=zpB_m1dxK236_qZAiM8jzMkNCVTEPgeSV6tFpdgLZoo,1581763
22
- ex4nicegui/reactive/EChartsComponent/ECharts.py,sha256=LhThgTo7TSjaXIaWcG6eJojuPWyhUkDkw3tJIuCkJTw,2968
40
+ ex4nicegui/reactive/EChartsComponent/ECharts.js,sha256=qj3HUngg-pcTjNDCiz7jgz-O2Lx3aW0HhvrcsDEb0a0,1581667
41
+ ex4nicegui/reactive/EChartsComponent/ECharts.py,sha256=J3Vl8h-u__z2iIVtHL-PYWmrqRAB9caMCI50h8nEdCo,3010
23
42
  ex4nicegui/reactive/EChartsComponent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
43
  ex4nicegui/reactive/UseDraggable/UseDraggable.js,sha256=D2_4c64qYwkqG_JzL1ZAwoNZDoz6qtHfPA_Z5RIvmIw,5235
25
44
  ex4nicegui/reactive/UseDraggable/UseDraggable.py,sha256=ii9KGchUWUb0L_PiMQ3qkBmk98IxTfUg9DU7rT9FqXY,3509
@@ -29,15 +48,15 @@ ex4nicegui/reactive/dropZone/dropZone.js,sha256=7rSpFJX-Fk_W_NGZhOTyuEw0bzR-YUc8
29
48
  ex4nicegui/reactive/dropZone/dropZone.py,sha256=hg9UKTayff8v8Ek-n38h_3wX1Qmiotvdyv1Hsqilh5Y,2590
30
49
  ex4nicegui/reactive/officials/__init__.py,sha256=8xPx079EFXpEWtEc1vCbgQJt1TRZuRf91YOaqhkyRIo,1527
31
50
  ex4nicegui/reactive/officials/aggrid.py,sha256=OArj_BTUrD4Y1hxURTJOLeao1lwZ31xc7Ezd_RpEdVY,2408
32
- ex4nicegui/reactive/officials/base.py,sha256=oaoZbvGePk66juwt4Es5ZKhEStK_Hx31OY_n_jLMOxk,4499
33
- ex4nicegui/reactive/officials/button.py,sha256=vbp_cCw8mOf9lWn-_YZJWvzuzY-zI0Gy1sGgg0qd9Pw,2250
51
+ ex4nicegui/reactive/officials/base.py,sha256=OwJQ52nnVtCR47FZW45ZPZcamHkXtJY1QRiLrS18T6k,4786
52
+ ex4nicegui/reactive/officials/button.py,sha256=mLbPGM7CkoryfPCtOLO1DsyuCU4UQDC9m0tgRy9H_Zc,2251
34
53
  ex4nicegui/reactive/officials/card.py,sha256=8-tBwm3xfVybolQ87i8lAYUpBV6FdaVdeSH6xu0736U,1275
35
54
  ex4nicegui/reactive/officials/checkbox.py,sha256=Dy4zCqR_uv--EWNEr3eOIpfvO7VE_v-gOdI1o60SRvw,1772
36
55
  ex4nicegui/reactive/officials/color_picker.py,sha256=s6zUBkCAqAnBnoLWS3bXFIqmCK5iLiQv8VdY_x33H7w,2744
37
56
  ex4nicegui/reactive/officials/column.py,sha256=3RLvVKNaDtOb8df4uS3xRfwJJPuH1ndXk_Y4Gry0Tjo,413
38
57
  ex4nicegui/reactive/officials/date.py,sha256=4muMUxoXwV_OYBoe-ucB5g20msT2zjbiyfGNZbKPdoU,2700
39
- ex4nicegui/reactive/officials/drawer.py,sha256=7XqP8UmkvgxglV1-vUwbo5Sx2Fz7CPr1UqBfriEagDE,2443
40
- ex4nicegui/reactive/officials/echarts.py,sha256=kVlKT1PPjD7BDvI8LmOfyhvhCt4KyHQEVYD9M0fQu2I,2159
58
+ ex4nicegui/reactive/officials/drawer.py,sha256=8g88ppLIepYVG_0qUaZdsakvB3ag6IY_x4fAEgOiyGY,2409
59
+ ex4nicegui/reactive/officials/echarts.py,sha256=HmQqzcvIFum6C80_b6IPmLLy-D16l_8y1IaHYFOsylk,2198
41
60
  ex4nicegui/reactive/officials/expansion.py,sha256=Z2aKsrtUpkO0Z4kO9kPwcu7piBcE_d62OAC2oVDFTGE,1528
42
61
  ex4nicegui/reactive/officials/grid.py,sha256=6brGijR9ZLqOhe5r2w4BF81R8I4kJPZxZVkbQjXwlOU,925
43
62
  ex4nicegui/reactive/officials/html.py,sha256=7CQWKu_t3MdDJX21fTC3xTMAOcg0gKZrKJsaSCpZ0e4,1687
@@ -61,10 +80,11 @@ ex4nicegui/reactive/useMouse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
61
80
  ex4nicegui/tools/__init__.py,sha256=Ue6ATQC9BuQlJEcs2JnuFXZh4DYh9twKc4F7zpIPhjE,40
62
81
  ex4nicegui/tools/debug.py,sha256=HCKlVzhHx5av-983ADgwgMkScKwTreSluLA7uikGYa0,4887
63
82
  ex4nicegui/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ ex4nicegui/utils/clientScope.py,sha256=plgHxcCY1y76bK31u5zfOTX8cnYC1Jlx-N3cAgCY2G4,1143
64
84
  ex4nicegui/utils/common.py,sha256=5fsaOkoj-Ild1LGsInZXra66gJLVoVcZGAIG6YOeM6E,430
65
- ex4nicegui/utils/signals.py,sha256=Dwvb0Anansa0N1ZH2Ko0yCX9o-QHKbXOYEtvdrtde9g,4807
66
- ex4nicegui-0.2.18.dist-info/LICENSE,sha256=0KDDElS2dl-HIsWvbpy8ywbLzJMBFzXLev57LnMIZXs,1094
67
- ex4nicegui-0.2.18.dist-info/METADATA,sha256=wpiHNzH4hmeP__pwog5DyINiHtd99yQgHl48qj7DakI,515
68
- ex4nicegui-0.2.18.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
69
- ex4nicegui-0.2.18.dist-info/top_level.txt,sha256=VFwMiO9AFjj5rfLMJwN1ipLRASk9fJXB8tM6DNrpvPQ,11
70
- ex4nicegui-0.2.18.dist-info/RECORD,,
85
+ ex4nicegui/utils/signals.py,sha256=CaQbiQtcOvLEnjImezzIJuOotCmPGr0VW0yXRIOP0XI,6121
86
+ ex4nicegui-0.3.1.dist-info/LICENSE,sha256=0KDDElS2dl-HIsWvbpy8ywbLzJMBFzXLev57LnMIZXs,1094
87
+ ex4nicegui-0.3.1.dist-info/METADATA,sha256=1pqxdI5s9CbS4G5VZ3dz0Ym41KdAfXhRI1T7J9G1Oqg,514
88
+ ex4nicegui-0.3.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
89
+ ex4nicegui-0.3.1.dist-info/top_level.txt,sha256=VFwMiO9AFjj5rfLMJwN1ipLRASk9fJXB8tM6DNrpvPQ,11
90
+ ex4nicegui-0.3.1.dist-info/RECORD,,