ex4nicegui 0.6.9__py3-none-any.whl → 0.7.0__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 (47) hide show
  1. ex4nicegui/bi/dataSourceFacade.py +20 -20
  2. ex4nicegui/bi/index.py +20 -23
  3. ex4nicegui/reactive/EChartsComponent/ECharts.py +9 -8
  4. ex4nicegui/reactive/__init__.py +8 -0
  5. ex4nicegui/reactive/base.py +61 -54
  6. ex4nicegui/reactive/mixins/backgroundColor.py +5 -5
  7. ex4nicegui/reactive/mixins/disableable.py +8 -8
  8. ex4nicegui/reactive/mixins/textColor.py +10 -10
  9. ex4nicegui/reactive/officials/aggrid.py +5 -5
  10. ex4nicegui/reactive/officials/button.py +15 -15
  11. ex4nicegui/reactive/officials/checkbox.py +5 -5
  12. ex4nicegui/reactive/officials/chip.py +5 -5
  13. ex4nicegui/reactive/officials/circular_progress.py +6 -6
  14. ex4nicegui/reactive/officials/color_picker.py +7 -7
  15. ex4nicegui/reactive/officials/column.py +5 -5
  16. ex4nicegui/reactive/officials/date.py +5 -5
  17. ex4nicegui/reactive/officials/dialog.py +49 -0
  18. ex4nicegui/reactive/officials/echarts.py +49 -51
  19. ex4nicegui/reactive/officials/expansion.py +5 -5
  20. ex4nicegui/reactive/officials/icon.py +6 -6
  21. ex4nicegui/reactive/officials/image.py +5 -5
  22. ex4nicegui/reactive/officials/input.py +8 -8
  23. ex4nicegui/reactive/officials/knob.py +6 -6
  24. ex4nicegui/reactive/officials/label.py +6 -6
  25. ex4nicegui/reactive/officials/linear_progress.py +6 -6
  26. ex4nicegui/reactive/officials/number.py +9 -9
  27. ex4nicegui/reactive/officials/radio.py +8 -8
  28. ex4nicegui/reactive/officials/row.py +5 -5
  29. ex4nicegui/reactive/officials/select.py +9 -8
  30. ex4nicegui/reactive/officials/slider.py +5 -5
  31. ex4nicegui/reactive/officials/switch.py +5 -5
  32. ex4nicegui/reactive/officials/tab.py +0 -12
  33. ex4nicegui/reactive/officials/tab_panels.py +5 -5
  34. ex4nicegui/reactive/officials/table.py +13 -13
  35. ex4nicegui/reactive/officials/tabs.py +5 -5
  36. ex4nicegui/reactive/officials/textarea.py +5 -5
  37. ex4nicegui/reactive/officials/tooltip.py +40 -0
  38. ex4nicegui/reactive/q_pagination.py +5 -5
  39. ex4nicegui/reactive/vfor.js +14 -4
  40. ex4nicegui/reactive/vfor.py +128 -58
  41. ex4nicegui/reactive/view_model.py +160 -0
  42. ex4nicegui/reactive/vmodel.py +42 -12
  43. ex4nicegui/utils/signals.py +23 -21
  44. {ex4nicegui-0.6.9.dist-info → ex4nicegui-0.7.0.dist-info}/METADATA +219 -48
  45. {ex4nicegui-0.6.9.dist-info → ex4nicegui-0.7.0.dist-info}/RECORD +47 -44
  46. {ex4nicegui-0.6.9.dist-info → ex4nicegui-0.7.0.dist-info}/LICENSE +0 -0
  47. {ex4nicegui-0.6.9.dist-info → ex4nicegui-0.7.0.dist-info}/WHEEL +0 -0
@@ -26,6 +26,7 @@ import executing
26
26
  import ast
27
27
  import warnings
28
28
  from ex4nicegui.reactive.systems.object_system import get_attribute, set_attribute
29
+ from ex4nicegui.utils.types import _TMaybeRef as TMaybeRef, Ref
29
30
 
30
31
  _T = TypeVar("_T")
31
32
 
@@ -138,23 +139,24 @@ def vmodel(expr: Any, *attrs: Union[str, int]) -> TRef[Any]:
138
139
  expr (Any): _description_
139
140
 
140
141
  ## Examples
141
- ```python
142
- from ex4nicegui.reactive import rxui
143
- from ex4nicegui import deep_ref
144
142
 
145
- data = deep_ref({"a": 1, "b": [1, 2, 3, 4]})
143
+ .. code-block:: python
144
+ from ex4nicegui.reactive import rxui
145
+ from ex4nicegui import deep_ref
146
146
 
147
- rxui.label(lambda: f"{data.value=!s}")
147
+ data = deep_ref({"a": 1, "b": [1, 2, 3, 4]})
148
148
 
149
- # No binding effect
150
- rxui.input(value=data.value["a"])
149
+ rxui.label(lambda: f"{data.value=!s}")
151
150
 
152
- # readonly binding
153
- rxui.input(value=lambda: data.value["a"])
151
+ # No binding effect
152
+ rxui.input(value=data.value["a"])
153
+
154
+ # readonly binding
155
+ rxui.input(value=lambda: data.value["a"])
156
+
157
+ # two-way binding
158
+ rxui.input(value=rxui.vmodel(data.value,'a'))
154
159
 
155
- # two-way binding
156
- rxui.input(value=rxui.vmodel(data.value["a"]))
157
- ```
158
160
 
159
161
  """
160
162
 
@@ -205,3 +207,31 @@ def vmodel(expr: Any, *attrs: Union[str, int]) -> TRef[Any]:
205
207
  TRef,
206
208
  wrapper,
207
209
  )
210
+
211
+
212
+ def vmodel_with_index(ref: Ref, index: TMaybeRef[int], *keys: Union[str, int]) -> Ref:
213
+ proxy = ref.value
214
+
215
+ def getter():
216
+ item = proxy[to_value(index)]
217
+ result = item
218
+
219
+ for k in keys:
220
+ result = get_attribute(result, k)
221
+ return result
222
+
223
+ def setter(value):
224
+ item = proxy[to_value(index)]
225
+
226
+ if len(keys) == 1:
227
+ set_attribute(item, keys[0], value)
228
+ return
229
+
230
+ obj = get_attribute(item, keys[0])
231
+
232
+ for k in keys[1:-1]:
233
+ set_attribute(obj, k, get_attribute(obj, k))
234
+
235
+ set_attribute(obj, keys[-1], value)
236
+
237
+ return RefWrapper(getter, setter) # type: ignore
@@ -54,11 +54,12 @@ def to_value(obj: Union[_TMaybeRef[T], RefWrapper]) -> T:
54
54
  obj (Union[_TMaybeRef[T], RefWrapper]): A getter function, an existing ref, or a non-function value.
55
55
 
56
56
  ## Example
57
- ```python
58
- to_value(1) # 1
59
- to_value(lambda: 1) # 1
60
- to_value(to_ref(1)) # 1
61
- ```
57
+
58
+ .. code-block:: python
59
+ to_value(1) # 1
60
+ to_value(lambda: 1) # 1
61
+ to_value(to_ref(1)) # 1
62
+
62
63
  """
63
64
  if is_ref(obj):
64
65
  return obj.value # type: ignore
@@ -239,26 +240,27 @@ def event_batch(event_fn: Callable[..., None]):
239
240
  Args:
240
241
  event_fn (Callable[..., None]): event callback
241
242
 
242
- @Example
243
- ```python
244
- from nicegui import ui
245
- from ex4nicegui import on, to_ref, effect, ref_computed, batch
243
+ ## Example
244
+
245
+ .. code-block:: python
246
+ from nicegui import ui
247
+ from ex4nicegui import on, to_ref, effect, ref_computed, batch
248
+
249
+ a = to_ref(0)
250
+ b = to_ref(0)
251
+ text = ref_computed(lambda: f"a={a.value};b={b.value}")
246
252
 
247
- a = to_ref(0)
248
- b = to_ref(0)
249
- text = ref_computed(lambda: f"a={a.value};b={b.value}")
253
+ @on([a, b, text])
254
+ def when_vars_changed():
255
+ ui.notify(f"a:{a.value};b:{b.value};text={text.value}")
250
256
 
251
- @on([a, b, text])
252
- def when_vars_changed():
253
- ui.notify(f"a:{a.value};b:{b.value};text={text.value}")
257
+ @event_batch
258
+ def when_click():
259
+ a.value += 1
260
+ b.value += 1
254
261
 
255
- @event_batch
256
- def when_click():
257
- a.value += 1
258
- b.value += 1
262
+ ui.button("change all values", on_click=when_click)
259
263
 
260
- ui.button("change all values", on_click=when_click)
261
- ```
262
264
  """
263
265
 
264
266
  def wrap(*args, **kwargs):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ex4nicegui
3
- Version: 0.6.9
3
+ Version: 0.7.0
4
4
  Summary: Extension library based on nicegui, providing data responsive,BI functionality modules
5
5
  Home-page: https://github.com/CrystalWindSnake/ex4nicegui
6
6
  License: MIT
@@ -17,13 +17,17 @@ Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Requires-Dist: executing (>=2.0.1,<3.0.0)
19
19
  Requires-Dist: nicegui (>=1.4.25,<2.0.0)
20
- Requires-Dist: signe (>=0.4.14,<0.5.0)
20
+ Requires-Dist: signe (>=0.4.20,<0.5.0)
21
21
  Project-URL: Repository, https://github.com/CrystalWindSnake/ex4nicegui
22
22
  Description-Content-Type: text/markdown
23
23
 
24
24
  # ex4nicegui
25
- [ENGLISH README](./README.en.md)
26
25
 
26
+ <div align="center">
27
+
28
+ 简体中文| [English](./README.en.md)
29
+
30
+ </div>
27
31
 
28
32
  - [教程](#教程)
29
33
  - [安装](#-安装)
@@ -191,6 +195,154 @@ ui.run()
191
195
  ---
192
196
 
193
197
 
198
+
199
+ ## ViewModel
200
+ 在 `v0.7.0` 版本中,引入 `ViewModel` 类,用于管理一组响应式数据。
201
+
202
+ 下面是一个简单的计算器示例:
203
+
204
+ 1. 当用户修改数值输入框或符号选择框,右侧会自动显示计算结果
205
+ 2. 当结果小于 0 时,结果显示为红色,否则为黑色
206
+
207
+ ```python
208
+ from ex4nicegui import rxui
209
+
210
+ class Calculator(rxui.ViewModel):
211
+ num1 = rxui.var(0)
212
+ sign = rxui.var("+")
213
+ num2 = rxui.var(0)
214
+
215
+ def result(self):
216
+ # 当 num1,sign,num2 任意一个值发生变化时,result 也会重新计算
217
+ return eval(f"{self.num1.value}{self.sign.value}{self.num2.value}")
218
+
219
+ # 每个对象拥有独立的数据
220
+ calc = Calculator()
221
+
222
+ with ui.row(align_items="center"):
223
+ rxui.number(value=calc.num1, label="Number 1")
224
+ rxui.select(value=calc.sign, options=["+", "-", "*", "/"], label="Sign")
225
+ rxui.number(value=calc.num2, label="Number 2")
226
+ ui.label("=")
227
+ rxui.label(calc.result).bind_color(
228
+ lambda: "red" if calc.result() < 0 else "black"
229
+ )
230
+
231
+ ```
232
+
233
+ ### cached_var
234
+
235
+ 上面的示例中,由于使用了两次 `calc.result` 。因此,每当 `num1`, `sign`, `num2` 任意一个值发生变化时,`result` 都会执行2次。
236
+
237
+ 实际上,第二次的计算是多余的。我们可以通过添加 `rxui.cached_var` 装饰器,避免多余的计算。
238
+
239
+ ```python
240
+ class Calculator(rxui.ViewModel):
241
+ ...
242
+
243
+ @rxui.cached_var
244
+ def result(self):
245
+ return eval(f"{self.num1.value}{self.sign.value}{self.num2.value}")
246
+
247
+ ...
248
+ ```
249
+
250
+ ---
251
+
252
+ ### 使用列表
253
+
254
+ 当数据为可变对象时,比如列表,字典等,需要提供工厂函数传给 `rxui.var`
255
+
256
+
257
+ ```python
258
+ class Home(rxui.ViewModel):
259
+ persons= rxui.var(lambda: [])
260
+
261
+ ```
262
+
263
+ 下面的示例,每个 person 使用卡片展示。最上方显示所有人的平均年龄。当个人年龄大于平均年龄,卡片外边框将变为红色。
264
+ 通过 `number` 组件修改年龄,一切都会自动更新。
265
+
266
+ ```python
267
+ from ex4nicegui import rxui, Ref
268
+ from itertools import count
269
+
270
+ id_generator = count()
271
+
272
+ class Person(rxui.ViewModel):
273
+ name = rxui.var("")
274
+ age = rxui.var(0)
275
+
276
+ def __init__(self, name: str = "", age: int = 0):
277
+ super().__init__()
278
+ self.name.value = name
279
+ self.age.value = age
280
+ self.id = next(id_generator)
281
+
282
+
283
+ class Home(rxui.ViewModel):
284
+ persons: Ref[List[Person]] = rxui.var(lambda: [])
285
+
286
+ def avg_age(self) -> float:
287
+ if len(self.persons.value) == 0:
288
+ return 0
289
+
290
+ return sum(p.age.value for p in self.persons.value) / len(self.persons.value)
291
+
292
+ def sample_data(self):
293
+ self.persons.value = [
294
+ Person("alice", 25),
295
+ Person("bob", 30),
296
+ Person("charlie", 31),
297
+ Person("dave", 22),
298
+ Person("eve", 26),
299
+ Person("frank", 29),
300
+ ]
301
+
302
+ home = Home()
303
+ home.sample_data()
304
+
305
+ rxui.label(lambda: f"平均年龄: {home.avg_age()}")
306
+
307
+
308
+ with ui.row():
309
+
310
+ @rxui.vfor(home.persons, key="id")
311
+ def _(store: rxui.VforStore[Person]):
312
+ person = store.get_item()
313
+ with rxui.card().classes("outline").bind_classes(
314
+ {
315
+ "outline-red-500": lambda: person.age.value > home.avg_age(),
316
+ }
317
+ ):
318
+ rxui.input(value=person.name, placeholder="名字")
319
+ rxui.number(value=person.age, min=1, max=100, step=1, placeholder="年龄")
320
+
321
+ ```
322
+
323
+ 如果你觉得 `rxui.vfor` 代码过于复杂,可以使用 `effect_refreshable` 装饰器代替。
324
+
325
+ ```python
326
+ from ex4nicegui import rxui, Ref,effect_refreshable
327
+ ...
328
+
329
+ # 明确指定监控 home.persons 变化,可以避免意味刷新
330
+ @effect_refreshable.on(home.persons)
331
+ def _():
332
+
333
+ for person in home.persons.value:
334
+ ...
335
+ rxui.number(value=person.age, min=1, max=100, step=1, placeholder="年龄")
336
+ ...
337
+ ```
338
+
339
+ 需要注意到,每当 `home.persons` 列表变化时(比如新增或删除元素),`effect_refreshable` 装饰的函数都会重新执行。意味着所有元素都会重新创建。
340
+
341
+
342
+ 更多复杂的应用,可以查看 [examples](./examples)
343
+
344
+ ---
345
+
194
346
  ## 响应式
195
347
 
196
348
  ```python
@@ -331,15 +483,14 @@ ui.button("change", on_click=change_value)
331
483
 
332
484
  > `ref_computed` 是只读的 `to_ref`
333
485
 
334
-
335
- 如果你更喜欢通过类组织代码,`ref_computed` 同样支持作用到实例方法上
486
+ 从 `v0.7.0` 版本开始,不建议使用 `ref_computed` 应用实例方法。你可以使用 `rxui.ViewModel`,并使用 `rxui.cached_var` 装饰器
336
487
 
337
488
  ```python
338
- class MyState:
489
+ class MyState(rxui.ViewModel):
339
490
  def __init__(self) -> None:
340
491
  self.r_text = to_ref("")
341
492
 
342
- @ref_computed
493
+ @rxui.cached_var
343
494
  def post_text(self):
344
495
  return self.r_text.value + "post"
345
496
 
@@ -494,70 +645,90 @@ rxui.input(value=data.value["a"])
494
645
  rxui.input(value=lambda: data.value["a"])
495
646
 
496
647
  # 要使用 vmodel 才能双向绑定
497
- rxui.input(value=rxui.vmodel(data.value["a"]))
648
+ rxui.input(value=rxui.vmodel(data, "a"))
649
+
650
+ # 也可以直接使用,但不推荐
651
+ rxui.input(value=rxui.vmodel(data.value['a']))
652
+
498
653
  ```
499
654
 
500
- - 第一个输入框将完全失去响应性,因为代码等价于直接传入一个数值`1`
655
+ - 第一个输入框将完全失去响应性,因为代码等价于 `rxui.input(value=1)`
501
656
  - 第二个输入框由于使用函数,将得到读取响应性(第三个输入框输入值,将得到同步)
502
657
  - 第三个输入框,使用 `rxui.vmodel` 包裹,即可实现双向绑定
503
658
 
504
- 多数在配合 `vfor` 时使用 `vmodel`,可参考 [todo list 案例](./examples/todomvc/)
659
+ > 如果使用 `rxui.ViewModel` ,你可能不需要使用 `vmodel`
505
660
 
661
+ 可参考 [todo list 案例](./examples/todomvc/)
662
+
663
+ ---
506
664
 
507
665
  ### vfor
508
- 基于列表响应式数据,渲染列表组件。每项组件按需更新。数据项支持字典或任意类型对象
666
+ 基于列表响应式数据,渲染列表组件。每项组件按需更新。数据项支持字典或任意类型对象。
667
+
668
+ 从 `v0.7.0` 版本开始,建议配合 `rxui.ViewModel` 使用。与使用 `effect_refreshable` 装饰器不同,`vfor` 不会重新创建所有的元素,而是更新已存在的元素。
669
+
670
+ 下面是卡片排序例子,卡片总是按年龄排序。当你修改某个卡片中的年龄数据时,卡片会实时调整顺序。但是,光标焦点不会离开输入框。
671
+
509
672
 
510
673
  ```python
674
+ from typing import List
511
675
  from nicegui import ui
512
- from ex4nicegui.reactive import rxui
513
- from ex4nicegui import deep_ref, ref_computed
514
- from typing import Dict
515
-
516
- # refs
517
- items = deep_ref(
518
- [
519
- {"id": 1, "message": "foo", "done": False},
520
- {"id": 2, "message": "bar", "done": True},
521
- ]
522
- )
676
+ from ex4nicegui import rxui, deep_ref as ref, Ref
523
677
 
524
- # ref_computeds
525
- @ref_computed
526
- def done_count_info():
527
- return f"done count:{sum(item['done'] for item in items.value)}"
528
678
 
529
- # method
530
- def check():
531
- for item in items.value:
532
- item["done"] = not item["done"]
679
+ class Person(rxui.ViewModel):
680
+ def __init__(self, name: str, age: int) -> None:
681
+ self.name = name
682
+ self.age = ref(age)
683
+
684
+
685
+ class MyApp(rxui.ViewModel):
686
+ persons: Ref[List[Person]] = rxui.var(lambda: [])
687
+ order = rxui.var("asc")
688
+
689
+ def sort_by_age(self):
690
+ return sorted(
691
+ self.persons.value,
692
+ key=lambda p: p.age.value,
693
+ reverse=self.order.value == "desc",
694
+ )
695
+
696
+ @staticmethod
697
+ def create():
698
+ persons = [
699
+ Person(name="Alice", age=25),
700
+ Person(name="Bob", age=30),
701
+ Person(name="Charlie", age=20),
702
+ Person(name="Dave", age=35),
703
+ Person(name="Eve", age=28),
704
+ ]
705
+ app = MyApp()
706
+ app.persons.value = persons
707
+ return app
533
708
 
534
709
 
535
710
  # ui
536
- rxui.label(done_count_info)
537
- ui.button("check", on_click=check)
711
+ app = MyApp.create()
538
712
 
713
+ with rxui.tabs(app.order):
714
+ rxui.tab("asc", "Ascending")
715
+ rxui.tab("desc", "Descending")
539
716
 
540
- @rxui.vfor(items,key='id')
541
- def _(store: rxui.VforStore[Dict]):
542
- # 函数中构建每一行数据的界面
543
- item = store.get() # 通过 store.get 获取对应行的响应式对象(相当于每行的数据 to_ref(...))
544
- mes = rxui.vmodel(item.value['message']) # 复杂结构默认没有双向绑定,需要使用 `vmodel`
545
717
 
546
- # 输入框输入内容,可以看到单选框的标题同步变化
547
- with ui.card():
548
- with ui.row():
549
- rxui.input(value=mes)
550
- rxui.label(lambda: f"{mes.value=!s}")
551
- rxui.checkbox(text=mes, value=rxui.vmodel(item.value['done']))
718
+ @rxui.vfor(app.sort_by_age, key="name")
719
+ def each_person(s: rxui.VforStore[Person]):
720
+ person = s.get_item()
721
+
722
+ with ui.card(), ui.row(align_items="center"):
723
+ rxui.label(person.name)
724
+ rxui.number(value=person.age, step=1, min=0, max=100)
552
725
 
553
726
  ```
554
727
 
555
728
  - `rxui.vfor` 装饰器到自定义函数
556
- - 第一个参数传入响应式列表。列表中每一项可以是字典或其他对象(`dataclasses` 等等)
557
- - 第二个参数 `key`: 为了可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你可以为每个元素对应的块提供一个唯一的 key 。默认情况使用列表元素索引。
558
- - 自定义函数带有一个参数。通过 `store.get` 可以获取当前行的响应式对象
559
-
560
- > vfor 渲染的项目,只有在新增数据时,才会创建
729
+ - 第一个参数传入响应式列表。注意,无须调用 `app.sort_by_age`
730
+ - 第二个参数 `key`: 为了可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你可以为每个元素对应的块提供一个唯一的 key 。默认情况使用列表元素索引。例子中假定每个人的名字唯一。
731
+ - 自定义函数带有一个参数。通过 `store.get_item` 可以获取当前行的对象。由于 Person 本身继承自 `rxui.ViewModel`,所以它的各项属性可以直接绑定到组件。
561
732
 
562
733
 
563
734
  ---
@@ -1,7 +1,7 @@
1
1
  ex4nicegui/__init__.py,sha256=olowSWbRsHGj1uoL28cZ5697vwXUzgJzusMVFe7adfg,1116
2
2
  ex4nicegui/bi/__init__.py,sha256=eu-2CuzzrcHCyKQOfoo87v6C9nSwFDdeLhjY0cRV13M,315
3
3
  ex4nicegui/bi/dataSource.py,sha256=hOOUN4PpSfPx4Vp1sg9Sfxi5K-wROw9C22Z-mmNXs6w,7644
4
- ex4nicegui/bi/dataSourceFacade.py,sha256=6NuAyrTIk_L2Tz9IRFpuHKRQY_OwJINDzxoM6JYOc14,8186
4
+ ex4nicegui/bi/dataSourceFacade.py,sha256=6p4gXxEd8pGHoM8w4h8Ojy-_ZxIUqlJHIdbGwdNdh5U,8248
5
5
  ex4nicegui/bi/elements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  ex4nicegui/bi/elements/containers.py,sha256=5a9ZkzyVNLnK7DftDYdbVRo0bQFvuMHRI9LBGR__YuI,358
7
7
  ex4nicegui/bi/elements/layouts.py,sha256=teb0Vp-fgsByBNPTiW73kXEu2JponRRj4QQanaalcA0,898
@@ -16,7 +16,7 @@ ex4nicegui/bi/elements/ui_range.py,sha256=1tnka-a0jVfqTwvypKIRgHb6EzYGn3DmsWr3yv
16
16
  ex4nicegui/bi/elements/ui_select.py,sha256=yOab3YrHCZ5kkU3bmDdr-LIAMhOunUsCbtctR8WpnLI,3872
17
17
  ex4nicegui/bi/elements/ui_slider.py,sha256=-b1k3i1v8Z9WIwRaI0PJoYxR3Nbq1GUEyjmQnq9jIeo,2165
18
18
  ex4nicegui/bi/elements/ui_table.py,sha256=aKL26xbiCIQG_-KFEozXjbB4G88FdOK25k2H0k24bys,1810
19
- ex4nicegui/bi/index.py,sha256=ZuwFxUD1KcxBpKvTLO7CGQQ5gN7FDpaHo9tfAS3UpQ4,2067
19
+ ex4nicegui/bi/index.py,sha256=orzOh-5AN4gq2xsqaLs711pjrueUA9YJd4alQGloCP0,2121
20
20
  ex4nicegui/bi/protocols.py,sha256=SjwYrS21L6dcNfYrLvh5pESya0NIa6ihQ6URMU6z-6Q,4529
21
21
  ex4nicegui/bi/types.py,sha256=PGPUXr17iRmxxYHxHKJSdxp5CdAkHWb2_9nJ1GwYRlc,355
22
22
  ex4nicegui/experimental_/__init__.py,sha256=HODL0f70HUzVrfRwUzdCwxTp_9mYr4D1nnzd8jevlMw,69
@@ -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=mutWUjTNYefm_FC7yrjg5beceQCWFX0YGGFoRP01he0,3881
74
- ex4nicegui/reactive/base.py,sha256=_1n78kAC65jLyHm91HkeuCq4MuvISY_gc3J6xXipLec,13635
73
+ ex4nicegui/reactive/__init__.py,sha256=Wokz5KhIb_E-v-TtdyVpZDpMyFE-QiCU-NlPOEVGKxQ,4132
74
+ ex4nicegui/reactive/base.py,sha256=vNZyM18wwXuzUAEsoJZq1F9ogAHO9sPUbNMxshThJ4I,13907
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
78
  ex4nicegui/reactive/EChartsComponent/ECharts.js,sha256=ye2FZNLfY4T41YAGQQYqn3LThSlnbY0pqnGtpyEg9bE,3548
79
- ex4nicegui/reactive/EChartsComponent/ECharts.py,sha256=ho6Cnz5zv99UXyQGdoln81KSCWlLsA4ZUT0Jdic4Xmo,4490
79
+ ex4nicegui/reactive/EChartsComponent/ECharts.py,sha256=Qa1kzClEwjJo9yJy-fer75PoZxwnf6jSwFJSuYoODAA,4463
80
80
  ex4nicegui/reactive/EChartsComponent/events.py,sha256=_BtmLRcAIZciDQT5i1eFc-r3e0pBnAabW1BSl6uzhCc,570
81
81
  ex4nicegui/reactive/EChartsComponent/types.py,sha256=_7AekG0IyzRpDEBZMtKRiZ3o3dUCcn6btegBk8c9Fig,1001
82
82
  ex4nicegui/reactive/EChartsComponent/utils.py,sha256=a5r2fghC6IIZbyfUUR8TEkpLj9HPbcf8QHEBatXaL2M,1463
@@ -86,46 +86,48 @@ ex4nicegui/reactive/fileWatcher.py,sha256=gjeZhgar02f-qGQa47Tj5SMaCP_ftRtSU898XU
86
86
  ex4nicegui/reactive/local_file_picker.py,sha256=MoInXSauFdCuhYi_CmNKZwxAtsOqXh8roWWdqNwjPBY,6199
87
87
  ex4nicegui/reactive/mermaid/mermaid.js,sha256=Ds5VevGWZE1_N0WKf-uITd8xSCO9gQzVUsmb80EajNY,2308
88
88
  ex4nicegui/reactive/mermaid/mermaid.py,sha256=uP321QiNj_S5E5I2KF9h03WlSFdRITE8tvObGdk6m7M,2144
89
- ex4nicegui/reactive/mixins/backgroundColor.py,sha256=R2ES4CcYm26O15No9r6Xr-vxCJg3fH6C0Y4ZxQv0NC8,1123
90
- ex4nicegui/reactive/mixins/disableable.py,sha256=hprIcmcq9k2xUy0hJDbhzX4EvkALOmOnWHg9UNLXYZw,1113
91
- ex4nicegui/reactive/mixins/textColor.py,sha256=oY3hhnj1Mb6G2Io9h1dPycIidgerxuPBWq9z5874LW8,1816
92
- ex4nicegui/reactive/officials/aggrid.py,sha256=AhDmbCUk8PU97eP25HCTYfGhdtKCZ6noLE3Snb2O6pU,2974
89
+ ex4nicegui/reactive/mixins/backgroundColor.py,sha256=5d4v06_dypEFjkHvYfLOKLKa1qSLySMFUUesqf12vEg,1118
90
+ ex4nicegui/reactive/mixins/disableable.py,sha256=bqhhU5XTT3E60-I0dr_mT0Gk9uX5-aKouAsu6MwCeV0,1133
91
+ ex4nicegui/reactive/mixins/textColor.py,sha256=a-ZNbI2KE0S_pmIYvfKpGbRUAI_wY0SLc888qG7WJsE,1806
92
+ ex4nicegui/reactive/officials/aggrid.py,sha256=GWxDfTzhcnlyzPhLzBI5ay6RtPcE2zOCMwZhMX5WBck,2973
93
93
  ex4nicegui/reactive/officials/base.py,sha256=SVJz0UYPvlpSHN193X-EFCNT-lAP2LYEo8HJBQ0i8Tg,153
94
- ex4nicegui/reactive/officials/button.py,sha256=zbV8AFaAZ23dDxhssAHB5RCyqt6-LVmkfmAoba5obRU,2670
94
+ ex4nicegui/reactive/officials/button.py,sha256=C1x-gwCKH6VWk0QqY2pUebAsaLLkMBx8GInk9KZg1K0,2666
95
95
  ex4nicegui/reactive/officials/card.py,sha256=8-tBwm3xfVybolQ87i8lAYUpBV6FdaVdeSH6xu0736U,1275
96
- ex4nicegui/reactive/officials/checkbox.py,sha256=c_CDUlPx7izgaZY3Y4CaCIyxM3moQ0x_lLEs4MylSOc,1565
97
- ex4nicegui/reactive/officials/chip.py,sha256=M_4zODM-oIrnLor6qjqbvj4D67sLDqXIRDsYe4Wn8Y8,3185
98
- ex4nicegui/reactive/officials/circular_progress.py,sha256=DXTGC18BD2kcbAfLX6sdPFxSaQX6LkU7pUfooV3-VKE,1964
99
- ex4nicegui/reactive/officials/color_picker.py,sha256=FUuHhSQ96bCaVua5Cq28_V08PYIVOHFxygVawJkqo1I,3420
100
- ex4nicegui/reactive/officials/column.py,sha256=Ox2OZRmKjAR8pRTWNXej8I-AYI8FGujIAhZyAoi9cNY,1109
101
- ex4nicegui/reactive/officials/date.py,sha256=E5Xs4mJgknQzpBqW_lwJ8c3GZf8wlyi7xCPQrJ70MWE,2515
96
+ ex4nicegui/reactive/officials/checkbox.py,sha256=ghO987s_xrOXbrnksbtM4kP8_mP4ggVKsQKrgPku9ac,1560
97
+ ex4nicegui/reactive/officials/chip.py,sha256=ybAEAfBUnaEXw0eFLE3hTL4EaWIeMPATsCRDIuJgPH4,3180
98
+ ex4nicegui/reactive/officials/circular_progress.py,sha256=0NAaLN0ytrS1S8EGmJQxci5ZDJ8JAY2ZwIxhQKCxtT4,1958
99
+ ex4nicegui/reactive/officials/color_picker.py,sha256=Wz2RY68E55FDUavn8xXRAR4SX3wR-otnPTMSiNXW6w4,3413
100
+ ex4nicegui/reactive/officials/column.py,sha256=RwmjQBTRN4x1vfm-ylfR1r1GjmsLY-3rNf1SqyMLjKI,1104
101
+ ex4nicegui/reactive/officials/date.py,sha256=yiL8v0IJFfiX1rtw-MNHdqjuvz6AS00y4YV_KzjoaY0,2510
102
+ ex4nicegui/reactive/officials/dialog.py,sha256=1M2mTpb3NQ6GWjibwKZf_brdEXGYZUmC-36BX_Vc9sk,1375
102
103
  ex4nicegui/reactive/officials/drawer.py,sha256=_Ro6stOh8U3igYMeDwI4omBgi1nld5berrAk9Dv5RVw,2346
103
- ex4nicegui/reactive/officials/echarts.py,sha256=YvoVfxRl2V93e6pC5l5O6-VJqMxvfwqEf0JLXv639UY,10072
104
+ ex4nicegui/reactive/officials/echarts.py,sha256=QxCl_3e2GxXupXmICwlBXF9a0pMpZzCXGdxPmiqYMeI,10224
104
105
  ex4nicegui/reactive/officials/element.py,sha256=-qsHcxfF3fMfU0sJlKtTksX_wYPMIPJ_AgFcZbbI754,412
105
- ex4nicegui/reactive/officials/expansion.py,sha256=N0mp7_ZO0gHjGTAA69-mAdDCNZWr3FP_sqFL4-Rvhes,1898
106
+ ex4nicegui/reactive/officials/expansion.py,sha256=OsrVttwuZXqAUYRIXI2QZnvqIJmEcu3Sfj_Iwqu_PKQ,1893
106
107
  ex4nicegui/reactive/officials/grid.py,sha256=Bq83jejsxQSYVc9O1IE6JUgUndUm1uexb4fq9EZWjHQ,921
107
108
  ex4nicegui/reactive/officials/html.js,sha256=lyvRAdMKZGOc7MPEapeU6WbOzq_MVzqzUJEhKuC8zWc,119
108
109
  ex4nicegui/reactive/officials/html.py,sha256=XrOpGoAJDo8dtTnZVLSmi7H5iHffmYpeZ94lXxHjBwI,629
109
- ex4nicegui/reactive/officials/icon.py,sha256=qCfdxTGrwtIYEgEYkxnxTGj1C0yEfFa6EfdLzSkjmXs,1544
110
- ex4nicegui/reactive/officials/image.py,sha256=ifuBU_RORV8FTG_3xKQtj6d5F5exz-nxqD70HKo0S7g,1121
111
- ex4nicegui/reactive/officials/input.py,sha256=osu9HfT6W3zXhFkCLNIaN-q3LjlFvz6GknksO6h7r7Y,4044
112
- ex4nicegui/reactive/officials/knob.py,sha256=GRtrgnne7TdCtx_BjLeCuN8YlNsyn1Rf55Bj3e5QCzU,2321
113
- ex4nicegui/reactive/officials/label.py,sha256=_4a9MQJCohWQumdyUoi7dHmeuVOUpmrI5U7HOzkUhJM,1335
114
- ex4nicegui/reactive/officials/linear_progress.py,sha256=VhqiW64wO6QxFbv0TAVVlwtpVgysWVmUSsLe2Vd9aKY,2113
115
- ex4nicegui/reactive/officials/number.py,sha256=H5_6_NfcC4tosomHJXht9DHAF3q87zQKBIkPoKmHgZk,2786
116
- ex4nicegui/reactive/officials/radio.py,sha256=N13zS2FVzA3gew77_OjRCyzdcnheGLAeGYlWK3CxGTc,1945
117
- ex4nicegui/reactive/officials/row.py,sha256=fGNcEHS2sMT1GY33jpLTvUh-MjqdNSuyCrjgBXM-p2Q,1049
118
- ex4nicegui/reactive/officials/select.py,sha256=japHOAIeFM860W9RCOXAQtMdslN9tLjxdYuzNZ3p4rM,2996
119
- ex4nicegui/reactive/officials/slider.py,sha256=eF3W7hwxmTXmRfP_aZGM8z_zXi3Z7-mGjAZr7Sjc6vA,2971
120
- ex4nicegui/reactive/officials/switch.py,sha256=9OtkOB1QD3wCEyPBwPvzAPyYJku5v5MvuTciNE9EQvo,1606
121
- ex4nicegui/reactive/officials/tab.py,sha256=A83oxhlr8-YBeuUJTfPk05Kt9DeA5knNwbpwE5-i7Lk,1816
110
+ ex4nicegui/reactive/officials/icon.py,sha256=oOl5_geE2cXrXKyxA4XK-F4AYxNmTtWWFx0WR_36nEk,1536
111
+ ex4nicegui/reactive/officials/image.py,sha256=a-iKjrkj672JspLCENXA1b9ABNwPO1D28WEgt5mmvwk,1118
112
+ ex4nicegui/reactive/officials/input.py,sha256=E6YjkEhmYHrBXBUXu0vH30wJbczD7eSMrRNZpdeGkJE,4042
113
+ ex4nicegui/reactive/officials/knob.py,sha256=WTTPEG7xOwfDC6GQ0BGzrFLIYyaUNeqzfwqystRs0xg,2315
114
+ ex4nicegui/reactive/officials/label.py,sha256=SwU603HlLHULlhyvSo6-VLV_3MuWuhtHMQaUyfLWlLo,1327
115
+ ex4nicegui/reactive/officials/linear_progress.py,sha256=7suAd_rLRkrviTkcuIt9LwkBr4YC57FeWeGgwTCStHQ,2107
116
+ ex4nicegui/reactive/officials/number.py,sha256=xSqPXn07-ZLPPZ0lVhsXA-KpnWhSKWNcJIMqJsJQ58Q,2789
117
+ ex4nicegui/reactive/officials/radio.py,sha256=u0jDUukowf4sCy2HERcmuI_OWea5aNl5FGWCACoGy4s,1941
118
+ ex4nicegui/reactive/officials/row.py,sha256=GBz0VW34rOqvGgsA0vA_93WSa2i1F9Lt7jf2UrRevDs,1044
119
+ ex4nicegui/reactive/officials/select.py,sha256=gwg_5JpzQxrBQM33EV0wXcZdq-d9_i4vKQ8egNH-dsU,3013
120
+ ex4nicegui/reactive/officials/slider.py,sha256=qX1IZWG88gtE1MRpc1InCEa4MohqCwUEweopblm1ldY,2966
121
+ ex4nicegui/reactive/officials/switch.py,sha256=lpqHYl3IvE4igcB8_XEZPZ7XPxIcH5BplzkLrLr7PQo,1601
122
+ ex4nicegui/reactive/officials/tab.py,sha256=nyB7Ksc_tWG-RaAXiu3TTIJvkNeSa9AZdwHXuL2SsOE,1433
122
123
  ex4nicegui/reactive/officials/tab_panel.py,sha256=Y05XTIOE6qXYZjcCoVIPm9lruyR7av58McRLmPc2yxg,650
123
- ex4nicegui/reactive/officials/tab_panels.py,sha256=hjNDSTslwnzSPIf-mEVlhOE8AfoN5z-DDP_fUk0D5PU,6049
124
- ex4nicegui/reactive/officials/table.py,sha256=oNOuG8rT0oKbnn-MpO2sRisdJwpGILDZkxk96g7GYtQ,6208
125
- ex4nicegui/reactive/officials/tabs.py,sha256=w-wXIRUnYBgBDZDTNLhcUrIvP6rpiZRs0kd2GvJ7zPw,1301
126
- ex4nicegui/reactive/officials/textarea.py,sha256=dCF_uNUIveK6Nuy-OxJDSb7jzPyw-rIsNw51uwsg090,3043
124
+ ex4nicegui/reactive/officials/tab_panels.py,sha256=YSe346Pa_BWPvYbJrxB4Mzc7c6IGcip6oc7LcSg2vbk,6044
125
+ ex4nicegui/reactive/officials/table.py,sha256=B_nX19UxwyxGKsxLuu2x4UNwxsapjTBw70RMBWDI8w0,6206
126
+ ex4nicegui/reactive/officials/tabs.py,sha256=1aLFnpKgBJMBE-e842Uldq80XOCVvdoH1uUeN1OUmWI,1296
127
+ ex4nicegui/reactive/officials/textarea.py,sha256=5pSDr11NkGMYBlOZNhtPwJwASAFEdeTZjmIVz-aDa_s,3038
128
+ ex4nicegui/reactive/officials/tooltip.py,sha256=8a3E7PfUSL3G8VNlxYU34myGNuUQddUWQzTo4F--ddE,1127
127
129
  ex4nicegui/reactive/officials/upload.py,sha256=5SX2CFkf3s_4bPcnx0bmKRA4eYVlm0S8RBeQ7qHnqck,2395
128
- ex4nicegui/reactive/q_pagination.py,sha256=hvX8abzp7nmeOy2gKwtNM6Dhpt7fYqw7d8YNHYAltx8,1560
130
+ ex4nicegui/reactive/q_pagination.py,sha256=nUszZ4fvCf4leQ1DpS70laCDf40RprbOex7SISbAEek,1555
129
131
  ex4nicegui/reactive/rxui.py,sha256=gZ8ZEjGuJFKcedEZhcm4PIZguNkY-Wv5yQx80QnsBKI,31
130
132
  ex4nicegui/reactive/scopedStyle.js,sha256=RtpfUwkpjMv_cbplkr2UtydKAxB5Dz7Sm6jRgPHRhow,1569
131
133
  ex4nicegui/reactive/scopedStyle.py,sha256=aYP4sIFzAmPaLyZV8m9jqyuGmOcJnC-5s07UQnoNSag,738
@@ -141,9 +143,10 @@ ex4nicegui/reactive/UseDraggable/UseDraggable.py,sha256=Zh6NfQPSf3nMvCL8wDA4tjhy
141
143
  ex4nicegui/reactive/useMouse/UseMouse.js,sha256=6FjcYozJK5zFwK1kBP8JlfMyTUwKVK3k_0wSdhapaZs,2722
142
144
  ex4nicegui/reactive/useMouse/UseMouse.py,sha256=cFNlso7_BneyAfGmWbl-N9vQwGleV2ArsqdRBv_yS6Y,2126
143
145
  ex4nicegui/reactive/usePagination.py,sha256=8YLqcZ_ecuX0FdQ0ct-XdEFfMAVkubAS_K02YOhg5oo,2584
144
- ex4nicegui/reactive/vfor.js,sha256=xtKVUPSN0BP99H0BO6LRUYFqxqTGIRttQh5UjoUTwBc,282
145
- ex4nicegui/reactive/vfor.py,sha256=dBTxoXiR7lZMWp5dMQSLPhzTqRGeY7MnJPAVFEIXINg,5765
146
- ex4nicegui/reactive/vmodel.py,sha256=cKfclpvUvQf_UYGLSYWOJVOJP2iPu8KvE7p6D-ZAHOg,5126
146
+ ex4nicegui/reactive/vfor.js,sha256=sCy3KR5Aeyx68yh9VI6I9Vj7bnVuir_LUYKZBe_ePTg,908
147
+ ex4nicegui/reactive/vfor.py,sha256=5gu6a1k0qFP_0M4xEUpZZJgLFogDTAhQORaym42EiEg,7817
148
+ ex4nicegui/reactive/view_model.py,sha256=M36l2UBerErs5JK6I2jkKyj91mrLxOcFejzbBlfXP-0,4379
149
+ ex4nicegui/reactive/vmodel.py,sha256=ymrUpC_68jaHF76ivKmgz-C4Xl6i65c_41uMc0ffEhY,5936
147
150
  ex4nicegui/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
151
  ex4nicegui/tools/debug.py,sha256=h9iYHxw7jWWvmiExSpGi2hQl1PfhPZgC2KNS_GTuHSw,4868
149
152
  ex4nicegui/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -155,10 +158,10 @@ ex4nicegui/utils/effect.py,sha256=LTtPTxx8-sP4VtZaFQjERB-ef3L2y5hu95GvTdj-nLo,24
155
158
  ex4nicegui/utils/refComputed.py,sha256=Vb7fyi0wNieFeLfCjXl6wSzpws3i6_aeCka1s9dsc8E,4232
156
159
  ex4nicegui/utils/refWrapper.py,sha256=gX5sdfC1P4UXmMYM6FwdImfLD39y02kq7Af6dIMDrZ8,1472
157
160
  ex4nicegui/utils/scheduler.py,sha256=1gyq7Y2BkbwmPK_Q9kpRpc1MOC9H7xcpxuix-RZhN9k,1787
158
- ex4nicegui/utils/signals.py,sha256=t21k-XUjQpX0UlW_diyzx_OxNN1Al-kNqk4u8Wx0L14,7024
161
+ ex4nicegui/utils/signals.py,sha256=Q2aaYct1U1DAW4neLiq1_iUdBGiPLNxpXQcuW1KiaDg,7106
159
162
  ex4nicegui/utils/types.py,sha256=pE5WOSbcTHxaAhnT24FaZEd1B2Z_lTcsd46w0OKiMyc,359
160
163
  ex4nicegui/version.py,sha256=NE7u1piESstg3xCtf5hhV4iedGs2qJQw9SiC3ZSpiio,90
161
- ex4nicegui-0.6.9.dist-info/LICENSE,sha256=0KDDElS2dl-HIsWvbpy8ywbLzJMBFzXLev57LnMIZXs,1094
162
- ex4nicegui-0.6.9.dist-info/METADATA,sha256=7ZTJqu2FUrvBpqWBn1GdkKkuuOKCsTg3xsAlPo6mBA0,30069
163
- ex4nicegui-0.6.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
164
- ex4nicegui-0.6.9.dist-info/RECORD,,
164
+ ex4nicegui-0.7.0.dist-info/LICENSE,sha256=0KDDElS2dl-HIsWvbpy8ywbLzJMBFzXLev57LnMIZXs,1094
165
+ ex4nicegui-0.7.0.dist-info/METADATA,sha256=UwWpQE5SWENPA4E-mI0Z8a8xJI72g_zdUBNVeSQpiF8,34891
166
+ ex4nicegui-0.7.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
167
+ ex4nicegui-0.7.0.dist-info/RECORD,,