instaui 0.1.15__py2.py3-none-any.whl → 0.1.16__py2.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.
@@ -0,0 +1,10 @@
1
+ __all__ = [
2
+ "url_location",
3
+ "set_cookie",
4
+ "cookie_output",
5
+ "cookie_input",
6
+ ]
7
+
8
+
9
+ from .url_location import UrlLocation as url_location
10
+ from .cookie import cookie_input, cookie_output, set_cookie
@@ -0,0 +1,25 @@
1
+ from datetime import datetime
2
+ from typing import Optional, Union
3
+ from instaui.runtime.context import get_context
4
+
5
+
6
+ def cookie_output():
7
+ if not get_context().app_mode == "web":
8
+ raise ValueError("cookie_output can only be used in web mode")
9
+
10
+
11
+ def cookie_input():
12
+ pass
13
+
14
+
15
+ def set_cookie(
16
+ key: str,
17
+ value: str,
18
+ *,
19
+ max_age: Optional[int] = None,
20
+ expires: Optional[Union[int, datetime]] = None,
21
+ secure: bool = False,
22
+ httponly: bool = False,
23
+ samesite: Optional[str] = None,
24
+ ):
25
+ pass
@@ -1,3 +1,4 @@
1
+ from __future__ import annotations
1
2
  import typing
2
3
  from typing_extensions import Unpack
3
4
  import pydantic
@@ -6,13 +7,16 @@ from instaui.vars.types import TMaybeRef
6
7
  from instaui.vars.state import StateModel
7
8
  from instaui.arco import component_types
8
9
  from instaui.event.event_mixin import EventMixin
9
- from ._utils import handle_props, try_setup_vmodel
10
+ from ._utils import handle_props
11
+ from .radio_group import RadioGroup
12
+
13
+ _TValue = typing.Union[str, float]
10
14
 
11
15
 
12
16
  class Radio(Element):
13
17
  def __init__(
14
18
  self,
15
- value: typing.Optional[TMaybeRef[typing.Union[str, int, bool, float]]] = None,
19
+ value: typing.Optional[TMaybeRef[_TValue]] = None,
16
20
  **kwargs: Unpack[component_types.TRadio],
17
21
  ):
18
22
  super().__init__("a-radio")
@@ -33,8 +37,17 @@ class Radio(Element):
33
37
  )
34
38
  return self
35
39
 
40
+ @staticmethod
41
+ def from_list(options: TMaybeRef[typing.List[_TValue]], value: TMaybeRef[_TValue]):
42
+ return RadioGroup(value=value, options=options) # type: ignore
43
+
44
+ @staticmethod
45
+ def from_options(
46
+ options: TMaybeRef[typing.List[RadioOption]], value: TMaybeRef[_TValue]
47
+ ):
48
+ return RadioGroup(value=value, options=options) # type: ignore
36
49
 
37
- class RadioOption(StateModel):
38
- label: str
39
- value: typing.Union[str, int]
40
- disabled: bool = pydantic.Field(default=False)
50
+ class RadioOption(StateModel):
51
+ label: str
52
+ value: typing.Union[str, int]
53
+ disabled: bool = pydantic.Field(default=False)
@@ -4,7 +4,6 @@ from instaui.components.element import Element
4
4
  from instaui.vars.types import TMaybeRef
5
5
  from instaui.event.event_mixin import EventMixin
6
6
  from ._utils import handle_props, try_setup_vmodel
7
- from .radio import RadioOption
8
7
 
9
8
 
10
9
  class TRadioGroup(TypedDict, total=False):
@@ -12,7 +11,7 @@ class TRadioGroup(TypedDict, total=False):
12
11
  default_value: typing.Union[str, int, bool]
13
12
  type: typing.Literal["radio", "button"]
14
13
  size: typing.Literal["mini", "small", "medium", "large"]
15
- options: typing.List[typing.Union[str, int, RadioOption]]
14
+ options: typing.List[typing.Union[str, int]]
16
15
  direction: typing.Literal["horizontal", "vertical"]
17
16
  disabled: bool
18
17
 
@@ -20,7 +19,7 @@ class TRadioGroup(TypedDict, total=False):
20
19
  class RadioGroup(Element):
21
20
  def __init__(
22
21
  self,
23
- value: typing.Optional[TMaybeRef[typing.Union[str, int, bool, float]]] = None,
22
+ value: typing.Optional[TMaybeRef[typing.Union[str, float]]] = None,
24
23
  **kwargs: Unpack[TRadioGroup],
25
24
  ):
26
25
  super().__init__("a-radio-group")
@@ -29,6 +29,8 @@ class Component(Jsonable):
29
29
  else str(tag)
30
30
  )
31
31
  )
32
+ if isinstance(tag, ElementBindingMixin):
33
+ tag._mark_used()
32
34
  self._slot_manager = SlotManager()
33
35
 
34
36
  get_app_slot().append_component_to_container(self)
@@ -6,6 +6,7 @@ __all__ = [
6
6
  "number",
7
7
  "button",
8
8
  "checkbox",
9
+ "radio",
9
10
  "form",
10
11
  "select",
11
12
  "option",
@@ -32,6 +33,7 @@ from .input import Input as input
32
33
  from .number import Number as number
33
34
  from .button import Button as button
34
35
  from .checkbox import Checkbox as checkbox
36
+ from .radio import Radio as radio
35
37
  from .form import Form as form
36
38
  from .select import Select as select
37
39
  from .ul import Ul as ul
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from typing import TYPE_CHECKING, Any, Union
2
+ from typing import TYPE_CHECKING, Any, Optional, Union
3
3
  from instaui.components.element import Element
4
4
 
5
5
  if TYPE_CHECKING:
@@ -10,12 +10,14 @@ class Label(Element):
10
10
  def __init__(
11
11
  self,
12
12
  text: Union[Any, TMaybeRef[Any], None] = None,
13
+ *,
14
+ for_: Optional[TMaybeRef[str]] = None,
13
15
  ):
14
16
  super().__init__("label")
15
17
 
16
- if text is not None:
17
- self.props(
18
- {
19
- "innerText": text,
20
- }
21
- )
18
+ self.props(
19
+ {
20
+ "innerText": text,
21
+ "for": for_,
22
+ }
23
+ )
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Optional, Union
3
+ from instaui.components.element import Element
4
+ from instaui.components.value_element import ValueElement
5
+ from ._mixins import InputEventMixin
6
+
7
+ if TYPE_CHECKING:
8
+ from instaui.vars.types import TMaybeRef
9
+
10
+
11
+ _T_value = str
12
+
13
+
14
+ class Radio(InputEventMixin, ValueElement[_T_value]):
15
+ def __init__(
16
+ self,
17
+ value: Optional[TMaybeRef[_T_value]] = None,
18
+ *,
19
+ model_value: Optional[_T_value] = None,
20
+ id: Optional[TMaybeRef[str]] = None,
21
+ name: Optional[TMaybeRef[str]] = None,
22
+ ):
23
+ super().__init__("input", value, is_html_component=True)
24
+ self.props({"type": "radio"})
25
+
26
+ self.props(
27
+ {
28
+ "id": id,
29
+ "name": name,
30
+ }
31
+ )
32
+
33
+ if model_value is not None:
34
+ self.props({"value": model_value})
35
+
36
+ def _input_event_mixin_element(self) -> Element:
37
+ return self
@@ -0,0 +1,48 @@
1
+ import { ref, watch, onMounted, onUnmounted, toRef } from 'vue'
2
+
3
+
4
+ export default {
5
+ props: ['intervalSeconds', 'active', 'once', 'immediate'],
6
+ setup(props, { emit }) {
7
+ const { intervalSeconds, once = false, immediate = true } = props
8
+ const intervalId = ref(null)
9
+ const isActive = toRef(() => props.active ?? true)
10
+ const emitTick = once ? () => { emit('tick'); stopInterval() } : () => emit('tick')
11
+
12
+ if (once === false) {
13
+ watch(isActive, (value) => {
14
+ if (value) {
15
+ startInterval()
16
+ } else {
17
+ stopInterval()
18
+ }
19
+ })
20
+ }
21
+
22
+ const startInterval = () => {
23
+ if (immediate) {
24
+ emitTick()
25
+ }
26
+
27
+ intervalId.value = setInterval(() => {
28
+ emitTick()
29
+ }, intervalSeconds * 1000)
30
+ }
31
+
32
+ const stopInterval = () => {
33
+ clearInterval(intervalId.value)
34
+ emit('stop')
35
+ }
36
+
37
+ onMounted(() => {
38
+ if (isActive.value) {
39
+ startInterval()
40
+ }
41
+ })
42
+
43
+ onUnmounted(() => {
44
+ stopInterval()
45
+ })
46
+ }
47
+
48
+ }
@@ -0,0 +1,94 @@
1
+ from __future__ import annotations
2
+ from typing import List, Optional
3
+ from instaui.components.element import Element
4
+ from instaui.vars.types import TMaybeRef
5
+ from instaui.event.event_mixin import EventMixin
6
+
7
+
8
+ class Timer(Element, esm="./timer.js"):
9
+ """
10
+ A timer component that triggers events at specified intervals.
11
+
12
+ Args:
13
+ interval_seconds (float): Time in seconds between repeated events.
14
+ active (Optional[TMaybeRef[bool]], optional): If True, starts the timer immediately.
15
+ Accepts reactive values (e.g., state references) for dynamic control. Defaults to None (equivalent to True).
16
+ immediate (Optional[bool], optional): If True, triggers the first event immediately. Defaults to None (equivalent to True).
17
+
18
+ Example:
19
+ .. code-block:: python
20
+ from instaui import ui, html
21
+
22
+ @ui.page('/')
23
+ def index():
24
+ x = ui.state(0)
25
+ active = ui.state(True)
26
+
27
+ @ui.event(inputs=[x], outputs=[x])
28
+ def on_tick(x):
29
+ return x + 1
30
+
31
+ ui.timer(1, active=active).on_tick(on_tick)
32
+
33
+ html.checkbox(active)
34
+ html.span(x)
35
+ """
36
+
37
+ def __init__(
38
+ self,
39
+ interval_seconds: float,
40
+ *,
41
+ active: Optional[TMaybeRef[bool]] = None,
42
+ immediate: Optional[bool] = None,
43
+ ):
44
+ super().__init__("template")
45
+
46
+ self.props(
47
+ {
48
+ "intervalSeconds": interval_seconds,
49
+ "active": active,
50
+ "immediate": immediate,
51
+ }
52
+ )
53
+
54
+ def on_tick(
55
+ self,
56
+ handler: EventMixin,
57
+ *,
58
+ extends: Optional[List] = None,
59
+ ):
60
+ """
61
+ Registers an event handler for the "tick" event.
62
+ """
63
+ return self.on("tick", handler, extends=extends)
64
+
65
+ def on_stop(
66
+ self,
67
+ handler: EventMixin,
68
+ *,
69
+ extends: Optional[List] = None,
70
+ ):
71
+ """
72
+ Registers an event handler for the "stop" event.
73
+ """
74
+
75
+ return self.on("stop", handler, extends=extends)
76
+
77
+ @classmethod
78
+ def once(cls, delay_seconds: float):
79
+ """
80
+ Creates a timer that triggers only once.
81
+
82
+ Args:
83
+ delay_seconds (float): Time in seconds before the timer triggers.
84
+
85
+ Example:
86
+ .. code-block:: python
87
+ msg = ui.state('')
88
+ on_done = ui.js_event(outputs=[msg],code="()=> 'Done!'")
89
+
90
+ ui.timer.once(1).on_tick(on_done)
91
+ html.span(msg) # will show "Done!" after 1 second
92
+
93
+ """
94
+ return cls(delay_seconds, immediate=False).props({"once": True})
instaui/event/js_event.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import typing
2
2
  from instaui.vars.mixin_types.py_binding import CanInputMixin, CanOutputMixin
3
+ from instaui.vars.mixin_types.element_binding import _try_mark_inputs_used
3
4
  from instaui.common.jsonable import Jsonable
4
5
  from .event_mixin import EventMixin
5
6
 
@@ -26,6 +27,7 @@ class JsEvent(Jsonable, EventMixin):
26
27
  def _to_json_dict(self):
27
28
  data = super()._to_json_dict()
28
29
  data["type"] = self.event_type()
30
+ _try_mark_inputs_used(self._org_inputs)
29
31
 
30
32
  if self._inputs:
31
33
  data["inputs"] = self._inputs
@@ -1,6 +1,7 @@
1
1
  import typing
2
2
  from instaui.common.jsonable import Jsonable
3
3
  from instaui.vars.mixin_types.observable import ObservableMixin
4
+ from instaui.vars.mixin_types.element_binding import _try_mark_inputs_used
4
5
  from .event_mixin import EventMixin
5
6
 
6
7
 
@@ -59,6 +60,8 @@ class VueEvent(Jsonable, EventMixin):
59
60
 
60
61
  def _to_json_dict(self):
61
62
  data = super()._to_json_dict()
63
+
64
+ _try_mark_inputs_used((self._bindings or {}).values())
62
65
  data["type"] = self.event_type()
63
66
  return data
64
67
 
@@ -4,7 +4,7 @@ from typing_extensions import ParamSpec
4
4
  from instaui.common.jsonable import Jsonable
5
5
  from instaui.runtime._app import get_current_scope, get_app_slot
6
6
  from instaui.vars.mixin_types.py_binding import CanInputMixin, CanOutputMixin
7
- from instaui.vars.mixin_types.element_binding import ElementBindingMixin
7
+ from instaui.vars.mixin_types.element_binding import _try_mark_inputs_used
8
8
  from instaui.handlers import event_handler
9
9
  from .event_mixin import EventMixin
10
10
 
@@ -47,9 +47,7 @@ class WebEvent(Jsonable, EventMixin, typing.Generic[P, R]):
47
47
  def _to_json_dict(self):
48
48
  app = get_app_slot()
49
49
 
50
- for _input in self._inputs:
51
- if isinstance(_input, ElementBindingMixin):
52
- _input._mark_used()
50
+ _try_mark_inputs_used(self._inputs)
53
51
 
54
52
  hkey = event_handler.create_handler_key(
55
53
  page_path=app.page_path, handler=self._fn
instaui/runtime/scope.py CHANGED
@@ -97,14 +97,23 @@ class Scope(Jsonable):
97
97
  if self._element_refs:
98
98
  data["eRefs"] = self._element_refs
99
99
 
100
+ # web computeds
100
101
  _web_computeds = [
101
102
  computed for computed in self._web_computeds if computed._is_used()
102
103
  ]
103
104
 
104
105
  if _web_computeds:
105
106
  data["web_computed"] = _web_computeds
106
- if self._js_computeds:
107
- data["js_computed"] = self._js_computeds
107
+
108
+ # js computeds
109
+ _js_computeds = [
110
+ computed for computed in self._js_computeds if computed._is_used()
111
+ ]
112
+
113
+ if _js_computeds:
114
+ data["js_computed"] = _js_computeds
115
+
116
+ # vue computeds
108
117
  if self._vue_computeds:
109
118
  data["vue_computed"] = self._vue_computeds
110
119
  if self._const_data:
instaui/ui/__init__.py CHANGED
@@ -61,7 +61,6 @@ __all__ = [
61
61
  "skip_output",
62
62
  "js_output",
63
63
  "str_format",
64
- "url_location",
65
64
  "on_page_request_lifespan",
66
65
  "webview",
67
66
  "code",
@@ -69,6 +68,7 @@ __all__ = [
69
68
  "echarts",
70
69
  "use_shadcn_classless",
71
70
  "mermaid",
71
+ "timer",
72
72
  ]
73
73
 
74
74
  # -- static imports
@@ -107,6 +107,7 @@ from instaui.components.vif import VIf as vif
107
107
  from instaui.components.match import Match as match
108
108
  from instaui.components.content import Content as content
109
109
  from instaui.components.label import label
110
+ from instaui.components.timer.timer import Timer as timer
110
111
 
111
112
  from instaui.event.web_event import event, WebEvent as TEventFn
112
113
  from instaui.event.js_event import js_event
@@ -126,7 +127,6 @@ import instaui.experimental as experimental
126
127
 
127
128
  from instaui.ui_functions.server import create_server as server
128
129
  from instaui.ui_functions.ui_page import page
129
- from instaui.ui_functions.url_location import UrlLocation as url_location
130
130
  from instaui.ui_functions.str_format import str_format
131
131
  from instaui.ui_functions.ui_types import TBindable, is_bindable
132
132
 
instaui/ui/__init__.pyi CHANGED
@@ -61,7 +61,6 @@ __all__ = [
61
61
  "skip_output",
62
62
  "js_output",
63
63
  "str_format",
64
- "url_location",
65
64
  "on_page_request_lifespan",
66
65
  "webview",
67
66
  "code",
@@ -69,6 +68,7 @@ __all__ = [
69
68
  "echarts",
70
69
  "use_shadcn_classless",
71
70
  "mermaid",
71
+ "timer",
72
72
  ]
73
73
 
74
74
  # -- static imports
@@ -107,6 +107,7 @@ from instaui.components.vif import VIf as vif
107
107
  from instaui.components.match import Match as match
108
108
  from instaui.components.content import Content as content
109
109
  from instaui.components.label import label
110
+ from instaui.components.timer.timer import Timer as timer
110
111
 
111
112
  from instaui.event.web_event import event, WebEvent as TEventFn
112
113
  from instaui.event.js_event import js_event
@@ -126,7 +127,6 @@ import instaui.experimental as experimental
126
127
 
127
128
  from instaui.ui_functions.server import create_server as server
128
129
  from instaui.ui_functions.ui_page import page
129
- from instaui.ui_functions.url_location import UrlLocation as url_location
130
130
  from instaui.ui_functions.str_format import str_format
131
131
  from instaui.ui_functions.ui_types import TBindable, is_bindable
132
132
 
@@ -6,7 +6,10 @@ from instaui.common.jsonable import Jsonable
6
6
  from instaui.runtime._app import get_current_scope
7
7
  from instaui.vars.path_var import PathVar
8
8
  from instaui.vars.mixin_types.var_type import VarMixin
9
- from instaui.vars.mixin_types.element_binding import ElementBindingMixin
9
+ from instaui.vars.mixin_types.element_binding import (
10
+ ElementBindingMixin,
11
+ _try_mark_inputs_used,
12
+ )
10
13
  from instaui.vars.mixin_types.py_binding import CanInputMixin
11
14
  from instaui.vars.mixin_types.pathable import CanPathPropMixin
12
15
  from instaui.vars.mixin_types.str_format_binding import StrFormatBindingMixin
@@ -55,6 +58,7 @@ class JsComputed(
55
58
  deep_compare_on_input: bool = False,
56
59
  ) -> None:
57
60
  self.code = code
61
+ self._org_inputs = inputs or []
58
62
 
59
63
  scope = get_current_scope()
60
64
  scope.register_js_computed(self)
@@ -67,6 +71,7 @@ class JsComputed(
67
71
 
68
72
  self._async_init_value = async_init_value
69
73
  self._deep_compare_on_input = deep_compare_on_input
74
+ self.__be_used = False
70
75
 
71
76
  def __to_binding_config(self):
72
77
  return {
@@ -90,6 +95,16 @@ class JsComputed(
90
95
  def _to_observable_config(self):
91
96
  return self.__to_binding_config()
92
97
 
98
+ def _mark_used(self):
99
+ if self.__be_used:
100
+ return
101
+
102
+ self.__be_used = True
103
+ _try_mark_inputs_used(self._org_inputs)
104
+
105
+ def _is_used(self):
106
+ return self.__be_used
107
+
93
108
  def _to_json_dict(self):
94
109
  data = super()._to_json_dict()
95
110
 
@@ -1,4 +1,4 @@
1
- from typing import Dict, Generic, TypeVar
1
+ from typing import Dict, Generic, Iterable, TypeVar
2
2
  from abc import ABC, abstractmethod
3
3
 
4
4
  T = TypeVar("T")
@@ -14,3 +14,9 @@ class ElementBindingMixin(ABC, Generic[T]):
14
14
 
15
15
  def _is_used(self):
16
16
  return True
17
+
18
+
19
+ def _try_mark_inputs_used(inputs: Iterable):
20
+ for input_ in inputs:
21
+ if isinstance(input_, ElementBindingMixin):
22
+ input_._mark_used()
instaui/vars/path_var.py CHANGED
@@ -13,8 +13,8 @@ class PathVar(PathableMixin):
13
13
  def __getitem__(self, item: Union[str, int, CanPathPropMixin]):
14
14
  return PathTrackerBindable(self)[item]
15
15
 
16
- def inverse(self):
17
- return PathTrackerBindable(self).inverse()
16
+ def not_(self):
17
+ return PathTrackerBindable(self).not_()
18
18
 
19
19
  def __add__(self, other: str):
20
20
  return PathTrackerBindable(self) + other
@@ -33,7 +33,7 @@ class PathTracker:
33
33
  def __getattr__(self, key) -> Self:
34
34
  return self.__new_self__([*self.paths, key])
35
35
 
36
- def inverse(self) -> Self:
36
+ def not_(self) -> Self:
37
37
  return self.__new_self__([*self.paths, ["!"]])
38
38
 
39
39
  def __add__(self, other: str) -> Self:
@@ -6,7 +6,10 @@ from instaui.common.jsonable import Jsonable
6
6
  from instaui.runtime._app import get_current_scope
7
7
  from instaui.vars.path_var import PathVar
8
8
  from instaui.vars.mixin_types.var_type import VarMixin
9
- from instaui.vars.mixin_types.element_binding import ElementBindingMixin
9
+ from instaui.vars.mixin_types.element_binding import (
10
+ ElementBindingMixin,
11
+ _try_mark_inputs_used,
12
+ )
10
13
  from instaui.vars.mixin_types.py_binding import CanInputMixin
11
14
  from instaui.vars.mixin_types.pathable import CanPathPropMixin
12
15
  from instaui.vars.mixin_types.str_format_binding import StrFormatBindingMixin
@@ -31,11 +34,13 @@ class VueComputed(
31
34
  bindings: Optional[Mapping[str, Union[ElementBindingMixin, Any]]] = None,
32
35
  ) -> None:
33
36
  self.code = fn_code
37
+ self._bindings = bindings
34
38
  scope = get_current_scope()
35
39
  scope.register_vue_computed(self)
36
40
 
37
41
  self._sid = scope.id
38
42
  self._id = scope.generate_vars_id()
43
+ self.__be_used = False
39
44
 
40
45
  if bindings:
41
46
  const_bind = []
@@ -71,10 +76,21 @@ class VueComputed(
71
76
  def _to_observable_config(self):
72
77
  return self.__to_binding_config()
73
78
 
79
+ def _mark_used(self):
80
+ if self.__be_used:
81
+ return
82
+
83
+ self.__be_used = True
84
+ _try_mark_inputs_used((self._bindings or {}).values())
85
+
86
+ def _is_used(self):
87
+ return self.__be_used
88
+
74
89
  def _to_json_dict(self):
75
90
  data = super()._to_json_dict()
76
91
  data["sid"] = self._sid
77
92
  data["id"] = self._id
93
+ _try_mark_inputs_used((self._bindings or {}).values())
78
94
  return data
79
95
 
80
96
 
@@ -17,7 +17,10 @@ from instaui.handlers import watch_handler
17
17
 
18
18
  from instaui.vars.path_var import PathVar
19
19
  from instaui.vars.mixin_types.py_binding import CanInputMixin, CanOutputMixin
20
- from instaui.vars.mixin_types.element_binding import ElementBindingMixin
20
+ from instaui.vars.mixin_types.element_binding import (
21
+ ElementBindingMixin,
22
+ _try_mark_inputs_used,
23
+ )
21
24
  from instaui.vars.mixin_types.pathable import CanPathPropMixin
22
25
  from instaui.vars.mixin_types.str_format_binding import StrFormatBindingMixin
23
26
  from instaui.vars.mixin_types.observable import ObservableMixin
@@ -146,9 +149,7 @@ class WebComputed(
146
149
  return
147
150
 
148
151
  self.__be_used = True
149
- for input_ in self._org_inputs:
150
- if isinstance(input_, ElementBindingMixin):
151
- input_._mark_used()
152
+ _try_mark_inputs_used(self._org_inputs)
152
153
 
153
154
  def _is_used(self):
154
155
  return self.__be_used
instaui/watch/js_watch.py CHANGED
@@ -6,6 +6,7 @@ from instaui.common.jsonable import Jsonable
6
6
  from instaui.runtime._app import get_current_scope
7
7
 
8
8
  from instaui.vars.mixin_types.py_binding import CanOutputMixin
9
+ from instaui.vars.mixin_types.element_binding import _try_mark_inputs_used
9
10
  from instaui.vars.mixin_types.common_type import TObservableInput
10
11
  from instaui._helper import observable_helper
11
12
 
@@ -21,6 +22,7 @@ class JsWatch(Jsonable):
21
22
  once: bool = False,
22
23
  flush: typing.Optional[_types.TFlush] = None,
23
24
  ) -> None:
25
+ _try_mark_inputs_used(inputs or [])
24
26
  inputs = observable_helper.auto_made_inputs_to_slient(inputs, outputs)
25
27
 
26
28
  get_current_scope().register_js_watch(self)
@@ -10,7 +10,7 @@ from instaui.runtime._app import get_app_slot, get_current_scope
10
10
  from instaui.handlers import watch_handler
11
11
 
12
12
  from instaui.vars.mixin_types.py_binding import CanOutputMixin
13
- from instaui.vars.mixin_types.element_binding import ElementBindingMixin
13
+ from instaui.vars.mixin_types.element_binding import _try_mark_inputs_used
14
14
  from instaui.vars.mixin_types.common_type import TObservableInput
15
15
  from instaui._helper import observable_helper
16
16
 
@@ -33,7 +33,7 @@ class WebWatch(Jsonable, typing.Generic[P, R]):
33
33
  flush: typing.Optional[_types.TFlush] = None,
34
34
  _debug: typing.Optional[typing.Any] = None,
35
35
  ) -> None:
36
- self.__org_inputs = inputs or []
36
+ _try_mark_inputs_used(inputs or [])
37
37
  inputs = observable_helper.auto_made_inputs_to_slient(inputs, outputs)
38
38
 
39
39
  get_current_scope().register_web_watch(self)
@@ -58,10 +58,6 @@ class WebWatch(Jsonable, typing.Generic[P, R]):
58
58
 
59
59
  app = get_app_slot()
60
60
 
61
- for _input in self.__org_inputs:
62
- if isinstance(_input, ElementBindingMixin):
63
- _input._mark_used()
64
-
65
61
  if app.mode == "web":
66
62
  hkey = watch_handler.create_handler_key(
67
63
  page_path=app.page_path,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instaui
3
- Version: 0.1.15
3
+ Version: 0.1.16
4
4
  Summary: insta-ui is a Python-based UI library for rapidly building user interfaces.
5
5
  Author-email: CrystalWindSnake <568166495@qq.com>
6
6
  License-Expression: MIT
@@ -8,6 +8,9 @@ instaui/page_info.py,sha256=aJtfLp2h05tCuLzxk2pZ6a9ztyxSdI-g3NBRxbqpS6E,269
8
8
  instaui/skip.py,sha256=uqhqusgeChVoivKFMoZd-XePYrlSoLvUzRZDBcUgFmA,149
9
9
  instaui/version.py,sha256=to8l16EjNe4jmzK316s5ZIotjv554tqF0VfwA1tBhQk,87
10
10
  instaui/_helper/observable_helper.py,sha256=U30PmA8jZ9q48GI_FMNPRYUTKNdl4SsMTAFoq94eRFs,1447
11
+ instaui/action/__init__.py,sha256=YJQlCwJhQ4py5hAsfsgVUgfa9V2jNnu0pLlMFr5zXY0,219
12
+ instaui/action/cookie.py,sha256=UD4QbgxX3Ty5gXrE4_PmLjrQWV819qEtXO17c7h6Vc8,551
13
+ instaui/action/url_location.py,sha256=zyTAJpA-3GBBe7WAiP2IDKQxeQhu0LNgBOxwEzcDaDk,823
11
14
  instaui/arco/__init__.py,sha256=_QuzxGbuQKuq9hjem65NKqYwiKDAP_3ZVPHy75Idw_s,6155
12
15
  instaui/arco/_settings.py,sha256=iuWQb-sGNlw4fBxf-Ufj-YGnBXaGVJIDMgPuVg9ZJ38,771
13
16
  instaui/arco/component_types.py,sha256=wAJvOw4SGbf8bcC3QTdJonsWk5SsRVui-imsKdg-Nzo,39397
@@ -63,8 +66,8 @@ instaui/arco/components/pagination.py,sha256=SOim-t1TE25OkhH4IRavalXLz1TSVgOfVLS
63
66
  instaui/arco/components/pop_confirm.py,sha256=Q96oCK88FjNBesC9VZhv8dWuxlEMTqa-SIBV2fGbNBM,1490
64
67
  instaui/arco/components/popover.py,sha256=pfJBqvTOi4BzPGNHw6EjkXs7c7nOjLgeqBpCcwm9IUQ,955
65
68
  instaui/arco/components/progress.py,sha256=uB0HnUCug_FZdDaKUGiIkmECwV3jPBOOEpovrxV-Cck,388
66
- instaui/arco/components/radio.py,sha256=w0v8Uh70MFjRFKzVKZTYa0V7aFW90IW4KAzcCjOBQFI,1096
67
- instaui/arco/components/radio_group.py,sha256=3LhRaljmD83cR5KAy0492zy62hRde6TTQF-VqkF1Wos,1290
69
+ instaui/arco/components/radio.py,sha256=ds4TxOpEksuQALnfpIqg21EhphRKZluGCf80yZxiGw8,1564
70
+ instaui/arco/components/radio_group.py,sha256=QdZvt3PbnXaMbwErQGALEMsQZiWL2irGkISitgB7vI0,1234
68
71
  instaui/arco/components/rate.py,sha256=GLALtLZ1-1xklnnGKZf02KOLJga-IWVB-l_XSrQoQMs,1163
69
72
  instaui/arco/components/resize_box.py,sha256=imq3YgcLtaeFChZFvC-jflCaJxq0hY_cnK4TCN7s3j4,1678
70
73
  instaui/arco/components/result.py,sha256=QEkQeTujw4P9GtsAziUHDT3UqoRjCcVS2MdZDtT2a8U,382
@@ -102,7 +105,7 @@ instaui/arco/static/instaui-arco.js,sha256=PktbvZE6yids2NyfSKo81g--fCo-AiNEdOgvv
102
105
  instaui/common/jsonable.py,sha256=efzn_IvfrsaNKjc3B3UzshoMvsqSsB-jnD2Aia8YMYM,902
103
106
  instaui/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
107
  instaui/components/column.py,sha256=t_kDAelb-5_aqx4hv19sOm8zcQpRmn-slTMcwZfMOLk,848
105
- instaui/components/component.py,sha256=cfKWlhxATdvERSzsVzvLtm61f72_gblhLJXIrXLGQrk,1284
108
+ instaui/components/component.py,sha256=peaC_t1I-tAIS43U1cZ_UrrxVSO7exoorQAr4jqPoxU,1364
106
109
  instaui/components/content.py,sha256=f6dm0GukYJk4RRNJzuvOGqBrStLWkJQbLkV7M5fJ63k,1094
107
110
  instaui/components/directive.py,sha256=bHSOWXNhzWRVNqLXwhc_hY3R3g-JAQ5DWIqpZkI6_wI,1411
108
111
  instaui/components/element.py,sha256=pPbiJ84D2MZoNE4MZdiMuE_riwuv8PRibOhRbAx7NNA,17691
@@ -115,7 +118,7 @@ instaui/components/transition_group.py,sha256=H9zx9NTlCoQnBArWfmxmh7CMKb5hZn8vKr
115
118
  instaui/components/value_element.py,sha256=wRIAaR3_Cq9qLNJw2KPhWt7dJmclj1mrttzlGpb01Y0,1412
116
119
  instaui/components/vfor.py,sha256=1KeJ0-XMmxJuaZIuOqyOZjh6Y5rDAdAewr6HEqL8N_M,4125
117
120
  instaui/components/vif.py,sha256=jG0xa-DFU9gegJp-S6Br-FX0TZfg5AdVx7z0sNkFNYk,1313
118
- instaui/components/html/__init__.py,sha256=9bO1ai0aQCWwj80NKqDeq_3zwMg5gf17mE40a1IESAk,1088
121
+ instaui/components/html/__init__.py,sha256=B1BDIbeHexH3dEg1Gwx3HwZgR0JnxWhNcNlVUp5VeE4,1137
119
122
  instaui/components/html/_mixins.py,sha256=5dcSM9h1PswIKL6_eiqUxqW4H2OCuyNeCuRZq3gDGOc,876
120
123
  instaui/components/html/_preset.py,sha256=c5rTj3r8W7UP0UHFLUW-ZSPedIa-gzrsU1goi60l20Q,94
121
124
  instaui/components/html/button.py,sha256=lB5SYC2Q8b3dOHLBclJW8yaWBuhoe0qNhpKeEifRDJc,820
@@ -125,11 +128,12 @@ instaui/components/html/div.py,sha256=fF9rBlOBIl-tDvml1DtJK9lFfFY0SBcP5bn36pluis
125
128
  instaui/components/html/form.py,sha256=C-QVtwX18zH8ZuVK93weGwlRWfSyTGWY_CYIdGcaslU,169
126
129
  instaui/components/html/heading.py,sha256=nYGfUIJFNjeVV_RRwCRuEMblWAEZT-CjNX8eAmtbaaU,1260
127
130
  instaui/components/html/input.py,sha256=I9Sbl4THBQuCcaE2HulwD-Hz8Kh2v-rp-HEactlZZBs,894
128
- instaui/components/html/label.py,sha256=HAH0pGhRdyRG3YwTM4qM8lyF8O3yAfmEyPHj0fQnA-k,507
131
+ instaui/components/html/label.py,sha256=iJPI5HzTulEs-38hpNiSi_D4klpVx0WexsBtKGUcSC0,557
129
132
  instaui/components/html/li.py,sha256=2IS8eudUX4McHjyxT1SOu91xviC2D1NNdYKLjznZ-IA,416
130
133
  instaui/components/html/link.py,sha256=eNC2f-twFZUhw_rL-Ggff2Lo8NRU33oF8CfWW_9-ktI,670
131
134
  instaui/components/html/number.py,sha256=Y2oIzTMHKWMWpufG55tFz0npEoEFvLhTWpZbMJ8J07s,1069
132
135
  instaui/components/html/paragraph.py,sha256=TNMtI9dyQb6hYKE5vGAsSXiOiEqkx7BM6CEoJrg6nz8,914
136
+ instaui/components/html/radio.py,sha256=4-u-9tCe5372zDJWPs3-BDC-xpaKUDbdPQmcbThMyeI,1020
133
137
  instaui/components/html/range.py,sha256=cLGoo3QaARG9YDnh6g3UYtc1yueI5dfMa9-4e-feSn4,1644
134
138
  instaui/components/html/select.py,sha256=Bq6mwyKa1qAk7bZiHK0uOg65W2twz4QkcJQTjvFNDP4,2029
135
139
  instaui/components/html/span.py,sha256=RJnccwnYEh8PUZ36VTBCKzBNV74M3SMohAejb0ck0UI,440
@@ -152,12 +156,14 @@ instaui/components/shiki_code/static/langs/shell.mjs,sha256=tFnepW_2H4k-TKg0X2a5
152
156
  instaui/components/shiki_code/static/langs/shellscript.mjs,sha256=hUZDCGMkHhsWI8d8RJwqC5DENXuUoJgFmrgJFnuN_Gw,45548
153
157
  instaui/components/shiki_code/static/themes/vitesse-dark.mjs,sha256=OqDIbeBNg40dGoy2Ef02zM7aS7QTcC3bah6ZzvtkpbA,15326
154
158
  instaui/components/shiki_code/static/themes/vitesse-light.mjs,sha256=RWgJuEHtO93_BSyNYuenSW6O_x1fv01aiGRO0ZF_qdo,15176
159
+ instaui/components/timer/timer.js,sha256=Y109rj0XTWgNEfiPHhSmLB5B__z8hXe0AeFyK-mmHKw,1271
160
+ instaui/components/timer/timer.py,sha256=49J_xHd5Ck4Ma9uhLXFigGq7kZZWuIdYmFYmWkJZh5U,2736
155
161
  instaui/dependencies/component_dependency.py,sha256=V9L9YmM0_d1bQFMea3aH8qYG_mvGsAVPhmz0UHZa3PQ,672
156
162
  instaui/dependencies/plugin_dependency.py,sha256=6u562ihKbiL3DE4hBrGjauS2nzYEC2glOVN0fwEVNVc,806
157
163
  instaui/event/event_mixin.py,sha256=cN0Wh95e1wX183mGnGFm8BK_aEHWJ8WNx3Upy75mU_4,286
158
- instaui/event/js_event.py,sha256=CGegLXP3QldJp0jN-lNY0XSG8fLuaitFqKkgGEfI7yE,2868
159
- instaui/event/vue_event.py,sha256=NRwEcAromivjyPtgMq5SEqHqx8GEc1OJZsRL2Nj43RY,2187
160
- instaui/event/web_event.py,sha256=vilVbw4FtLodkLt0BxQ16dvXv555eWipM53lSkK6tVA,3814
164
+ instaui/event/js_event.py,sha256=0W8oo1ZXEJsyqTGsHXugpUcSIy6LJFqMMdeIr1tymgw,2993
165
+ instaui/event/vue_event.py,sha256=AseL5M2eHnLQOkTB7YLpPV4k6DJUcgxulqwwf3SFfGc,2329
166
+ instaui/event/web_event.py,sha256=_RYvKdUcy8JUnV7nQdLODpAYQsozK5J9qBuxrfkrQJQ,3730
161
167
  instaui/experimental/__init__.py,sha256=nKvudMaBaDsxflSZQ00ck8Cc4hmrF0f6Xzs4mhIYa08,75
162
168
  instaui/experimental/debug.py,sha256=UGUWgNZ3ShanpuxfuPdx52TgQrkO9hByABYMnPZEIiE,1325
163
169
  instaui/extra_libs/_echarts.py,sha256=HCF4mxmzVyKRtxHuehiqf7kmBq7G14_dc2m9XQEM-fQ,78
@@ -187,7 +193,7 @@ instaui/runtime/_link_manager.py,sha256=sVdqm3gdCl6i9UXa8WwckfYVf1vmESm7hvdagT_-
187
193
  instaui/runtime/context.py,sha256=MXwyKnX1X13peHOUbYzwAMflaA1WoQrNkGbi5C_0ErU,1086
188
194
  instaui/runtime/dataclass.py,sha256=dr3hN4YjFXPzckRX9HR87t1-gPjT9RNq9YV-0uJnjHo,587
189
195
  instaui/runtime/resource.py,sha256=8I47HZHRHIzIDrYcfSiHA2RWwb3-ZIsVFMsat8jgV-8,2363
190
- instaui/runtime/scope.py,sha256=tsf15tmxZ66rsALxN-OLWYSQp7Xr8keAf83cDi0Ua_c,4774
196
+ instaui/runtime/scope.py,sha256=zDihbXxdI2Qs_fLk0sfTCiBDO3awNs-rs2_MTZ5HQqs,4962
191
197
  instaui/runtime/ui_state_scope.py,sha256=g48VpQj0BboooUrPr5VIWvcQoJe0bIQARMwRyVEE0I8,314
192
198
  instaui/settings/__init__.py,sha256=nK_xDrlq7CPjm9x3EKsKUW5qWBg_1d-xbqAp_i5G8cc,70
193
199
  instaui/settings/__settings.py,sha256=DWzRvs9bBqjoNA2MvGAyz3GRrSV8H6lMLF1H3iJyoyA,385
@@ -232,32 +238,31 @@ instaui/template/env.py,sha256=ZqVsqpfSY1mupbgpBSkvOJytNui8xfNR5kNNC9rv4Ps,150
232
238
  instaui/template/web_template.py,sha256=BmZY13q4E_ZP4YVgfBKbbXvPHcGZfOl2f54wp_0DjJA,1603
233
239
  instaui/template/webview_template.py,sha256=rd51iPi600QOPQ9PMjgYk61oIxn3L2p3_sJ3eBPG_24,1557
234
240
  instaui/template/zero_template.py,sha256=E88VGsyjb1qbHFJlMW-xmLRFkwUXZA7VDoZ_Jd8YubA,3514
235
- instaui/ui/__init__.py,sha256=4aHnUvEv-0UjpZNu5fU6hvcj1ZGlWwIIobabWUJk-Mc,4818
236
- instaui/ui/__init__.pyi,sha256=VyyxCXkUhUe7V6lm23o0RYn8SFOE9Jm6aiRNqcCG3A4,4898
241
+ instaui/ui/__init__.py,sha256=e8GJWNB8HXMWlqqp4hGuRCWii5HcgyxXnyH4F8O7B64,4795
242
+ instaui/ui/__init__.pyi,sha256=8LwGzW1nFLd5bSKi25rrB47TMXdpomcWF31L0zx6blY,4875
237
243
  instaui/ui/events.py,sha256=lfhiINwn-Kh0MezsSeLJPttWm6G1aWiwyk3TRo0NrlA,809
238
244
  instaui/ui_functions/input_slient_data.py,sha256=0A5DegIt_MqdZgbj1RiVFNmB_RUqgov9FYtkw6VX0DE,511
239
245
  instaui/ui_functions/server.py,sha256=B4w8KwBUMGStY19uUG8E4vRG7-L4cedttLkh35xr698,357
240
246
  instaui/ui_functions/str_format.py,sha256=ECWttA4LlNHlvdT_73wGF_I68soWNEXTP_Hosmxt-m4,1139
241
247
  instaui/ui_functions/ui_page.py,sha256=WVm1qoQ9IxE3kWKKnAU8WVI8drsqxxlLucYKfEZ712s,367
242
248
  instaui/ui_functions/ui_types.py,sha256=J5tqFFkoZJMuoLeTqU52KNgw3kdB_IfcrhaBmyI6NAA,505
243
- instaui/ui_functions/url_location.py,sha256=zyTAJpA-3GBBe7WAiP2IDKQxeQhu0LNgBOxwEzcDaDk,823
244
249
  instaui/vars/_types.py,sha256=wthCk1fcxj1SZ5y6b84W9gFpoi8j2PYnfmaPj4Am72s,308
245
250
  instaui/vars/data.py,sha256=uxDN-Xa5wO-_QFZYkiYOACnb9Ve8yODSFNIUs-S_E0I,1768
246
251
  instaui/vars/element_ref.py,sha256=qC-Kb1hBGz_Y6WKjKxRvYR8jdvWW4VeAAGzJ2wSrGgI,1059
247
252
  instaui/vars/event_context.py,sha256=3ML6nyF6Q1hbFvdeu6E2QVOIVcWe1P9FtlCR0dgBGjo,1308
248
253
  instaui/vars/event_extend.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
- instaui/vars/js_computed.py,sha256=CYCSR21Je1nTKfFh4camDne7TCHol6JHVZySDT4lCrk,3643
250
- instaui/vars/path_var.py,sha256=DOgYHoajWKcMHMKYMSBiEOA99mmHIaMH-HRDvAKTZyE,2820
254
+ instaui/vars/js_computed.py,sha256=HjBbSeKCOYExJ2xwhklouG8bawlXW4JNvJZjDaE4CWg,3972
255
+ instaui/vars/path_var.py,sha256=znIvxaNHwQzXflEqwB2xjrI7Bk5_QjwYlhdl4qvtyws,2811
251
256
  instaui/vars/ref.py,sha256=iMwKRYI8ygy2cOpXJgqUYJCpzJCQskDl4lRYTACZWnA,2567
252
257
  instaui/vars/slot_prop.py,sha256=qBVQ0Ze0T8-Wsy__8qEuqVESIrLX69Bmy21Kuxrg_GQ,1198
253
258
  instaui/vars/state.py,sha256=MuiCzR9n348P1J7qdCfFXXratwuOOGELLzg8pu9G6kE,3074
254
259
  instaui/vars/types.py,sha256=K0QTajlzHaDvFoVMCHAhY_rVvrBm3FsC92BFPOgdBog,511
255
260
  instaui/vars/vfor_item.py,sha256=cVrpErh8OrycYjDLm7PTuE2kIcC2M6ThAQlwvTXG8x0,5490
256
- instaui/vars/vue_computed.py,sha256=6ZpxCQc2TJfh0vxTxcj6yNPjTVPo3CmsHq028xtiv8Y,2416
257
- instaui/vars/web_computed.py,sha256=zRlyq1gnuQ5HWS1mh3VYhrRX1EYYYCGIpo3AyW8hu9s,6382
261
+ instaui/vars/vue_computed.py,sha256=bWMlnjKf9pFYX9IrXtSzUZy4A7P4zABeDXUi4fvqnnI,2818
262
+ instaui/vars/web_computed.py,sha256=vbxN7ccyhdtKJAaYbnkc1aPWHPW_TmY9DzSyizsMAOM,6335
258
263
  instaui/vars/web_view_computed.py,sha256=bFFVE9jRKczNy4HhmegWoC6KOL_Nrej-ag37DAIDzaA,36
259
264
  instaui/vars/mixin_types/common_type.py,sha256=4KduANLCUCeGTA1ClEsbFzEzd8Mgve3693Wxf9H7Gmw,176
260
- instaui/vars/mixin_types/element_binding.py,sha256=Mc6rY18y1HlZ9vh62pYKhzyU2XvImZgKcWyKoekTM0s,326
265
+ instaui/vars/mixin_types/element_binding.py,sha256=WqULHTT8iqhebjt9lOvN9TqZfNz13cb1VQR9tMiQncE,499
261
266
  instaui/vars/mixin_types/observable.py,sha256=h2cox7BwQtLOWqCTaWnNU0TsgYJKuoNUuuEqwj-KXpU,141
262
267
  instaui/vars/mixin_types/pathable.py,sha256=40H5f1gCDtKs4Qor0C-moB821T7Df8DOgUcntjxgums,302
263
268
  instaui/vars/mixin_types/py_binding.py,sha256=VIVSrHrjcltsP5ADKHtMSZBpi2qKyameXqoEevdfqk8,237
@@ -265,9 +270,9 @@ instaui/vars/mixin_types/str_format_binding.py,sha256=i2jXm1RKddPnGrCxEyz0tkDrBU
265
270
  instaui/vars/mixin_types/var_type.py,sha256=FQj1TEkjT7HopDPztt0-J6eQVGHjem3KBFsjZwvcvYg,57
266
271
  instaui/watch/_types.py,sha256=HJ_eAID0NsEJ_S8PhcYWxpVWhYLjjqKlbNWwqdqS4IU,73
267
272
  instaui/watch/_utils.py,sha256=mTITHG8hp0pyfQXUERQKXMDna5Au02bhuASCV32eXHI,124
268
- instaui/watch/js_watch.py,sha256=8lVINBauHBRiDX3-F1V6V5_1CN9j1EMCROjcD9LRCD8,4230
273
+ instaui/watch/js_watch.py,sha256=m2p-6jL6ZJerkk2MJ-cE7nAngcFY5-NFVP3yFSO9Kmw,4351
269
274
  instaui/watch/vue_watch.py,sha256=Vd3nsRyf9ufrXLFTjaSvglwnkoWyE32fOV0qOogWPt4,2013
270
- instaui/watch/web_watch.py,sha256=LFzw2Mkm3N6VflxvxebVzEInlG5bP6vImje_TfS-5rE,6285
275
+ instaui/watch/web_watch.py,sha256=UdofiqTfyvGW1CLtyYydFtAwc_sAKRWhiLQCEHSNJPw,6152
271
276
  instaui/webview/__init__.py,sha256=_L8B0Ym7i1Q8eonQ81fC54EXn7oZuc6zE1KqeAEPHEg,65
272
277
  instaui/webview/_utils.py,sha256=pqARVv37h-8p7CLOpvqLV8O_az4EV2VD9G-beUVqjD8,172
273
278
  instaui/webview/api.py,sha256=9xuG3EKpmOOy1dvIrS9C9z9ukQDRnIdZLrGFD5FLyvU,2071
@@ -277,7 +282,7 @@ instaui/webview/resource.py,sha256=kFT6N5UZK5GLE0KmW3TrEYDNlViw9DL2OshRh41wBXs,5
277
282
  instaui/zero/__init__.py,sha256=N0LuRUAcaurxHSspcEDuwZg62W2S3qL4VtrMKxOivBE,49
278
283
  instaui/zero/func.py,sha256=8cA_wJMtRmoAARjWY8yY5MmLXDAQ7hyVW6f1Vbejtoc,3576
279
284
  instaui/zero/scope.py,sha256=HGohYOqnpRGVkkoz_gvR6-DgCc48AtJAcDwbOnnGHLM,3753
280
- instaui-0.1.15.dist-info/METADATA,sha256=4xaLjEqZu6_yAQieLp_zOGNvPtsboBvjk7j5SM50_h8,3562
281
- instaui-0.1.15.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
282
- instaui-0.1.15.dist-info/licenses/LICENSE,sha256=_JjnAWrikJ6qkwT7PazeFNRlcIu8q_RH3mYcHTxEF5c,1094
283
- instaui-0.1.15.dist-info/RECORD,,
285
+ instaui-0.1.16.dist-info/METADATA,sha256=r5ViXqPm5_kLMHKBc6N2MhiwZlODJhOBRtSTVgDWSJ0,3562
286
+ instaui-0.1.16.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
287
+ instaui-0.1.16.dist-info/licenses/LICENSE,sha256=_JjnAWrikJ6qkwT7PazeFNRlcIu8q_RH3mYcHTxEF5c,1094
288
+ instaui-0.1.16.dist-info/RECORD,,
File without changes