instaui 0.1.3__tar.gz → 0.1.5__tar.gz

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 (210) hide show
  1. {instaui-0.1.3 → instaui-0.1.5}/PKG-INFO +4 -1
  2. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/content.py +4 -4
  3. instaui-0.1.5/instaui/components/echarts/echarts.js +128 -0
  4. instaui-0.1.5/instaui/components/echarts/echarts.py +194 -0
  5. instaui-0.1.5/instaui/components/echarts/static/echarts.esm.min.js +45 -0
  6. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/element.py +103 -13
  7. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/__init__.py +31 -18
  8. instaui-0.1.5/instaui/components/html/_preset.py +4 -0
  9. instaui-0.1.5/instaui/components/html/heading.py +51 -0
  10. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/range.py +3 -0
  11. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/select.py +16 -35
  12. instaui-0.1.5/instaui/components/html/table.py +36 -0
  13. instaui-0.1.5/instaui/components/html/textarea.py +28 -0
  14. instaui-0.1.5/instaui/components/markdown/markdown.js +33 -0
  15. instaui-0.1.5/instaui/components/markdown/markdown.py +41 -0
  16. instaui-0.1.5/instaui/components/markdown/static/github-markdown.css +12 -0
  17. instaui-0.1.5/instaui/components/markdown/static/marked.esm.js +2579 -0
  18. instaui-0.1.5/instaui/components/shiki_code/shiki_code.js +126 -0
  19. instaui-0.1.5/instaui/components/shiki_code/shiki_code.py +99 -0
  20. instaui-0.1.5/instaui/components/shiki_code/static/langs/css.mjs +5 -0
  21. instaui-0.1.5/instaui/components/shiki_code/static/langs/markdown.mjs +5 -0
  22. instaui-0.1.5/instaui/components/shiki_code/static/langs/python.mjs +5 -0
  23. instaui-0.1.5/instaui/components/shiki_code/static/langs/shell.mjs +2 -0
  24. instaui-0.1.5/instaui/components/shiki_code/static/langs/shellscript.mjs +5 -0
  25. instaui-0.1.5/instaui/components/shiki_code/static/shiki-core.js +5784 -0
  26. instaui-0.1.5/instaui/components/shiki_code/static/shiki-style.css +175 -0
  27. instaui-0.1.5/instaui/components/shiki_code/static/shiki-transformers.js +461 -0
  28. instaui-0.1.5/instaui/components/shiki_code/static/themes/vitesse-dark.mjs +2 -0
  29. instaui-0.1.5/instaui/components/shiki_code/static/themes/vitesse-light.mjs +2 -0
  30. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/value_element.py +7 -3
  31. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/vfor.py +1 -1
  32. {instaui-0.1.3 → instaui-0.1.5}/instaui/consts.py +2 -1
  33. instaui-0.1.5/instaui/daisyui/__init__.py +26 -0
  34. instaui-0.1.5/instaui/daisyui/_index.py +20 -0
  35. instaui-0.1.5/instaui/daisyui/button.py +38 -0
  36. instaui-0.1.5/instaui/daisyui/checkbox.py +17 -0
  37. instaui-0.1.5/instaui/daisyui/static/daisyui.css +1 -0
  38. instaui-0.1.5/instaui/daisyui/static/themes.css +1 -0
  39. instaui-0.1.5/instaui/daisyui/table.py +35 -0
  40. instaui-0.1.5/instaui/dependencies/component_dependency.py +22 -0
  41. {instaui-0.1.3 → instaui-0.1.5}/instaui/event/js_event.py +1 -0
  42. {instaui-0.1.3 → instaui-0.1.5}/instaui/event/web_event.py +6 -7
  43. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/dependency_router.py +4 -3
  44. instaui-0.1.5/instaui/fastapi_server/resource.py +30 -0
  45. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/server.py +34 -24
  46. {instaui-0.1.3 → instaui-0.1.5}/instaui/handlers/event_handler.py +3 -1
  47. {instaui-0.1.3 → instaui-0.1.5}/instaui/handlers/watch_handler.py +4 -0
  48. instaui-0.1.5/instaui/html_tools.py +95 -0
  49. {instaui-0.1.3 → instaui-0.1.5}/instaui/inject.py +3 -3
  50. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/_app.py +43 -4
  51. instaui-0.1.5/instaui/runtime/_link_manager.py +89 -0
  52. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/resource.py +21 -8
  53. instaui-0.1.5/instaui/shadcn_classless/_index.py +42 -0
  54. instaui-0.1.5/instaui/shadcn_classless/static/shadcn-classless.css +403 -0
  55. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_functions.py +1 -1
  56. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_route_model.py +1 -1
  57. instaui-0.1.5/instaui/static/insta-ui.css +1 -0
  58. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/insta-ui.esm-browser.prod.js +1308 -1252
  59. instaui-0.1.5/instaui/static/insta-ui.js.map +1 -0
  60. instaui-0.1.5/instaui/static/instaui-tools-browser.js +511 -0
  61. instaui-0.1.5/instaui/static/templates/webview.html +78 -0
  62. instaui-0.1.5/instaui/systems/module_system.py +30 -0
  63. instaui-0.1.5/instaui/tailwind/__init__.py +6 -0
  64. instaui-0.1.5/instaui/tailwind/_index.py +24 -0
  65. instaui-0.1.3/instaui/static/tailwindcss.min.js → instaui-0.1.5/instaui/tailwind/static/tailwindcss-v3.min.js +62 -62
  66. instaui-0.1.5/instaui/tailwind/static/tailwindcss-v4.min.js +8 -0
  67. instaui-0.1.5/instaui/template/_utils.py +23 -0
  68. instaui-0.1.5/instaui/template/webview_template.py +50 -0
  69. {instaui-0.1.3 → instaui-0.1.5}/instaui/template/zero_template.py +18 -17
  70. instaui-0.1.5/instaui/ui/__build_init.py +73 -0
  71. instaui-0.1.5/instaui/ui/__init__.py +136 -0
  72. instaui-0.1.3/instaui/ui/__init__.py → instaui-0.1.5/instaui/ui/__init__.pyi +73 -58
  73. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui/events.py +1 -1
  74. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui_functions/server.py +3 -1
  75. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/event_context.py +4 -0
  76. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/web_computed.py +30 -30
  77. {instaui-0.1.3 → instaui-0.1.5}/instaui/watch/web_watch.py +5 -6
  78. instaui-0.1.5/instaui/webview/__init__.py +1 -0
  79. instaui-0.1.5/instaui/webview/_utils.py +8 -0
  80. instaui-0.1.5/instaui/webview/api.py +72 -0
  81. instaui-0.1.5/instaui/webview/func.py +114 -0
  82. instaui-0.1.5/instaui/webview/index.py +162 -0
  83. instaui-0.1.5/instaui/webview/resource.py +172 -0
  84. {instaui-0.1.3 → instaui-0.1.5}/instaui/zero/func.py +31 -23
  85. instaui-0.1.5/instaui/zero/scope.py +126 -0
  86. {instaui-0.1.3 → instaui-0.1.5}/pyproject.toml +7 -1
  87. instaui-0.1.3/instaui/dependencies/component_dependency.py +0 -16
  88. instaui-0.1.3/instaui/fastapi_server/resource.py +0 -34
  89. instaui-0.1.3/instaui/handlers/computed_handler.py +0 -42
  90. instaui-0.1.3/instaui/handlers/config_handler.py +0 -13
  91. instaui-0.1.3/instaui/html_tools.py +0 -53
  92. instaui-0.1.3/instaui/static/insta-ui.css +0 -1
  93. instaui-0.1.3/instaui/static/insta-ui.iife.js +0 -29
  94. instaui-0.1.3/instaui/static/insta-ui.iife.js.map +0 -1
  95. instaui-0.1.3/instaui/static/insta-ui.js.map +0 -1
  96. instaui-0.1.3/instaui/zero/scope.py +0 -20
  97. instaui-0.1.3/instaui/zero/test.html +0 -44
  98. {instaui-0.1.3 → instaui-0.1.5}/LICENSE +0 -0
  99. {instaui-0.1.3 → instaui-0.1.5}/README.md +0 -0
  100. {instaui-0.1.3 → instaui-0.1.5}/instaui/__init__.py +0 -0
  101. {instaui-0.1.3 → instaui-0.1.5}/instaui/_helper/observable_helper.py +0 -0
  102. {instaui-0.1.3 → instaui-0.1.5}/instaui/boot_info.py +0 -0
  103. {instaui-0.1.3 → instaui-0.1.5}/instaui/common/jsonable.py +0 -0
  104. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/__init__.py +0 -0
  105. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/column.py +0 -0
  106. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/component.py +0 -0
  107. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/directive.py +0 -0
  108. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/grid.py +0 -0
  109. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/_mixins.py +0 -0
  110. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/button.py +0 -0
  111. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/checkbox.py +0 -0
  112. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/date.py +0 -0
  113. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/div.py +0 -0
  114. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/form.py +0 -0
  115. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/input.py +0 -0
  116. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/label.py +0 -0
  117. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/li.py +0 -0
  118. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/link.py +0 -0
  119. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/number.py +0 -0
  120. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/paragraph.py +0 -0
  121. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/span.py +0 -0
  122. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/html/ul.py +0 -0
  123. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/match.py +0 -0
  124. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/row.py +0 -0
  125. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/slot.py +0 -0
  126. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/transition_group.py +0 -0
  127. {instaui-0.1.3 → instaui-0.1.5}/instaui/components/vif.py +0 -0
  128. {instaui-0.1.3 → instaui-0.1.5}/instaui/dependencies/plugin_dependency.py +0 -0
  129. {instaui-0.1.3 → instaui-0.1.5}/instaui/event/event_mixin.py +0 -0
  130. {instaui-0.1.3 → instaui-0.1.5}/instaui/experimental/__init__.py +0 -0
  131. {instaui-0.1.3 → instaui-0.1.5}/instaui/experimental/debug.py +0 -0
  132. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/_utils.py +0 -0
  133. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/_uvicorn.py +0 -0
  134. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/debug_mode_router.py +0 -0
  135. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/event_router.py +0 -0
  136. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/middlewares.py +0 -0
  137. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/request_context.py +0 -0
  138. {instaui-0.1.3 → instaui-0.1.5}/instaui/fastapi_server/watch_router.py +0 -0
  139. {instaui-0.1.3 → instaui-0.1.5}/instaui/handlers/_utils.py +0 -0
  140. {instaui-0.1.3 → instaui-0.1.5}/instaui/js/__init__.py +0 -0
  141. {instaui-0.1.3 → instaui-0.1.5}/instaui/js/js_output.py +0 -0
  142. {instaui-0.1.3 → instaui-0.1.5}/instaui/js/lambda_func.py +0 -0
  143. {instaui-0.1.3 → instaui-0.1.5}/instaui/launch_collector.py +0 -0
  144. {instaui-0.1.3 → instaui-0.1.5}/instaui/page_info.py +0 -0
  145. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/__init__.py +0 -0
  146. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/_inner_helper.py +0 -0
  147. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/context.py +0 -0
  148. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/dataclass.py +0 -0
  149. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/scope.py +0 -0
  150. {instaui-0.1.3 → instaui-0.1.5}/instaui/runtime/ui_state_scope.py +0 -0
  151. {instaui-0.1.3 → instaui-0.1.5}/instaui/settings/__init__.py +0 -0
  152. {instaui-0.1.3 → instaui-0.1.5}/instaui/settings/__settings.py +0 -0
  153. {instaui-0.1.3 → instaui-0.1.5}/instaui/skip.py +0 -0
  154. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/__init__.py +0 -0
  155. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_components.py +0 -0
  156. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_file_base_utils.py +0 -0
  157. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_install.py +0 -0
  158. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_router_box.py +0 -0
  159. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_router_output.py +0 -0
  160. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_router_param_var.py +0 -0
  161. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/_types.py +0 -0
  162. {instaui-0.1.3 → instaui-0.1.5}/instaui/spa_router/templates/page_routes +0 -0
  163. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/insta-ui.ico +0 -0
  164. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/templates/debug/sse.html +0 -0
  165. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/templates/web.html +0 -0
  166. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/templates/zero.html +0 -0
  167. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/vue.esm-browser.prod.js +0 -0
  168. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/vue.global.prod.js +0 -0
  169. {instaui-0.1.3 → instaui-0.1.5}/instaui/static/vue.runtime.esm-browser.prod.js +0 -0
  170. {instaui-0.1.3 → instaui-0.1.5}/instaui/systems/file_system.py +0 -0
  171. {instaui-0.1.3 → instaui-0.1.5}/instaui/systems/func_system.py +0 -0
  172. {instaui-0.1.3 → instaui-0.1.5}/instaui/systems/js_system.py +0 -0
  173. {instaui-0.1.3 → instaui-0.1.5}/instaui/systems/pydantic_system.py +0 -0
  174. {instaui-0.1.3 → instaui-0.1.5}/instaui/systems/string_system.py +0 -0
  175. {instaui-0.1.3 → instaui-0.1.5}/instaui/template/__init__.py +0 -0
  176. {instaui-0.1.3 → instaui-0.1.5}/instaui/template/env.py +0 -0
  177. {instaui-0.1.3 → instaui-0.1.5}/instaui/template/web_template.py +0 -0
  178. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui_functions/input_slient_data.py +0 -0
  179. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui_functions/str_format.py +0 -0
  180. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui_functions/ui_page.py +0 -0
  181. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui_functions/ui_types.py +0 -0
  182. {instaui-0.1.3 → instaui-0.1.5}/instaui/ui_functions/url_location.py +0 -0
  183. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/__init__.py +0 -0
  184. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/_types.py +0 -0
  185. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/_utils.py +0 -0
  186. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/data.py +0 -0
  187. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/element_ref.py +0 -0
  188. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/event_extend.py +0 -0
  189. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/js_computed.py +0 -0
  190. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/common_type.py +0 -0
  191. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/element_binding.py +0 -0
  192. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/observable.py +0 -0
  193. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/pathable.py +0 -0
  194. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/py_binding.py +0 -0
  195. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/str_format_binding.py +0 -0
  196. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/mixin_types/var_type.py +0 -0
  197. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/path_var.py +0 -0
  198. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/ref.py +0 -0
  199. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/slot_prop.py +0 -0
  200. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/state.py +0 -0
  201. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/types.py +0 -0
  202. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/vfor_item.py +0 -0
  203. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/vue_computed.py +0 -0
  204. {instaui-0.1.3 → instaui-0.1.5}/instaui/vars/web_view_computed.py +0 -0
  205. {instaui-0.1.3 → instaui-0.1.5}/instaui/version.py +0 -0
  206. {instaui-0.1.3 → instaui-0.1.5}/instaui/watch/_types.py +0 -0
  207. {instaui-0.1.3 → instaui-0.1.5}/instaui/watch/_utils.py +0 -0
  208. {instaui-0.1.3 → instaui-0.1.5}/instaui/watch/js_watch.py +0 -0
  209. {instaui-0.1.3 → instaui-0.1.5}/instaui/watch/vue_watch.py +0 -0
  210. {instaui-0.1.3 → instaui-0.1.5}/instaui/zero/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: instaui
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: insta-ui is a Python-based UI library for rapidly building user interfaces.
5
5
  License: MIT
6
6
  Author: CrystalWindSnake
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.9
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
+ Provides-Extra: all
16
17
  Provides-Extra: web
17
18
  Provides-Extra: webview
18
19
  Requires-Dist: fastapi ; extra == "web"
@@ -22,6 +23,8 @@ Requires-Dist: pydantic (>=2.10.6,<3.0.0)
22
23
  Requires-Dist: pywebview ; extra == "webview"
23
24
  Requires-Dist: typing-extensions (>=4.12.2,<5.0.0)
24
25
  Requires-Dist: uvicorn ; extra == "web"
26
+ Requires-Dist: web ; extra == "all"
27
+ Requires-Dist: webview ; extra == "all"
25
28
  Description-Content-Type: text/markdown
26
29
 
27
30
  # insta-ui
@@ -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