instaui 0.1.3__py3-none-any.whl → 0.1.5__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 (93) hide show
  1. instaui/components/content.py +4 -4
  2. instaui/components/echarts/echarts.js +128 -0
  3. instaui/components/echarts/echarts.py +194 -0
  4. instaui/components/echarts/static/echarts.esm.min.js +45 -0
  5. instaui/components/element.py +103 -13
  6. instaui/components/html/__init__.py +31 -18
  7. instaui/components/html/_preset.py +4 -0
  8. instaui/components/html/heading.py +51 -0
  9. instaui/components/html/range.py +3 -0
  10. instaui/components/html/select.py +16 -35
  11. instaui/components/html/table.py +36 -0
  12. instaui/components/html/textarea.py +28 -0
  13. instaui/components/markdown/markdown.js +33 -0
  14. instaui/components/markdown/markdown.py +41 -0
  15. instaui/components/markdown/static/github-markdown.css +12 -0
  16. instaui/components/markdown/static/marked.esm.js +2579 -0
  17. instaui/components/shiki_code/shiki_code.js +126 -0
  18. instaui/components/shiki_code/shiki_code.py +99 -0
  19. instaui/components/shiki_code/static/langs/css.mjs +5 -0
  20. instaui/components/shiki_code/static/langs/markdown.mjs +5 -0
  21. instaui/components/shiki_code/static/langs/python.mjs +5 -0
  22. instaui/components/shiki_code/static/langs/shell.mjs +2 -0
  23. instaui/components/shiki_code/static/langs/shellscript.mjs +5 -0
  24. instaui/components/shiki_code/static/shiki-core.js +5784 -0
  25. instaui/components/shiki_code/static/shiki-style.css +175 -0
  26. instaui/components/shiki_code/static/shiki-transformers.js +461 -0
  27. instaui/components/shiki_code/static/themes/vitesse-dark.mjs +2 -0
  28. instaui/components/shiki_code/static/themes/vitesse-light.mjs +2 -0
  29. instaui/components/value_element.py +7 -3
  30. instaui/components/vfor.py +1 -1
  31. instaui/consts.py +2 -1
  32. instaui/daisyui/__init__.py +26 -0
  33. instaui/daisyui/_index.py +20 -0
  34. instaui/daisyui/button.py +38 -0
  35. instaui/daisyui/checkbox.py +17 -0
  36. instaui/daisyui/static/daisyui.css +1 -0
  37. instaui/daisyui/static/themes.css +1 -0
  38. instaui/daisyui/table.py +35 -0
  39. instaui/dependencies/component_dependency.py +11 -5
  40. instaui/event/js_event.py +1 -0
  41. instaui/event/web_event.py +6 -7
  42. instaui/fastapi_server/dependency_router.py +4 -3
  43. instaui/fastapi_server/resource.py +12 -16
  44. instaui/fastapi_server/server.py +34 -24
  45. instaui/handlers/event_handler.py +3 -1
  46. instaui/handlers/watch_handler.py +4 -0
  47. instaui/html_tools.py +44 -2
  48. instaui/inject.py +3 -3
  49. instaui/runtime/_app.py +43 -4
  50. instaui/runtime/_link_manager.py +89 -0
  51. instaui/runtime/resource.py +21 -8
  52. instaui/shadcn_classless/_index.py +42 -0
  53. instaui/shadcn_classless/static/shadcn-classless.css +403 -0
  54. instaui/spa_router/_functions.py +1 -1
  55. instaui/spa_router/_route_model.py +1 -1
  56. instaui/static/insta-ui.css +1 -1
  57. instaui/static/insta-ui.esm-browser.prod.js +1308 -1252
  58. instaui/static/insta-ui.js.map +1 -1
  59. instaui/static/instaui-tools-browser.js +511 -0
  60. instaui/static/templates/webview.html +78 -0
  61. instaui/systems/module_system.py +30 -0
  62. instaui/tailwind/__init__.py +6 -0
  63. instaui/tailwind/_index.py +24 -0
  64. instaui/{static/tailwindcss.min.js → tailwind/static/tailwindcss-v3.min.js} +62 -62
  65. instaui/tailwind/static/tailwindcss-v4.min.js +8 -0
  66. instaui/template/_utils.py +23 -0
  67. instaui/template/webview_template.py +50 -0
  68. instaui/template/zero_template.py +18 -17
  69. instaui/ui/__build_init.py +73 -0
  70. instaui/ui/__init__.py +74 -58
  71. instaui/ui/__init__.pyi +135 -0
  72. instaui/ui/events.py +1 -1
  73. instaui/ui_functions/server.py +3 -1
  74. instaui/vars/event_context.py +4 -0
  75. instaui/vars/web_computed.py +30 -30
  76. instaui/watch/web_watch.py +5 -6
  77. instaui/webview/__init__.py +1 -0
  78. instaui/webview/_utils.py +8 -0
  79. instaui/webview/api.py +72 -0
  80. instaui/webview/func.py +114 -0
  81. instaui/webview/index.py +162 -0
  82. instaui/webview/resource.py +172 -0
  83. instaui/zero/func.py +31 -23
  84. instaui/zero/scope.py +110 -4
  85. {instaui-0.1.3.dist-info → instaui-0.1.5.dist-info}/METADATA +4 -1
  86. {instaui-0.1.3.dist-info → instaui-0.1.5.dist-info}/RECORD +88 -44
  87. instaui/handlers/computed_handler.py +0 -42
  88. instaui/handlers/config_handler.py +0 -13
  89. instaui/static/insta-ui.iife.js +0 -29
  90. instaui/static/insta-ui.iife.js.map +0 -1
  91. instaui/zero/test.html +0 -44
  92. {instaui-0.1.3.dist-info → instaui-0.1.5.dist-info}/LICENSE +0 -0
  93. {instaui-0.1.3.dist-info → instaui-0.1.5.dist-info}/WHEEL +0 -0
@@ -1,18 +1,18 @@
1
1
  from __future__ import annotations
2
- from typing import Dict
2
+ from typing import Any, Dict
3
3
  from instaui.components.component import Component
4
4
  from instaui.vars.types import TMaybeRef
5
5
  from instaui.vars.mixin_types.element_binding import ElementBindingMixin
6
6
 
7
7
 
8
8
  class Content(Component):
9
- def __init__(self, content: TMaybeRef[str]):
9
+ def __init__(self, content: TMaybeRef[Any]):
10
10
  """Content to be displayed on the page, typically used for pure text content within slots.
11
11
 
12
12
  Args:
13
- content (TMaybeRef[str]): The textual content to display.
13
+ content (TMaybeRef[Any]): The textual content to display.
14
14
 
15
- Example:
15
+ Examples:
16
16
  .. code-block:: python
17
17
  with html.div():
18
18
  ui.content("Hello, world!")
@@ -0,0 +1,128 @@
1
+ import { h, onMounted, shallowRef, watch } from "vue";
2
+ import * as echarts from 'echarts';
3
+
4
+
5
+ export default {
6
+ props: ['option', 'theme', 'initOptions', 'resizeOption', 'updateOptions', 'chartEvents', 'zrEvents'],
7
+ setup(props, { attrs, emit }) {
8
+ const root = shallowRef();
9
+ const chartIns = shallowRef();
10
+
11
+ onMounted(() => {
12
+ init(root, chartIns, props);
13
+ autoResize(root, chartIns, props);
14
+
15
+ setOption(root, chartIns, props);
16
+ setChartEvents(root, chartIns, emit, props);
17
+ })
18
+
19
+ watch(() => props.option, (newVal, oldVal) => {
20
+
21
+ setOption(root, chartIns, props);
22
+
23
+ }, { deep: true })
24
+
25
+
26
+ return () => {
27
+ return h("div", { ...attrs, ref: root })
28
+ };
29
+ }
30
+
31
+ }
32
+
33
+
34
+ function init(root, chartIns, props) {
35
+ if (!root.value) {
36
+ return;
37
+ }
38
+
39
+ chartIns.value = echarts.init(
40
+ root.value,
41
+ props.theme,
42
+ props.initOptions,
43
+ )
44
+ }
45
+
46
+
47
+ function setOption(root, chartIns, props) {
48
+ if (!chartIns.value) {
49
+ init(root, chartIns, props);
50
+ } else {
51
+ chartIns.value.setOption(props.option, props.updateOptions || {});
52
+ }
53
+ }
54
+
55
+
56
+ function autoResize(root, chartIns, props) {
57
+
58
+ watch(() => props.resizeOption, (resizeOption, _, onCleanup) => {
59
+
60
+ let ro = null;
61
+
62
+ if (resizeOption) {
63
+ const { offsetWidth, offsetHeight } = root.value;
64
+ const { throttle = 100 } = resizeOption;
65
+
66
+ let isInitialResize = false;
67
+ const callback = () => {
68
+ chartIns.value.resize()
69
+ }
70
+ const resizeCallback = throttle ? echarts.throttle(callback, throttle) : callback;
71
+
72
+ ro = new ResizeObserver(() => {
73
+
74
+ if (!isInitialResize) {
75
+ isInitialResize = true;
76
+ if (
77
+ root.offsetWidth === offsetWidth &&
78
+ root.offsetHeight === offsetHeight
79
+ ) {
80
+ return;
81
+ }
82
+ }
83
+ resizeCallback();
84
+ })
85
+
86
+ ro.observe(root.value);
87
+ }
88
+
89
+ onCleanup(() => {
90
+ if (ro) {
91
+ ro.disconnect();
92
+ ro = null;
93
+ }
94
+ });
95
+
96
+ }, { deep: true, immediate: true })
97
+
98
+ }
99
+
100
+
101
+ function setChartEvents(root, chartIns, emit, props) {
102
+
103
+ const { chartEvents, zrEvents } = props;
104
+
105
+ if (chartEvents) {
106
+ chartEvents.forEach(event => {
107
+ chartIns.value.on(event, (...args) => {
108
+ const eventArgs = args[0]
109
+ delete eventArgs['event']
110
+ delete eventArgs['$vars']
111
+
112
+ emit(`chart:${event}`, ...args)
113
+ });
114
+ })
115
+ }
116
+
117
+ if (zrEvents) {
118
+ zrEvents.forEach(event => {
119
+ chartIns.value.getZr().on(event, (...args) => emit(`zr:${event}`, ...args));
120
+ })
121
+ }
122
+
123
+
124
+
125
+
126
+
127
+ }
128
+
@@ -0,0 +1,194 @@
1
+ from pathlib import Path
2
+ from typing import Dict, Literal, Optional, Set, Union
3
+ from typing_extensions import TypedDict
4
+ from instaui import ui
5
+ from instaui.event.event_mixin import EventMixin
6
+
7
+ _STATIC_DIR = Path(__file__).parent / "static"
8
+ _ECHARTS_JS_FILE = _STATIC_DIR / "echarts.esm.min.js"
9
+
10
+
11
+ _IMPORT_MAPS = {
12
+ "echarts": _ECHARTS_JS_FILE,
13
+ }
14
+
15
+
16
+ TEChartsEvent = Literal[
17
+ "highlight",
18
+ "downplay",
19
+ "selectchanged",
20
+ "legendselectchanged",
21
+ "legendselected",
22
+ "legendunselected",
23
+ "legendselectall",
24
+ "legendinverseselect",
25
+ "legendscroll",
26
+ "datazoom",
27
+ "datarangeselected",
28
+ "timelinechanged",
29
+ "timelineplaychanged",
30
+ "restore",
31
+ "dataviewchanged",
32
+ "magictypechanged",
33
+ "geoselectchanged",
34
+ "geoselected",
35
+ "geounselected",
36
+ "axisareaselected",
37
+ "brush",
38
+ "brushEnd",
39
+ "brushselected",
40
+ "globalcursortaken",
41
+ "rendered",
42
+ "finished",
43
+ "click",
44
+ "dblclick",
45
+ "mouseover",
46
+ "mouseout",
47
+ "mousemove",
48
+ "mousedown",
49
+ "mouseup",
50
+ "globalout",
51
+ "contextmenu",
52
+ ]
53
+
54
+
55
+ TZRenderEvent = Literal[
56
+ "click", "mousedown", "mouseup", "mousewheel", "dblclick", "contextmenu"
57
+ ]
58
+
59
+
60
+ class TResizeOptions(TypedDict, total=False):
61
+ throttle: int
62
+
63
+
64
+ class TInitOptions(TypedDict, total=False):
65
+ devicePixelRatio: int
66
+ renderer: Literal["canvas", "svg"]
67
+ width: Union[int, str]
68
+ height: Union[int, str]
69
+ locale: str
70
+ pointerSize: int
71
+
72
+
73
+ class ECharts(
74
+ ui.element,
75
+ esm="./echarts.js",
76
+ externals=_IMPORT_MAPS,
77
+ ):
78
+ """ECharts component
79
+
80
+ Example usage:
81
+ .. code-block:: python
82
+
83
+ opts = {
84
+ "title": {"text": "ECharts Getting Started Example"},
85
+ "tooltip": {},
86
+ "legend": {"data": ["sales"]},
87
+ "xAxis": {
88
+ "data": ["Shirts", "Cardigans", "Chiffons", "Pants", "Heels", "Socks"]
89
+ },
90
+ "yAxis": {},
91
+ "series": [{"name": "sales", "type": "bar", "data": [5, 20, 36, 10, 10, 20]}],
92
+ }
93
+
94
+ ui.echarts(opts)
95
+
96
+ """
97
+
98
+ def __init__(
99
+ self,
100
+ option: ui.TMaybeRef[Dict],
101
+ *,
102
+ theme: Optional[Union[Path, str, Dict]] = None,
103
+ init_options: Optional[TInitOptions] = None,
104
+ update_options: Optional[Dict] = None,
105
+ resize_options: Optional[TResizeOptions] = None,
106
+ ):
107
+ """Create an ECharts component
108
+
109
+ Args:
110
+ option (ui.TMaybeRef[Dict]): Chart option.
111
+ theme (Optional[Union[Path, str, Dict]], optional): Theme file or object. Defaults to None.
112
+ init_options (Optional[TInitOptions], optional): Chart initialization options. Defaults to None.
113
+ update_options (Optional[Dict], optional): Chart update options. Defaults to None.
114
+ resize_options (Optional[TResizeOptions], optional): Chart resize options. Defaults to None.
115
+
116
+ Example usage:
117
+
118
+ resize_options:
119
+
120
+ .. code-block:: python
121
+ ui.echarts(opts, resize_options={"throttle": 100})
122
+
123
+ chart event:
124
+ .. code-block:: python
125
+ opts = ui.state(
126
+ {
127
+ "title": {"text": "ECharts Getting Started Example"},
128
+ "tooltip": {},
129
+ "legend": {"data": ["sales"]},
130
+ "xAxis": {
131
+ "data": ["Shirts", "Cardigans", "Chiffons", "Pants", "Heels", "Socks"]
132
+ },
133
+ "yAxis": {},
134
+ "series": [
135
+ {"name": "sales", "type": "bar", "data": [5, 20, 36, 10, 10, 20]}
136
+ ],
137
+ }
138
+ )
139
+
140
+ msg = ui.state("Click the bars in the chart.")
141
+
142
+ @ui.event(inputs=[ui.event_context.e()], outputs=[msg])
143
+ def click(arg):
144
+ return f'You clicked on "{arg["name"]}"'
145
+
146
+ ui.content(msg)
147
+ ui.echarts(opts).on_chart("click", click)
148
+
149
+ """
150
+
151
+ super().__init__()
152
+ self._chart_events: Set[str] = set()
153
+ self._zr_events: Set[str] = set()
154
+ self.props({"option": option})
155
+
156
+ if init_options:
157
+ self.props({"initOptions": init_options})
158
+
159
+ if update_options:
160
+ self.props({"updateOptions": update_options})
161
+
162
+ if theme:
163
+ if isinstance(theme, (str, Path)):
164
+ raise NotImplementedError("Theme file not supported yet")
165
+ else:
166
+ self.props({"theme": theme})
167
+
168
+ self.props({"resizeOption": resize_options or {}})
169
+
170
+ self.style("width: 100%; height: 100%;min-width:0;")
171
+
172
+ def on_chart(
173
+ self,
174
+ event_name: TEChartsEvent,
175
+ handler: EventMixin,
176
+ ):
177
+ self._chart_events.add(event_name)
178
+ return self.on(f"chart:{event_name}", handler)
179
+
180
+ def on_zr(self, event_name: TZRenderEvent, handler: EventMixin):
181
+ self._zr_events.add(event_name)
182
+ return self.on(f"zr:{event_name}", handler)
183
+
184
+ def _to_json_dict(self):
185
+ data = super()._to_json_dict()
186
+ props = data.get("props", {})
187
+
188
+ if self._chart_events:
189
+ props["chartEvents"] = list(self._chart_events)
190
+
191
+ if self._zr_events:
192
+ props["zrEvents"] = list(self._zr_events)
193
+
194
+ return data