instaui 0.1.4__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 (82) hide show
  1. instaui/components/echarts/echarts.js +128 -0
  2. instaui/components/echarts/echarts.py +194 -0
  3. instaui/components/echarts/static/echarts.esm.min.js +45 -0
  4. instaui/components/element.py +50 -4
  5. instaui/components/html/__init__.py +30 -19
  6. instaui/components/html/_preset.py +4 -0
  7. instaui/components/html/heading.py +51 -0
  8. instaui/components/html/range.py +3 -0
  9. instaui/components/html/select.py +13 -31
  10. instaui/components/html/table.py +36 -0
  11. instaui/components/markdown/static/marked.esm.js +0 -1
  12. instaui/components/shiki_code/shiki_code.js +126 -0
  13. instaui/components/shiki_code/shiki_code.py +99 -0
  14. instaui/components/shiki_code/static/langs/css.mjs +5 -0
  15. instaui/components/shiki_code/static/langs/markdown.mjs +5 -0
  16. instaui/components/shiki_code/static/langs/python.mjs +5 -0
  17. instaui/components/shiki_code/static/langs/shell.mjs +2 -0
  18. instaui/components/shiki_code/static/langs/shellscript.mjs +5 -0
  19. instaui/components/shiki_code/static/shiki-core.js +5784 -0
  20. instaui/components/shiki_code/static/shiki-style.css +175 -0
  21. instaui/components/shiki_code/static/shiki-transformers.js +461 -0
  22. instaui/components/shiki_code/static/themes/vitesse-dark.mjs +2 -0
  23. instaui/components/shiki_code/static/themes/vitesse-light.mjs +2 -0
  24. instaui/components/value_element.py +7 -3
  25. instaui/consts.py +2 -1
  26. instaui/daisyui/__init__.py +8 -2
  27. instaui/daisyui/_index.py +5 -0
  28. instaui/daisyui/table.py +35 -0
  29. instaui/event/js_event.py +1 -0
  30. instaui/event/web_event.py +6 -7
  31. instaui/fastapi_server/server.py +4 -12
  32. instaui/handlers/event_handler.py +3 -1
  33. instaui/handlers/watch_handler.py +4 -0
  34. instaui/html_tools.py +40 -2
  35. instaui/runtime/_app.py +37 -3
  36. instaui/runtime/_link_manager.py +89 -0
  37. instaui/runtime/resource.py +19 -9
  38. instaui/shadcn_classless/_index.py +42 -0
  39. instaui/shadcn_classless/static/shadcn-classless.css +403 -0
  40. instaui/static/insta-ui.css +1 -1
  41. instaui/static/insta-ui.esm-browser.prod.js +1314 -1253
  42. instaui/static/insta-ui.js.map +1 -1
  43. instaui/static/instaui-tools-browser.js +511 -0
  44. instaui/static/templates/webview.html +78 -0
  45. instaui/tailwind/__init__.py +6 -0
  46. instaui/tailwind/_index.py +24 -0
  47. instaui/{static/tailwindcss.min.js → tailwind/static/tailwindcss-v3.min.js} +62 -62
  48. instaui/tailwind/static/tailwindcss-v4.min.js +8 -0
  49. instaui/template/_utils.py +23 -0
  50. instaui/template/webview_template.py +50 -0
  51. instaui/ui/__init__.py +8 -2
  52. instaui/ui/__init__.pyi +7 -1
  53. instaui/vars/event_context.py +4 -0
  54. instaui/vars/web_computed.py +30 -30
  55. instaui/watch/web_watch.py +5 -6
  56. instaui/webview/__init__.py +1 -0
  57. instaui/webview/_utils.py +8 -0
  58. instaui/webview/api.py +72 -0
  59. instaui/webview/func.py +114 -0
  60. instaui/webview/index.py +162 -0
  61. instaui/webview/resource.py +172 -0
  62. instaui/zero/func.py +19 -12
  63. instaui/zero/scope.py +46 -28
  64. {instaui-0.1.4.dist-info → instaui-0.1.5.dist-info}/METADATA +4 -1
  65. {instaui-0.1.4.dist-info → instaui-0.1.5.dist-info}/RECORD +67 -47
  66. instaui/components/highlight_code/code.js +0 -63
  67. instaui/components/highlight_code/code.py +0 -117
  68. instaui/components/highlight_code/static/core.min.js +0 -307
  69. instaui/components/highlight_code/static/languages/css.min.js +0 -31
  70. instaui/components/highlight_code/static/languages/javascript.min.js +0 -81
  71. instaui/components/highlight_code/static/languages/json.min.js +0 -8
  72. instaui/components/highlight_code/static/languages/python-repl.min.js +0 -5
  73. instaui/components/highlight_code/static/languages/python.min.js +0 -42
  74. instaui/components/highlight_code/static/languages/shell.min.js +0 -5
  75. instaui/components/highlight_code/static/styles/default.min.css +0 -9
  76. instaui/components/highlight_code/static/styles/github-dark-dimmed.min.css +0 -9
  77. instaui/components/highlight_code/static/styles/github-dark.min.css +0 -10
  78. instaui/components/highlight_code/static/styles/github.min.css +0 -10
  79. instaui/handlers/computed_handler.py +0 -42
  80. instaui/handlers/config_handler.py +0 -13
  81. {instaui-0.1.4.dist-info → instaui-0.1.5.dist-info}/LICENSE +0 -0
  82. {instaui-0.1.4.dist-info → instaui-0.1.5.dist-info}/WHEEL +0 -0
@@ -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