instaui 0.1.9__tar.gz → 0.1.11__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 (290) hide show
  1. instaui-0.1.11/PKG-INFO +153 -0
  2. instaui-0.1.11/README.md +127 -0
  3. {instaui-0.1.9 → instaui-0.1.11}/instaui/_helper/observable_helper.py +11 -1
  4. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/radio.py +1 -1
  5. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/select.py +4 -1
  6. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/echarts/echarts.js +8 -6
  7. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/echarts/echarts.py +1 -1
  8. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/element.py +12 -22
  9. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/grid.py +63 -11
  10. instaui-0.1.11/instaui/components/html/paragraph.py +29 -0
  11. instaui-0.1.11/instaui/components/label.py +5 -0
  12. {instaui-0.1.9 → instaui-0.1.11}/instaui/event/js_event.py +24 -0
  13. instaui-0.1.11/instaui/event/vue_event.py +66 -0
  14. {instaui-0.1.9 → instaui-0.1.11}/instaui/event/web_event.py +36 -25
  15. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/dependency_router.py +6 -0
  16. {instaui-0.1.9 → instaui-0.1.11}/instaui/handlers/_utils.py +27 -5
  17. instaui-0.1.11/instaui/static/insta-ui.css +1 -0
  18. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/insta-ui.esm-browser.prod.js +3717 -3672
  19. instaui-0.1.11/instaui/static/insta-ui.js.map +1 -0
  20. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/templates/web.html +1 -1
  21. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/templates/webview.html +1 -1
  22. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/templates/zero.html +1 -1
  23. {instaui-0.1.9 → instaui-0.1.11}/instaui/systems/func_system.py +15 -0
  24. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui/__init__.py +5 -1
  25. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui/__init__.pyi +5 -1
  26. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui_functions/ui_page.py +3 -3
  27. instaui-0.1.11/instaui/vars/event_extend.py +0 -0
  28. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/js_computed.py +25 -1
  29. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/state.py +15 -0
  30. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/web_computed.py +36 -0
  31. instaui-0.1.11/instaui/watch/js_watch.py +110 -0
  32. {instaui-0.1.9 → instaui-0.1.11}/instaui/watch/web_watch.py +53 -0
  33. {instaui-0.1.9 → instaui-0.1.11}/pyproject.toml +1 -1
  34. instaui-0.1.9/PKG-INFO +0 -153
  35. instaui-0.1.9/README.md +0 -127
  36. instaui-0.1.9/instaui/components/html/paragraph.py +0 -19
  37. instaui-0.1.9/instaui/static/insta-ui.css +0 -1
  38. instaui-0.1.9/instaui/static/insta-ui.js.map +0 -1
  39. instaui-0.1.9/instaui/watch/js_watch.py +0 -74
  40. {instaui-0.1.9 → instaui-0.1.11}/.gitignore +0 -0
  41. {instaui-0.1.9 → instaui-0.1.11}/LICENSE +0 -0
  42. {instaui-0.1.9 → instaui-0.1.11}/instaui/__init__.py +0 -0
  43. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/__init__.py +0 -0
  44. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/_settings.py +0 -0
  45. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/_use_tools/locale.py +0 -0
  46. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/component_types.py +0 -0
  47. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/_utils.py +0 -0
  48. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/affix.py +0 -0
  49. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/alert.py +0 -0
  50. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/anchor.py +0 -0
  51. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/auto_complete.py +0 -0
  52. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/avatar.py +0 -0
  53. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/back_top.py +0 -0
  54. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/badge.py +0 -0
  55. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/breadcrumb.py +0 -0
  56. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/button.py +0 -0
  57. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/calendar.py +0 -0
  58. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/card.py +0 -0
  59. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/carousel.py +0 -0
  60. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/cascader.py +0 -0
  61. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/checkbox.py +0 -0
  62. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/collapse.py +0 -0
  63. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/color_picker.py +0 -0
  64. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/comment.py +0 -0
  65. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/config_provider.py +0 -0
  66. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/date_picker.py +0 -0
  67. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/descriptions.py +0 -0
  68. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/divider.py +0 -0
  69. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/drawer.py +0 -0
  70. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/dropdown.py +0 -0
  71. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/empty.py +0 -0
  72. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/form.py +0 -0
  73. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/icon.py +0 -0
  74. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/image.py +0 -0
  75. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/input.py +0 -0
  76. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/input_number.py +0 -0
  77. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/input_password.py +0 -0
  78. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/input_search.py +0 -0
  79. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/input_tag.py +0 -0
  80. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/layout.py +0 -0
  81. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/layout_content.py +0 -0
  82. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/layout_footer.py +0 -0
  83. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/layout_header.py +0 -0
  84. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/layout_sider.py +0 -0
  85. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/link.py +0 -0
  86. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/list.py +0 -0
  87. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/mention.py +0 -0
  88. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/menu.py +0 -0
  89. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/modal.py +0 -0
  90. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/overflow_list.py +0 -0
  91. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/page_header.py +0 -0
  92. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/pagination.py +0 -0
  93. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/pop_confirm.py +0 -0
  94. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/popover.py +0 -0
  95. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/progress.py +0 -0
  96. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/radio_group.py +0 -0
  97. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/rate.py +0 -0
  98. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/resize_box.py +0 -0
  99. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/result.py +0 -0
  100. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/skeleton.py +0 -0
  101. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/slider.py +0 -0
  102. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/space.py +0 -0
  103. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/spin.py +0 -0
  104. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/split.py +0 -0
  105. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/statistic.py +0 -0
  106. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/steps.py +0 -0
  107. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/switch.py +0 -0
  108. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/tab_pane.py +0 -0
  109. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/table.py +0 -0
  110. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/tabs.py +0 -0
  111. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/tag.py +0 -0
  112. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/textarea.py +0 -0
  113. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/time_picker.py +0 -0
  114. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/timeline.py +0 -0
  115. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/tooltip.py +0 -0
  116. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/transfer.py +0 -0
  117. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/tree.py +0 -0
  118. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/tree_select.py +0 -0
  119. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/trigger.py +0 -0
  120. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/typography.py +0 -0
  121. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/upload.py +0 -0
  122. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/verification_code.py +0 -0
  123. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/components/watermark.py +0 -0
  124. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/locales/__init__.py +0 -0
  125. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/locales/_index.py +0 -0
  126. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/locales/en_us.py +0 -0
  127. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/locales/zh_cn.py +0 -0
  128. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/setup.py +0 -0
  129. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/static/instaui-arco.css +0 -0
  130. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/static/instaui-arco.js +0 -0
  131. {instaui-0.1.9 → instaui-0.1.11}/instaui/arco/types.py +0 -0
  132. {instaui-0.1.9 → instaui-0.1.11}/instaui/boot_info.py +0 -0
  133. {instaui-0.1.9 → instaui-0.1.11}/instaui/common/jsonable.py +0 -0
  134. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/__init__.py +0 -0
  135. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/column.py +0 -0
  136. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/component.py +0 -0
  137. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/content.py +0 -0
  138. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/directive.py +0 -0
  139. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/echarts/static/echarts.esm.min.js +0 -0
  140. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/__init__.py +0 -0
  141. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/_mixins.py +0 -0
  142. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/_preset.py +0 -0
  143. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/button.py +0 -0
  144. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/checkbox.py +0 -0
  145. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/date.py +0 -0
  146. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/div.py +0 -0
  147. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/form.py +0 -0
  148. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/heading.py +0 -0
  149. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/input.py +0 -0
  150. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/label.py +0 -0
  151. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/li.py +0 -0
  152. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/link.py +0 -0
  153. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/number.py +0 -0
  154. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/range.py +0 -0
  155. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/select.py +0 -0
  156. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/span.py +0 -0
  157. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/table.py +0 -0
  158. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/textarea.py +0 -0
  159. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/html/ul.py +0 -0
  160. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/markdown/markdown.js +0 -0
  161. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/markdown/markdown.py +0 -0
  162. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/markdown/static/github-markdown.css +0 -0
  163. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/markdown/static/marked.esm.js +0 -0
  164. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/match.py +0 -0
  165. /instaui-0.1.9/instaui/vars/event_extend.py → /instaui-0.1.11/instaui/components/mermaid.py +0 -0
  166. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/row.py +0 -0
  167. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/shiki_code.js +0 -0
  168. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/shiki_code.py +0 -0
  169. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/langs/css.mjs +0 -0
  170. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/langs/markdown.mjs +0 -0
  171. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/langs/python.mjs +0 -0
  172. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/langs/shell.mjs +0 -0
  173. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/langs/shellscript.mjs +0 -0
  174. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/shiki-core.js +0 -0
  175. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/shiki-style.css +0 -0
  176. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/shiki-transformers.js +0 -0
  177. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/themes/vitesse-dark.mjs +0 -0
  178. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/shiki_code/static/themes/vitesse-light.mjs +0 -0
  179. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/slot.py +0 -0
  180. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/transition_group.py +0 -0
  181. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/value_element.py +0 -0
  182. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/vfor.py +0 -0
  183. {instaui-0.1.9 → instaui-0.1.11}/instaui/components/vif.py +0 -0
  184. {instaui-0.1.9 → instaui-0.1.11}/instaui/consts.py +0 -0
  185. {instaui-0.1.9 → instaui-0.1.11}/instaui/dependencies/component_dependency.py +0 -0
  186. {instaui-0.1.9 → instaui-0.1.11}/instaui/dependencies/plugin_dependency.py +0 -0
  187. {instaui-0.1.9 → instaui-0.1.11}/instaui/event/event_mixin.py +0 -0
  188. {instaui-0.1.9 → instaui-0.1.11}/instaui/experimental/__init__.py +0 -0
  189. {instaui-0.1.9 → instaui-0.1.11}/instaui/experimental/debug.py +0 -0
  190. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/_utils.py +0 -0
  191. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/_uvicorn.py +0 -0
  192. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/debug_mode_router.py +0 -0
  193. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/event_router.py +0 -0
  194. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/middlewares.py +0 -0
  195. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/request_context.py +0 -0
  196. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/resource.py +0 -0
  197. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/server.py +0 -0
  198. {instaui-0.1.9 → instaui-0.1.11}/instaui/fastapi_server/watch_router.py +0 -0
  199. {instaui-0.1.9 → instaui-0.1.11}/instaui/handlers/event_handler.py +0 -0
  200. {instaui-0.1.9 → instaui-0.1.11}/instaui/handlers/watch_handler.py +0 -0
  201. {instaui-0.1.9 → instaui-0.1.11}/instaui/html_tools.py +0 -0
  202. {instaui-0.1.9 → instaui-0.1.11}/instaui/inject.py +0 -0
  203. {instaui-0.1.9 → instaui-0.1.11}/instaui/js/__init__.py +0 -0
  204. {instaui-0.1.9 → instaui-0.1.11}/instaui/js/js_output.py +0 -0
  205. {instaui-0.1.9 → instaui-0.1.11}/instaui/js/lambda_func.py +0 -0
  206. {instaui-0.1.9 → instaui-0.1.11}/instaui/launch_collector.py +0 -0
  207. {instaui-0.1.9 → instaui-0.1.11}/instaui/page_info.py +0 -0
  208. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/__init__.py +0 -0
  209. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/_app.py +0 -0
  210. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/_inner_helper.py +0 -0
  211. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/_link_manager.py +0 -0
  212. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/context.py +0 -0
  213. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/dataclass.py +0 -0
  214. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/resource.py +0 -0
  215. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/scope.py +0 -0
  216. {instaui-0.1.9 → instaui-0.1.11}/instaui/runtime/ui_state_scope.py +0 -0
  217. {instaui-0.1.9 → instaui-0.1.11}/instaui/settings/__init__.py +0 -0
  218. {instaui-0.1.9 → instaui-0.1.11}/instaui/settings/__settings.py +0 -0
  219. {instaui-0.1.9 → instaui-0.1.11}/instaui/shadcn_classless/_index.py +0 -0
  220. {instaui-0.1.9 → instaui-0.1.11}/instaui/shadcn_classless/static/shadcn-classless.css +0 -0
  221. {instaui-0.1.9 → instaui-0.1.11}/instaui/skip.py +0 -0
  222. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/__init__.py +0 -0
  223. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_components.py +0 -0
  224. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_file_base_utils.py +0 -0
  225. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_functions.py +0 -0
  226. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_install.py +0 -0
  227. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_route_model.py +0 -0
  228. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_router_box.py +0 -0
  229. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_router_output.py +0 -0
  230. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_router_param_var.py +0 -0
  231. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/_types.py +0 -0
  232. {instaui-0.1.9 → instaui-0.1.11}/instaui/spa_router/templates/page_routes +0 -0
  233. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/insta-ui.ico +0 -0
  234. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/instaui-tools-browser.js +0 -0
  235. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/templates/debug/sse.html +0 -0
  236. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/vue.esm-browser.prod.js +0 -0
  237. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/vue.global.prod.js +0 -0
  238. {instaui-0.1.9 → instaui-0.1.11}/instaui/static/vue.runtime.esm-browser.prod.js +0 -0
  239. {instaui-0.1.9 → instaui-0.1.11}/instaui/systems/file_system.py +0 -0
  240. {instaui-0.1.9 → instaui-0.1.11}/instaui/systems/js_system.py +0 -0
  241. {instaui-0.1.9 → instaui-0.1.11}/instaui/systems/module_system.py +0 -0
  242. {instaui-0.1.9 → instaui-0.1.11}/instaui/systems/pydantic_system.py +0 -0
  243. {instaui-0.1.9 → instaui-0.1.11}/instaui/systems/string_system.py +0 -0
  244. {instaui-0.1.9 → instaui-0.1.11}/instaui/tailwind/__init__.py +0 -0
  245. {instaui-0.1.9 → instaui-0.1.11}/instaui/tailwind/_index.py +0 -0
  246. {instaui-0.1.9 → instaui-0.1.11}/instaui/tailwind/static/tailwindcss-v3.min.js +0 -0
  247. {instaui-0.1.9 → instaui-0.1.11}/instaui/tailwind/static/tailwindcss-v4.min.js +0 -0
  248. {instaui-0.1.9 → instaui-0.1.11}/instaui/template/__init__.py +0 -0
  249. {instaui-0.1.9 → instaui-0.1.11}/instaui/template/_utils.py +0 -0
  250. {instaui-0.1.9 → instaui-0.1.11}/instaui/template/env.py +0 -0
  251. {instaui-0.1.9 → instaui-0.1.11}/instaui/template/web_template.py +0 -0
  252. {instaui-0.1.9 → instaui-0.1.11}/instaui/template/webview_template.py +0 -0
  253. {instaui-0.1.9 → instaui-0.1.11}/instaui/template/zero_template.py +0 -0
  254. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui/events.py +0 -0
  255. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui_functions/input_slient_data.py +0 -0
  256. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui_functions/server.py +0 -0
  257. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui_functions/str_format.py +0 -0
  258. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui_functions/ui_types.py +0 -0
  259. {instaui-0.1.9 → instaui-0.1.11}/instaui/ui_functions/url_location.py +0 -0
  260. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/_types.py +0 -0
  261. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/data.py +0 -0
  262. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/element_ref.py +0 -0
  263. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/event_context.py +0 -0
  264. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/common_type.py +0 -0
  265. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/element_binding.py +0 -0
  266. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/observable.py +0 -0
  267. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/pathable.py +0 -0
  268. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/py_binding.py +0 -0
  269. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/str_format_binding.py +0 -0
  270. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/mixin_types/var_type.py +0 -0
  271. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/path_var.py +0 -0
  272. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/ref.py +0 -0
  273. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/slot_prop.py +0 -0
  274. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/types.py +0 -0
  275. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/vfor_item.py +0 -0
  276. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/vue_computed.py +0 -0
  277. {instaui-0.1.9 → instaui-0.1.11}/instaui/vars/web_view_computed.py +0 -0
  278. {instaui-0.1.9 → instaui-0.1.11}/instaui/version.py +0 -0
  279. {instaui-0.1.9 → instaui-0.1.11}/instaui/watch/_types.py +0 -0
  280. {instaui-0.1.9 → instaui-0.1.11}/instaui/watch/_utils.py +0 -0
  281. {instaui-0.1.9 → instaui-0.1.11}/instaui/watch/vue_watch.py +0 -0
  282. {instaui-0.1.9 → instaui-0.1.11}/instaui/webview/__init__.py +0 -0
  283. {instaui-0.1.9 → instaui-0.1.11}/instaui/webview/_utils.py +0 -0
  284. {instaui-0.1.9 → instaui-0.1.11}/instaui/webview/api.py +0 -0
  285. {instaui-0.1.9 → instaui-0.1.11}/instaui/webview/func.py +0 -0
  286. {instaui-0.1.9 → instaui-0.1.11}/instaui/webview/index.py +0 -0
  287. {instaui-0.1.9 → instaui-0.1.11}/instaui/webview/resource.py +0 -0
  288. {instaui-0.1.9 → instaui-0.1.11}/instaui/zero/__init__.py +0 -0
  289. {instaui-0.1.9 → instaui-0.1.11}/instaui/zero/func.py +0 -0
  290. {instaui-0.1.9 → instaui-0.1.11}/instaui/zero/scope.py +0 -0
@@ -0,0 +1,153 @@
1
+ Metadata-Version: 2.4
2
+ Name: instaui
3
+ Version: 0.1.11
4
+ Summary: insta-ui is a Python-based UI library for rapidly building user interfaces.
5
+ Author-email: CrystalWindSnake <568166495@qq.com>
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Keywords: gui,ui,web
9
+ Requires-Python: <3.13,>=3.8
10
+ Requires-Dist: jinja2>=3.1.6
11
+ Requires-Dist: orjson>=3.10.15
12
+ Requires-Dist: pydantic>=2.10.6
13
+ Requires-Dist: typing-extensions>=4.13.2
14
+ Provides-Extra: all
15
+ Requires-Dist: fastapi[standard]; extra == 'all'
16
+ Requires-Dist: pywebview; extra == 'all'
17
+ Requires-Dist: uvicorn; extra == 'all'
18
+ Provides-Extra: web
19
+ Requires-Dist: fastapi[standard]; extra == 'web'
20
+ Requires-Dist: pydantic<3.0.0,>=2.10.6; extra == 'web'
21
+ Requires-Dist: uvicorn; extra == 'web'
22
+ Provides-Extra: webview
23
+ Requires-Dist: pydantic<3.0.0,>=2.10.6; extra == 'webview'
24
+ Requires-Dist: pywebview; extra == 'webview'
25
+ Description-Content-Type: text/markdown
26
+
27
+ # insta-ui
28
+
29
+ <div align="center">
30
+
31
+ English| [简体中文](./README.md)
32
+
33
+ </div>
34
+
35
+ ## 📖 Introduction
36
+ insta-ui is a Python-based UI library for quickly building user interfaces.
37
+
38
+ ## ⚙️ Features
39
+ Three modes:
40
+
41
+ - Web mode: Generate web (stateless) applications.
42
+ - Web View mode: Generate web view applications that can be packaged as native apps (no need to start a web server).
43
+ - Zero mode: Generate pure HTML files that run directly in browsers without any dependencies.
44
+
45
+
46
+ ## 📦 Installation
47
+
48
+ Zero mode:
49
+
50
+ ```
51
+ pip install instaui -U
52
+ ```
53
+
54
+ web mode
55
+
56
+ ```
57
+ pip install instaui[web] -U
58
+ ```
59
+
60
+ Web View mode
61
+ ```
62
+ pip install instaui[webview] -U
63
+ ```
64
+
65
+
66
+ ## 🖥️ Quick Start
67
+ Below is a simple example of number summation. The result color changes dynamically based on the sum:
68
+
69
+ ```python
70
+ from instaui import ui, arco
71
+ arco.use()
72
+
73
+ @ui.page('/')
74
+ def home():
75
+ num1 = ui.state(0)
76
+ num2 = ui.state(0)
77
+
78
+ # Automatically recalculates result when num1 or num2 changes
79
+ @ui.computed(inputs=[num1, num2])
80
+ def result(num1: int, num2: int):
81
+ return num1 + num2
82
+
83
+ # Automatically updates text_color when result changes
84
+ @ui.computed(inputs=[result])
85
+ def text_color(result: int):
86
+ return "red" if result % 2 == 0 else "blue"
87
+
88
+ # UI components
89
+ arco.input_number(num1)
90
+ ui.label("+")
91
+ arco.input_number(num2)
92
+ ui.label("=")
93
+ ui.label(result).style({"color": text_color})
94
+
95
+ ui.server().run()
96
+ ```
97
+
98
+ Replace `ui.server().run()` with `ui.webview().run()` to switch to Web View mode:
99
+
100
+ ```python
101
+ ...
102
+
103
+ # ui.server().run()
104
+ ui.webview().run()
105
+ ```
106
+
107
+ To execute computations on the client side instead of the server, use `ui.js_computed` instead of `ui.computed`:
108
+
109
+ ```python
110
+ from instaui import ui, arco
111
+ arco.use()
112
+
113
+ @ui.page('/')
114
+ def home():
115
+ num1 = ui.state(0)
116
+ num2 = ui.state(0)
117
+
118
+ result = ui.js_computed(inputs=[num1, num2], code="(num1, num2) => num1 + num2")
119
+ text_color = ui.js_computed(inputs=[result], code="(result) => result % 2 === 0? 'red' : 'blue'")
120
+
121
+ # UI components
122
+ ...
123
+
124
+ ...
125
+
126
+ ```
127
+
128
+ In this case, all interactions will run on the client side. Use `Zero mode` to generate a standalone HTML file:
129
+
130
+ ```python
131
+ from instaui import ui, arco,zero
132
+ arco.use()
133
+
134
+ @ui.page('/')
135
+ def home():
136
+ num1 = ui.state(0)
137
+ num2 = ui.state(0)
138
+
139
+ result = ui.js_computed(inputs=[num1, num2], code="(num1, num2) => num1 + num2")
140
+ text_color = ui.js_computed(inputs=[result], code="(result) => result % 2 === 0? 'red' : 'blue'")
141
+
142
+ # UI components
143
+ arco.input_number(num1)
144
+ ui.label("+")
145
+ arco.input_number(num2)
146
+ ui.label("=")
147
+ ui.label(result).style({"color": text_color})
148
+
149
+ with zero() as z:
150
+ home()
151
+ z.to_html('index.html')
152
+
153
+ ```
@@ -0,0 +1,127 @@
1
+ # insta-ui
2
+
3
+ <div align="center">
4
+
5
+ English| [简体中文](./README.md)
6
+
7
+ </div>
8
+
9
+ ## 📖 Introduction
10
+ insta-ui is a Python-based UI library for quickly building user interfaces.
11
+
12
+ ## ⚙️ Features
13
+ Three modes:
14
+
15
+ - Web mode: Generate web (stateless) applications.
16
+ - Web View mode: Generate web view applications that can be packaged as native apps (no need to start a web server).
17
+ - Zero mode: Generate pure HTML files that run directly in browsers without any dependencies.
18
+
19
+
20
+ ## 📦 Installation
21
+
22
+ Zero mode:
23
+
24
+ ```
25
+ pip install instaui -U
26
+ ```
27
+
28
+ web mode
29
+
30
+ ```
31
+ pip install instaui[web] -U
32
+ ```
33
+
34
+ Web View mode
35
+ ```
36
+ pip install instaui[webview] -U
37
+ ```
38
+
39
+
40
+ ## 🖥️ Quick Start
41
+ Below is a simple example of number summation. The result color changes dynamically based on the sum:
42
+
43
+ ```python
44
+ from instaui import ui, arco
45
+ arco.use()
46
+
47
+ @ui.page('/')
48
+ def home():
49
+ num1 = ui.state(0)
50
+ num2 = ui.state(0)
51
+
52
+ # Automatically recalculates result when num1 or num2 changes
53
+ @ui.computed(inputs=[num1, num2])
54
+ def result(num1: int, num2: int):
55
+ return num1 + num2
56
+
57
+ # Automatically updates text_color when result changes
58
+ @ui.computed(inputs=[result])
59
+ def text_color(result: int):
60
+ return "red" if result % 2 == 0 else "blue"
61
+
62
+ # UI components
63
+ arco.input_number(num1)
64
+ ui.label("+")
65
+ arco.input_number(num2)
66
+ ui.label("=")
67
+ ui.label(result).style({"color": text_color})
68
+
69
+ ui.server().run()
70
+ ```
71
+
72
+ Replace `ui.server().run()` with `ui.webview().run()` to switch to Web View mode:
73
+
74
+ ```python
75
+ ...
76
+
77
+ # ui.server().run()
78
+ ui.webview().run()
79
+ ```
80
+
81
+ To execute computations on the client side instead of the server, use `ui.js_computed` instead of `ui.computed`:
82
+
83
+ ```python
84
+ from instaui import ui, arco
85
+ arco.use()
86
+
87
+ @ui.page('/')
88
+ def home():
89
+ num1 = ui.state(0)
90
+ num2 = ui.state(0)
91
+
92
+ result = ui.js_computed(inputs=[num1, num2], code="(num1, num2) => num1 + num2")
93
+ text_color = ui.js_computed(inputs=[result], code="(result) => result % 2 === 0? 'red' : 'blue'")
94
+
95
+ # UI components
96
+ ...
97
+
98
+ ...
99
+
100
+ ```
101
+
102
+ In this case, all interactions will run on the client side. Use `Zero mode` to generate a standalone HTML file:
103
+
104
+ ```python
105
+ from instaui import ui, arco,zero
106
+ arco.use()
107
+
108
+ @ui.page('/')
109
+ def home():
110
+ num1 = ui.state(0)
111
+ num2 = ui.state(0)
112
+
113
+ result = ui.js_computed(inputs=[num1, num2], code="(num1, num2) => num1 + num2")
114
+ text_color = ui.js_computed(inputs=[result], code="(result) => result % 2 === 0? 'red' : 'blue'")
115
+
116
+ # UI components
117
+ arco.input_number(num1)
118
+ ui.label("+")
119
+ arco.input_number(num2)
120
+ ui.label("=")
121
+ ui.label(result).style({"color": text_color})
122
+
123
+ with zero() as z:
124
+ home()
125
+ z.to_html('index.html')
126
+
127
+ ```
@@ -1,6 +1,6 @@
1
1
  import typing
2
2
  from instaui.vars.mixin_types.observable import ObservableMixin
3
- from instaui.vars.mixin_types.py_binding import CanInputMixin
3
+ from instaui.vars.mixin_types.py_binding import CanInputMixin, CanOutputMixin
4
4
  from instaui.ui_functions.input_slient_data import InputSilentData
5
5
 
6
6
  from instaui.vars.mixin_types.common_type import TObservableInput
@@ -33,3 +33,13 @@ def analyze_observable_inputs(inputs: typing.List[TObservableInput]):
33
33
  result_inputs.append(input)
34
34
 
35
35
  return result_inputs, slients, datas
36
+
37
+
38
+ def auto_made_inputs_to_slient(
39
+ inputs: typing.Optional[typing.Sequence[TObservableInput]],
40
+ outputs: typing.Optional[typing.Sequence[CanOutputMixin]],
41
+ ):
42
+ if inputs is None or outputs is None:
43
+ return inputs
44
+
45
+ return [InputSilentData(input) if input in outputs else input for input in inputs]
@@ -17,7 +17,7 @@ class Radio(Element):
17
17
  ):
18
18
  super().__init__("a-radio")
19
19
 
20
- try_setup_vmodel(self, value)
20
+ self.props({"value": value})
21
21
  self.props(handle_props(kwargs)) # type: ignore
22
22
 
23
23
  def on_change(
@@ -10,6 +10,9 @@ from instaui.arco import component_types
10
10
  from instaui.event.event_mixin import EventMixin
11
11
  from ._utils import handle_props, try_setup_vmodel
12
12
 
13
+
14
+ _TSelectValue = typing.Union[str, int, typing.Sequence[str], typing.Sequence[int]]
15
+
13
16
  _OPTIONS_TRANSLATE_JS: typing.Final = r"""(options)=>{
14
17
  if (Array.isArray(options)){
15
18
  const obj = {};
@@ -27,7 +30,7 @@ class Select(Element):
27
30
  def __init__(
28
31
  self,
29
32
  options: TMaybeRef[typing.Union[typing.Sequence, typing.Dict]],
30
- value: typing.Optional[TMaybeRef[typing.Union[str, int]]] = None,
33
+ value: typing.Optional[TMaybeRef[_TSelectValue]] = None,
31
34
  **kwargs: Unpack[component_types.TSelect],
32
35
  ):
33
36
  super().__init__("a-select")
@@ -48,7 +48,7 @@ function setOption(root, chartIns, props) {
48
48
  if (!chartIns.value) {
49
49
  init(root, chartIns, props);
50
50
  } else {
51
- chartIns.value.setOption(props.option, props.updateOptions || {});
51
+ chartIns.value.setOption(props.option || {}, props.updateOptions || {});
52
52
  }
53
53
  }
54
54
 
@@ -74,8 +74,8 @@ function autoResize(root, chartIns, props) {
74
74
  if (!isInitialResize) {
75
75
  isInitialResize = true;
76
76
  if (
77
- root.offsetWidth === offsetWidth &&
78
- root.offsetHeight === offsetHeight
77
+ root.value.offsetWidth === offsetWidth &&
78
+ root.value.offsetHeight === offsetHeight
79
79
  ) {
80
80
  return;
81
81
  }
@@ -105,9 +105,11 @@ function setChartEvents(root, chartIns, emit, props) {
105
105
  if (chartEvents) {
106
106
  chartEvents.forEach(event => {
107
107
  chartIns.value.on(event, (...args) => {
108
- const eventArgs = args[0]
109
- delete eventArgs['event']
110
- delete eventArgs['$vars']
108
+ if (args.length > 0) {
109
+ const eventArgs = args[0]
110
+ delete eventArgs['event']
111
+ delete eventArgs['$vars']
112
+ }
111
113
 
112
114
  emit(`chart:${event}`, ...args)
113
115
  });
@@ -153,7 +153,7 @@ class ECharts(
153
153
  self._zr_events: Set[str] = set()
154
154
  self.props({"option": option})
155
155
 
156
- if init_options:
156
+ if init_options is not None:
157
157
  self.props({"initOptions": init_options})
158
158
 
159
159
  if update_options:
@@ -96,8 +96,11 @@ class Element(Component):
96
96
  self._props.update(self._default_props)
97
97
  self._proxy_props: List[ElementBindingMixin] = []
98
98
 
99
- self._js_events: defaultdict[str, List[EventMixin]] = defaultdict(list)
100
- self._web_events: defaultdict[str, List[EventMixin]] = defaultdict(list)
99
+ self._events: defaultdict[str, List[EventMixin]] = defaultdict(list)
100
+
101
+ # self._js_events: defaultdict[str, List[EventMixin]] = defaultdict(list)
102
+ # self._web_events: defaultdict[str, List[EventMixin]] = defaultdict(list)
103
+ # self._vue_events: defaultdict[str, List[EventMixin]] = defaultdict(list)
101
104
  self._directives: Dict[Directive, None] = {}
102
105
 
103
106
  self._slot_manager = SlotManager()
@@ -328,11 +331,7 @@ class Element(Component):
328
331
  if extends:
329
332
  handler = handler.copy_with_extends(extends)
330
333
 
331
- if handler.event_type() == "js":
332
- self._js_events[event_name].append(handler)
333
-
334
- if handler.event_type() == "web":
335
- self._web_events[event_name].append(handler)
334
+ self._events[event_name].append(handler)
336
335
 
337
336
  return self
338
337
 
@@ -452,8 +451,8 @@ class Element(Component):
452
451
  v._to_element_binding_config() for v in self._proxy_props
453
452
  ]
454
453
 
455
- if self._js_events or self._web_events:
456
- data["events"] = _normalize_events(self._js_events, self._web_events)
454
+ if self._events:
455
+ data["events"] = _normalize_events(self._events)
457
456
 
458
457
  if self._slot_manager.has_slot():
459
458
  data["slots"] = self._slot_manager
@@ -477,20 +476,11 @@ class Element(Component):
477
476
 
478
477
 
479
478
  def _normalize_events(
480
- js_events: defaultdict[str, List[EventMixin]],
481
- web_events: defaultdict[str, List[EventMixin]],
479
+ events: defaultdict[str, List[EventMixin]],
482
480
  ):
483
- merged: defaultdict[str, List[EventMixin]] = defaultdict(list)
484
-
485
- for name, events in js_events.items():
486
- name = _normalize_event_name(name)
487
- merged[name].extend(events)
488
-
489
- for name, events in web_events.items():
490
- name = _normalize_event_name(name)
491
- merged[name].extend(events)
492
-
493
- return dict(merged)
481
+ return {
482
+ _normalize_event_name(name): event_list for name, event_list in events.items()
483
+ }
494
484
 
495
485
 
496
486
  def _normalize_event_name(event_name: str):
@@ -121,23 +121,75 @@ class Grid(Element):
121
121
  area = f"{real_row} / {real_column} / {real_row_span} / {real_column_span}"
122
122
  return self.mark_area(area)
123
123
 
124
- @classmethod
124
+ @staticmethod
125
125
  def auto_columns(
126
- cls,
127
126
  *,
128
127
  min_width: TMaybeRef[str],
129
128
  mode: TMaybeRef[Literal["auto-fill", "auto-fit"]] = "auto-fit",
130
- ) -> Grid:
131
- if isinstance(min_width, ObservableMixin) or isinstance(mode, ObservableMixin):
132
- template = JsComputed(
133
- inputs=[min_width, mode],
134
- code=r"(min_width, mode)=> `repeat(${mode}, minmax(min(${min_width},100%), 1fr))`",
135
- )
129
+ ):
130
+ """
131
+ Generate a dynamic grid column configuration for responsive layout systems.
132
+
133
+ Creates a computed layout specification that calculates column dimensions
134
+ based on minimum width requirements and auto-sizing behavior. Retu
135
+
136
+ Args:
137
+ min_width (TMaybeRef[str]):
138
+ Minimum width constraint for columns as a CSS length string (e.g., "300px").
139
+ Accepts reactive references for dynamic updates.
140
+ mode (TMaybeRef[Literal[&quot;auto, optional):
141
+ Auto-sizing behavior strategy:
142
+ - "auto-fill": Preserves container space by creating additional columns
143
+ - "auto-fit": Adjusts columns to fit available space.
144
+ Defaults to "auto-fit".
145
+
146
+ Example:
147
+ .. code-block:: python
148
+
149
+ with ui.grid(columns=ui.grid.auto_columns(min_width="300px")):
150
+ ...
151
+ """
152
+ template = JsComputed(
153
+ inputs=[min_width, mode],
154
+ code=r"(min_width, mode)=> `repeat(${mode}, minmax(min(${min_width},100%), 1fr))`",
155
+ )
156
+
157
+ return template
158
+
159
+ @staticmethod
160
+ def auto_rows(
161
+ *,
162
+ min_height: TMaybeRef[str],
163
+ mode: TMaybeRef[Literal["auto-fill", "auto-fit"]] = "auto-fit",
164
+ ):
165
+ """
166
+ Generate a dynamic grid row configuration for responsive layout systems.
167
+
168
+ Creates a computed layout specification that calculates row dimensions
169
+ based on minimum height requirements and auto-sizing behavior.
170
+
171
+ Args:
172
+ min_height (TMaybeRef[str]):
173
+ Minimum height constraint for rows as a CSS length string (e.g., "300px").
174
+ mode (TMaybeRef[Literal[&quot;auto, optional):
175
+ Auto-sizing behavior strategy:
176
+ - "auto-fill": Preserves container space by creating additional rows
177
+ - "auto-fit": Adjusts rows to fit available space.
178
+ Defaults to "auto-fit".
179
+
180
+ Example:
181
+ .. code-block:: python
182
+
183
+ with ui.grid(rows=ui.grid.auto_rows(min_height="300px")):
184
+ ...
185
+ """
136
186
 
137
- else:
138
- template = f"repeat({mode}, minmax(min({min_width},100%), 1fr))"
187
+ template = JsComputed(
188
+ inputs=[min_height, mode],
189
+ code=r"(min_height, mode)=> `repeat(${mode}, minmax(min(${min_height},100%), 1fr))`",
190
+ )
139
191
 
140
- return cls(columns=template)
192
+ return template
141
193
 
142
194
  def row_gap(self, gap: TMaybeRef[str]) -> Grid:
143
195
  return self.style({"row-gap": gap})
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+ from typing import TYPE_CHECKING, Any, Union
3
+ from instaui.components.element import Element
4
+
5
+ if TYPE_CHECKING:
6
+ from instaui.vars.types import TMaybeRef
7
+
8
+
9
+ class Paragraph(Element):
10
+ """
11
+ A component class representing an HTML `<p>` (paragraph) element.
12
+
13
+ Args:
14
+ text (Union[str, TMaybeRef[Any]]):The text content of the paragraph.
15
+ - If a string is provided, the content is static.
16
+ - If a `TMaybeRef` object is provided, the content
17
+ will reactively update when the referenced value changes.
18
+ """
19
+
20
+ def __init__(
21
+ self,
22
+ text: Union[str, TMaybeRef[Any]],
23
+ ):
24
+ super().__init__("p")
25
+ self.props(
26
+ {
27
+ "innerText": text,
28
+ }
29
+ )
@@ -0,0 +1,5 @@
1
+ from instaui.components.html.span import Span
2
+
3
+
4
+ label = Span
5
+ """ A label element. Equivalent to `html.span`. """
@@ -55,4 +55,28 @@ def js_event(
55
55
  outputs: typing.Optional[typing.Sequence] = None,
56
56
  code: str,
57
57
  ):
58
+ """
59
+ Creates a client-side event handler decorator for binding JavaScript logic to UI component events.
60
+
61
+ Args:
62
+ inputs (typing.Optional[typing.Sequence], optional):Reactive sources (state variables, computed values)
63
+ that should be passed to the event handler. These values
64
+ will be available in the JavaScript context through the `args` array.
65
+ outputs (typing.Optional[typing.Sequence], optional): Targets (state variables, UI elements) that should
66
+ update when this handler executes. Used for coordinating
67
+ interface updates after the event is processed.
68
+ code (str): JavaScript code to execute when the event is triggered.
69
+
70
+ # Example:
71
+ .. code-block:: python
72
+ from instaui import ui, html
73
+
74
+ a = ui.state(0)
75
+
76
+ plus_one = ui.js_event(inputs=[a], outputs=[a], code="a =>a + 1")
77
+
78
+ html.button("click me").on_click(plus_one)
79
+ html.paragraph(a)
80
+
81
+ """
58
82
  return JsEvent(inputs=inputs, outputs=outputs, code=code)
@@ -0,0 +1,66 @@
1
+ import typing
2
+ from instaui.common.jsonable import Jsonable
3
+ from instaui.vars.mixin_types.observable import ObservableMixin
4
+ from .event_mixin import EventMixin
5
+
6
+
7
+ class VueEvent(Jsonable, EventMixin):
8
+ """
9
+ Create an event object that can be bound to a UI component's event listener.
10
+
11
+ This function generates a callable event handler with optional contextual bindings.
12
+ The event logic is defined via a code string, which can reference bound variables.
13
+
14
+ Args:
15
+ code (str): A string containing the executable logic for the event handler.
16
+ Typically contains a function body or expression that utilizes bound variables.
17
+ bindings (typing.Optional[typing.Dict[str, typing.Any]], optional): A dictionary mapping variable names to values that should be available in the
18
+ event handler's context. If None, no additional bindings are created.. Defaults to None.
19
+
20
+ Example:
21
+ .. code-block:: python
22
+ a = ui.state(1)
23
+
24
+ event = ui.vue_event(bindings={"a": a}, code=r'''()=> { a.value +=1}''')
25
+
26
+ html.span(a)
27
+ html.button("plus").on("click", event)
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ *,
33
+ code: str,
34
+ bindings: typing.Optional[typing.Dict[str, typing.Any]] = None,
35
+ ):
36
+ self.code = code
37
+ self._bindings = bindings
38
+
39
+ if bindings:
40
+ bindData = [
41
+ int(not isinstance(v, ObservableMixin)) for v in bindings.values()
42
+ ]
43
+
44
+ if sum(bindData) > 0:
45
+ self.bindData = bindData
46
+
47
+ self.bind = {
48
+ k: typing.cast(ObservableMixin, v)._to_observable_config()
49
+ if isinstance(v, ObservableMixin)
50
+ else v
51
+ for k, v in bindings.items()
52
+ }
53
+
54
+ def copy_with_extends(self, extends: typing.Dict):
55
+ raise NotImplementedError("VueEvent does not support extends")
56
+
57
+ def event_type(self):
58
+ return "vue"
59
+
60
+ def _to_json_dict(self):
61
+ data = super()._to_json_dict()
62
+ data["type"] = self.event_type()
63
+ return data
64
+
65
+
66
+ vue_event = VueEvent