castella 0.11.0__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 (536) hide show
  1. castella-0.11.0/.castella_commands +0 -0
  2. castella-0.11.0/.github/workflows/castella-skia-release.yml +187 -0
  3. castella-0.11.0/.github/workflows/ci.yml +16 -0
  4. castella-0.11.0/.github/workflows/ios-deps.yml +126 -0
  5. castella-0.11.0/.github/workflows/release.yml +39 -0
  6. castella-0.11.0/.gitignore +172 -0
  7. castella-0.11.0/.python-version +1 -0
  8. castella-0.11.0/CHANGELOG.md +59 -0
  9. castella-0.11.0/Cargo.lock +872 -0
  10. castella-0.11.0/Cargo.toml +16 -0
  11. castella-0.11.0/Justfile +73 -0
  12. castella-0.11.0/LICENSE +19 -0
  13. castella-0.11.0/PKG-INFO +468 -0
  14. castella-0.11.0/README.md +400 -0
  15. castella-0.11.0/bindings/python/.cargo/config.toml +8 -0
  16. castella-0.11.0/bindings/python/Cargo.toml +16 -0
  17. castella-0.11.0/bindings/python/README.md +40 -0
  18. castella-0.11.0/bindings/python/build_ios.sh +25 -0
  19. castella-0.11.0/bindings/python/pyproject.toml +38 -0
  20. castella-0.11.0/bindings/python/python/castella_skia/__init__.py +47 -0
  21. castella-0.11.0/bindings/python/python/castella_skia/__init__.pyi +134 -0
  22. castella-0.11.0/bindings/python/src/lib.rs +662 -0
  23. castella-0.11.0/bindings/python/uv.lock +8 -0
  24. castella-0.11.0/castella/__init__.py +91 -0
  25. castella-0.11.0/castella/a2a/__init__.py +46 -0
  26. castella-0.11.0/castella/a2a/client.py +259 -0
  27. castella-0.11.0/castella/a2a/types.py +150 -0
  28. castella-0.11.0/castella/a2ui/__init__.py +208 -0
  29. castella-0.11.0/castella/a2ui/_factories.py +760 -0
  30. castella-0.11.0/castella/a2ui/catalog.py +177 -0
  31. castella-0.11.0/castella/a2ui/client.py +481 -0
  32. castella-0.11.0/castella/a2ui/compat.py +458 -0
  33. castella-0.11.0/castella/a2ui/renderer.py +939 -0
  34. castella-0.11.0/castella/a2ui/stream.py +158 -0
  35. castella-0.11.0/castella/a2ui/transports.py +308 -0
  36. castella-0.11.0/castella/a2ui/types.py +478 -0
  37. castella-0.11.0/castella/agent/__init__.py +67 -0
  38. castella-0.11.0/castella/agent/agent_chat.py +311 -0
  39. castella-0.11.0/castella/agent/card_view.py +198 -0
  40. castella-0.11.0/castella/agent/chat.py +408 -0
  41. castella-0.11.0/castella/agent/hub.py +420 -0
  42. castella-0.11.0/castella/agent/multi.py +314 -0
  43. castella-0.11.0/castella/agent/tool_view.py +195 -0
  44. castella-0.11.0/castella/animation/__init__.py +76 -0
  45. castella-0.11.0/castella/animation/animated_state.py +189 -0
  46. castella-0.11.0/castella/animation/animation.py +57 -0
  47. castella-0.11.0/castella/animation/easing.py +107 -0
  48. castella-0.11.0/castella/animation/interpolators.py +70 -0
  49. castella-0.11.0/castella/animation/scheduler.py +160 -0
  50. castella-0.11.0/castella/animation/tween.py +202 -0
  51. castella-0.11.0/castella/async_net_image.py +44 -0
  52. castella-0.11.0/castella/box.py +450 -0
  53. castella-0.11.0/castella/build_owner.py +161 -0
  54. castella-0.11.0/castella/button.py +270 -0
  55. castella-0.11.0/castella/calendar/__init__.py +59 -0
  56. castella-0.11.0/castella/calendar/day_cell.py +188 -0
  57. castella-0.11.0/castella/calendar/grid.py +152 -0
  58. castella-0.11.0/castella/calendar/header.py +99 -0
  59. castella-0.11.0/castella/calendar/locale.py +121 -0
  60. castella-0.11.0/castella/calendar/month_picker.py +93 -0
  61. castella-0.11.0/castella/calendar/state.py +428 -0
  62. castella-0.11.0/castella/calendar/time_picker.py +246 -0
  63. castella-0.11.0/castella/calendar/utils.py +223 -0
  64. castella-0.11.0/castella/calendar/year_picker.py +133 -0
  65. castella-0.11.0/castella/canvaskit_painter.py +287 -0
  66. castella-0.11.0/castella/chart/__init__.py +184 -0
  67. castella-0.11.0/castella/chart/area_chart.py +556 -0
  68. castella-0.11.0/castella/chart/ascii.py +531 -0
  69. castella-0.11.0/castella/chart/bar_chart.py +409 -0
  70. castella-0.11.0/castella/chart/base.py +652 -0
  71. castella-0.11.0/castella/chart/colormap.py +317 -0
  72. castella-0.11.0/castella/chart/events.py +111 -0
  73. castella-0.11.0/castella/chart/gauge_chart.py +399 -0
  74. castella-0.11.0/castella/chart/heatmap_chart.py +433 -0
  75. castella-0.11.0/castella/chart/hit_testing.py +287 -0
  76. castella-0.11.0/castella/chart/line_chart.py +527 -0
  77. castella-0.11.0/castella/chart/models/__init__.py +65 -0
  78. castella-0.11.0/castella/chart/models/animation.py +52 -0
  79. castella-0.11.0/castella/chart/models/axis.py +115 -0
  80. castella-0.11.0/castella/chart/models/chart_data.py +469 -0
  81. castella-0.11.0/castella/chart/models/data_points.py +69 -0
  82. castella-0.11.0/castella/chart/models/heatmap_data.py +269 -0
  83. castella-0.11.0/castella/chart/models/legend.py +55 -0
  84. castella-0.11.0/castella/chart/models/series.py +181 -0
  85. castella-0.11.0/castella/chart/pie_chart.py +358 -0
  86. castella-0.11.0/castella/chart/scales/__init__.py +11 -0
  87. castella-0.11.0/castella/chart/scales/band.py +154 -0
  88. castella-0.11.0/castella/chart/scales/linear.py +196 -0
  89. castella-0.11.0/castella/chart/scales/polar.py +267 -0
  90. castella-0.11.0/castella/chart/scatter_chart.py +444 -0
  91. castella-0.11.0/castella/chart/stacked_bar_chart.py +536 -0
  92. castella-0.11.0/castella/chart/theme.py +158 -0
  93. castella-0.11.0/castella/chart/transform.py +345 -0
  94. castella-0.11.0/castella/checkbox.py +208 -0
  95. castella-0.11.0/castella/color.py +64 -0
  96. castella-0.11.0/castella/column.py +148 -0
  97. castella-0.11.0/castella/core.py +1963 -0
  98. castella-0.11.0/castella/datetime_input.py +540 -0
  99. castella-0.11.0/castella/events/__init__.py +75 -0
  100. castella-0.11.0/castella/events/focus.py +314 -0
  101. castella-0.11.0/castella/events/gesture.py +214 -0
  102. castella-0.11.0/castella/events/keyboard.py +95 -0
  103. castella-0.11.0/castella/events/manager.py +291 -0
  104. castella-0.11.0/castella/events/pointer.py +187 -0
  105. castella-0.11.0/castella/events/shortcuts.py +125 -0
  106. castella-0.11.0/castella/file_tree.py +406 -0
  107. castella-0.11.0/castella/font.py +52 -0
  108. castella-0.11.0/castella/font_fallback.py +157 -0
  109. castella-0.11.0/castella/frame/__init__.py +79 -0
  110. castella-0.11.0/castella/frame/base.py +276 -0
  111. castella-0.11.0/castella/frame/macos_ime.py +485 -0
  112. castella-0.11.0/castella/glfw_frame.py +284 -0
  113. castella-0.11.0/castella/graph/__init__.py +111 -0
  114. castella-0.11.0/castella/graph/canvas.py +842 -0
  115. castella-0.11.0/castella/graph/hit_testing.py +139 -0
  116. castella-0.11.0/castella/graph/layout.py +455 -0
  117. castella-0.11.0/castella/graph/models.py +191 -0
  118. castella-0.11.0/castella/graph/theme.py +152 -0
  119. castella-0.11.0/castella/graph/transform.py +135 -0
  120. castella-0.11.0/castella/i18n/__init__.py +109 -0
  121. castella-0.11.0/castella/i18n/catalog.py +156 -0
  122. castella-0.11.0/castella/i18n/loader.py +153 -0
  123. castella-0.11.0/castella/i18n/locale_string.py +149 -0
  124. castella-0.11.0/castella/i18n/manager.py +234 -0
  125. castella-0.11.0/castella/i18n/plural.py +147 -0
  126. castella-0.11.0/castella/image.py +43 -0
  127. castella-0.11.0/castella/input.py +698 -0
  128. castella-0.11.0/castella/ios_frame.py +898 -0
  129. castella-0.11.0/castella/layout/__init__.py +5 -0
  130. castella-0.11.0/castella/layout/linear.py +430 -0
  131. castella-0.11.0/castella/markdown/__init__.py +321 -0
  132. castella-0.11.0/castella/markdown/code_highlighter.py +91 -0
  133. castella-0.11.0/castella/markdown/code_text_renderer.py +132 -0
  134. castella-0.11.0/castella/markdown/emoji_map.py +364 -0
  135. castella-0.11.0/castella/markdown/math_renderer.py +169 -0
  136. castella-0.11.0/castella/markdown/mermaid/__init__.py +51 -0
  137. castella-0.11.0/castella/markdown/mermaid/layout.py +498 -0
  138. castella-0.11.0/castella/markdown/mermaid/models.py +170 -0
  139. castella-0.11.0/castella/markdown/mermaid/parser.py +603 -0
  140. castella-0.11.0/castella/markdown/mermaid/renderer.py +434 -0
  141. castella-0.11.0/castella/markdown/mermaid/shapes.py +855 -0
  142. castella-0.11.0/castella/markdown/models.py +337 -0
  143. castella-0.11.0/castella/markdown/parser.py +591 -0
  144. castella-0.11.0/castella/markdown/renderer.py +1296 -0
  145. castella-0.11.0/castella/markdown/theme.py +175 -0
  146. castella-0.11.0/castella/mcp/__init__.py +88 -0
  147. castella-0.11.0/castella/mcp/introspection.py +323 -0
  148. castella-0.11.0/castella/mcp/registry.py +268 -0
  149. castella-0.11.0/castella/mcp/resources.py +185 -0
  150. castella-0.11.0/castella/mcp/server.py +262 -0
  151. castella-0.11.0/castella/mcp/sse.py +357 -0
  152. castella-0.11.0/castella/mcp/tools.py +617 -0
  153. castella-0.11.0/castella/mcp/types.py +63 -0
  154. castella-0.11.0/castella/mcp/watcher.py +399 -0
  155. castella-0.11.0/castella/modal.py +400 -0
  156. castella-0.11.0/castella/models/__init__.py +70 -0
  157. castella-0.11.0/castella/models/events.py +161 -0
  158. castella-0.11.0/castella/models/font.py +82 -0
  159. castella-0.11.0/castella/models/geometry.py +184 -0
  160. castella-0.11.0/castella/models/style.py +118 -0
  161. castella-0.11.0/castella/multiline_input.py +1106 -0
  162. castella-0.11.0/castella/multiline_text.py +363 -0
  163. castella-0.11.0/castella/net_image.py +118 -0
  164. castella-0.11.0/castella/numpy_image.py +91 -0
  165. castella-0.11.0/castella/progressbar.py +314 -0
  166. castella-0.11.0/castella/protocols/__init__.py +25 -0
  167. castella-0.11.0/castella/protocols/painter.py +170 -0
  168. castella-0.11.0/castella/pt_frame.py +264 -0
  169. castella-0.11.0/castella/pt_painter.py +347 -0
  170. castella-0.11.0/castella/radio_buttons.py +59 -0
  171. castella-0.11.0/castella/render/__init__.py +38 -0
  172. castella-0.11.0/castella/render/layout_node.py +240 -0
  173. castella-0.11.0/castella/render/node.py +201 -0
  174. castella-0.11.0/castella/row.py +153 -0
  175. castella-0.11.0/castella/rust_skia_painter.py +294 -0
  176. castella-0.11.0/castella/sdl_frame.py +274 -0
  177. castella-0.11.0/castella/slider.py +293 -0
  178. castella-0.11.0/castella/spacer.py +34 -0
  179. castella-0.11.0/castella/state/__init__.py +29 -0
  180. castella-0.11.0/castella/state/collections.py +147 -0
  181. castella-0.11.0/castella/state/observers.py +88 -0
  182. castella-0.11.0/castella/state/reactive.py +164 -0
  183. castella-0.11.0/castella/studio/__init__.py +26 -0
  184. castella-0.11.0/castella/studio/components/__init__.py +8 -0
  185. castella-0.11.0/castella/studio/components/content_viewer_modal.py +218 -0
  186. castella-0.11.0/castella/studio/components/file_panel.py +97 -0
  187. castella-0.11.0/castella/studio/components/status_bar.py +119 -0
  188. castella-0.11.0/castella/studio/components/toolbar.py +206 -0
  189. castella-0.11.0/castella/studio/executor/__init__.py +5 -0
  190. castella-0.11.0/castella/studio/executor/base.py +355 -0
  191. castella-0.11.0/castella/studio/loader/__init__.py +10 -0
  192. castella-0.11.0/castella/studio/loader/module_loader.py +100 -0
  193. castella-0.11.0/castella/studio/models/__init__.py +15 -0
  194. castella-0.11.0/castella/studio/models/execution.py +122 -0
  195. castella-0.11.0/castella/studio/widgets/__init__.py +5 -0
  196. castella-0.11.0/castella/studio/widgets/canvas.py +343 -0
  197. castella-0.11.0/castella/switch.py +141 -0
  198. castella-0.11.0/castella/table.py +1637 -0
  199. castella-0.11.0/castella/tabs.py +282 -0
  200. castella-0.11.0/castella/text.py +272 -0
  201. castella-0.11.0/castella/theme/__init__.py +130 -0
  202. castella-0.11.0/castella/theme/core.py +642 -0
  203. castella-0.11.0/castella/theme/manager.py +176 -0
  204. castella-0.11.0/castella/theme/presets.py +392 -0
  205. castella-0.11.0/castella/theme/tokens.py +88 -0
  206. castella-0.11.0/castella/tree.py +684 -0
  207. castella-0.11.0/castella/utils/__init__.py +9 -0
  208. castella-0.11.0/castella/utils/color.py +163 -0
  209. castella-0.11.0/castella/utils/keymap.py +141 -0
  210. castella-0.11.0/castella/web_frame.py +271 -0
  211. castella-0.11.0/castella-skia-core/Cargo.toml +39 -0
  212. castella-0.11.0/castella-skia-core/src/error.rs +58 -0
  213. castella-0.11.0/castella-skia-core/src/font.rs +298 -0
  214. castella-0.11.0/castella-skia-core/src/image.rs +79 -0
  215. castella-0.11.0/castella-skia-core/src/lib.rs +52 -0
  216. castella-0.11.0/castella-skia-core/src/painter.rs +404 -0
  217. castella-0.11.0/castella-skia-core/src/surface.rs +405 -0
  218. castella-0.11.0/castella-skia-core/src/types.rs +220 -0
  219. castella-0.11.0/docs/agent.md +608 -0
  220. castella-0.11.0/docs/animation.md +184 -0
  221. castella-0.11.0/docs/castella-skia.md +215 -0
  222. castella-0.11.0/docs/chart.md +626 -0
  223. castella-0.11.0/docs/custom-widgets.md +94 -0
  224. castella-0.11.0/docs/environment.md +133 -0
  225. castella-0.11.0/docs/examples/Roboto-Regular.ttf +1447 -0
  226. castella-0.11.0/docs/examples/box.html +31 -0
  227. castella-0.11.0/docs/examples/box.py +10 -0
  228. castella-0.11.0/docs/examples/button.html +31 -0
  229. castella-0.11.0/docs/examples/button.py +14 -0
  230. castella-0.11.0/docs/examples/calc.html +31 -0
  231. castella-0.11.0/docs/examples/calc.py +105 -0
  232. castella-0.11.0/docs/examples/camp_tent.png +0 -0
  233. castella-0.11.0/docs/examples/camp_tent_sankaku.png +0 -0
  234. castella-0.11.0/docs/examples/castella-0.4.0-py3-none-any.whl +0 -0
  235. castella-0.11.0/docs/examples/column.html +31 -0
  236. castella-0.11.0/docs/examples/column.py +11 -0
  237. castella-0.11.0/docs/examples/counter.html +31 -0
  238. castella-0.11.0/docs/examples/counter.py +27 -0
  239. castella-0.11.0/docs/examples/hello_world.html +31 -0
  240. castella-0.11.0/docs/examples/hello_world.py +4 -0
  241. castella-0.11.0/docs/examples/hello_world_2.html +31 -0
  242. castella-0.11.0/docs/examples/hello_world_2.py +4 -0
  243. castella-0.11.0/docs/examples/hello_world_2_left.html +31 -0
  244. castella-0.11.0/docs/examples/hello_world_2_left.py +7 -0
  245. castella-0.11.0/docs/examples/hello_world_3.html +31 -0
  246. castella-0.11.0/docs/examples/hello_world_3.py +4 -0
  247. castella-0.11.0/docs/examples/misc.html +31 -0
  248. castella-0.11.0/docs/examples/misc.py +81 -0
  249. castella-0.11.0/docs/examples/model.html +31 -0
  250. castella-0.11.0/docs/examples/model.py +20 -0
  251. castella-0.11.0/docs/examples/num_list.html +31 -0
  252. castella-0.11.0/docs/examples/num_list.py +20 -0
  253. castella-0.11.0/docs/examples/pyscript.toml +1 -0
  254. castella-0.11.0/docs/examples/pyscript_with_numpy.toml +1 -0
  255. castella-0.11.0/docs/examples/row.html +31 -0
  256. castella-0.11.0/docs/examples/row.py +11 -0
  257. castella-0.11.0/docs/examples/row_with_fixed_and_flex.html +31 -0
  258. castella-0.11.0/docs/examples/row_with_fixed_and_flex.py +11 -0
  259. castella-0.11.0/docs/examples/row_with_flex.html +31 -0
  260. castella-0.11.0/docs/examples/row_with_flex.py +11 -0
  261. castella-0.11.0/docs/examples/switch.html +31 -0
  262. castella-0.11.0/docs/examples/switch.py +7 -0
  263. castella-0.11.0/docs/examples/text.html +31 -0
  264. castella-0.11.0/docs/examples/text.py +15 -0
  265. castella-0.11.0/docs/getting-started.md +316 -0
  266. castella-0.11.0/docs/hello-world.md +91 -0
  267. castella-0.11.0/docs/hot-reloading.md +64 -0
  268. castella-0.11.0/docs/hot-restarting.md +103 -0
  269. castella-0.11.0/docs/i18n.md +318 -0
  270. castella-0.11.0/docs/images/hello_world.png +0 -0
  271. castella-0.11.0/docs/images/hello_world_fixed_font_size.png +0 -0
  272. castella-0.11.0/docs/images/hello_world_fixed_font_size_align_left.png +0 -0
  273. castella-0.11.0/docs/images/hello_world_fixed_size.png +0 -0
  274. castella-0.11.0/docs/images/sweets_kasutera.png +0 -0
  275. castella-0.11.0/docs/images/sweets_taiwan_kasutera_cream.png +0 -0
  276. castella-0.11.0/docs/index.md +39 -0
  277. castella-0.11.0/docs/ios.md +246 -0
  278. castella-0.11.0/docs/layout.md +154 -0
  279. castella-0.11.0/docs/license.md +23 -0
  280. castella-0.11.0/docs/mcp.md +335 -0
  281. castella-0.11.0/docs/packaging.md +250 -0
  282. castella-0.11.0/docs/sizing.md +199 -0
  283. castella-0.11.0/docs/skills.md +140 -0
  284. castella-0.11.0/docs/state.md +372 -0
  285. castella-0.11.0/docs/studio.md +141 -0
  286. castella-0.11.0/docs/style.md +388 -0
  287. castella-0.11.0/docs/videos/counter.mp4 +0 -0
  288. castella-0.11.0/docs/videos/demo.mp4 +0 -0
  289. castella-0.11.0/docs/widgets.md +934 -0
  290. castella-0.11.0/docs/z-index.md +199 -0
  291. castella-0.11.0/examples/a2a_demo.py +210 -0
  292. castella-0.11.0/examples/a2ui_demo.py +422 -0
  293. castella-0.11.0/examples/a2ui_google_agent_demo.py +109 -0
  294. castella-0.11.0/examples/a2ui_mock_server.py +379 -0
  295. castella-0.11.0/examples/a2ui_mock_test.py +841 -0
  296. castella-0.11.0/examples/a2ui_sse_client_demo.py +202 -0
  297. castella-0.11.0/examples/a2ui_standalone_demo.py +196 -0
  298. castella-0.11.0/examples/a2ui_streaming_demo.py +169 -0
  299. castella-0.11.0/examples/agent_chat_a2a_demo.py +107 -0
  300. castella-0.11.0/examples/agent_chat_demo.py +127 -0
  301. castella-0.11.0/examples/all_widgets_demo.py +1343 -0
  302. castella-0.11.0/examples/all_widgets_demo_tabs.py +1341 -0
  303. castella-0.11.0/examples/alpha_demo.py +73 -0
  304. castella-0.11.0/examples/animation_demo.py +132 -0
  305. castella-0.11.0/examples/animation_simple_test.py +72 -0
  306. castella-0.11.0/examples/ascii_chart_demo.py +74 -0
  307. castella-0.11.0/examples/calc.py +121 -0
  308. castella-0.11.0/examples/calendar_demo.py +45 -0
  309. castella-0.11.0/examples/camp_tent.png +0 -0
  310. castella-0.11.0/examples/camp_tent_sankaku.png +0 -0
  311. castella-0.11.0/examples/chart_demo.py +223 -0
  312. castella-0.11.0/examples/chart_demo_extended.py +204 -0
  313. castella-0.11.0/examples/charts.py +95 -0
  314. castella-0.11.0/examples/checkboxes.py +22 -0
  315. castella-0.11.0/examples/checkboxes_ja.py +24 -0
  316. castella-0.11.0/examples/clock.py +26 -0
  317. castella-0.11.0/examples/copy_and_paste.py +36 -0
  318. castella-0.11.0/examples/counter.html +32 -0
  319. castella-0.11.0/examples/counter.py +26 -0
  320. castella-0.11.0/examples/counter_with_custom_state.py +38 -0
  321. castella-0.11.0/examples/counter_with_lock.py +49 -0
  322. castella-0.11.0/examples/counter_yet_another_version.py +20 -0
  323. castella-0.11.0/examples/cupertino_theme_demo.py +173 -0
  324. castella-0.11.0/examples/dummy_a2a_server.py +150 -0
  325. castella-0.11.0/examples/edda_workflow_manager/__init__.py +15 -0
  326. castella-0.11.0/examples/edda_workflow_manager/app.py +652 -0
  327. castella-0.11.0/examples/edda_workflow_manager/components/__init__.py +7 -0
  328. castella-0.11.0/examples/edda_workflow_manager/components/navigation.py +85 -0
  329. castella-0.11.0/examples/edda_workflow_manager/create_test_data.py +158 -0
  330. castella-0.11.0/examples/edda_workflow_manager/data/__init__.py +11 -0
  331. castella-0.11.0/examples/edda_workflow_manager/data/graph_builder.py +460 -0
  332. castella-0.11.0/examples/edda_workflow_manager/data/polling.py +289 -0
  333. castella-0.11.0/examples/edda_workflow_manager/data/service.py +631 -0
  334. castella-0.11.0/examples/edda_workflow_manager/data/workflow_analyzer.py +219 -0
  335. castella-0.11.0/examples/edda_workflow_manager/main.py +146 -0
  336. castella-0.11.0/examples/edda_workflow_manager/models/__init__.py +21 -0
  337. castella-0.11.0/examples/edda_workflow_manager/models/execution.py +205 -0
  338. castella-0.11.0/examples/edda_workflow_manager/models/instance.py +298 -0
  339. castella-0.11.0/examples/edda_workflow_manager/runtime.py +64 -0
  340. castella-0.11.0/examples/edda_workflow_manager/views/__init__.py +15 -0
  341. castella-0.11.0/examples/edda_workflow_manager/views/dashboard.py +203 -0
  342. castella-0.11.0/examples/edda_workflow_manager/views/definitions.py +308 -0
  343. castella-0.11.0/examples/edda_workflow_manager/views/execution_detail.py +412 -0
  344. castella-0.11.0/examples/edda_workflow_manager/views/execution_list.py +198 -0
  345. castella-0.11.0/examples/edda_workflow_manager/views/live_viewer.py +341 -0
  346. castella-0.11.0/examples/edda_workflow_manager/widgets/__init__.py +9 -0
  347. castella-0.11.0/examples/edda_workflow_manager/widgets/filter_bar.py +118 -0
  348. castella-0.11.0/examples/edda_workflow_manager/widgets/start_execution_modal.py +185 -0
  349. castella-0.11.0/examples/edda_workflow_manager/widgets/stats_card.py +69 -0
  350. castella-0.11.0/examples/enhanced_table_demo.py +141 -0
  351. castella-0.11.0/examples/file_tree_example.py +88 -0
  352. castella-0.11.0/examples/generator.py +49 -0
  353. castella-0.11.0/examples/heatmap_chart_demo.py +90 -0
  354. castella-0.11.0/examples/heatmap_table_demo.py +103 -0
  355. castella-0.11.0/examples/hello_world.py +4 -0
  356. castella-0.11.0/examples/ime_test.py +31 -0
  357. castella-0.11.0/examples/ios_all_widgets_demo/LICENSE +21 -0
  358. castella-0.11.0/examples/ios_all_widgets_demo/build_ios.sh +11 -0
  359. castella-0.11.0/examples/ios_all_widgets_demo/pyproject.toml +32 -0
  360. castella-0.11.0/examples/ios_all_widgets_demo/src/castella_all_widgets_demo/__init__.py +750 -0
  361. castella-0.11.0/examples/ios_all_widgets_demo/src/castella_all_widgets_demo/__main__.py +5 -0
  362. castella-0.11.0/examples/ios_charts_demo/LICENSE +21 -0
  363. castella-0.11.0/examples/ios_charts_demo/build_ios.sh +11 -0
  364. castella-0.11.0/examples/ios_charts_demo/pyproject.toml +32 -0
  365. castella-0.11.0/examples/ios_charts_demo/src/castella_charts_demo/__init__.py +312 -0
  366. castella-0.11.0/examples/ios_charts_demo/src/castella_charts_demo/__main__.py +5 -0
  367. castella-0.11.0/examples/ios_test_app/.gitignore +13 -0
  368. castella-0.11.0/examples/ios_test_app/LICENSE +21 -0
  369. castella-0.11.0/examples/ios_test_app/build_ios.sh +11 -0
  370. castella-0.11.0/examples/ios_test_app/pyproject.toml +33 -0
  371. castella-0.11.0/examples/ios_test_app/src/castella_ios_test/__init__.py +257 -0
  372. castella-0.11.0/examples/ios_test_app/src/castella_ios_test/__main__.py +6 -0
  373. castella-0.11.0/examples/ios_test_app/src/castella_ios_test/app.py +92 -0
  374. castella-0.11.0/examples/ios_test_app/src/castella_ios_test/sitecustomize.py +21 -0
  375. castella-0.11.0/examples/langgraph_studio/__init__.py +5 -0
  376. castella-0.11.0/examples/langgraph_studio/components/__init__.py +15 -0
  377. castella-0.11.0/examples/langgraph_studio/components/file_panel.py +94 -0
  378. castella-0.11.0/examples/langgraph_studio/components/initial_state_editor.py +153 -0
  379. castella-0.11.0/examples/langgraph_studio/components/right_panel.py +439 -0
  380. castella-0.11.0/examples/langgraph_studio/components/state_inspector.py +74 -0
  381. castella-0.11.0/examples/langgraph_studio/components/status_bar.py +110 -0
  382. castella-0.11.0/examples/langgraph_studio/components/studio.py +321 -0
  383. castella-0.11.0/examples/langgraph_studio/components/toolbar.py +198 -0
  384. castella-0.11.0/examples/langgraph_studio/executor/__init__.py +5 -0
  385. castella-0.11.0/examples/langgraph_studio/executor/runner.py +234 -0
  386. castella-0.11.0/examples/langgraph_studio/loader/__init__.py +20 -0
  387. castella-0.11.0/examples/langgraph_studio/loader/graph_extractor.py +360 -0
  388. castella-0.11.0/examples/langgraph_studio/loader/module_loader.py +82 -0
  389. castella-0.11.0/examples/langgraph_studio/main.py +55 -0
  390. castella-0.11.0/examples/langgraph_studio/models/__init__.py +15 -0
  391. castella-0.11.0/examples/langgraph_studio/models/canvas.py +122 -0
  392. castella-0.11.0/examples/langgraph_studio/models/execution.py +60 -0
  393. castella-0.11.0/examples/langgraph_studio/models/graph.py +20 -0
  394. castella-0.11.0/examples/langgraph_studio/samples/__init__.py +1 -0
  395. castella-0.11.0/examples/langgraph_studio/samples/rag_agent.py +263 -0
  396. castella-0.11.0/examples/langgraph_studio/samples/simple_agent.py +139 -0
  397. castella-0.11.0/examples/langgraph_studio/widgets/__init__.py +11 -0
  398. castella-0.11.0/examples/langgraph_studio/widgets/graph_canvas.py +49 -0
  399. castella-0.11.0/examples/langgraph_studio/widgets/hit_testing.py +125 -0
  400. castella-0.11.0/examples/layer.py +54 -0
  401. castella-0.11.0/examples/layout_examples.py +11 -0
  402. castella-0.11.0/examples/layout_examples_with_flex.py +11 -0
  403. castella-0.11.0/examples/layout_examples_with_scrollbar.py +21 -0
  404. castella-0.11.0/examples/lifecycle_demo.py +177 -0
  405. castella-0.11.0/examples/llamaindex_studio/__init__.py +21 -0
  406. castella-0.11.0/examples/llamaindex_studio/components/__init__.py +16 -0
  407. castella-0.11.0/examples/llamaindex_studio/components/context_inspector.py +257 -0
  408. castella-0.11.0/examples/llamaindex_studio/components/event_panel.py +214 -0
  409. castella-0.11.0/examples/llamaindex_studio/components/step_panel.py +370 -0
  410. castella-0.11.0/examples/llamaindex_studio/components/studio.py +687 -0
  411. castella-0.11.0/examples/llamaindex_studio/executor/__init__.py +5 -0
  412. castella-0.11.0/examples/llamaindex_studio/executor/runner.py +703 -0
  413. castella-0.11.0/examples/llamaindex_studio/loader/__init__.py +16 -0
  414. castella-0.11.0/examples/llamaindex_studio/loader/workflow_extractor.py +459 -0
  415. castella-0.11.0/examples/llamaindex_studio/main.py +44 -0
  416. castella-0.11.0/examples/llamaindex_studio/models/__init__.py +24 -0
  417. castella-0.11.0/examples/llamaindex_studio/models/events.py +69 -0
  418. castella-0.11.0/examples/llamaindex_studio/models/execution.py +120 -0
  419. castella-0.11.0/examples/llamaindex_studio/models/steps.py +96 -0
  420. castella-0.11.0/examples/llamaindex_studio/models/workflow.py +94 -0
  421. castella-0.11.0/examples/llamaindex_studio/samples/__init__.py +1 -0
  422. castella-0.11.0/examples/llamaindex_studio/samples/branching_workflow.py +75 -0
  423. castella-0.11.0/examples/llamaindex_studio/samples/complex_workflow.py +197 -0
  424. castella-0.11.0/examples/llamaindex_studio/samples/mock_workflow.py +314 -0
  425. castella-0.11.0/examples/llamaindex_studio/samples/simple_workflow.py +51 -0
  426. castella-0.11.0/examples/llamaindex_studio/widgets/__init__.py +6 -0
  427. castella-0.11.0/examples/llamaindex_studio/widgets/event_timeline.py +709 -0
  428. castella-0.11.0/examples/llamaindex_studio/widgets/workflow_canvas.py +802 -0
  429. castella-0.11.0/examples/markdown_chat.py +109 -0
  430. castella-0.11.0/examples/markdown_demo.py +101 -0
  431. castella-0.11.0/examples/markdown_editor.py +95 -0
  432. castella-0.11.0/examples/markdown_extended_demo.py +235 -0
  433. castella-0.11.0/examples/material_theme_demo.py +173 -0
  434. castella-0.11.0/examples/mcp_a2ui_client.py +161 -0
  435. castella-0.11.0/examples/mcp_a2ui_server.py +192 -0
  436. castella-0.11.0/examples/mcp_auto_demo.py +196 -0
  437. castella-0.11.0/examples/mcp_client_example.py +190 -0
  438. castella-0.11.0/examples/mcp_client_test.py +224 -0
  439. castella-0.11.0/examples/mcp_demo.py +177 -0
  440. castella-0.11.0/examples/mcp_interactive_demo.py +238 -0
  441. castella-0.11.0/examples/mcp_protocol_client.py +211 -0
  442. castella-0.11.0/examples/mcp_server_app.py +158 -0
  443. castella-0.11.0/examples/mcp_sse_client.py +176 -0
  444. castella-0.11.0/examples/mcp_sse_server.py +129 -0
  445. castella-0.11.0/examples/mcp_stdio_server.py +134 -0
  446. castella-0.11.0/examples/mcp_watcher_demo.py +109 -0
  447. castella-0.11.0/examples/misc.html +101 -0
  448. castella-0.11.0/examples/misc.py +67 -0
  449. castella-0.11.0/examples/misc2.py +80 -0
  450. castella-0.11.0/examples/misc2_yet_another.py +80 -0
  451. castella-0.11.0/examples/misc_yet_another.py +109 -0
  452. castella-0.11.0/examples/modal_demo.py +131 -0
  453. castella-0.11.0/examples/multiline_input_demo.py +35 -0
  454. castella-0.11.0/examples/new_widgets_demo.py +117 -0
  455. castella-0.11.0/examples/numpy_array.py +48 -0
  456. castella-0.11.0/examples/pydantic_graph_studio/__init__.py +5 -0
  457. castella-0.11.0/examples/pydantic_graph_studio/components/__init__.py +5 -0
  458. castella-0.11.0/examples/pydantic_graph_studio/components/right_panel.py +421 -0
  459. castella-0.11.0/examples/pydantic_graph_studio/components/studio.py +350 -0
  460. castella-0.11.0/examples/pydantic_graph_studio/executor/__init__.py +5 -0
  461. castella-0.11.0/examples/pydantic_graph_studio/executor/runner.py +426 -0
  462. castella-0.11.0/examples/pydantic_graph_studio/loader/__init__.py +15 -0
  463. castella-0.11.0/examples/pydantic_graph_studio/loader/graph_extractor.py +558 -0
  464. castella-0.11.0/examples/pydantic_graph_studio/main.py +104 -0
  465. castella-0.11.0/examples/pydantic_graph_studio/models/__init__.py +21 -0
  466. castella-0.11.0/examples/pydantic_graph_studio/models/execution.py +44 -0
  467. castella-0.11.0/examples/pydantic_graph_studio/models/graph.py +78 -0
  468. castella-0.11.0/examples/pydantic_graph_studio/samples/__init__.py +1 -0
  469. castella-0.11.0/examples/pydantic_graph_studio/samples/decision_graph.py +97 -0
  470. castella-0.11.0/examples/pydantic_graph_studio/samples/mock_graph.py +139 -0
  471. castella-0.11.0/examples/pydantic_graph_studio/samples/simple_graph.py +79 -0
  472. castella-0.11.0/examples/pydantic_graph_studio/widgets/__init__.py +5 -0
  473. castella-0.11.0/examples/pydantic_graph_studio/widgets/graph_canvas.py +63 -0
  474. castella-0.11.0/examples/pydantic_table_demo.py +74 -0
  475. castella-0.11.0/examples/radio_buttons.py +9 -0
  476. castella-0.11.0/examples/showcase.py +192 -0
  477. castella-0.11.0/examples/sizepolicy_examples.py +21 -0
  478. castella-0.11.0/examples/sizepolicy_examples_with_syntax_sugar.py +15 -0
  479. castella-0.11.0/examples/slider_demo.py +105 -0
  480. castella-0.11.0/examples/state_preservation_cache_demo.py +173 -0
  481. castella-0.11.0/examples/state_preservation_demo.py +172 -0
  482. castella-0.11.0/examples/tab_navigation_demo.py +102 -0
  483. castella-0.11.0/examples/table.py +78 -0
  484. castella-0.11.0/examples/tabs_demo.py +108 -0
  485. castella-0.11.0/examples/temp_conv.py +56 -0
  486. castella-0.11.0/examples/temp_conv_yet_another.py +57 -0
  487. castella-0.11.0/examples/test_agent_hub.py +33 -0
  488. castella-0.11.0/examples/test_multi_agent_chat.py +38 -0
  489. castella-0.11.0/examples/text_selection_demo.py +42 -0
  490. castella-0.11.0/examples/theme_demo.py +219 -0
  491. castella-0.11.0/examples/tokyo_night_theme_demo.py +174 -0
  492. castella-0.11.0/examples/tree_example.py +122 -0
  493. castella-0.11.0/examples/triple_counter.py +36 -0
  494. castella-0.11.0/examples/triple_counter_with_complex_layout.py +41 -0
  495. castella-0.11.0/examples/z_index.py +142 -0
  496. castella-0.11.0/ios-support/.gitignore +4 -0
  497. castella-0.11.0/ios-support/VERSIONS +10 -0
  498. castella-0.11.0/mkdocs.yml +101 -0
  499. castella-0.11.0/pyproject.toml +112 -0
  500. castella-0.11.0/skills/castella-a2a/SKILL.md +237 -0
  501. castella-0.11.0/skills/castella-a2a/references/streaming.md +168 -0
  502. castella-0.11.0/skills/castella-a2a/references/types.md +159 -0
  503. castella-0.11.0/skills/castella-a2a/scripts/a2a_async.py +80 -0
  504. castella-0.11.0/skills/castella-a2a/scripts/a2a_connect.py +49 -0
  505. castella-0.11.0/skills/castella-a2ui/SKILL.md +325 -0
  506. castella-0.11.0/skills/castella-a2ui/references/components.md +360 -0
  507. castella-0.11.0/skills/castella-a2ui/references/messages.md +212 -0
  508. castella-0.11.0/skills/castella-a2ui/references/streaming.md +206 -0
  509. castella-0.11.0/skills/castella-a2ui/scripts/a2ui_form.py +137 -0
  510. castella-0.11.0/skills/castella-a2ui/scripts/a2ui_list.py +127 -0
  511. castella-0.11.0/skills/castella-a2ui/scripts/basic_a2ui.py +61 -0
  512. castella-0.11.0/skills/castella-agent-ui/SKILL.md +351 -0
  513. castella-0.11.0/skills/castella-agent-ui/references/components.md +283 -0
  514. castella-0.11.0/skills/castella-agent-ui/references/data_classes.md +225 -0
  515. castella-0.11.0/skills/castella-agent-ui/scripts/agent_hub.py +45 -0
  516. castella-0.11.0/skills/castella-agent-ui/scripts/multi_agent.py +49 -0
  517. castella-0.11.0/skills/castella-agent-ui/scripts/simple_chat.py +29 -0
  518. castella-0.11.0/skills/castella-core/SKILL.md +366 -0
  519. castella-0.11.0/skills/castella-core/references/animation.md +196 -0
  520. castella-0.11.0/skills/castella-core/references/state.md +323 -0
  521. castella-0.11.0/skills/castella-core/references/theme.md +214 -0
  522. castella-0.11.0/skills/castella-core/references/widgets.md +389 -0
  523. castella-0.11.0/skills/castella-core/scripts/counter.py +40 -0
  524. castella-0.11.0/skills/castella-core/scripts/form.py +74 -0
  525. castella-0.11.0/skills/castella-core/scripts/scrollable_list.py +74 -0
  526. castella-0.11.0/skills/castella-mcp/SKILL.md +282 -0
  527. castella-0.11.0/skills/castella-mcp/references/resources.md +203 -0
  528. castella-0.11.0/skills/castella-mcp/references/tools.md +301 -0
  529. castella-0.11.0/skills/castella-mcp/references/types.md +212 -0
  530. castella-0.11.0/skills/castella-mcp/scripts/mcp_basic.py +83 -0
  531. castella-0.11.0/skills/castella-mcp/scripts/mcp_sse.py +87 -0
  532. castella-0.11.0/tools/build_ios.sh +203 -0
  533. castella-0.11.0/tools/build_pydantic_core_ios.sh +156 -0
  534. castella-0.11.0/tools/download_ios_deps.sh +68 -0
  535. castella-0.11.0/tools/hot_restarter.py +54 -0
  536. castella-0.11.0/uv.lock +4396 -0
File without changes
@@ -0,0 +1,187 @@
1
+ name: castella-skia Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "castella-skia-v*"
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ id-token: write # Required for PyPI Trusted Publishing (OIDC)
11
+ contents: write # Required for creating releases
12
+
13
+ jobs:
14
+ # Build wheels for Linux x86_64
15
+ linux-x86_64:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v6
19
+
20
+ - uses: actions/setup-python@v6
21
+ with:
22
+ python-version: "3.11"
23
+
24
+ - name: Build wheels
25
+ uses: PyO3/maturin-action@v1
26
+ with:
27
+ target: x86_64
28
+ args: --release --out dist -i 3.11 3.12 3.13 3.14
29
+ sccache: "true"
30
+ manylinux: auto
31
+ working-directory: bindings/python
32
+ before-script-linux: |
33
+ yum install -y freetype-devel fontconfig-devel
34
+
35
+ - name: Upload wheels
36
+ uses: actions/upload-artifact@v6
37
+ with:
38
+ name: wheels-linux-x86_64
39
+ path: bindings/python/dist/*.whl
40
+
41
+ # Build wheels for Linux aarch64 (using QEMU with native container)
42
+ linux-aarch64:
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - uses: actions/checkout@v6
46
+
47
+ - uses: actions/setup-python@v6
48
+ with:
49
+ python-version: "3.11"
50
+
51
+ - name: Set up QEMU
52
+ uses: docker/setup-qemu-action@v3
53
+ with:
54
+ platforms: arm64
55
+
56
+ - name: Build wheels
57
+ uses: PyO3/maturin-action@v1
58
+ with:
59
+ target: aarch64
60
+ args: --release --out dist -i 3.11 3.12 3.13 3.14
61
+ manylinux: auto
62
+ working-directory: bindings/python
63
+ container: quay.io/pypa/manylinux_2_28_aarch64
64
+ before-script-linux: |
65
+ yum install -y freetype-devel fontconfig-devel
66
+
67
+ - name: Upload wheels
68
+ uses: actions/upload-artifact@v6
69
+ with:
70
+ name: wheels-linux-aarch64
71
+ path: bindings/python/dist/*.whl
72
+
73
+ # Build wheels for Windows
74
+ windows:
75
+ runs-on: windows-latest
76
+ strategy:
77
+ matrix:
78
+ target: [x64]
79
+ steps:
80
+ - uses: actions/checkout@v6
81
+
82
+ - uses: actions/setup-python@v6
83
+ with:
84
+ python-version: "3.11"
85
+ architecture: ${{ matrix.target }}
86
+
87
+ - name: Build wheels
88
+ uses: PyO3/maturin-action@v1
89
+ with:
90
+ target: ${{ matrix.target }}
91
+ args: --release --out dist
92
+ sccache: "true"
93
+ working-directory: bindings/python
94
+
95
+ - name: Upload wheels
96
+ uses: actions/upload-artifact@v6
97
+ with:
98
+ name: wheels-windows-${{ matrix.target }}
99
+ path: bindings/python/dist/*.whl
100
+
101
+ # Build wheels for macOS (Apple Silicon only)
102
+ macos:
103
+ runs-on: macos-14
104
+ strategy:
105
+ matrix:
106
+ target: [aarch64]
107
+ steps:
108
+ - uses: actions/checkout@v6
109
+
110
+ - uses: actions/setup-python@v6
111
+ with:
112
+ python-version: "3.11"
113
+
114
+ - name: Build wheels
115
+ uses: PyO3/maturin-action@v1
116
+ with:
117
+ target: ${{ matrix.target }}
118
+ args: --release --out dist
119
+ sccache: "true"
120
+ working-directory: bindings/python
121
+
122
+ - name: Upload wheels
123
+ uses: actions/upload-artifact@v6
124
+ with:
125
+ name: wheels-macos-${{ matrix.target }}
126
+ path: bindings/python/dist/*.whl
127
+
128
+ # Build source distribution
129
+ sdist:
130
+ runs-on: ubuntu-latest
131
+ steps:
132
+ - uses: actions/checkout@v6
133
+
134
+ - name: Build sdist
135
+ uses: PyO3/maturin-action@v1
136
+ with:
137
+ command: sdist
138
+ args: --out dist
139
+ working-directory: bindings/python
140
+
141
+ - name: Upload sdist
142
+ uses: actions/upload-artifact@v6
143
+ with:
144
+ name: wheels-sdist
145
+ path: bindings/python/dist/*.tar.gz
146
+
147
+ # Publish to PyPI
148
+ publish:
149
+ name: Publish to PyPI
150
+ runs-on: ubuntu-latest
151
+ needs: [linux-x86_64, linux-aarch64, windows, macos, sdist]
152
+ if: startsWith(github.ref, 'refs/tags/')
153
+ environment: pypi
154
+
155
+ steps:
156
+ - name: Download all artifacts
157
+ uses: actions/download-artifact@v6
158
+ with:
159
+ pattern: wheels-*
160
+ path: dist
161
+ merge-multiple: true
162
+
163
+ - name: List artifacts
164
+ run: ls -la dist/
165
+
166
+ - name: Publish to PyPI
167
+ uses: pypa/gh-action-pypi-publish@release/v1
168
+
169
+ # Upload to GitHub Release
170
+ release:
171
+ name: Upload to GitHub Release
172
+ runs-on: ubuntu-latest
173
+ needs: [linux-x86_64, linux-aarch64, windows, macos, sdist]
174
+ if: startsWith(github.ref, 'refs/tags/')
175
+
176
+ steps:
177
+ - name: Download all artifacts
178
+ uses: actions/download-artifact@v6
179
+ with:
180
+ pattern: wheels-*
181
+ path: dist
182
+ merge-multiple: true
183
+
184
+ - name: Upload to Release
185
+ uses: softprops/action-gh-release@v2
186
+ with:
187
+ files: dist/*
@@ -0,0 +1,16 @@
1
+ name: ci
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ jobs:
7
+ deploy:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v6
11
+ - uses: actions/setup-python@v6
12
+ with:
13
+ python-version: 3.x
14
+ - run: pip install mkdocs-material
15
+ - run: pip install mkdocs-video
16
+ - run: mkdocs gh-deploy --force
@@ -0,0 +1,126 @@
1
+ name: Build iOS Dependencies
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+ inputs:
9
+ pydantic_core_version:
10
+ description: 'pydantic-core version/branch to build'
11
+ required: false
12
+ default: 'main'
13
+
14
+ permissions:
15
+ contents: write
16
+
17
+ env:
18
+ PYTHON_VERSION: "3.14"
19
+
20
+ jobs:
21
+ build-ios-deps:
22
+ runs-on: macos-14 # M1 runner for arm64
23
+
24
+ steps:
25
+ - name: Checkout castella
26
+ uses: actions/checkout@v6
27
+
28
+ - name: Install Rust
29
+ uses: dtolnay/rust-action@stable
30
+ with:
31
+ targets: aarch64-apple-ios,aarch64-apple-ios-sim
32
+
33
+ - name: Clone pydantic-core
34
+ run: |
35
+ git clone https://github.com/pydantic/pydantic-core.git /tmp/pydantic-core
36
+ cd /tmp/pydantic-core
37
+ # Add extension-module to existing pyo3 features list
38
+ sed -i '' 's/pyo3 = { version = "\([^"]*\)", features = \["/pyo3 = { version = "\1", features = ["extension-module", "/' Cargo.toml
39
+
40
+ # Create .cargo/config.toml with linker flags
41
+ mkdir -p .cargo
42
+ cat > .cargo/config.toml << 'EOF'
43
+ [target.aarch64-apple-ios]
44
+ rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
45
+
46
+ [target.aarch64-apple-ios-sim]
47
+ rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
48
+ EOF
49
+
50
+ - name: Build pydantic-core for iOS Simulator
51
+ run: |
52
+ cd /tmp/pydantic-core
53
+ PYO3_CROSS_PYTHON_VERSION=${{ env.PYTHON_VERSION }} \
54
+ cargo build --release --target aarch64-apple-ios-sim -j 2
55
+
56
+ - name: Build pydantic-core for iOS Device
57
+ run: |
58
+ cd /tmp/pydantic-core
59
+ PYO3_CROSS_PYTHON_VERSION=${{ env.PYTHON_VERSION }} \
60
+ cargo build --release --target aarch64-apple-ios -j 2
61
+
62
+ - name: Build castella-skia for iOS Simulator
63
+ run: |
64
+ cd bindings/python
65
+ PYO3_CROSS_PYTHON_VERSION=${{ env.PYTHON_VERSION }} \
66
+ cargo build --release --target aarch64-apple-ios-sim
67
+
68
+ - name: Build castella-skia for iOS Device
69
+ run: |
70
+ cd bindings/python
71
+ PYO3_CROSS_PYTHON_VERSION=${{ env.PYTHON_VERSION }} \
72
+ cargo build --release --target aarch64-apple-ios
73
+
74
+ - name: Package iOS Simulator dependencies
75
+ run: |
76
+ mkdir -p dist/ios-sim-arm64
77
+
78
+ # pydantic-core
79
+ mkdir -p dist/ios-sim-arm64/pydantic_core
80
+ cp /tmp/pydantic-core/target/aarch64-apple-ios-sim/release/lib_pydantic_core.dylib \
81
+ dist/ios-sim-arm64/pydantic_core/_pydantic_core.abi3.so
82
+ cp -r /tmp/pydantic-core/python/pydantic_core/*.py \
83
+ dist/ios-sim-arm64/pydantic_core/
84
+
85
+ # castella-skia (workspace target is at root)
86
+ cp target/aarch64-apple-ios-sim/release/libcastella_skia.dylib \
87
+ dist/ios-sim-arm64/castella_skia.abi3.so
88
+
89
+ # Create tarball
90
+ cd dist
91
+ tar czf ios-sim-arm64.tar.gz ios-sim-arm64/
92
+
93
+ - name: Package iOS Device dependencies
94
+ run: |
95
+ mkdir -p dist/ios-arm64
96
+
97
+ # pydantic-core
98
+ mkdir -p dist/ios-arm64/pydantic_core
99
+ cp /tmp/pydantic-core/target/aarch64-apple-ios/release/lib_pydantic_core.dylib \
100
+ dist/ios-arm64/pydantic_core/_pydantic_core.abi3.so
101
+ cp -r /tmp/pydantic-core/python/pydantic_core/*.py \
102
+ dist/ios-arm64/pydantic_core/
103
+
104
+ # castella-skia (workspace target is at root)
105
+ cp target/aarch64-apple-ios/release/libcastella_skia.dylib \
106
+ dist/ios-arm64/castella_skia.abi3.so
107
+
108
+ # Create tarball
109
+ cd dist
110
+ tar czf ios-arm64.tar.gz ios-arm64/
111
+
112
+ - name: Upload artifacts
113
+ uses: actions/upload-artifact@v6
114
+ with:
115
+ name: ios-deps
116
+ path: |
117
+ dist/ios-sim-arm64.tar.gz
118
+ dist/ios-arm64.tar.gz
119
+
120
+ - name: Upload to Release
121
+ if: startsWith(github.ref, 'refs/tags/')
122
+ uses: softprops/action-gh-release@v2
123
+ with:
124
+ files: |
125
+ dist/ios-sim-arm64.tar.gz
126
+ dist/ios-arm64.tar.gz
@@ -0,0 +1,39 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ id-token: write # Required for PyPI Trusted Publishing (OIDC)
11
+ contents: write # Required for creating releases
12
+
13
+ jobs:
14
+ publish:
15
+ runs-on: ubuntu-latest
16
+ environment: pypi
17
+
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@v6
21
+ with:
22
+ submodules: true
23
+
24
+ - name: Set up uv
25
+ uses: astral-sh/setup-uv@v7
26
+
27
+ - name: Set up Python
28
+ run: uv python install 3.11
29
+
30
+ - name: Install dependencies
31
+ run: uv sync
32
+
33
+ - name: Build package
34
+ run: |
35
+ uv build --sdist
36
+ uv build --wheel
37
+
38
+ - name: Publish to PyPI
39
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,172 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110
+ .pdm.toml
111
+ .pdm-python
112
+ .pdm-build/
113
+
114
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115
+ __pypackages__/
116
+
117
+ # Celery stuff
118
+ celerybeat-schedule
119
+ celerybeat.pid
120
+
121
+ # SageMath parsed files
122
+ *.sage.py
123
+
124
+ # Environments
125
+ .env
126
+ .venv
127
+ env/
128
+ venv/
129
+ ENV/
130
+ env.bak/
131
+ venv.bak/
132
+
133
+ # Spyder project settings
134
+ .spyderproject
135
+ .spyproject
136
+
137
+ # Rope project settings
138
+ .ropeproject
139
+
140
+ # mkdocs documentation
141
+ /site
142
+
143
+ # mypy
144
+ .mypy_cache/
145
+ .dmypy.json
146
+ dmypy.json
147
+
148
+ # Pyre type checker
149
+ .pyre/
150
+
151
+ # pytype static type analyzer
152
+ .pytype/
153
+
154
+ # Cython debug symbols
155
+ cython_debug/
156
+
157
+ # PyCharm
158
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
161
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162
+ #.idea/
163
+
164
+ # VSCode
165
+ .vscode/
166
+
167
+ # Ruff
168
+ .ruff_cache/
169
+
170
+ # Test databases
171
+ *.db
172
+ pydantic-core-ios-build/
@@ -0,0 +1 @@
1
+ 3.12.8
@@ -0,0 +1,59 @@
1
+ # Changelog
2
+
3
+ All notable changes to Castella will be documented in this file.
4
+
5
+ ## [0.9.0] - 2025-01-07
6
+
7
+ ### Added
8
+ - **I18n Module** - Internationalization support with runtime locale switching, YAML translation loading, and reactive LocaleString
9
+
10
+ ## [0.8.0] - 2025-01-06
11
+
12
+ ### Added
13
+ - **Interactive Legend** - Click legend items to toggle series/slice visibility
14
+
15
+ ## [0.7.0] - 2025-01-05
16
+
17
+ ### Added
18
+ - **HeatmapChart** - Native heatmap chart with colorbar, tooltips, axis labels, and cell value annotations
19
+ - **Heatmap Table** - DataTable cell background coloring via `ColumnConfig.cell_bg_color`
20
+ - **Colormap System** - Scientific colormaps (Viridis, Plasma, Inferno, Magma) for both chart and table
21
+ - **HeatmapConfig** - Helper class for easy heatmap table setup
22
+ - **Auto-contrast Text** - WCAG luminance-based automatic text color selection
23
+
24
+ ## [0.6.0] - 2025-01-05
25
+
26
+ ### Added
27
+ - **Mouse Drag Text Selection** - Input widget now supports text selection via mouse drag
28
+
29
+ ## [0.5.0] - 2025-01-04
30
+
31
+ ### Added
32
+ - **Graph Visualization System** - Reusable graph module with Sugiyama layout algorithm, interactive canvas with zoom/pan
33
+ - **Workflow Studio Samples** - Visual development environments for LangGraph, LlamaIndex Workflows, pydantic-graph, and Edda
34
+ - **MCP Support** - Model Context Protocol integration for AI-UI interaction
35
+ - **Animation System** - ValueTween, AnimatedState, ProgressBar, and easing functions
36
+ - **Agent Skills** - 5 built-in skills for AI coding agents (castella-core, castella-a2ui, castella-a2a, castella-mcp, castella-agent-ui)
37
+ - **A2UIClient** - Connect to A2A agents with A2UI extension
38
+ - **DataTable** - High-performance data table with sorting, filtering, selection, virtual scrolling, and Pydantic integration
39
+ - **Tree & FileTree** - Hierarchical data display with multi-select support
40
+ - **DateTimeInput** - Visual calendar picker with locale support (EN, JA)
41
+ - **MultilineText** - Text display with selection and copy support
42
+ - **Markdown** - Clickable links with hover underline, extended syntax support
43
+ - **IME Support** - Japanese/Chinese input on macOS GLFW backend
44
+
45
+ ### Changed
46
+ - **A2UI 0.9 Compatibility** - Auto-normalization of A2UI 0.9 spec format
47
+ - **Theme System** - Built-in themes (Tokyo Night, Cupertino, Material Design 3)
48
+ - **Widget Lifecycle** - Added `on_mount()`, `on_unmount()`, `is_mounted()` hooks
49
+ - **Size Policies** - Added syntax sugar methods (`fixed_width()`, `fit_content()`, etc.)
50
+ - **Color System** - Alpha channel support and color utilities
51
+
52
+ ### Fixed
53
+ - Slider rendering to prevent thumb afterimages
54
+ - Switch border_radius affecting center rect
55
+ - Modal event handling improvements
56
+ - Font fallback for special characters and emoji
57
+
58
+ ## [0.2.3] - 2025-01-05
59
+ - Previous stable release