ex4nicegui 0.8.6__py3-none-any.whl → 0.8.8__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.
@@ -1,6 +1,13 @@
1
1
  import 'echarts'
2
2
  import { convertDynamicProperties } from "../../static/utils/dynamic_properties.js";
3
3
 
4
+ const registerThemeTask = Promise.all(
5
+ (echarts._ex4ng_themes || []).map(async ({ name, url }) => {
6
+ const data = await fetch(url).then(response => response.json());
7
+ echarts.registerTheme(name, data);
8
+ })
9
+ );
10
+
4
11
  function collectMapRegisterTask() {
5
12
  const tasks = new Map();
6
13
 
@@ -57,6 +64,8 @@ export default {
57
64
  async mounted() {
58
65
  await new Promise((resolve) => setTimeout(resolve, 0)); // wait for Tailwind classes to be applied
59
66
 
67
+ await registerThemeTask;
68
+
60
69
  this.chart = echarts.init(this.$el, this.theme, this.initOptions);
61
70
  this.resizeObs = new ResizeObserver(this.chart.resize)
62
71
 
@@ -28,6 +28,7 @@ class echarts(Element, component="ECharts.js", dependencies=libraries): # type:
28
28
  options: Optional[dict] = None,
29
29
  code: Optional[str] = None,
30
30
  init_options: Optional[dict] = None,
31
+ theme: Optional[str] = None,
31
32
  ) -> None:
32
33
  super().__init__()
33
34
 
@@ -47,6 +48,9 @@ class echarts(Element, component="ECharts.js", dependencies=libraries): # type:
47
48
  self._props["initOptions"] = init_options
48
49
  self._props["eventTasks"] = {}
49
50
 
51
+ if theme:
52
+ self._props["theme"] = theme
53
+
50
54
  def update_chart(
51
55
  self,
52
56
  merge_opts: Optional[dict] = None,
@@ -74,7 +74,7 @@ from .mermaid.mermaid import Mermaid as mermaid
74
74
  from .officials.dialog import DialogBindableUi as dialog
75
75
  from .vfor import vfor, VforStore
76
76
  from .vmodel import vmodel
77
- from .view_model import ViewModel, var, cached_var, list_var
77
+ from .view_model import ViewModel, var, cached_var, list_var, dict_var
78
78
 
79
79
  pagination = q_pagination
80
80
 
@@ -102,6 +102,7 @@ __all__ = [
102
102
  "var",
103
103
  "cached_var",
104
104
  "list_var",
105
+ "dict_var",
105
106
  "html",
106
107
  "aggrid",
107
108
  "button",
@@ -1,5 +1,5 @@
1
1
  from pathlib import Path
2
- from typing import Any, Callable, Dict, List, Union, cast, Optional, Literal
2
+ from typing import Any, Callable, Dict, List, Union, cast, Optional, Literal, ClassVar
3
3
  from ex4nicegui.reactive.services.reactive_service import ParameterClassifier
4
4
  from ex4nicegui.utils.signals import (
5
5
  TGetterOrReadonlyRef,
@@ -17,10 +17,14 @@ from ex4nicegui.reactive.EChartsComponent.events import EChartsMouseEventArgumen
17
17
  from nicegui.awaitable_response import AwaitableResponse
18
18
  from nicegui import ui, app
19
19
  import orjson as json
20
+ from contextvars import ContextVar
20
21
 
21
22
 
22
23
  class EChartsBindableUi(BindableUi[echarts]):
23
24
  EChartsMouseEventArguments = EChartsMouseEventArguments
25
+ _CURRENT_THEME: ClassVar[ContextVar[Optional[str]]] = ContextVar(
26
+ "CURRENT_THEME", default=None
27
+ )
24
28
 
25
29
  def __init__(
26
30
  self,
@@ -28,6 +32,8 @@ class EChartsBindableUi(BindableUi[echarts]):
28
32
  not_merge: TMaybeRef[Union[bool, None]] = None,
29
33
  code: Optional[str] = None,
30
34
  init_options: Optional[Dict] = None,
35
+ *,
36
+ theme: Optional[str] = None,
31
37
  ) -> None:
32
38
  """Create a new ECharts instance.
33
39
 
@@ -43,10 +49,11 @@ class EChartsBindableUi(BindableUi[echarts]):
43
49
  pc = ParameterClassifier(
44
50
  locals(),
45
51
  maybeRefs=["options", "code", "init_options"],
46
- exclude=["not_merge"],
52
+ exclude=["not_merge", "theme"],
47
53
  )
48
54
 
49
55
  value_kws = pc.get_values_kws()
56
+ value_kws["theme"] = theme or self._CURRENT_THEME.get()
50
57
 
51
58
  element = echarts(**value_kws).classes("nicegui-echart")
52
59
 
@@ -59,6 +66,44 @@ class EChartsBindableUi(BindableUi[echarts]):
59
66
  for key, value in pc.get_bindings().items():
60
67
  self.bind_prop(key, value) # type: ignore
61
68
 
69
+ @classmethod
70
+ def register_theme(cls, name: str, theme: Path):
71
+ """register a new theme to echarts.
72
+
73
+ @see - https://github.com/CrystalWindSnake/ex4nicegui/blob/main/README.en.md#rxuiechartsregister_theme
74
+ @中文文档 - https://gitee.com/carson_add/ex4nicegui/tree/main/#rxuiechartsregister_theme
75
+
76
+ Args:
77
+ name (str): Theme name.
78
+ theme (Path): Theme file path.
79
+
80
+ ## Examples
81
+ .. code-block:: python
82
+
83
+ @ui.page('/)
84
+ def index():
85
+ rxui.echarts.register_theme("my_theme", Path("path/to/my_theme.json"))
86
+ rxui.echarts(opts)
87
+
88
+ """
89
+
90
+ url = app.add_static_file(local_file=theme)
91
+
92
+ ui.add_body_html(
93
+ rf"""
94
+ <script type="module">
95
+ import "echarts";
96
+ echarts._ex4ng_themes = echarts._ex4ng_themes || [];
97
+ echarts._ex4ng_themes.push({{
98
+ name: "{name}",
99
+ url: "{url}"
100
+ }});
101
+ </script>
102
+ """
103
+ )
104
+ cls._CURRENT_THEME.set(name)
105
+ return cls
106
+
62
107
  @classmethod
63
108
  def register_map(
64
109
  cls,
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from typing import Any, Callable, List, Optional, Union, Type, TypeVar, overload
2
+ from typing import Any, Callable, Dict, List, Optional, Union, Type, TypeVar, overload
3
3
  from ex4nicegui.utils.signals import (
4
4
  deep_ref,
5
5
  is_ref,
@@ -23,6 +23,7 @@ from ex4nicegui.utils.proxy.descriptor import ProxyDescriptor
23
23
 
24
24
  _CACHED_VARS_FLAG = "__vm_cached__"
25
25
  _LIST_VAR_FLAG = "__vm_list_var__"
26
+ _DICT_VAR_FLAG = "__vm_dict_var__"
26
27
 
27
28
  _T = TypeVar("_T")
28
29
 
@@ -72,7 +73,8 @@ class ViewModel(NoProxy):
72
73
  if callable(value) and hasattr(value, _CACHED_VARS_FLAG):
73
74
  setattr(self, name, computed(partial(value, self)))
74
75
 
75
- def __init_subclass__(cls) -> None:
76
+ def __init_subclass__(cls, **kwargs) -> None:
77
+ super().__init_subclass__(**kwargs)
76
78
  need_vars = (
77
79
  (name, value)
78
80
  for name, value in vars(cls).items()
@@ -80,7 +82,7 @@ class ViewModel(NoProxy):
80
82
  )
81
83
 
82
84
  for name, value in need_vars:
83
- class_var_setter(cls, name, value, _LIST_VAR_FLAG)
85
+ class_var_setter(cls, name, value, _LIST_VAR_FLAG, _DICT_VAR_FLAG)
84
86
 
85
87
  @overload
86
88
  @staticmethod
@@ -280,6 +282,34 @@ def list_var(factory: Callable[[], List[_T_Var_Value]]) -> List[_T_Var_Value]:
280
282
  return factory # type: ignore
281
283
 
282
284
 
285
+ def dict_var(factory: Callable[[], Dict]) -> Dict:
286
+ """Create implicitly proxied reactive variables for dictionaries. Use them just like ordinary dictionaries while maintaining reactivity. Only use within rxui.ViewModel.
287
+
288
+ Args:
289
+ factory (Callable[[], Dict]): A factory function that returns a new dictionary.
290
+
291
+ Example:
292
+ .. code-block:: python
293
+ from ex4nicegui import rxui
294
+ class State(rxui.ViewModel):
295
+ data = rxui.dict_var(lambda: {"a": 1, "b": 2, "c": 3})
296
+
297
+ def update_data(self):
298
+ self.data["d"] = len(self.data) + 1
299
+
300
+ def display_data(self):
301
+ return ",".join(f"{k}:{v}" for k, v in self.data.items())
302
+
303
+ state = State()
304
+ ui.button("Update", on_click=state.update_data)
305
+ rxui.label(state.display_data)
306
+
307
+ """
308
+ assert callable(factory), "factory must be a callable"
309
+ setattr(factory, _DICT_VAR_FLAG, None)
310
+ return factory # type: ignore
311
+
312
+
283
313
  def cached_var(func: Callable[..., _T]) -> ReadonlyRef[_T]:
284
314
  """A decorator to cache the result of a function. Only use within rxui.ViewModel.
285
315
 
@@ -8,6 +8,7 @@ from .float import FloatProxy
8
8
  from .bool import BoolProxy
9
9
  from .date import DateProxy
10
10
  from .dict import DictProxy
11
+ from ex4nicegui.utils.signals import deep_ref
11
12
  import datetime
12
13
  import warnings
13
14
  from . import to_value_if_base_type_proxy
@@ -61,9 +62,34 @@ class ListDescriptor(ProxyDescriptor[Callable[[], List]]):
61
62
  super().__init__(name, value, lambda x: ListProxy(x() if callable(x) else x))
62
63
 
63
64
 
64
- class DictDescriptor(ProxyDescriptor[Dict]):
65
- def __init__(self, name: str, value: Dict) -> None:
66
- super().__init__(name, value, DictProxy)
65
+ class DictDescriptor:
66
+ def __init__(
67
+ self,
68
+ name: str,
69
+ factory: Callable[[], Dict],
70
+ ) -> None:
71
+ self.name = name
72
+ self._ref_builder = lambda: deep_ref(factory())
73
+
74
+ def __get__(self, instance: object, owner: Any):
75
+ if instance is None:
76
+ return self
77
+
78
+ proxy = instance.__dict__.get(self.name, None)
79
+ if proxy is None:
80
+ proxy = self._ref_builder()
81
+ instance.__dict__[self.name] = proxy
82
+
83
+ return proxy.value
84
+
85
+ def __set__(self, instance: object, value: T) -> None:
86
+ value = to_value_if_base_type_proxy(value)
87
+ proxy = instance.__dict__.get(self.name, None)
88
+ if proxy is None:
89
+ proxy = self._ref_builder()
90
+ instance.__dict__[self.name] = proxy
91
+
92
+ proxy.value = value # type: ignore
67
93
 
68
94
 
69
95
  class StringDescriptor(ProxyDescriptor[str]):
@@ -91,7 +117,9 @@ class DateDescriptor(ProxyDescriptor[datetime.date]):
91
117
  super().__init__(name, value, lambda x: DateProxy(x.year, x.month, x.day))
92
118
 
93
119
 
94
- def class_var_setter(cls: Type, name: str, value, list_var_flat: str) -> None:
120
+ def class_var_setter(
121
+ cls: Type, name: str, value, list_var_flat: str, dict_var_flat: str
122
+ ) -> None:
95
123
  if value is None or isinstance(value, str):
96
124
  setattr(cls, name, StringDescriptor(name, value))
97
125
  elif isinstance(value, bool):
@@ -111,9 +139,8 @@ def class_var_setter(cls: Type, name: str, value, list_var_flat: str) -> None:
111
139
  )
112
140
  setattr(cls, name, ListDescriptor(name, lambda: []))
113
141
 
114
- elif isinstance(value, dict):
115
- pass # TODO
116
- # setattr(cls, name, DictDescriptor(name, value))
142
+ elif callable(value) and hasattr(value, dict_var_flat):
143
+ setattr(cls, name, DictDescriptor(name, value))
117
144
  elif isinstance(value, float):
118
145
  setattr(cls, name, FloatDescriptor(name, value))
119
146
  elif isinstance(value, datetime.date):
@@ -1,8 +1,7 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: ex4nicegui
3
- Version: 0.8.6
3
+ Version: 0.8.8
4
4
  Summary: Extension library based on nicegui, providing data responsive,BI functionality modules
5
- Home-page: https://github.com/CrystalWindSnake/ex4nicegui
6
5
  License: MIT
7
6
  Keywords: nicegui,ex4nicegui,webui
8
7
  Author: CrystalWindSnake
@@ -15,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
18
  Requires-Dist: executing (>=2.0.1,<3.0.0)
19
19
  Requires-Dist: nicegui (>=2.0.0,<3.0.0)
20
20
  Requires-Dist: signe (>=0.4.22,<0.5.0)
@@ -458,6 +458,7 @@ class MyApp(rxui.ViewModel):
458
458
  - [echarts 图表鼠标事件](#echarts-图表鼠标事件)
459
459
  - [rxui.echarts.from\_javascript](#rxuiechartsfrom_javascript)
460
460
  - [rxui.echarts.register\_map](#rxuiechartsregister_map)
461
+ - [rxui.echarts.register\_theme](#rxuiechartsregister_theme)
461
462
  - [tab\_panels](#tab_panels)
462
463
  - [lazy\_tab\_panels](#lazy_tab_panels)
463
464
  - [scoped\_style](#scoped_style)
@@ -1346,6 +1347,35 @@ rxui.echarts.register_map(
1346
1347
  )
1347
1348
  ```
1348
1349
 
1350
+ ---
1351
+ ##### rxui.echarts.register_theme
1352
+ 注册主题.
1353
+
1354
+ ```python
1355
+ @ui.page("/")
1356
+ def page():
1357
+ # 本页范围,所有 rxui.echarts 默认主题均为 walden(最后注册的主题)
1358
+ rxui.echarts.register_theme(
1359
+ "my_theme", Path(__file__).parent / "echarts_theme.json"
1360
+ ).register_theme("walden", Path(__file__).parent / "echarts_walden.json")
1361
+
1362
+ opts = {
1363
+ "xAxis": {"data": ["Shirts", "Cardigans"]},
1364
+ "yAxis": {},
1365
+ "series": [{"type": "bar", "data": [5, 20]}],
1366
+ }
1367
+
1368
+ # 主题为 walden
1369
+ rxui.echarts(opts)
1370
+
1371
+ # 主题为 my_theme
1372
+ rxui.echarts(
1373
+ opts,
1374
+ theme="my_theme",
1375
+ )
1376
+
1377
+ ```
1378
+
1349
1379
  ---
1350
1380
 
1351
1381
  #### tab_panels
@@ -70,13 +70,13 @@ ex4nicegui/libs/gsap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
70
70
  ex4nicegui/libs/gsap/utils/matrix.js,sha256=77scrxbQZXx4ex5HkvnT9IkhMG1rQoDNp4TSYgUeYVk,15235
71
71
  ex4nicegui/libs/gsap/utils/paths.js,sha256=2SPaRHQ7zgba9cH8hGhkTYPCZdrrEhE2qhh6ECAEvSA,49314
72
72
  ex4nicegui/libs/gsap/utils/strings.js,sha256=47G9slz5ltG9mDSwrfQDtWzzdV5QJ-AIMLRMNK0VSiM,10472
73
- ex4nicegui/reactive/__init__.py,sha256=I5GhhBCPBIVj3vhLE7Zf_UpjIK7ZOwCFFCC3YNPE4Rs,4668
73
+ ex4nicegui/reactive/__init__.py,sha256=Mzt4pXWcj5abJuUfqyy_oGex-jTmaXiH3fiB972JprY,4695
74
74
  ex4nicegui/reactive/base.py,sha256=CQmWhrKHNMF2ql7O6VOKEOBdEcc3-yagOcERpnUPYus,16323
75
75
  ex4nicegui/reactive/deferredTask.py,sha256=g78TTG1EIkBxjPih01xmrCZw9OxQG93veSVSELWKfcU,987
76
76
  ex4nicegui/reactive/dropZone/dropZone.js,sha256=7rSpFJX-Fk_W_NGZhOTyuEw0bzR-YUc8ZYPzQG9KzE0,2713
77
77
  ex4nicegui/reactive/dropZone/dropZone.py,sha256=hg9UKTayff8v8Ek-n38h_3wX1Qmiotvdyv1Hsqilh5Y,2590
78
- ex4nicegui/reactive/EChartsComponent/ECharts.js,sha256=K9sX34SMnghwDMCkl-IA7WsntxyryeRsboihkIwDb84,3852
79
- ex4nicegui/reactive/EChartsComponent/ECharts.py,sha256=jLRdKqJWCtKHzNlFAX9ePAmzP1WSXRzBQAO0KHHkfBA,4258
78
+ ex4nicegui/reactive/EChartsComponent/ECharts.js,sha256=Dhsfzlio9zO2T3LhK5cI7IdPXHtWhbBXMdlL3uvkU24,4110
79
+ ex4nicegui/reactive/EChartsComponent/ECharts.py,sha256=NjJocWIEF4xzvRQVbkTQSaB2fF_GIVf2_QaMKjln9hU,4359
80
80
  ex4nicegui/reactive/EChartsComponent/events.py,sha256=ln10cNw5ODiSmdKVi6KBZ6JMR3YIZ6itYZcMgNAlKhA,741
81
81
  ex4nicegui/reactive/EChartsComponent/types.py,sha256=_7AekG0IyzRpDEBZMtKRiZ3o3dUCcn6btegBk8c9Fig,1001
82
82
  ex4nicegui/reactive/EChartsComponent/utils.py,sha256=YqxodbGD_lk_Bp-K8s8XvgqSXRf_CIHmzeubrqFRuVM,1013
@@ -105,7 +105,7 @@ ex4nicegui/reactive/officials/column.py,sha256=fllKknMEUw7uNhmP7w4pgBT7HTDbpkN-d
105
105
  ex4nicegui/reactive/officials/date.py,sha256=lRiJNrgs_oNo9AZTfTX_66dYL7az4co5rfRyIzvGAIo,2440
106
106
  ex4nicegui/reactive/officials/dialog.py,sha256=3dyrvsUwM1Q7jr_PgLKt92KDA6Hris0DH90-sKamfFE,1297
107
107
  ex4nicegui/reactive/officials/drawer.py,sha256=_Ro6stOh8U3igYMeDwI4omBgi1nld5berrAk9Dv5RVw,2346
108
- ex4nicegui/reactive/officials/echarts.py,sha256=xRBKVbcCUwUGA8n7bw2eJj9FBQIayL4t_rzXZrjD3Pc,10895
108
+ ex4nicegui/reactive/officials/echarts.py,sha256=ANI74NjGFLF7LoABbc8x9L2Z5nLOguptoK4iUIoSizY,12288
109
109
  ex4nicegui/reactive/officials/element.py,sha256=-qsHcxfF3fMfU0sJlKtTksX_wYPMIPJ_AgFcZbbI754,412
110
110
  ex4nicegui/reactive/officials/expansion.py,sha256=8xwJa0SpsVhFxbYwYRZtf1ul9m4oYTjgmtrRI_lqF_0,1822
111
111
  ex4nicegui/reactive/officials/grid.py,sha256=0vLLJOe7t_b351TsYOWpnrPsWKaqV_bG_010Xp-_BfY,2012
@@ -153,7 +153,7 @@ ex4nicegui/reactive/useMouse/UseMouse.py,sha256=cFNlso7_BneyAfGmWbl-N9vQwGleV2Ar
153
153
  ex4nicegui/reactive/usePagination.py,sha256=8YLqcZ_ecuX0FdQ0ct-XdEFfMAVkubAS_K02YOhg5oo,2584
154
154
  ex4nicegui/reactive/vfor.js,sha256=sCy3KR5Aeyx68yh9VI6I9Vj7bnVuir_LUYKZBe_ePTg,908
155
155
  ex4nicegui/reactive/vfor.py,sha256=SSu3X2DLZeCveTrcLANYNMNpLv34cJonLCp_9W0HFlY,7931
156
- ex4nicegui/reactive/view_model.py,sha256=1V5s_uBx9N_Iv2b0tJLsRA_7LNBi6ySlge-rbyQkCC8,8792
156
+ ex4nicegui/reactive/view_model.py,sha256=OSOnOTc86JgYqO6pb3J_IrOdDKP0MyEIeSHYX4P3EOI,9904
157
157
  ex4nicegui/reactive/vmodel.py,sha256=ymrUpC_68jaHF76ivKmgz-C4Xl6i65c_41uMc0ffEhY,5936
158
158
  ex4nicegui/toolbox/__init__.py,sha256=Q5pIvMJX5Ugf2dLcffU4wK6DFQW_qsKV5iTJPoALvTQ,235
159
159
  ex4nicegui/toolbox/core/vue_use.py,sha256=0wzNJTDuZ08BNEVs0ibXiinje8SQIpeqEJIoug25iwg,969
@@ -173,7 +173,7 @@ ex4nicegui/utils/proxy/__init__.py,sha256=L0SO_32i33Unue0fCFVpHdyZljuykWHjll3Dmd
173
173
  ex4nicegui/utils/proxy/base.py,sha256=g_7308xGAB3bB3EiEf_-0JKfUzImwt5_T9XVyT7zJJg,128
174
174
  ex4nicegui/utils/proxy/bool.py,sha256=KQ2Sp2r4nLScif9DhupDmkpRhbsuXdpXTkxSrtFYtDE,1774
175
175
  ex4nicegui/utils/proxy/date.py,sha256=wS0M4nfGVQ7A1u9tJkPqilEhDwcMKBjtTC9VjUsOqac,2356
176
- ex4nicegui/utils/proxy/descriptor.py,sha256=VuPBXAE7mHbJ3EUAsftr3mettDvju79bR-SlwczRrAs,4594
176
+ ex4nicegui/utils/proxy/descriptor.py,sha256=BG6KQGTSMX1QKpXDvkrMk9wvL__vzg6m2GSuaj1leeE,5384
177
177
  ex4nicegui/utils/proxy/dict.py,sha256=MPtx-09ylf_bHXnkr1c7PmJeaq2KpDp-_Shyw5YjOLU,3046
178
178
  ex4nicegui/utils/proxy/float.py,sha256=fdMUS7_xwypdDNscuZaUn3NA0vx8LGswAOc9kw0jK0c,5271
179
179
  ex4nicegui/utils/proxy/int.py,sha256=0Y7L924Zzq6LWRZEmaTmoXf0J6kC0o5EtW--2Lk7SNw,7381
@@ -186,7 +186,7 @@ ex4nicegui/utils/scheduler.py,sha256=1gyq7Y2BkbwmPK_Q9kpRpc1MOC9H7xcpxuix-RZhN9k
186
186
  ex4nicegui/utils/signals.py,sha256=Jz0jKFPrJIRV0Gye62Bgk2kGgod1KBvDhnF-W3lRm04,7373
187
187
  ex4nicegui/utils/types.py,sha256=pE5WOSbcTHxaAhnT24FaZEd1B2Z_lTcsd46w0OKiMyc,359
188
188
  ex4nicegui/version.py,sha256=NE7u1piESstg3xCtf5hhV4iedGs2qJQw9SiC3ZSpiio,90
189
- ex4nicegui-0.8.6.dist-info/LICENSE,sha256=0KDDElS2dl-HIsWvbpy8ywbLzJMBFzXLev57LnMIZXs,1094
190
- ex4nicegui-0.8.6.dist-info/METADATA,sha256=_cFoYls_MNIYvzX1RQEo_95byNPo0WgBbj7hKZiG3c8,46125
191
- ex4nicegui-0.8.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
192
- ex4nicegui-0.8.6.dist-info/RECORD,,
189
+ ex4nicegui-0.8.8.dist-info/LICENSE,sha256=0KDDElS2dl-HIsWvbpy8ywbLzJMBFzXLev57LnMIZXs,1094
190
+ ex4nicegui-0.8.8.dist-info/METADATA,sha256=F65K1T5Q-aq5j43kfUik17A08SdSUBNJnAsPWLLjTQk,46832
191
+ ex4nicegui-0.8.8.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
192
+ ex4nicegui-0.8.8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 2.1.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any