ratatui_ruby 0.4.0 → 0.6.0

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 (441) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +1 -1
  3. data/.builds/ruby-3.3.yml +1 -1
  4. data/.builds/ruby-3.4.yml +1 -1
  5. data/.builds/ruby-4.0.0.yml +1 -1
  6. data/AGENTS.md +98 -176
  7. data/CHANGELOG.md +80 -6
  8. data/README.md +19 -7
  9. data/REUSE.toml +15 -0
  10. data/doc/application_architecture.md +179 -45
  11. data/doc/application_testing.md +80 -32
  12. data/doc/contributors/design/ruby_frontend.md +48 -8
  13. data/doc/contributors/design/rust_backend.md +1 -0
  14. data/doc/contributors/developing_examples.md +191 -48
  15. data/doc/contributors/documentation_style.md +7 -0
  16. data/doc/contributors/examples_audit/p1_high.md +21 -0
  17. data/doc/contributors/examples_audit/p2_moderate.md +81 -0
  18. data/doc/contributors/examples_audit.md +41 -0
  19. data/doc/contributors/index.md +2 -0
  20. data/doc/event_handling.md +21 -7
  21. data/doc/images/app_all_events.png +0 -0
  22. data/doc/images/app_color_picker.png +0 -0
  23. data/doc/images/app_login_form.png +0 -0
  24. data/doc/images/app_stateful_interaction.png +0 -0
  25. data/doc/images/verify_quickstart_dsl.png +0 -0
  26. data/doc/images/verify_quickstart_layout.png +0 -0
  27. data/doc/images/verify_quickstart_lifecycle.png +0 -0
  28. data/doc/images/verify_readme_usage.png +0 -0
  29. data/doc/images/widget_barchart_demo.png +0 -0
  30. data/doc/images/widget_block_demo.png +0 -0
  31. data/doc/images/widget_box_demo.png +0 -0
  32. data/doc/images/widget_calendar_demo.png +0 -0
  33. data/doc/images/widget_canvas_demo.png +0 -0
  34. data/doc/images/widget_cell_demo.png +0 -0
  35. data/doc/images/widget_center_demo.png +0 -0
  36. data/doc/images/widget_chart_demo.png +0 -0
  37. data/doc/images/widget_gauge_demo.png +0 -0
  38. data/doc/images/widget_layout_split.png +0 -0
  39. data/doc/images/widget_line_gauge_demo.png +0 -0
  40. data/doc/images/widget_list_demo.png +0 -0
  41. data/doc/images/widget_overlay_demo.png +0 -0
  42. data/doc/images/widget_ratatui_logo_demo.png +0 -0
  43. data/doc/images/widget_ratatui_mascot_demo.png +0 -0
  44. data/doc/images/widget_render.png +0 -0
  45. data/doc/images/widget_rich_text.png +0 -0
  46. data/doc/images/widget_scroll_text.png +0 -0
  47. data/doc/images/widget_scrollbar_demo.png +0 -0
  48. data/doc/images/widget_sparkline_demo.png +0 -0
  49. data/doc/images/widget_style_colors.png +0 -0
  50. data/doc/images/widget_table_demo.png +0 -0
  51. data/doc/images/widget_table_flex.png +0 -0
  52. data/doc/images/widget_tabs_demo.png +0 -0
  53. data/doc/images/widget_text_width.png +0 -0
  54. data/doc/interactive_design.md +25 -30
  55. data/doc/quickstart.md +150 -130
  56. data/doc/terminal_limitations.md +92 -0
  57. data/examples/app_all_events/README.md +99 -0
  58. data/examples/app_all_events/app.rb +96 -0
  59. data/examples/app_all_events/model/app_model.rb +157 -0
  60. data/examples/app_all_events/model/event_color_cycle.rb +41 -0
  61. data/examples/app_all_events/model/event_entry.rb +92 -0
  62. data/examples/app_all_events/model/msg.rb +37 -0
  63. data/examples/app_all_events/model/timestamp.rb +54 -0
  64. data/examples/app_all_events/update.rb +73 -0
  65. data/examples/app_all_events/view/app_view.rb +78 -0
  66. data/examples/app_all_events/view/controls_view.rb +52 -0
  67. data/examples/app_all_events/view/counts_view.rb +59 -0
  68. data/examples/app_all_events/view/live_view.rb +70 -0
  69. data/examples/app_all_events/view/log_view.rb +55 -0
  70. data/examples/app_all_events/view.rb +7 -0
  71. data/examples/app_color_picker/README.md +134 -0
  72. data/examples/app_color_picker/app.rb +74 -0
  73. data/examples/app_color_picker/clipboard.rb +84 -0
  74. data/examples/app_color_picker/color.rb +191 -0
  75. data/examples/app_color_picker/controls.rb +90 -0
  76. data/examples/app_color_picker/copy_dialog.rb +166 -0
  77. data/examples/app_color_picker/export_pane.rb +126 -0
  78. data/examples/app_color_picker/harmony.rb +56 -0
  79. data/examples/app_color_picker/input.rb +174 -0
  80. data/examples/app_color_picker/main_container.rb +178 -0
  81. data/examples/app_color_picker/palette.rb +109 -0
  82. data/examples/app_login_form/README.md +47 -0
  83. data/examples/{login_form → app_login_form}/app.rb +38 -42
  84. data/examples/app_stateful_interaction/README.md +31 -0
  85. data/examples/app_stateful_interaction/app.rb +272 -0
  86. data/examples/timeout_demo.rb +43 -0
  87. data/examples/verify_quickstart_dsl/README.md +48 -0
  88. data/examples/{quickstart_dsl → verify_quickstart_dsl}/app.rb +17 -6
  89. data/examples/verify_quickstart_layout/README.md +71 -0
  90. data/examples/verify_quickstart_layout/app.rb +71 -0
  91. data/examples/verify_quickstart_lifecycle/README.md +56 -0
  92. data/examples/verify_quickstart_lifecycle/app.rb +54 -0
  93. data/examples/verify_readme_usage/README.md +43 -0
  94. data/examples/verify_readme_usage/app.rb +40 -0
  95. data/examples/widget_barchart_demo/README.md +49 -0
  96. data/examples/widget_barchart_demo/app.rb +238 -0
  97. data/examples/widget_block_demo/README.md +34 -0
  98. data/examples/widget_block_demo/app.rb +256 -0
  99. data/examples/widget_box_demo/README.md +45 -0
  100. data/examples/{box_demo → widget_box_demo}/app.rb +99 -65
  101. data/examples/widget_calendar_demo/README.md +39 -0
  102. data/examples/widget_calendar_demo/app.rb +109 -0
  103. data/examples/widget_canvas_demo/README.md +27 -0
  104. data/examples/widget_canvas_demo/app.rb +123 -0
  105. data/examples/widget_cell_demo/README.md +36 -0
  106. data/examples/widget_cell_demo/app.rb +111 -0
  107. data/examples/widget_center_demo/README.md +29 -0
  108. data/examples/widget_center_demo/app.rb +116 -0
  109. data/examples/widget_chart_demo/README.md +41 -0
  110. data/examples/widget_chart_demo/app.rb +218 -0
  111. data/examples/widget_gauge_demo/README.md +41 -0
  112. data/examples/widget_gauge_demo/app.rb +212 -0
  113. data/examples/widget_layout_split/README.md +44 -0
  114. data/examples/widget_layout_split/app.rb +246 -0
  115. data/examples/widget_line_gauge_demo/README.md +41 -0
  116. data/examples/widget_line_gauge_demo/app.rb +217 -0
  117. data/examples/widget_list_demo/README.md +49 -0
  118. data/examples/widget_list_demo/app.rb +366 -0
  119. data/examples/widget_map_demo/README.md +39 -0
  120. data/examples/{map_demo → widget_map_demo}/app.rb +24 -21
  121. data/examples/widget_overlay_demo/app.rb +248 -0
  122. data/examples/widget_popup_demo/README.md +36 -0
  123. data/examples/widget_popup_demo/app.rb +104 -0
  124. data/examples/widget_ratatui_logo_demo/README.md +34 -0
  125. data/examples/widget_ratatui_logo_demo/app.rb +103 -0
  126. data/examples/widget_ratatui_mascot_demo/README.md +34 -0
  127. data/examples/widget_ratatui_mascot_demo/app.rb +93 -0
  128. data/examples/widget_rect/README.md +38 -0
  129. data/examples/widget_rect/app.rb +205 -0
  130. data/examples/widget_render/README.md +37 -0
  131. data/examples/widget_render/app.rb +184 -0
  132. data/examples/widget_rich_text/README.md +35 -0
  133. data/examples/widget_rich_text/app.rb +166 -0
  134. data/examples/widget_scroll_text/README.md +37 -0
  135. data/examples/widget_scroll_text/app.rb +107 -0
  136. data/examples/widget_scrollbar_demo/README.md +37 -0
  137. data/examples/widget_scrollbar_demo/app.rb +153 -0
  138. data/examples/widget_sparkline_demo/README.md +42 -0
  139. data/examples/widget_sparkline_demo/app.rb +275 -0
  140. data/examples/widget_style_colors/README.md +34 -0
  141. data/examples/widget_style_colors/app.rb +19 -21
  142. data/examples/widget_table_demo/README.md +48 -0
  143. data/examples/widget_table_demo/app.rb +239 -0
  144. data/examples/widget_tabs_demo/README.md +41 -0
  145. data/examples/widget_tabs_demo/app.rb +181 -0
  146. data/examples/widget_text_width/README.md +35 -0
  147. data/examples/widget_text_width/app.rb +106 -0
  148. data/ext/ratatui_ruby/Cargo.lock +11 -4
  149. data/ext/ratatui_ruby/Cargo.toml +2 -1
  150. data/ext/ratatui_ruby/src/events.rs +359 -62
  151. data/ext/ratatui_ruby/src/frame.rs +227 -0
  152. data/ext/ratatui_ruby/src/lib.rs +110 -27
  153. data/ext/ratatui_ruby/src/rendering.rs +8 -4
  154. data/ext/ratatui_ruby/src/string_width.rs +101 -0
  155. data/ext/ratatui_ruby/src/style.rs +138 -57
  156. data/ext/ratatui_ruby/src/terminal.rs +42 -22
  157. data/ext/ratatui_ruby/src/text.rs +14 -7
  158. data/ext/ratatui_ruby/src/widgets/barchart.rs +74 -54
  159. data/ext/ratatui_ruby/src/widgets/block.rs +7 -6
  160. data/ext/ratatui_ruby/src/widgets/canvas.rs +21 -3
  161. data/ext/ratatui_ruby/src/widgets/chart.rs +20 -10
  162. data/ext/ratatui_ruby/src/widgets/gauge.rs +9 -2
  163. data/ext/ratatui_ruby/src/widgets/layout.rs +9 -4
  164. data/ext/ratatui_ruby/src/widgets/line_gauge.rs +9 -2
  165. data/ext/ratatui_ruby/src/widgets/list.rs +211 -12
  166. data/ext/ratatui_ruby/src/widgets/list_state.rs +137 -0
  167. data/ext/ratatui_ruby/src/widgets/mod.rs +3 -0
  168. data/ext/ratatui_ruby/src/widgets/overlay.rs +2 -1
  169. data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
  170. data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +19 -8
  171. data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +17 -10
  172. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +97 -3
  173. data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +169 -0
  174. data/ext/ratatui_ruby/src/widgets/sparkline.rs +14 -11
  175. data/ext/ratatui_ruby/src/widgets/table.rs +121 -5
  176. data/ext/ratatui_ruby/src/widgets/table_state.rs +121 -0
  177. data/ext/ratatui_ruby/src/widgets/tabs.rs +11 -11
  178. data/lib/ratatui_ruby/cell.rb +7 -7
  179. data/lib/ratatui_ruby/event/key/character.rb +35 -0
  180. data/lib/ratatui_ruby/event/key/media.rb +44 -0
  181. data/lib/ratatui_ruby/event/key/modifier.rb +95 -0
  182. data/lib/ratatui_ruby/event/key/navigation.rb +55 -0
  183. data/lib/ratatui_ruby/event/key/system.rb +45 -0
  184. data/lib/ratatui_ruby/event/key.rb +112 -52
  185. data/lib/ratatui_ruby/event/mouse.rb +3 -3
  186. data/lib/ratatui_ruby/event/none.rb +43 -0
  187. data/lib/ratatui_ruby/event/paste.rb +1 -1
  188. data/lib/ratatui_ruby/event.rb +56 -4
  189. data/lib/ratatui_ruby/frame.rb +183 -0
  190. data/lib/ratatui_ruby/list_state.rb +88 -0
  191. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +13 -13
  192. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +1 -5
  193. data/lib/ratatui_ruby/schema/bar_chart.rb +217 -217
  194. data/lib/ratatui_ruby/schema/block.rb +163 -168
  195. data/lib/ratatui_ruby/schema/calendar.rb +66 -67
  196. data/lib/ratatui_ruby/schema/canvas.rb +63 -63
  197. data/lib/ratatui_ruby/schema/center.rb +46 -46
  198. data/lib/ratatui_ruby/schema/chart.rb +135 -143
  199. data/lib/ratatui_ruby/schema/clear.rb +42 -42
  200. data/lib/ratatui_ruby/schema/constraint.rb +76 -76
  201. data/lib/ratatui_ruby/schema/cursor.rb +30 -25
  202. data/lib/ratatui_ruby/schema/gauge.rb +54 -52
  203. data/lib/ratatui_ruby/schema/layout.rb +87 -87
  204. data/lib/ratatui_ruby/schema/line_gauge.rb +62 -62
  205. data/lib/ratatui_ruby/schema/list.rb +103 -80
  206. data/lib/ratatui_ruby/schema/list_item.rb +41 -0
  207. data/lib/ratatui_ruby/schema/overlay.rb +31 -31
  208. data/lib/ratatui_ruby/schema/paragraph.rb +80 -80
  209. data/lib/ratatui_ruby/schema/ratatui_logo.rb +10 -6
  210. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +10 -5
  211. data/lib/ratatui_ruby/schema/rect.rb +99 -56
  212. data/lib/ratatui_ruby/schema/scrollbar.rb +119 -119
  213. data/lib/ratatui_ruby/schema/shape/label.rb +1 -1
  214. data/lib/ratatui_ruby/schema/sparkline.rb +111 -110
  215. data/lib/ratatui_ruby/schema/style.rb +66 -46
  216. data/lib/ratatui_ruby/schema/table.rb +126 -115
  217. data/lib/ratatui_ruby/schema/tabs.rb +66 -67
  218. data/lib/ratatui_ruby/schema/text.rb +69 -1
  219. data/lib/ratatui_ruby/scrollbar_state.rb +112 -0
  220. data/lib/ratatui_ruby/session/autodoc.rb +482 -0
  221. data/lib/ratatui_ruby/session.rb +55 -23
  222. data/lib/ratatui_ruby/table_state.rb +90 -0
  223. data/lib/ratatui_ruby/test_helper/event_injection.rb +169 -0
  224. data/lib/ratatui_ruby/test_helper/snapshot.rb +390 -0
  225. data/lib/ratatui_ruby/test_helper/style_assertions.rb +351 -0
  226. data/lib/ratatui_ruby/test_helper/terminal.rb +127 -0
  227. data/lib/ratatui_ruby/test_helper/test_doubles.rb +68 -0
  228. data/lib/ratatui_ruby/test_helper.rb +66 -193
  229. data/lib/ratatui_ruby/version.rb +1 -1
  230. data/lib/ratatui_ruby.rb +100 -51
  231. data/{examples/sparkline_demo → sig/examples/app_all_events}/app.rbs +3 -2
  232. data/sig/examples/app_all_events/model/event_entry.rbs +16 -0
  233. data/sig/examples/app_all_events/model/events.rbs +15 -0
  234. data/sig/examples/app_all_events/model/timestamp.rbs +11 -0
  235. data/sig/examples/app_all_events/view/app_view.rbs +8 -0
  236. data/sig/examples/app_all_events/view/controls_view.rbs +6 -0
  237. data/sig/examples/app_all_events/view/counts_view.rbs +6 -0
  238. data/sig/examples/app_all_events/view/live_view.rbs +6 -0
  239. data/sig/examples/app_all_events/view/log_view.rbs +6 -0
  240. data/sig/examples/app_all_events/view.rbs +8 -0
  241. data/sig/examples/app_all_events/view_state.rbs +15 -0
  242. data/{examples/list_demo → sig/examples/app_color_picker}/app.rbs +2 -2
  243. data/sig/examples/app_login_form/app.rbs +11 -0
  244. data/sig/examples/app_stateful_interaction/app.rbs +33 -0
  245. data/sig/examples/verify_quickstart_dsl/app.rbs +11 -0
  246. data/sig/examples/verify_quickstart_lifecycle/app.rbs +11 -0
  247. data/sig/examples/verify_readme_usage/app.rbs +11 -0
  248. data/sig/examples/widget_block_demo/app.rbs +32 -0
  249. data/sig/examples/widget_box_demo/app.rbs +11 -0
  250. data/sig/examples/widget_calendar_demo/app.rbs +11 -0
  251. data/sig/examples/widget_cell_demo/app.rbs +11 -0
  252. data/sig/examples/widget_chart_demo/app.rbs +11 -0
  253. data/{examples/gauge_demo → sig/examples/widget_gauge_demo}/app.rbs +4 -0
  254. data/sig/examples/widget_layout_split/app.rbs +10 -0
  255. data/sig/examples/widget_line_gauge_demo/app.rbs +11 -0
  256. data/sig/examples/widget_list_demo/app.rbs +12 -0
  257. data/sig/examples/widget_map_demo/app.rbs +11 -0
  258. data/sig/examples/widget_popup_demo/app.rbs +11 -0
  259. data/sig/examples/widget_ratatui_logo_demo/app.rbs +11 -0
  260. data/sig/examples/widget_ratatui_mascot_demo/app.rbs +11 -0
  261. data/sig/examples/widget_rect/app.rbs +12 -0
  262. data/sig/examples/widget_render/app.rbs +10 -0
  263. data/sig/examples/widget_rich_text/app.rbs +11 -0
  264. data/sig/examples/widget_scroll_text/app.rbs +11 -0
  265. data/sig/examples/widget_scrollbar_demo/app.rbs +11 -0
  266. data/sig/examples/widget_sparkline_demo/app.rbs +10 -0
  267. data/{examples → sig/examples}/widget_style_colors/app.rbs +1 -1
  268. data/sig/examples/widget_table_demo/app.rbs +11 -0
  269. data/sig/examples/widget_text_width/app.rbs +10 -0
  270. data/sig/ratatui_ruby/event.rbs +11 -1
  271. data/sig/ratatui_ruby/frame.rbs +11 -0
  272. data/sig/ratatui_ruby/list_state.rbs +13 -0
  273. data/sig/ratatui_ruby/ratatui_ruby.rbs +5 -4
  274. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +3 -3
  275. data/sig/ratatui_ruby/schema/draw.rbs +4 -0
  276. data/sig/ratatui_ruby/schema/gauge.rbs +2 -2
  277. data/sig/ratatui_ruby/schema/layout.rbs +1 -1
  278. data/sig/ratatui_ruby/schema/line_gauge.rbs +2 -2
  279. data/sig/ratatui_ruby/schema/list.rbs +4 -2
  280. data/sig/ratatui_ruby/schema/list_item.rbs +10 -0
  281. data/sig/ratatui_ruby/schema/rect.rbs +3 -0
  282. data/sig/ratatui_ruby/schema/style.rbs +3 -3
  283. data/sig/ratatui_ruby/schema/table.rbs +3 -1
  284. data/sig/ratatui_ruby/schema/text.rbs +8 -6
  285. data/sig/ratatui_ruby/scrollbar_state.rbs +18 -0
  286. data/sig/ratatui_ruby/session.rbs +107 -0
  287. data/sig/ratatui_ruby/table_state.rbs +15 -0
  288. data/sig/ratatui_ruby/test_helper/event_injection.rbs +16 -0
  289. data/sig/ratatui_ruby/test_helper/snapshot.rbs +12 -0
  290. data/sig/ratatui_ruby/test_helper/style_assertions.rbs +64 -0
  291. data/sig/ratatui_ruby/test_helper/terminal.rbs +14 -0
  292. data/sig/ratatui_ruby/test_helper/test_doubles.rbs +22 -0
  293. data/sig/ratatui_ruby/test_helper.rbs +5 -4
  294. data/tasks/autodoc/examples.rb +79 -0
  295. data/tasks/autodoc/inventory.rb +63 -0
  296. data/tasks/autodoc/member.rb +56 -0
  297. data/tasks/autodoc/name.rb +19 -0
  298. data/tasks/autodoc/notice.rb +26 -0
  299. data/tasks/autodoc/rbs.rb +38 -0
  300. data/tasks/autodoc/rdoc.rb +45 -0
  301. data/tasks/autodoc.rake +53 -0
  302. data/tasks/bump/changelog.rb +3 -3
  303. data/tasks/bump/history.rb +2 -2
  304. data/tasks/bump/links.rb +67 -0
  305. data/tasks/doc.rake +600 -6
  306. data/tasks/example_viewer.html.erb +172 -0
  307. data/tasks/lint.rake +8 -4
  308. data/tasks/resources/index.html.erb +6 -0
  309. data/tasks/sourcehut.rake +70 -30
  310. data/tasks/terminal_preview/app_screenshot.rb +14 -6
  311. data/tasks/terminal_preview/crash_report.rb +7 -9
  312. data/tasks/terminal_preview/launcher_script.rb +4 -6
  313. data/tasks/terminal_preview/preview_collection.rb +4 -6
  314. data/tasks/terminal_preview/safety_confirmation.rb +3 -5
  315. data/tasks/terminal_preview/saved_screenshot.rb +10 -11
  316. data/tasks/terminal_preview/terminal_window.rb +7 -9
  317. data/tasks/test.rake +1 -1
  318. data/tasks/website/index_page.rb +3 -3
  319. data/tasks/website/version.rb +10 -10
  320. data/tasks/website/version_menu.rb +10 -12
  321. data/tasks/website/versioned_documentation.rb +49 -17
  322. data/tasks/website/website.rb +6 -8
  323. data/tasks/website.rake +4 -4
  324. metadata +232 -127
  325. data/LICENSES/BSD-2-Clause.txt +0 -9
  326. data/doc/contributors/better_dx.md +0 -543
  327. data/doc/contributors/example_analysis.md +0 -82
  328. data/doc/images/all_events.png +0 -0
  329. data/doc/images/block_padding.png +0 -0
  330. data/doc/images/block_titles.png +0 -0
  331. data/doc/images/box_demo.png +0 -0
  332. data/doc/images/calendar_demo.png +0 -0
  333. data/doc/images/cell_demo.png +0 -0
  334. data/doc/images/chart_demo.png +0 -0
  335. data/doc/images/flex_layout.png +0 -0
  336. data/doc/images/gauge_demo.png +0 -0
  337. data/doc/images/line_gauge_demo.png +0 -0
  338. data/doc/images/list_demo.png +0 -0
  339. data/doc/images/list_styles.png +0 -0
  340. data/doc/images/login_form.png +0 -0
  341. data/doc/images/quickstart_dsl.png +0 -0
  342. data/doc/images/quickstart_lifecycle.png +0 -0
  343. data/doc/images/readme_usage.png +0 -0
  344. data/doc/images/rich_text.png +0 -0
  345. data/doc/images/scroll_text.png +0 -0
  346. data/doc/images/scrollbar_demo.png +0 -0
  347. data/doc/images/sparkline_demo.png +0 -0
  348. data/doc/images/table_flex.png +0 -0
  349. data/doc/images/table_select.png +0 -0
  350. data/examples/all_events/app.rb +0 -169
  351. data/examples/all_events/app.rbs +0 -7
  352. data/examples/all_events/test_app.rb +0 -139
  353. data/examples/analytics/app.rb +0 -258
  354. data/examples/analytics/app.rbs +0 -7
  355. data/examples/analytics/test_app.rb +0 -132
  356. data/examples/block_padding/app.rb +0 -63
  357. data/examples/block_padding/app.rbs +0 -7
  358. data/examples/block_padding/test_app.rb +0 -31
  359. data/examples/block_titles/app.rb +0 -61
  360. data/examples/block_titles/app.rbs +0 -7
  361. data/examples/block_titles/test_app.rb +0 -34
  362. data/examples/box_demo/app.rbs +0 -7
  363. data/examples/box_demo/test_app.rb +0 -88
  364. data/examples/calendar_demo/app.rb +0 -101
  365. data/examples/calendar_demo/app.rbs +0 -7
  366. data/examples/calendar_demo/test_app.rb +0 -108
  367. data/examples/cell_demo/app.rb +0 -108
  368. data/examples/cell_demo/app.rbs +0 -7
  369. data/examples/cell_demo/test_app.rb +0 -36
  370. data/examples/chart_demo/app.rb +0 -203
  371. data/examples/chart_demo/app.rbs +0 -7
  372. data/examples/chart_demo/test_app.rb +0 -102
  373. data/examples/custom_widget/app.rb +0 -51
  374. data/examples/custom_widget/app.rbs +0 -7
  375. data/examples/custom_widget/test_app.rb +0 -30
  376. data/examples/flex_layout/app.rb +0 -156
  377. data/examples/flex_layout/app.rbs +0 -7
  378. data/examples/flex_layout/test_app.rb +0 -65
  379. data/examples/gauge_demo/app.rb +0 -182
  380. data/examples/gauge_demo/test_app.rb +0 -120
  381. data/examples/hit_test/app.rb +0 -175
  382. data/examples/hit_test/app.rbs +0 -7
  383. data/examples/hit_test/test_app.rb +0 -102
  384. data/examples/line_gauge_demo/app.rb +0 -190
  385. data/examples/line_gauge_demo/app.rbs +0 -7
  386. data/examples/line_gauge_demo/test_app.rb +0 -129
  387. data/examples/list_demo/app.rb +0 -253
  388. data/examples/list_demo/test_app.rb +0 -237
  389. data/examples/list_styles/app.rb +0 -140
  390. data/examples/list_styles/app.rbs +0 -7
  391. data/examples/list_styles/test_app.rb +0 -157
  392. data/examples/login_form/app.rbs +0 -7
  393. data/examples/login_form/test_app.rb +0 -51
  394. data/examples/map_demo/app.rbs +0 -7
  395. data/examples/map_demo/test_app.rb +0 -149
  396. data/examples/mouse_events/app.rb +0 -97
  397. data/examples/mouse_events/app.rbs +0 -7
  398. data/examples/mouse_events/test_app.rb +0 -53
  399. data/examples/popup_demo/app.rb +0 -103
  400. data/examples/popup_demo/app.rbs +0 -7
  401. data/examples/popup_demo/test_app.rb +0 -54
  402. data/examples/quickstart_dsl/app.rbs +0 -7
  403. data/examples/quickstart_dsl/test_app.rb +0 -29
  404. data/examples/quickstart_lifecycle/app.rb +0 -39
  405. data/examples/quickstart_lifecycle/app.rbs +0 -7
  406. data/examples/quickstart_lifecycle/test_app.rb +0 -29
  407. data/examples/ratatui_logo_demo/app.rb +0 -79
  408. data/examples/ratatui_logo_demo/app.rbs +0 -7
  409. data/examples/ratatui_logo_demo/test_app.rb +0 -51
  410. data/examples/ratatui_mascot_demo/app.rb +0 -84
  411. data/examples/ratatui_mascot_demo/app.rbs +0 -7
  412. data/examples/ratatui_mascot_demo/test_app.rb +0 -47
  413. data/examples/readme_usage/app.rb +0 -29
  414. data/examples/readme_usage/app.rbs +0 -7
  415. data/examples/readme_usage/test_app.rb +0 -29
  416. data/examples/rich_text/app.rb +0 -141
  417. data/examples/rich_text/app.rbs +0 -7
  418. data/examples/rich_text/test_app.rb +0 -166
  419. data/examples/scroll_text/app.rb +0 -103
  420. data/examples/scroll_text/app.rbs +0 -7
  421. data/examples/scroll_text/test_app.rb +0 -110
  422. data/examples/scrollbar_demo/app.rb +0 -143
  423. data/examples/scrollbar_demo/app.rbs +0 -7
  424. data/examples/scrollbar_demo/test_app.rb +0 -77
  425. data/examples/sparkline_demo/app.rb +0 -240
  426. data/examples/sparkline_demo/test_app.rb +0 -107
  427. data/examples/table_flex/app.rb +0 -65
  428. data/examples/table_flex/app.rbs +0 -7
  429. data/examples/table_flex/test_app.rb +0 -36
  430. data/examples/table_select/app.rb +0 -198
  431. data/examples/table_select/app.rbs +0 -7
  432. data/examples/table_select/test_app.rb +0 -180
  433. data/examples/widget_style_colors/test_app.rb +0 -48
  434. data/tasks/bump/comparison_links.rb +0 -41
  435. /data/doc/images/{analytics.png → app_analytics.png} +0 -0
  436. /data/doc/images/{custom_widget.png → app_custom_widget.png} +0 -0
  437. /data/doc/images/{mouse_events.png → app_mouse_events.png} +0 -0
  438. /data/doc/images/{map_demo.png → widget_map_demo.png} +0 -0
  439. /data/doc/images/{popup_demo.png → widget_popup_demo.png} +0 -0
  440. /data/doc/images/{hit_test.png → widget_rect.png} +0 -0
  441. /data/{doc/images/ratatui_logo_demo.png → exe/.gitkeep} +0 -0
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
4
- require "ratatui_ruby"
5
-
6
- # A custom widget that fills its area with a checkered pattern using Cell objects.
7
- class CheckeredBackground
8
- def render(area)
9
- cell = RatatuiRuby::Cell.new(char: "░", fg: :dark_gray)
10
- commands = []
11
- area.height.times do |y|
12
- area.width.times do |x|
13
- # Checkerboard logic
14
- if (x + y).even?
15
- # Use a dim cell for the background pattern
16
- commands << RatatuiRuby::Draw.cell(area.x + x, area.y + y, cell)
17
- end
18
- end
19
- end
20
- commands
21
- end
22
- end
23
-
24
- class CellDemoApp
25
- def main
26
- RatatuiRuby.run do |tui|
27
- # Define some reusable cells for our table
28
- ok_cell = RatatuiRuby::Cell.new(char: "OK", fg: :green)
29
- fail_cell = RatatuiRuby::Cell.new(char: "FAIL", fg: :red, modifiers: ["bold"])
30
- pending_cell = RatatuiRuby::Cell.new(char: "...", fg: :yellow, modifiers: ["dim"])
31
-
32
- # A mix of Strings and Cells in rows
33
- rows = [
34
- ["Database", ok_cell],
35
- ["Cache", ok_cell],
36
- ["Worker", fail_cell],
37
- ["Analytics", pending_cell],
38
- ["Web Server", RatatuiRuby::Cell.new(char: "RESTARTING", fg: :blue, modifiers: ["rapid_blink"])]
39
- ]
40
-
41
- table = RatatuiRuby::Table.new(
42
- header: ["Service", RatatuiRuby::Cell.new(char: "Status", modifiers: ["underlined"])],
43
- rows: rows,
44
- widths: [
45
- RatatuiRuby::Constraint.percentage(70),
46
- RatatuiRuby::Constraint.percentage(30)
47
- ],
48
- block: RatatuiRuby::Block.new(title: "System Status", borders: :all),
49
- column_spacing: 1
50
- )
51
-
52
- # Main loop
53
- loop do
54
- # Create a layout that holds both widgets
55
- # We use a vertical layout:
56
- # Top: Custom CheckeredBackground with specific height
57
- # Bottom: Table using remaining space
58
-
59
- # Note: CheckeredBackground renders to the area implicitly if passed as a child.
60
- # However, to overlay the paragraph, we might need a more complex structure or
61
- # wrapper. RatatuiRuby::Layout handles non-overlapping children.
62
- # To get the "Overlay" effect from my previous code (Paragraph over Background),
63
- # we would need to composite them. For now, let's just show them stacked or
64
- # using 'Overlay' widget if it exists.
65
-
66
- # Checking schema: Overlay exists? Yes: require_relative "ratatui_ruby/schema/overlay" in lib/ratatui_ruby.rb
67
-
68
- layout = RatatuiRuby::Layout.new(
69
- direction: :vertical,
70
- constraints: [
71
- RatatuiRuby::Constraint.length(10), # Top section
72
- RatatuiRuby::Constraint.min(0) # Bottom section
73
- ],
74
- children: [
75
- # Top Child: An Overlay of Paragraph on top of CheckeredBackground
76
- RatatuiRuby::Overlay.new(
77
- layers: [
78
- CheckeredBackground.new,
79
- RatatuiRuby::Center.new(
80
- width_percent: 50,
81
- height_percent: 50,
82
- child: RatatuiRuby::Paragraph.new(
83
- text: "Custom Widget Demo\n(CheckeredBackground)",
84
- alignment: :center,
85
- block: RatatuiRuby::Block.new(borders: :all, title: "Overlay")
86
- )
87
- )
88
- ]
89
- ),
90
- # Bottom Child: The Table
91
- table
92
- ]
93
- )
94
-
95
- tui.draw(layout)
96
-
97
- event = RatatuiRuby.poll_event
98
- if event.is_a?(RatatuiRuby::Event::Key)
99
- break if event.code == "q" || (event.code == "c" && event.modifiers.include?("ctrl"))
100
- end
101
- end
102
- end
103
- end
104
- end
105
-
106
- if __FILE__ == $0
107
- CellDemoApp.new.main
108
- end
@@ -1,7 +0,0 @@
1
- class CellDemoApp
2
- # @public
3
- def self.new: () -> CellDemoApp
4
-
5
- # @public
6
- def run: () -> void
7
- end
@@ -1,36 +0,0 @@
1
- require "minitest/autorun"
2
- require "ratatui_ruby"
3
- require "ratatui_ruby/test_helper"
4
- require_relative "app"
5
-
6
- class TestCellDemoApp < Minitest::Test
7
- include RatatuiRuby::TestHelper
8
-
9
- include RatatuiRuby::TestHelper
10
-
11
- def test_cell_demo_output
12
- # Run the demo in a test terminal
13
- # We'll inject a 'q' key to exit the loop immediately after the first draw
14
- with_test_terminal(timeout: 5) do
15
- inject_key("q")
16
- CellDemoApp.new.main
17
-
18
- # Verify Custom Widget Output
19
- # Check for "░" character from CheckeredBackground
20
- # It should be visible around the centered widget
21
- assert_includes buffer_content.join("\n"), "░"
22
-
23
- # Verify Table Output
24
- # Content strings
25
- assert_includes buffer_content.join("\n"), "System Status"
26
- assert_includes buffer_content.join("\n"), "Database"
27
- assert_includes buffer_content.join("\n"), "Worker"
28
-
29
- # We can't easily grep for "FAIL" with color in simple string content check,
30
- # but we can check the text presence.
31
- assert_includes buffer_content.join("\n"), "FAIL"
32
- assert_includes buffer_content.join("\n"), "OK"
33
- assert_includes buffer_content.join("\n"), "RESTARTING"
34
- end
35
- end
36
- end
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
-
9
- # Demonstrates Chart widget with interactive attribute cycling.
10
- class ChartDemoApp
11
- def initialize
12
- @markers = [
13
- { name: "Dot (·)", marker: :dot },
14
- { name: "Braille", marker: :braille },
15
- { name: "Block (█)", marker: :block },
16
- { name: "Bar", marker: :bar }
17
- ]
18
- @marker_index = 0
19
-
20
- @dataset_styles = [
21
- { name: "Yellow", style: RatatuiRuby::Style.new(fg: :yellow) },
22
- { name: "Green", style: RatatuiRuby::Style.new(fg: :green) },
23
- { name: "Cyan", style: RatatuiRuby::Style.new(fg: :cyan) },
24
- { name: "Red", style: RatatuiRuby::Style.new(fg: :red) },
25
- { name: "Magenta", style: RatatuiRuby::Style.new(fg: :magenta) },
26
- { name: "Bold Blue", style: RatatuiRuby::Style.new(fg: :blue, modifiers: [:bold]) },
27
- { name: "Dim White", style: RatatuiRuby::Style.new(fg: :white, modifiers: [:dim]) },
28
- { name: "Italic Green", style: RatatuiRuby::Style.new(fg: :green, modifiers: [:italic]) },
29
- { name: "Alert (Red/White/Bar)", style: RatatuiRuby::Style.new(fg: :white, bg: :red, modifiers: [:bold]) }
30
- ]
31
- @dataset_style_index = 0
32
-
33
- @x_alignments = [
34
- { name: "Left", alignment: :left },
35
- { name: "Center", alignment: :center },
36
- { name: "Right", alignment: :right }
37
- ]
38
- @x_alignment_index = 1
39
-
40
- @y_alignments = [
41
- { name: "Left", alignment: :left },
42
- { name: "Center", alignment: :center },
43
- { name: "Right", alignment: :right }
44
- ]
45
- @y_alignment_index = 2
46
-
47
- @legend_positions = [
48
- { name: "Top Right", position: :top_right },
49
- { name: "Top Left", position: :top_left },
50
- { name: "Bottom Right", position: :bottom_right },
51
- { name: "Bottom Left", position: :bottom_left }
52
- ]
53
- @legend_position_index = 0
54
-
55
- @hotkey_style = RatatuiRuby::Style.new(modifiers: [:bold, :underlined])
56
- end
57
-
58
- def run
59
- RatatuiRuby.run do
60
- loop do
61
- render
62
- break if handle_input == :quit
63
- sleep 0.05
64
- end
65
- end
66
- end
67
-
68
- private
69
-
70
- def render
71
- # Static sample data: sine wave with wider range for better visibility
72
- line_data = (0..50).map do |i|
73
- x = i / 5.0
74
- [x, Math.sin(x)]
75
- end
76
-
77
- # Scatter: Random points
78
- scatter_data = (0..20).map do |_|
79
- [rand(0.0..10.0), rand(-1.0..1.0)]
80
- end
81
-
82
- style = @dataset_styles[@dataset_style_index][:style]
83
- # Ensure the second dataset has a different style
84
- scatter_style = @dataset_styles[(@dataset_style_index + 2) % @dataset_styles.length][:style]
85
-
86
- datasets = [
87
- RatatuiRuby::Dataset.new(
88
- name: "Line",
89
- data: line_data,
90
- style:,
91
- marker: style.modifiers.include?(:bold) && style.bg ? :bar : @markers[@marker_index][:marker],
92
- graph_type: :line
93
- ),
94
- RatatuiRuby::Dataset.new(
95
- name: "Scatter",
96
- data: scatter_data,
97
- style: scatter_style,
98
- marker: scatter_style.modifiers.include?(:bold) && scatter_style.bg ? :bar : @markers[@marker_index][:marker],
99
- graph_type: :scatter
100
- )
101
- ]
102
-
103
- x_alignment = @x_alignments[@x_alignment_index][:alignment]
104
- y_alignment = @y_alignments[@y_alignment_index][:alignment]
105
- legend_position = @legend_positions[@legend_position_index][:position]
106
-
107
- chart = RatatuiRuby::Chart.new(
108
- datasets:,
109
- x_axis: RatatuiRuby::Axis.new(
110
- title: "Time",
111
- bounds: [0.0, 10.0],
112
- labels: %w[0 5 10],
113
- style: RatatuiRuby::Style.new(fg: :yellow),
114
- labels_alignment: x_alignment
115
- ),
116
- y_axis: RatatuiRuby::Axis.new(
117
- title: "Amplitude",
118
- bounds: [-1.0, 1.0],
119
- labels: %w[-1 0 1],
120
- style: RatatuiRuby::Style.new(fg: :cyan),
121
- labels_alignment: y_alignment
122
- ),
123
- block: RatatuiRuby::Block.new(
124
- title: "Chart Widget Demo",
125
- borders: [:all]
126
- ),
127
- legend_position:,
128
- hidden_legend_constraints: [
129
- RatatuiRuby::Constraint.min(20),
130
- RatatuiRuby::Constraint.min(10)
131
- ]
132
- )
133
-
134
- layout = RatatuiRuby::Layout.new(
135
- direction: :vertical,
136
- constraints: [
137
- RatatuiRuby::Constraint.fill(1),
138
- RatatuiRuby::Constraint.length(5)
139
- ],
140
- children: [
141
- chart,
142
- # Bottom control panel
143
- RatatuiRuby::Block.new(
144
- title: "Controls",
145
- borders: [:all],
146
- children: [
147
- RatatuiRuby::Paragraph.new(
148
- text: [
149
- # Line 1: Markers & Colors
150
- RatatuiRuby::Text::Line.new(spans: [
151
- RatatuiRuby::Text::Span.new(content: "m", style: @hotkey_style),
152
- RatatuiRuby::Text::Span.new(content: ": Marker (#{@markers[@marker_index][:name]}) "),
153
- RatatuiRuby::Text::Span.new(content: "s", style: @hotkey_style),
154
- RatatuiRuby::Text::Span.new(content: ": Style (#{@dataset_styles[@dataset_style_index][:name]})")
155
- ]),
156
- # Line 2: Axis alignments
157
- RatatuiRuby::Text::Line.new(spans: [
158
- RatatuiRuby::Text::Span.new(content: "x", style: @hotkey_style),
159
- RatatuiRuby::Text::Span.new(content: ": X Align (#{@x_alignments[@x_alignment_index][:name]}) "),
160
- RatatuiRuby::Text::Span.new(content: "y", style: @hotkey_style),
161
- RatatuiRuby::Text::Span.new(content: ": Y Align (#{@y_alignments[@y_alignment_index][:name]}) "),
162
- RatatuiRuby::Text::Span.new(content: "l", style: @hotkey_style),
163
- RatatuiRuby::Text::Span.new(content: ": Legend (#{@legend_positions[@legend_position_index][:name]})")
164
- ]),
165
- # Line 3: Quit
166
- RatatuiRuby::Text::Line.new(spans: [
167
- RatatuiRuby::Text::Span.new(content: "q", style: @hotkey_style),
168
- RatatuiRuby::Text::Span.new(content: ": Quit")
169
- ])
170
- ]
171
- )
172
- ]
173
- )
174
- ]
175
- )
176
-
177
- RatatuiRuby.draw(layout)
178
- end
179
-
180
- def handle_input
181
- event = RatatuiRuby.poll_event
182
- return unless event
183
-
184
- case event
185
- in {type: :key, code: "q"} | {type: :key, code: "c", modifiers: ["ctrl"]}
186
- :quit
187
- in type: :key, code: "m"
188
- @marker_index = (@marker_index + 1) % @markers.length
189
- in type: :key, code: "s"
190
- @dataset_style_index = (@dataset_style_index + 1) % @dataset_styles.length
191
- in type: :key, code: "x"
192
- @x_alignment_index = (@x_alignment_index + 1) % @x_alignments.length
193
- in type: :key, code: "y"
194
- @y_alignment_index = (@y_alignment_index + 1) % @y_alignments.length
195
- in type: :key, code: "l"
196
- @legend_position_index = (@legend_position_index + 1) % @legend_positions.length
197
- else
198
- nil
199
- end
200
- end
201
- end
202
-
203
- ChartDemoApp.new.run if __FILE__ == $PROGRAM_NAME
@@ -1,7 +0,0 @@
1
- class ChartDemoApp
2
- # @public
3
- def self.new: () -> ChartDemoApp
4
-
5
- # @public
6
- def run: () -> void
7
- end
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
- require "ratatui_ruby/test_helper"
9
- require "minitest/autorun"
10
- require_relative "app"
11
-
12
- class TestChartDemo < Minitest::Test
13
- include RatatuiRuby::TestHelper
14
-
15
- def setup
16
- @app = ChartDemoApp.new
17
- end
18
-
19
- def test_initial_render
20
- with_test_terminal do
21
- inject_key(:q)
22
- @app.run
23
-
24
- content = buffer_content.join("\n")
25
- assert_includes content, "Chart Widget Demo"
26
- assert_includes content, "Time"
27
- assert_includes content, "Amplitude"
28
- assert_includes content, "Line"
29
- assert_includes content, "Scatter"
30
- assert_includes content, "Controls"
31
- # Verify controls are visible
32
- assert_includes content, "Marker"
33
- assert_includes content, "Style"
34
- assert_includes content, "Align"
35
- end
36
- end
37
-
38
- def test_marker_cycling
39
- with_test_terminal do
40
- inject_key("m") # Cycle marker
41
- inject_key(:q)
42
- @app.run
43
-
44
- content = buffer_content.join("\n")
45
- # Should show the chart still renders
46
- assert_includes content, "Chart Widget Demo"
47
- assert_includes content, "Time"
48
- end
49
- end
50
-
51
- def test_style_cycling
52
- with_test_terminal do
53
- inject_key("s") # Cycle style
54
- inject_key(:q)
55
- @app.run
56
-
57
- content = buffer_content.join("\n")
58
- assert_includes content, "Chart Widget Demo"
59
- assert_includes content, "Time"
60
- end
61
- end
62
-
63
- def test_x_alignment_cycling
64
- with_test_terminal do
65
- inject_key("x") # Cycle X-axis label alignment
66
- inject_key(:q)
67
- @app.run
68
-
69
- content = buffer_content.join("\n")
70
- assert_includes content, "Chart Widget Demo"
71
- assert_includes content, "Time"
72
- end
73
- end
74
-
75
- def test_y_alignment_cycling
76
- with_test_terminal do
77
- inject_key("y") # Cycle Y-axis label alignment
78
- inject_key(:q)
79
- @app.run
80
-
81
- content = buffer_content.join("\n")
82
- assert_includes content, "Chart Widget Demo"
83
- assert_includes content, "Amplitude"
84
- end
85
- end
86
-
87
- def test_multiple_cycles
88
- with_test_terminal do
89
- inject_key("m")
90
- inject_key("s")
91
- inject_key("x")
92
- inject_key("y")
93
- inject_key(:q)
94
- @app.run
95
-
96
- content = buffer_content.join("\n")
97
- assert_includes content, "Chart Widget Demo"
98
- # Chart and controls should all render
99
- assert_includes content, "Controls"
100
- end
101
- end
102
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
-
9
- # A custom widget that draws a diagonal line.
10
- class DiagonalWidget
11
- def render(area)
12
- # Draw a diagonal line within the area
13
- (0..10).filter_map do |i|
14
- next if area.x + i >= area.x + area.width || area.y + i >= area.y + area.height
15
-
16
- RatatuiRuby::Draw.string(
17
- area.x + i,
18
- area.y + i,
19
- "\\",
20
- { fg: :red, modifiers: [:bold] }
21
- )
22
- end
23
- end
24
- end
25
-
26
- class CustomWidgetApp
27
- def run
28
- RatatuiRuby.run do |tui|
29
- loop do
30
- tui.draw(
31
- RatatuiRuby::Layout.new(
32
- direction: :vertical,
33
- constraints: [
34
- RatatuiRuby::Constraint.percentage(50),
35
- RatatuiRuby::Constraint.percentage(50),
36
- ],
37
- children: [
38
- RatatuiRuby::Paragraph.new(text: "Above custom widget"),
39
- DiagonalWidget.new,
40
- ]
41
- )
42
- )
43
-
44
- event = RatatuiRuby.poll_event
45
- break if event == "q" || event == :ctrl_c
46
- end
47
- end
48
- end
49
- end
50
-
51
- CustomWidgetApp.new.run if __FILE__ == $PROGRAM_NAME
@@ -1,7 +0,0 @@
1
- class CustomWidgetApp
2
- # @public
3
- def self.new: () -> CustomWidgetApp
4
-
5
- # @public
6
- def run: () -> void
7
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
- require "ratatui_ruby/test_helper"
9
- require "minitest/autorun"
10
- require_relative "app"
11
-
12
- class TestCustomWidget < Minitest::Test
13
- include RatatuiRuby::TestHelper
14
-
15
- def setup
16
- @app = CustomWidgetApp.new
17
- end
18
-
19
- def test_render
20
- with_test_terminal do
21
- inject_key(:q)
22
- @app.run
23
-
24
- content = buffer_content.join("\n")
25
- assert_includes content, "Above custom widget"
26
- # The custom widget draws backslashes
27
- assert_includes content, "\\"
28
- end
29
- end
30
- end