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
@@ -6,14 +6,19 @@
6
6
  module RatatuiRuby
7
7
  # Displays the Ratatui mascot.
8
8
  #
9
- # A widget that renders the Ratatui mascot (a rat).
9
+ # Interfaces without personality feel clinical and dry. Users appreciate a friendly face in their terminal.
10
10
  #
11
- # === Examples
11
+ # This widget renders the Ratatui mascot (a mouse).
12
12
  #
13
- # RatatuiMascot.new(
14
- # block: Block.new(title: "Mascot")
15
- # )
13
+ # Use it to add charm to your application, greet users on startup, or as a decorative element in sidebars.
16
14
  #
15
+ # {rdoc-image:/doc/images/widget_ratatui_mascot_demo.png}[link:/examples/widget_ratatui_mascot_demo/app_rb.html]
16
+ #
17
+ # === Example
18
+ #
19
+ # Run the interactive demo from the terminal:
20
+ #
21
+ # ruby examples/widget_ratatui_mascot_demo/app.rb
17
22
  class RatatuiMascot < Data.define(:block)
18
23
  ##
19
24
  # :method: new
@@ -4,70 +4,113 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Defines a rectangular area in the terminal grid.
7
+ # Defines a rectangular area in the terminal grid.
8
+ #
9
+ # Geometry management involves passing groups of four integers (`x, y, width, height`) repeatedly.
10
+ # This is verbose and prone to parameter mismatch errors.
11
+ #
12
+ # This class encapsulates the geometry. It provides a standard primitive for passing area definitions
13
+ # between layout engines and rendering functions.
14
+ #
15
+ # Use it when manual positioning is required or when querying layout results.
16
+ #
17
+ # === Examples
18
+ #
19
+ # area = Rect.new(x: 0, y: 0, width: 80, height: 24)
20
+ # puts area.width # => 80
21
+ class Rect < Data.define(:x, :y, :width, :height)
22
+ ##
23
+ # :attr_reader: x
24
+ # X coordinate (column) of the top-left corner (Integer, coerced via +to_int+ or +to_i+).
25
+
26
+ ##
27
+ # :attr_reader: y
28
+ # Y coordinate (row) of the top-left corner (Integer, coerced via +to_int+ or +to_i+).
29
+
30
+ ##
31
+ # :attr_reader: width
32
+ # Width in characters (Integer, coerced via +to_int+ or +to_i+).
33
+
34
+ ##
35
+ # :attr_reader: height
36
+ # Height in characters (Integer, coerced via +to_int+ or +to_i+).
37
+
38
+ # Creates a new Rect.
8
39
  #
9
- # Geometry management involves passing groups of four integers (`x, y, width, height`) repeatedly.
10
- # This is verbose and prone to parameter mismatch errors.
40
+ # All parameters accept any object responding to +to_int+ or +to_i+ (duck-typed).
11
41
  #
12
- # This class encapsulates the geometry. It provides a standard primitive for passing area definitions
13
- # between layout engines and rendering functions.
42
+ # [x] Column index (Numeric).
43
+ # [y] Row index (Numeric).
44
+ # [width] Width in columns (Numeric).
45
+ # [height] Height in rows (Numeric).
46
+ def initialize(x: 0, y: 0, width: 0, height: 0)
47
+ super(
48
+ x: Integer(x),
49
+ y: Integer(y),
50
+ width: Integer(width),
51
+ height: Integer(height)
52
+ )
53
+ end
54
+
55
+ # Tests whether a point is inside this rectangle.
14
56
  #
15
- # Use it when manual positioning is required or when querying layout results.
57
+ # Essential for hit testing mouse clicks against layout regions.
16
58
  #
17
- # === Examples
59
+ # area = Rect.new(x: 10, y: 5, width: 20, height: 10)
60
+ # area.contains?(15, 8) # => true
61
+ # area.contains?(5, 8) # => false
18
62
  #
19
- # area = Rect.new(x: 0, y: 0, width: 80, height: 24)
20
- # puts area.width # => 80
21
- class Rect < Data.define(:x, :y, :width, :height)
22
- ##
23
- # :attr_reader: x
24
- # X coordinate (column) of the top-left corner (Integer, coerced via +to_int+ or +to_i+).
25
-
26
- ##
27
- # :attr_reader: y
28
- # Y coordinate (row) of the top-left corner (Integer, coerced via +to_int+ or +to_i+).
63
+ # [px]
64
+ # X coordinate to test (column).
65
+ # [py]
66
+ # Y coordinate to test (row).
67
+ #
68
+ # Returns true if the point (px, py) is within the rectangle bounds.
69
+ def contains?(px, py)
70
+ px >= x && px < x + width && py >= y && py < y + height
71
+ end
29
72
 
30
- ##
31
- # :attr_reader: width
32
- # Width in characters (Integer, coerced via +to_int+ or +to_i+).
73
+ # Tests whether this rectangle overlaps with another.
74
+ #
75
+ # Essential for determining if a widget is visible within a viewport or clipping area.
76
+ #
77
+ # viewport = Rect.new(x: 0, y: 0, width: 80, height: 24)
78
+ # widget = Rect.new(x: 70, y: 20, width: 20, height: 10)
79
+ # viewport.intersects?(widget) # => true (partial overlap)
80
+ #
81
+ # [other]
82
+ # Another Rect to test against.
83
+ #
84
+ # Returns true if the rectangles overlap.
85
+ def intersects?(other)
86
+ x < other.x + other.width &&
87
+ x + width > other.x &&
88
+ y < other.y + other.height &&
89
+ y + height > other.y
90
+ end
33
91
 
34
- ##
35
- # :attr_reader: height
36
- # Height in characters (Integer, coerced via +to_int+ or +to_i+).
92
+ # Returns the overlapping area between this rectangle and another.
93
+ #
94
+ # Essential for calculating visible portions of widgets inside scroll views.
95
+ #
96
+ # viewport = Rect.new(x: 0, y: 0, width: 80, height: 24)
97
+ # widget = Rect.new(x: 70, y: 20, width: 20, height: 10)
98
+ # visible = viewport.intersection(widget)
99
+ # # => Rect(x: 70, y: 20, width: 10, height: 4)
100
+ #
101
+ # [other]
102
+ # Another Rect to intersect with.
103
+ #
104
+ # Returns a new Rect representing the intersection, or +nil+ if no overlap.
105
+ def intersection(other)
106
+ return nil unless intersects?(other)
37
107
 
38
- # Creates a new Rect.
39
- #
40
- # All parameters accept any object responding to +to_int+ or +to_i+ (duck-typed).
41
- #
42
- # [x] Column index (Numeric).
43
- # [y] Row index (Numeric).
44
- # [width] Width in columns (Numeric).
45
- # [height] Height in rows (Numeric).
46
- def initialize(x: 0, y: 0, width: 0, height: 0)
47
- super(
48
- x: Integer(x),
49
- y: Integer(y),
50
- width: Integer(width),
51
- height: Integer(height)
52
- )
53
- end
108
+ new_x = [x, other.x].max
109
+ new_y = [y, other.y].max
110
+ new_right = [x + width, other.x + other.width].min
111
+ new_bottom = [y + height, other.y + other.height].min
54
112
 
55
- # Tests whether a point is inside this rectangle.
56
- #
57
- # Essential for hit testing mouse clicks against layout regions.
58
- #
59
- # area = Rect.new(x: 10, y: 5, width: 20, height: 10)
60
- # area.contains?(15, 8) # => true
61
- # area.contains?(5, 8) # => false
62
- #
63
- # [px]
64
- # X coordinate to test (column).
65
- # [py]
66
- # Y coordinate to test (row).
67
- #
68
- # Returns true if the point (px, py) is within the rectangle bounds.
69
- def contains?(px, py)
70
- px >= x && px < x + width && py >= y && py < y + height
71
- end
113
+ Rect.new(x: new_x, y: new_y, width: new_right - new_x, height: new_bottom - new_y)
72
114
  end
115
+ end
73
116
  end
@@ -4,138 +4,138 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Visualizes the scroll state of a viewport.
8
- #
9
- # Content overflows. Users get lost in long lists without landmarks. They need to know where they are and how much is left.
10
- #
11
- # This widget maps your context. It draws a track and a thumb, representing your current position relative to the total length.
12
- #
13
- # Overlay it on top of lists, paragraphs, or tables to provide spatial awareness.
14
- #
15
- # === Examples
16
- #
17
- # Scrollbar.new(
18
- # content_length: 100,
19
- # position: 25,
20
- # orientation: :vertical
21
- # )
22
- class Scrollbar < Data.define(
23
- :content_length,
24
- :position,
25
- :orientation,
26
- :thumb_symbol,
27
- :thumb_style,
28
- :track_symbol,
29
- :track_style,
30
- :begin_symbol,
31
- :begin_style,
32
- :end_symbol,
33
- :end_style,
34
- :style,
35
- :block
36
- )
37
- ##
38
- # :attr_reader: content_length
39
- # Total items or lines in the content.
7
+ # Visualizes the scroll state of a viewport.
8
+ #
9
+ # Content overflows. Users get lost in long lists without landmarks. They need to know where they are and how much is left.
10
+ #
11
+ # This widget maps your context. It draws a track and a thumb, representing your current position relative to the total length.
12
+ #
13
+ # Overlay it on top of lists, paragraphs, or tables to provide spatial awareness.
14
+ #
15
+ # {rdoc-image:/doc/images/widget_scrollbar_demo.png}[link:/examples/widget_scrollbar_demo/app_rb.html]
16
+ #
17
+ # === Example
18
+ #
19
+ # Run the interactive demo from the terminal:
20
+ #
21
+ # ruby examples/widget_scrollbar_demo/app.rb
22
+ class Scrollbar < Data.define(
23
+ :content_length,
24
+ :position,
25
+ :orientation,
26
+ :thumb_symbol,
27
+ :thumb_style,
28
+ :track_symbol,
29
+ :track_style,
30
+ :begin_symbol,
31
+ :begin_style,
32
+ :end_symbol,
33
+ :end_style,
34
+ :style,
35
+ :block
36
+ )
37
+ ##
38
+ # :attr_reader: content_length
39
+ # Total items or lines in the content.
40
40
 
41
- ##
42
- # :attr_reader: position
43
- # Current scroll offset (index).
44
- #
45
- # Maps to Ratatui's <tt>ScrollbarState::get_position()</tt> (new in 0.30.0).
41
+ ##
42
+ # :attr_reader: position
43
+ # Current scroll offset (index).
44
+ #
45
+ # Maps to Ratatui's <tt>ScrollbarState::get_position()</tt> (new in 0.30.0).
46
46
 
47
- ##
48
- # :attr_reader: orientation
49
- # Direction of the scrollbar.
50
- #
51
- # <tt>:vertical</tt> (default, alias for <tt>:vertical_right</tt>), <tt>:horizontal</tt> (alias for <tt>:horizontal_bottom</tt>),
52
- # <tt>:vertical_left</tt>, <tt>:vertical_right</tt>, <tt>:horizontal_top</tt>, or <tt>:horizontal_bottom</tt>.
47
+ ##
48
+ # :attr_reader: orientation
49
+ # Direction of the scrollbar.
50
+ #
51
+ # <tt>:vertical</tt> (default, alias for <tt>:vertical_right</tt>), <tt>:horizontal</tt> (alias for <tt>:horizontal_bottom</tt>),
52
+ # <tt>:vertical_left</tt>, <tt>:vertical_right</tt>, <tt>:horizontal_top</tt>, or <tt>:horizontal_bottom</tt>.
53
53
 
54
- ##
55
- # :attr_reader: thumb_symbol
56
- # Symbol used to represent the current position indicator.
54
+ ##
55
+ # :attr_reader: thumb_symbol
56
+ # Symbol used to represent the current position indicator.
57
57
 
58
- ##
59
- # :attr_reader: thumb_style
60
- # Style of the position indicator (thumb).
58
+ ##
59
+ # :attr_reader: thumb_style
60
+ # Style of the position indicator (thumb).
61
61
 
62
- ##
63
- # :attr_reader: track_symbol
64
- # Symbol used to represent the empty space of the scrollbar.
62
+ ##
63
+ # :attr_reader: track_symbol
64
+ # Symbol used to represent the empty space of the scrollbar.
65
65
 
66
- ##
67
- # :attr_reader: track_style
68
- # Style of the filled track area.
66
+ ##
67
+ # :attr_reader: track_style
68
+ # Style of the filled track area.
69
69
 
70
- ##
71
- # :attr_reader: begin_symbol
72
- # Symbol rendered at the start of the track (e.g., arrow).
70
+ ##
71
+ # :attr_reader: begin_symbol
72
+ # Symbol rendered at the start of the track (e.g., arrow).
73
73
 
74
- ##
75
- # :attr_reader: begin_style
76
- # Style of the start symbol.
74
+ ##
75
+ # :attr_reader: begin_style
76
+ # Style of the start symbol.
77
77
 
78
- ##
79
- # :attr_reader: end_symbol
80
- # Symbol rendered at the end of the track (e.g., arrow).
78
+ ##
79
+ # :attr_reader: end_symbol
80
+ # Symbol rendered at the end of the track (e.g., arrow).
81
81
 
82
- ##
83
- # :attr_reader: end_style
84
- # Style of the end symbol.
82
+ ##
83
+ # :attr_reader: end_style
84
+ # Style of the end symbol.
85
85
 
86
- ##
87
- # :attr_reader: style
88
- # Base style applied to the entire widget.
86
+ ##
87
+ # :attr_reader: style
88
+ # Base style applied to the entire widget.
89
89
 
90
- ##
91
- # :attr_reader: block
92
- # Optional wrapping block.
90
+ ##
91
+ # :attr_reader: block
92
+ # Optional wrapping block.
93
93
 
94
- # Creates a new Scrollbar.
95
- #
96
- # [content_length] Integer.
97
- # [position] Integer.
98
- # [orientation] Symbol (default: <tt>:vertical</tt>).
99
- # [thumb_symbol] String (default: <tt>"█"</tt>).
100
- # [thumb_style] Style (optional).
101
- # [track_symbol] String (optional).
102
- # [track_style] Style (optional).
103
- # [begin_symbol] String (optional).
104
- # [begin_style] Style (optional).
105
- # [end_symbol] String (optional).
106
- # [end_style] Style (optional).
107
- # [style] Style (optional).
108
- # [block] Block (optional).
109
- def initialize(
110
- content_length:,
111
- position:,
112
- orientation: :vertical,
113
- thumb_symbol: "█",
114
- thumb_style: nil,
115
- track_symbol: nil,
116
- track_style: nil,
117
- begin_symbol: nil,
118
- begin_style: nil,
119
- end_symbol: nil,
120
- end_style: nil,
121
- style: nil,
122
- block: nil
94
+ # Creates a new Scrollbar.
95
+ #
96
+ # [content_length] Integer.
97
+ # [position] Integer.
98
+ # [orientation] Symbol (default: <tt>:vertical</tt>).
99
+ # [thumb_symbol] String (default: <tt>"█"</tt>).
100
+ # [thumb_style] Style (optional).
101
+ # [track_symbol] String (optional).
102
+ # [track_style] Style (optional).
103
+ # [begin_symbol] String (optional).
104
+ # [begin_style] Style (optional).
105
+ # [end_symbol] String (optional).
106
+ # [end_style] Style (optional).
107
+ # [style] Style (optional).
108
+ # [block] Block (optional).
109
+ def initialize(
110
+ content_length:,
111
+ position:,
112
+ orientation: :vertical,
113
+ thumb_symbol: "█",
114
+ thumb_style: nil,
115
+ track_symbol: nil,
116
+ track_style: nil,
117
+ begin_symbol: nil,
118
+ begin_style: nil,
119
+ end_symbol: nil,
120
+ end_style: nil,
121
+ style: nil,
122
+ block: nil
123
+ )
124
+ super(
125
+ content_length: Integer(content_length),
126
+ position: Integer(position),
127
+ orientation:,
128
+ thumb_symbol:,
129
+ thumb_style:,
130
+ track_symbol:,
131
+ track_style:,
132
+ begin_symbol:,
133
+ begin_style:,
134
+ end_symbol:,
135
+ end_style:,
136
+ style:,
137
+ block:
123
138
  )
124
- super(
125
- content_length: Integer(content_length),
126
- position: Integer(position),
127
- orientation: orientation,
128
- thumb_symbol: thumb_symbol,
129
- thumb_style: thumb_style,
130
- track_symbol: track_symbol,
131
- track_style: track_style,
132
- begin_symbol: begin_symbol,
133
- begin_style: begin_style,
134
- end_symbol: end_symbol,
135
- end_style: end_style,
136
- style: style,
137
- block: block
138
- )
139
- end
140
139
  end
140
+ end
141
141
  end
@@ -59,7 +59,7 @@ module RatatuiRuby
59
59
  # [text] Text content (String or Text::Line).
60
60
  # [style] Style (optional).
61
61
  def initialize(x:, y:, text:, style: nil)
62
- super(x: Float(x), y: Float(y), text: text, style: style)
62
+ super(x: Float(x), y: Float(y), text:, style:)
63
63
  end
64
64
  end
65
65
  end