ratatui_ruby 0.4.0 → 0.5.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 (351) 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 +87 -171
  7. data/CHANGELOG.md +38 -1
  8. data/README.md +8 -3
  9. data/REUSE.toml +20 -0
  10. data/doc/application_architecture.md +105 -45
  11. data/doc/application_testing.md +5 -3
  12. data/doc/contributors/design/ruby_frontend.md +9 -5
  13. data/doc/contributors/developing_examples.md +76 -18
  14. data/doc/contributors/documentation_style.md +7 -0
  15. data/doc/contributors/index.md +2 -0
  16. data/doc/event_handling.md +10 -4
  17. data/doc/images/app_all_events.png +0 -0
  18. data/doc/images/app_color_picker.png +0 -0
  19. data/doc/images/verify_readme_usage.png +0 -0
  20. data/doc/images/widget_barchart_demo.png +0 -0
  21. data/doc/images/widget_block_padding.png +0 -0
  22. data/doc/images/widget_block_titles.png +0 -0
  23. data/doc/images/widget_box_demo.png +0 -0
  24. data/doc/images/widget_calendar_demo.png +0 -0
  25. data/doc/images/widget_cell_demo.png +0 -0
  26. data/doc/images/widget_chart_demo.png +0 -0
  27. data/doc/images/widget_gauge_demo.png +0 -0
  28. data/doc/images/widget_layout_split.png +0 -0
  29. data/doc/images/widget_line_gauge_demo.png +0 -0
  30. data/doc/images/widget_list_demo.png +0 -0
  31. data/doc/images/widget_ratatui_logo_demo.png +0 -0
  32. data/doc/images/widget_ratatui_mascot_demo.png +0 -0
  33. data/doc/images/widget_render.png +0 -0
  34. data/doc/images/widget_scrollbar_demo.png +0 -0
  35. data/doc/images/widget_sparkline_demo.png +0 -0
  36. data/doc/images/widget_style_colors.png +0 -0
  37. data/doc/images/widget_table_flex.png +0 -0
  38. data/doc/images/widget_tabs_demo.png +0 -0
  39. data/doc/interactive_design.md +25 -30
  40. data/doc/quickstart.md +147 -120
  41. data/examples/app_all_events/README.md +81 -0
  42. data/examples/app_all_events/app.rb +93 -0
  43. data/examples/app_all_events/model/event_color_cycle.rb +41 -0
  44. data/examples/app_all_events/model/event_entry.rb +75 -0
  45. data/examples/app_all_events/model/events.rb +180 -0
  46. data/examples/app_all_events/model/highlight.rb +57 -0
  47. data/examples/app_all_events/model/timestamp.rb +54 -0
  48. data/examples/app_all_events/test/snapshots/after_focus_lost.txt +24 -0
  49. data/examples/app_all_events/test/snapshots/after_focus_regained.txt +24 -0
  50. data/examples/app_all_events/test/snapshots/after_horizontal_resize.txt +24 -0
  51. data/examples/app_all_events/test/snapshots/after_key_a.txt +24 -0
  52. data/examples/app_all_events/test/snapshots/after_key_ctrl_x.txt +24 -0
  53. data/examples/app_all_events/test/snapshots/after_mouse_click.txt +24 -0
  54. data/examples/app_all_events/test/snapshots/after_mouse_drag.txt +24 -0
  55. data/examples/app_all_events/test/snapshots/after_multiple_events.txt +24 -0
  56. data/examples/app_all_events/test/snapshots/after_paste.txt +24 -0
  57. data/examples/app_all_events/test/snapshots/after_resize.txt +24 -0
  58. data/examples/app_all_events/test/snapshots/after_right_click.txt +24 -0
  59. data/examples/app_all_events/test/snapshots/after_vertical_resize.txt +24 -0
  60. data/examples/app_all_events/test/snapshots/initial_state.txt +24 -0
  61. data/examples/app_all_events/view/app_view.rb +78 -0
  62. data/examples/app_all_events/view/controls_view.rb +50 -0
  63. data/examples/app_all_events/view/counts_view.rb +55 -0
  64. data/examples/app_all_events/view/live_view.rb +69 -0
  65. data/examples/app_all_events/view/log_view.rb +60 -0
  66. data/examples/app_all_events/view.rb +7 -0
  67. data/examples/app_all_events/view_state.rb +42 -0
  68. data/examples/app_color_picker/README.md +94 -0
  69. data/examples/app_color_picker/app.rb +112 -0
  70. data/examples/app_color_picker/clipboard.rb +84 -0
  71. data/examples/app_color_picker/color.rb +191 -0
  72. data/examples/app_color_picker/copy_dialog.rb +170 -0
  73. data/examples/app_color_picker/harmony.rb +56 -0
  74. data/examples/app_color_picker/input.rb +142 -0
  75. data/examples/app_color_picker/palette.rb +80 -0
  76. data/examples/app_color_picker/scene.rb +201 -0
  77. data/examples/{login_form → app_login_form}/app.rb +39 -42
  78. data/examples/{map_demo → app_map_demo}/app.rb +24 -21
  79. data/examples/{table_select → app_table_select}/app.rb +68 -65
  80. data/examples/{quickstart_dsl → verify_quickstart_dsl}/app.rb +15 -6
  81. data/examples/verify_quickstart_layout/app.rb +69 -0
  82. data/examples/{quickstart_lifecycle → verify_quickstart_lifecycle}/app.rb +19 -10
  83. data/examples/verify_readme_usage/app.rb +34 -0
  84. data/examples/widget_barchart_demo/app.rb +238 -0
  85. data/examples/{block_padding → widget_block_padding}/app.rb +17 -13
  86. data/examples/{block_titles → widget_block_titles}/app.rb +25 -17
  87. data/examples/{box_demo → widget_box_demo}/app.rb +99 -65
  88. data/examples/widget_calendar_demo/app.rb +109 -0
  89. data/examples/widget_cell_demo/app.rb +104 -0
  90. data/examples/widget_chart_demo/app.rb +213 -0
  91. data/examples/widget_gauge_demo/app.rb +212 -0
  92. data/examples/widget_layout_split/app.rb +246 -0
  93. data/examples/widget_line_gauge_demo/app.rb +217 -0
  94. data/examples/widget_list_demo/app.rb +382 -0
  95. data/examples/widget_list_styles/app.rb +141 -0
  96. data/examples/widget_popup_demo/app.rb +104 -0
  97. data/examples/widget_ratatui_logo_demo/app.rb +103 -0
  98. data/examples/widget_ratatui_mascot_demo/app.rb +93 -0
  99. data/examples/widget_rect/app.rb +205 -0
  100. data/examples/widget_render/app.rb +184 -0
  101. data/examples/widget_rich_text/app.rb +137 -0
  102. data/examples/widget_scroll_text/app.rb +108 -0
  103. data/examples/widget_scrollbar_demo/app.rb +153 -0
  104. data/examples/widget_sparkline_demo/app.rb +274 -0
  105. data/examples/widget_style_colors/app.rb +19 -21
  106. data/examples/widget_table_flex/app.rb +95 -0
  107. data/examples/widget_tabs_demo/app.rb +167 -0
  108. data/ext/ratatui_ruby/Cargo.lock +1 -1
  109. data/ext/ratatui_ruby/Cargo.toml +1 -1
  110. data/ext/ratatui_ruby/src/events.rs +121 -36
  111. data/ext/ratatui_ruby/src/frame.rs +115 -0
  112. data/ext/ratatui_ruby/src/lib.rs +79 -26
  113. data/ext/ratatui_ruby/src/rendering.rs +8 -4
  114. data/ext/ratatui_ruby/src/style.rs +138 -57
  115. data/ext/ratatui_ruby/src/terminal.rs +5 -9
  116. data/ext/ratatui_ruby/src/text.rs +13 -6
  117. data/ext/ratatui_ruby/src/widgets/barchart.rs +56 -54
  118. data/ext/ratatui_ruby/src/widgets/block.rs +7 -6
  119. data/ext/ratatui_ruby/src/widgets/canvas.rs +21 -3
  120. data/ext/ratatui_ruby/src/widgets/chart.rs +20 -10
  121. data/ext/ratatui_ruby/src/widgets/layout.rs +9 -4
  122. data/ext/ratatui_ruby/src/widgets/list.rs +32 -9
  123. data/ext/ratatui_ruby/src/widgets/overlay.rs +2 -1
  124. data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
  125. data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +19 -8
  126. data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +17 -10
  127. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +4 -2
  128. data/ext/ratatui_ruby/src/widgets/sparkline.rs +14 -11
  129. data/ext/ratatui_ruby/src/widgets/table.rs +8 -4
  130. data/ext/ratatui_ruby/src/widgets/tabs.rs +11 -11
  131. data/lib/ratatui_ruby/cell.rb +3 -3
  132. data/lib/ratatui_ruby/event/key.rb +1 -1
  133. data/lib/ratatui_ruby/event/none.rb +43 -0
  134. data/lib/ratatui_ruby/event.rb +56 -4
  135. data/lib/ratatui_ruby/frame.rb +87 -0
  136. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +11 -11
  137. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +1 -5
  138. data/lib/ratatui_ruby/schema/bar_chart.rb +217 -217
  139. data/lib/ratatui_ruby/schema/block.rb +163 -168
  140. data/lib/ratatui_ruby/schema/calendar.rb +66 -67
  141. data/lib/ratatui_ruby/schema/canvas.rb +63 -63
  142. data/lib/ratatui_ruby/schema/center.rb +46 -46
  143. data/lib/ratatui_ruby/schema/chart.rb +135 -143
  144. data/lib/ratatui_ruby/schema/clear.rb +42 -42
  145. data/lib/ratatui_ruby/schema/constraint.rb +76 -76
  146. data/lib/ratatui_ruby/schema/cursor.rb +25 -25
  147. data/lib/ratatui_ruby/schema/gauge.rb +53 -53
  148. data/lib/ratatui_ruby/schema/layout.rb +87 -87
  149. data/lib/ratatui_ruby/schema/line_gauge.rb +62 -62
  150. data/lib/ratatui_ruby/schema/list.rb +86 -84
  151. data/lib/ratatui_ruby/schema/overlay.rb +31 -31
  152. data/lib/ratatui_ruby/schema/paragraph.rb +80 -80
  153. data/lib/ratatui_ruby/schema/ratatui_logo.rb +10 -6
  154. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +10 -5
  155. data/lib/ratatui_ruby/schema/rect.rb +60 -60
  156. data/lib/ratatui_ruby/schema/scrollbar.rb +119 -119
  157. data/lib/ratatui_ruby/schema/shape/label.rb +1 -1
  158. data/lib/ratatui_ruby/schema/sparkline.rb +111 -110
  159. data/lib/ratatui_ruby/schema/style.rb +46 -46
  160. data/lib/ratatui_ruby/schema/table.rb +112 -119
  161. data/lib/ratatui_ruby/schema/tabs.rb +66 -67
  162. data/lib/ratatui_ruby/session/autodoc.rb +417 -0
  163. data/lib/ratatui_ruby/session.rb +40 -23
  164. data/lib/ratatui_ruby/test_helper.rb +185 -19
  165. data/lib/ratatui_ruby/version.rb +1 -1
  166. data/lib/ratatui_ruby.rb +65 -39
  167. data/{examples/sparkline_demo → sig/examples/app_all_events}/app.rbs +3 -2
  168. data/sig/examples/app_all_events/model/event_entry.rbs +16 -0
  169. data/sig/examples/app_all_events/model/events.rbs +15 -0
  170. data/sig/examples/app_all_events/model/timestamp.rbs +11 -0
  171. data/sig/examples/app_all_events/view/app_view.rbs +8 -0
  172. data/sig/examples/app_all_events/view/controls_view.rbs +6 -0
  173. data/sig/examples/app_all_events/view/counts_view.rbs +6 -0
  174. data/sig/examples/app_all_events/view/live_view.rbs +6 -0
  175. data/sig/examples/app_all_events/view/log_view.rbs +6 -0
  176. data/sig/examples/app_all_events/view.rbs +8 -0
  177. data/sig/examples/app_all_events/view_state.rbs +15 -0
  178. data/{examples/list_demo → sig/examples/app_color_picker}/app.rbs +2 -2
  179. data/sig/examples/app_login_form/app.rbs +11 -0
  180. data/sig/examples/app_map_demo/app.rbs +11 -0
  181. data/sig/examples/app_table_select/app.rbs +11 -0
  182. data/sig/examples/verify_quickstart_dsl/app.rbs +11 -0
  183. data/sig/examples/verify_quickstart_lifecycle/app.rbs +11 -0
  184. data/sig/examples/verify_readme_usage/app.rbs +11 -0
  185. data/sig/examples/widget_block_padding/app.rbs +11 -0
  186. data/sig/examples/widget_block_titles/app.rbs +11 -0
  187. data/sig/examples/widget_box_demo/app.rbs +11 -0
  188. data/sig/examples/widget_calendar_demo/app.rbs +11 -0
  189. data/sig/examples/widget_cell_demo/app.rbs +11 -0
  190. data/sig/examples/widget_chart_demo/app.rbs +11 -0
  191. data/{examples/gauge_demo → sig/examples/widget_gauge_demo}/app.rbs +4 -0
  192. data/sig/examples/widget_layout_split/app.rbs +10 -0
  193. data/sig/examples/widget_line_gauge_demo/app.rbs +11 -0
  194. data/sig/examples/widget_list_demo/app.rbs +12 -0
  195. data/sig/examples/widget_list_styles/app.rbs +11 -0
  196. data/sig/examples/widget_popup_demo/app.rbs +11 -0
  197. data/sig/examples/widget_ratatui_logo_demo/app.rbs +11 -0
  198. data/sig/examples/widget_ratatui_mascot_demo/app.rbs +11 -0
  199. data/sig/examples/widget_rect/app.rbs +12 -0
  200. data/sig/examples/widget_render/app.rbs +10 -0
  201. data/sig/examples/widget_rich_text/app.rbs +11 -0
  202. data/sig/examples/widget_scroll_text/app.rbs +11 -0
  203. data/sig/examples/widget_scrollbar_demo/app.rbs +11 -0
  204. data/sig/examples/widget_sparkline_demo/app.rbs +10 -0
  205. data/{examples → sig/examples}/widget_style_colors/app.rbs +1 -1
  206. data/sig/examples/widget_table_flex/app.rbs +11 -0
  207. data/sig/ratatui_ruby/frame.rbs +9 -0
  208. data/sig/ratatui_ruby/ratatui_ruby.rbs +3 -2
  209. data/sig/ratatui_ruby/schema/draw.rbs +4 -0
  210. data/sig/ratatui_ruby/schema/layout.rbs +1 -1
  211. data/sig/ratatui_ruby/session.rbs +94 -0
  212. data/tasks/autodoc/inventory.rb +61 -0
  213. data/tasks/autodoc/member.rb +56 -0
  214. data/tasks/autodoc/name.rb +19 -0
  215. data/tasks/autodoc/notice.rb +26 -0
  216. data/tasks/autodoc/rbs.rb +38 -0
  217. data/tasks/autodoc/rdoc.rb +45 -0
  218. data/tasks/autodoc.rake +47 -0
  219. data/tasks/bump/history.rb +2 -2
  220. data/tasks/doc.rake +600 -6
  221. data/tasks/example_viewer.html.erb +172 -0
  222. data/tasks/lint.rake +8 -4
  223. data/tasks/resources/index.html.erb +6 -0
  224. data/tasks/sourcehut.rake +4 -4
  225. data/tasks/terminal_preview/app_screenshot.rb +1 -3
  226. data/tasks/terminal_preview/crash_report.rb +7 -9
  227. data/tasks/terminal_preview/launcher_script.rb +4 -6
  228. data/tasks/terminal_preview/preview_collection.rb +4 -6
  229. data/tasks/terminal_preview/safety_confirmation.rb +3 -5
  230. data/tasks/terminal_preview/saved_screenshot.rb +7 -9
  231. data/tasks/terminal_preview/terminal_window.rb +7 -9
  232. data/tasks/test.rake +1 -1
  233. data/tasks/website/index_page.rb +3 -3
  234. data/tasks/website/version.rb +10 -10
  235. data/tasks/website/version_menu.rb +10 -12
  236. data/tasks/website/versioned_documentation.rb +49 -17
  237. data/tasks/website/website.rb +6 -8
  238. data/tasks/website.rake +4 -4
  239. metadata +156 -125
  240. data/LICENSES/BSD-2-Clause.txt +0 -9
  241. data/doc/contributors/better_dx.md +0 -543
  242. data/doc/contributors/example_analysis.md +0 -82
  243. data/doc/images/all_events.png +0 -0
  244. data/doc/images/block_padding.png +0 -0
  245. data/doc/images/block_titles.png +0 -0
  246. data/doc/images/box_demo.png +0 -0
  247. data/doc/images/calendar_demo.png +0 -0
  248. data/doc/images/cell_demo.png +0 -0
  249. data/doc/images/chart_demo.png +0 -0
  250. data/doc/images/flex_layout.png +0 -0
  251. data/doc/images/gauge_demo.png +0 -0
  252. data/doc/images/line_gauge_demo.png +0 -0
  253. data/doc/images/list_demo.png +0 -0
  254. data/doc/images/readme_usage.png +0 -0
  255. data/doc/images/scrollbar_demo.png +0 -0
  256. data/doc/images/sparkline_demo.png +0 -0
  257. data/doc/images/table_flex.png +0 -0
  258. data/examples/all_events/app.rb +0 -169
  259. data/examples/all_events/app.rbs +0 -7
  260. data/examples/all_events/test_app.rb +0 -139
  261. data/examples/analytics/app.rb +0 -258
  262. data/examples/analytics/app.rbs +0 -7
  263. data/examples/analytics/test_app.rb +0 -132
  264. data/examples/block_padding/app.rbs +0 -7
  265. data/examples/block_padding/test_app.rb +0 -31
  266. data/examples/block_titles/app.rbs +0 -7
  267. data/examples/block_titles/test_app.rb +0 -34
  268. data/examples/box_demo/app.rbs +0 -7
  269. data/examples/box_demo/test_app.rb +0 -88
  270. data/examples/calendar_demo/app.rb +0 -101
  271. data/examples/calendar_demo/app.rbs +0 -7
  272. data/examples/calendar_demo/test_app.rb +0 -108
  273. data/examples/cell_demo/app.rb +0 -108
  274. data/examples/cell_demo/app.rbs +0 -7
  275. data/examples/cell_demo/test_app.rb +0 -36
  276. data/examples/chart_demo/app.rb +0 -203
  277. data/examples/chart_demo/app.rbs +0 -7
  278. data/examples/chart_demo/test_app.rb +0 -102
  279. data/examples/custom_widget/app.rb +0 -51
  280. data/examples/custom_widget/app.rbs +0 -7
  281. data/examples/custom_widget/test_app.rb +0 -30
  282. data/examples/flex_layout/app.rb +0 -156
  283. data/examples/flex_layout/app.rbs +0 -7
  284. data/examples/flex_layout/test_app.rb +0 -65
  285. data/examples/gauge_demo/app.rb +0 -182
  286. data/examples/gauge_demo/test_app.rb +0 -120
  287. data/examples/hit_test/app.rb +0 -175
  288. data/examples/hit_test/app.rbs +0 -7
  289. data/examples/hit_test/test_app.rb +0 -102
  290. data/examples/line_gauge_demo/app.rb +0 -190
  291. data/examples/line_gauge_demo/app.rbs +0 -7
  292. data/examples/line_gauge_demo/test_app.rb +0 -129
  293. data/examples/list_demo/app.rb +0 -253
  294. data/examples/list_demo/test_app.rb +0 -237
  295. data/examples/list_styles/app.rb +0 -140
  296. data/examples/list_styles/app.rbs +0 -7
  297. data/examples/list_styles/test_app.rb +0 -157
  298. data/examples/login_form/app.rbs +0 -7
  299. data/examples/login_form/test_app.rb +0 -51
  300. data/examples/map_demo/app.rbs +0 -7
  301. data/examples/map_demo/test_app.rb +0 -149
  302. data/examples/mouse_events/app.rb +0 -97
  303. data/examples/mouse_events/app.rbs +0 -7
  304. data/examples/mouse_events/test_app.rb +0 -53
  305. data/examples/popup_demo/app.rb +0 -103
  306. data/examples/popup_demo/app.rbs +0 -7
  307. data/examples/popup_demo/test_app.rb +0 -54
  308. data/examples/quickstart_dsl/app.rbs +0 -7
  309. data/examples/quickstart_dsl/test_app.rb +0 -29
  310. data/examples/quickstart_lifecycle/app.rbs +0 -7
  311. data/examples/quickstart_lifecycle/test_app.rb +0 -29
  312. data/examples/ratatui_logo_demo/app.rb +0 -79
  313. data/examples/ratatui_logo_demo/app.rbs +0 -7
  314. data/examples/ratatui_logo_demo/test_app.rb +0 -51
  315. data/examples/ratatui_mascot_demo/app.rb +0 -84
  316. data/examples/ratatui_mascot_demo/app.rbs +0 -7
  317. data/examples/ratatui_mascot_demo/test_app.rb +0 -47
  318. data/examples/readme_usage/app.rb +0 -29
  319. data/examples/readme_usage/app.rbs +0 -7
  320. data/examples/readme_usage/test_app.rb +0 -29
  321. data/examples/rich_text/app.rb +0 -141
  322. data/examples/rich_text/app.rbs +0 -7
  323. data/examples/rich_text/test_app.rb +0 -166
  324. data/examples/scroll_text/app.rb +0 -103
  325. data/examples/scroll_text/app.rbs +0 -7
  326. data/examples/scroll_text/test_app.rb +0 -110
  327. data/examples/scrollbar_demo/app.rb +0 -143
  328. data/examples/scrollbar_demo/app.rbs +0 -7
  329. data/examples/scrollbar_demo/test_app.rb +0 -77
  330. data/examples/sparkline_demo/app.rb +0 -240
  331. data/examples/sparkline_demo/test_app.rb +0 -107
  332. data/examples/table_flex/app.rb +0 -65
  333. data/examples/table_flex/app.rbs +0 -7
  334. data/examples/table_flex/test_app.rb +0 -36
  335. data/examples/table_select/app.rbs +0 -7
  336. data/examples/table_select/test_app.rb +0 -180
  337. data/examples/widget_style_colors/test_app.rb +0 -48
  338. /data/doc/images/{analytics.png → app_analytics.png} +0 -0
  339. /data/doc/images/{custom_widget.png → app_custom_widget.png} +0 -0
  340. /data/doc/images/{login_form.png → app_login_form.png} +0 -0
  341. /data/doc/images/{map_demo.png → app_map_demo.png} +0 -0
  342. /data/doc/images/{mouse_events.png → app_mouse_events.png} +0 -0
  343. /data/doc/images/{table_select.png → app_table_select.png} +0 -0
  344. /data/doc/images/{quickstart_dsl.png → verify_quickstart_dsl.png} +0 -0
  345. /data/doc/images/{ratatui_logo_demo.png → verify_quickstart_layout.png} +0 -0
  346. /data/doc/images/{quickstart_lifecycle.png → verify_quickstart_lifecycle.png} +0 -0
  347. /data/doc/images/{list_styles.png → widget_list_styles.png} +0 -0
  348. /data/doc/images/{popup_demo.png → widget_popup_demo.png} +0 -0
  349. /data/doc/images/{hit_test.png → widget_rect.png} +0 -0
  350. /data/doc/images/{rich_text.png → widget_rich_text.png} +0 -0
  351. /data/doc/images/{scroll_text.png → widget_scroll_text.png} +0 -0
@@ -4,75 +4,75 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays a compact, single-line progress bar.
8
- #
9
- # Screen space is precious. Standard block gauges are bulky and consume multiple rows.
10
- #
11
- # This widget compresses the feedback. It draws a progress bar using line characters, fitting perfectly into tight layouts or lists.
12
- #
13
- # Use it when you need to show status without stealing focus or space.
14
- #
15
- # === Examples
16
- #
17
- # LineGauge.new(
18
- # ratio: 0.4,
19
- # filled_style: Style.new(fg: :blue),
20
- # unfilled_symbol: "-"
21
- # )
22
- class LineGauge < Data.define(:ratio, :label, :style, :filled_style, :unfilled_style, :block, :filled_symbol, :unfilled_symbol)
23
- ##
24
- # :attr_reader: ratio
25
- # Progress ratio from 0.0 to 1.0.
7
+ # Displays a compact, single-line progress bar.
8
+ #
9
+ # Screen space is precious. Standard block gauges are bulky and consume multiple rows.
10
+ #
11
+ # This widget compresses the feedback. It draws a progress bar using line characters, fitting perfectly into tight layouts or lists.
12
+ #
13
+ # Use it when you need to show status without stealing focus or space.
14
+ #
15
+ # {rdoc-image:/doc/images/widget_line_gauge_demo.png}[link:/examples/widget_line_gauge_demo/app_rb.html]
16
+ #
17
+ # === Example
18
+ #
19
+ # Run the interactive demo from the terminal:
20
+ #
21
+ # ruby examples/widget_line_gauge_demo/app.rb
22
+ class LineGauge < Data.define(:ratio, :label, :style, :filled_style, :unfilled_style, :block, :filled_symbol, :unfilled_symbol)
23
+ ##
24
+ # :attr_reader: ratio
25
+ # Progress ratio from 0.0 to 1.0.
26
26
 
27
- ##
28
- # :attr_reader: label
29
- # Optional label.
27
+ ##
28
+ # :attr_reader: label
29
+ # Optional label.
30
30
 
31
- ##
32
- # :attr_reader: style
33
- # Base style applied to the entire gauge.
31
+ ##
32
+ # :attr_reader: style
33
+ # Base style applied to the entire gauge.
34
34
 
35
- ##
36
- # :attr_reader: filled_style
37
- # Style for the completed portion.
35
+ ##
36
+ # :attr_reader: filled_style
37
+ # Style for the completed portion.
38
38
 
39
- ##
40
- # :attr_reader: unfilled_style
41
- # Style for the remainder.
39
+ ##
40
+ # :attr_reader: unfilled_style
41
+ # Style for the remainder.
42
42
 
43
- ##
44
- # :attr_reader: block
45
- # Optional wrapping block.
43
+ ##
44
+ # :attr_reader: block
45
+ # Optional wrapping block.
46
46
 
47
- ##
48
- # :attr_reader: filled_symbol
49
- # Character for filled segments.
47
+ ##
48
+ # :attr_reader: filled_symbol
49
+ # Character for filled segments.
50
50
 
51
- ##
52
- # :attr_reader: unfilled_symbol
53
- # Character for empty segments.
51
+ ##
52
+ # :attr_reader: unfilled_symbol
53
+ # Character for empty segments.
54
54
 
55
- # Creates a new LineGauge.
56
- #
57
- # [ratio] Float (0.0 - 1.0).
58
- # [label] String (optional).
59
- # [style] Style (optional, base style for the gauge).
60
- # [filled_style] Style.
61
- # [unfilled_style] Style.
62
- # [block] Block.
63
- # [filled_symbol] String (default: <tt>"█"</tt>).
64
- # [unfilled_symbol] String (default: <tt>"░"</tt>).
65
- def initialize(ratio: 0.0, label: nil, style: nil, filled_style: nil, unfilled_style: nil, block: nil, filled_symbol: "█", unfilled_symbol: "░")
66
- super(
67
- ratio: Float(ratio),
68
- label: label,
69
- style: style,
70
- filled_style: filled_style,
71
- unfilled_style: unfilled_style,
72
- block: block,
73
- filled_symbol: filled_symbol,
74
- unfilled_symbol: unfilled_symbol
75
- )
76
- end
55
+ # Creates a new LineGauge.
56
+ #
57
+ # [ratio] Float (0.0 - 1.0).
58
+ # [label] String (optional).
59
+ # [style] Style (optional, base style for the gauge).
60
+ # [filled_style] Style.
61
+ # [unfilled_style] Style.
62
+ # [block] Block.
63
+ # [filled_symbol] String (default: <tt>"█"</tt>).
64
+ # [unfilled_symbol] String (default: <tt>"░"</tt>).
65
+ def initialize(ratio: 0.0, label: nil, style: nil, filled_style: nil, unfilled_style: nil, block: nil, filled_symbol: "█", unfilled_symbol: "░")
66
+ super(
67
+ ratio: Float(ratio),
68
+ label:,
69
+ style:,
70
+ filled_style:,
71
+ unfilled_style:,
72
+ block:,
73
+ filled_symbol:,
74
+ unfilled_symbol:
75
+ )
77
76
  end
77
+ end
78
78
  end
@@ -4,99 +4,101 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays a selectable list of items.
8
- #
9
- # Users need to choose from options. Menus, file explorers, and selectors are everywhere.
10
- # Implementing navigation, highlighting, and scrolling state from scratch is tedious.
11
- #
12
- # This widget manages the list. It renders the items. It highlights the selection. It handles the scrolling window.
13
- #
14
- # Use it to build main menus, navigation sidebars, or logs.
15
- #
16
- # === Examples
17
- #
18
- # # Basic List
19
- # List.new(items: ["Item 1", "Item 2"])
20
- #
21
- # # Navigation Menu
22
- # List.new(
23
- # items: ["New Game", "Load Game", "Options", "Quit"],
24
- # selected_index: 0,
25
- # highlight_style: Style.new(bg: :blue),
26
- # highlight_symbol: ">> "
27
- # )
28
- class List < Data.define(:items, :selected_index, :style, :highlight_style, :highlight_symbol, :repeat_highlight_symbol, :highlight_spacing, :direction, :scroll_padding, :block)
29
- ##
30
- # :attr_reader: items
31
- # The items to display (Array of Strings).
7
+ # Displays a selectable list of items.
8
+ #
9
+ # Users need to choose from options. Menus, file explorers, and selectors are everywhere.
10
+ # Implementing navigation, highlighting, and scrolling state from scratch is tedious.
11
+ #
12
+ # This widget manages the list. It renders the items. It highlights the selection. It handles the scrolling window.
13
+ #
14
+ # Use it to build main menus, navigation sidebars, or logs.
15
+ #
16
+ # {rdoc-image:/doc/images/widget_list_demo.png}[link:/examples/widget_list_demo/app_rb.html]
17
+ #
18
+ # === Examples
19
+ #
20
+ # # Basic List
21
+ # List.new(items: ["Item 1", "Item 2"])
22
+ #
23
+ # # Navigation Menu
24
+ # List.new(
25
+ # items: ["New Game", "Load Game", "Options", "Quit"],
26
+ # selected_index: 0,
27
+ # highlight_style: Style.new(bg: :blue),
28
+ # highlight_symbol: ">> "
29
+ # )
30
+ class List < Data.define(:items, :selected_index, :style, :highlight_style, :highlight_symbol, :repeat_highlight_symbol, :highlight_spacing, :direction, :scroll_padding, :block)
31
+ ##
32
+ # :attr_reader: items
33
+ # The items to display (Array of Strings).
32
34
 
33
- ##
34
- # :attr_reader: selected_index
35
- # Index of the active selection (Integer or nil).
35
+ ##
36
+ # :attr_reader: selected_index
37
+ # Index of the active selection (Integer or nil).
36
38
 
37
- ##
38
- # :attr_reader: style
39
- # Base style for unselected items.
39
+ ##
40
+ # :attr_reader: style
41
+ # Base style for unselected items.
40
42
 
41
- ##
42
- # :attr_reader: highlight_style
43
- # Style for the selected item.
43
+ ##
44
+ # :attr_reader: highlight_style
45
+ # Style for the selected item.
44
46
 
45
- ##
46
- # :attr_reader: highlight_symbol
47
- # Symbol drawn before the selected item.
47
+ ##
48
+ # :attr_reader: highlight_symbol
49
+ # Symbol drawn before the selected item.
48
50
 
49
- ##
50
- # :attr_reader: repeat_highlight_symbol
51
- # Whether to repeat the highlight symbol for each line of the selected item.
51
+ ##
52
+ # :attr_reader: repeat_highlight_symbol
53
+ # Whether to repeat the highlight symbol for each line of the selected item.
52
54
 
53
- ##
54
- # :attr_reader: highlight_spacing
55
- # When to show the highlight symbol column.
56
- #
57
- # <tt>:always</tt>, <tt>:when_selected</tt>, or <tt>:never</tt>.
55
+ ##
56
+ # :attr_reader: highlight_spacing
57
+ # When to show the highlight symbol column.
58
+ #
59
+ # <tt>:always</tt>, <tt>:when_selected</tt>, or <tt>:never</tt>.
58
60
 
59
- ##
60
- # :attr_reader: direction
61
- # Render direction.
62
- #
63
- # <tt>:top_to_bottom</tt> or <tt>:bottom_to_top</tt>.
61
+ ##
62
+ # :attr_reader: direction
63
+ # Render direction.
64
+ #
65
+ # <tt>:top_to_bottom</tt> or <tt>:bottom_to_top</tt>.
64
66
 
65
- ##
66
- # :attr_reader: scroll_padding
67
- # Number of items to keep visible above/below the selected item when scrolling (Integer or nil).
67
+ ##
68
+ # :attr_reader: scroll_padding
69
+ # Number of items to keep visible above/below the selected item when scrolling (Integer or nil).
68
70
 
69
- ##
70
- # :attr_reader: block
71
- # Optional wrapping block.
71
+ ##
72
+ # :attr_reader: block
73
+ # Optional wrapping block.
72
74
 
73
- # Creates a new List.
74
- #
75
- # Integer parameters accept any object responding to +to_int+ or +to_i+ (duck-typed).
76
- #
77
- # [items] Array of Strings.
78
- # [selected_index] Numeric (nullable, coerced to Integer).
79
- # [style] Style object.
80
- # [highlight_style] Style object.
81
- # [highlight_symbol] String (default: <tt>"> "</tt>).
82
- # [repeat_highlight_symbol] Boolean (default: <tt>false</tt>).
83
- # [highlight_spacing] Symbol (default: <tt>:when_selected</tt>).
84
- # [direction] Symbol (default: <tt>:top_to_bottom</tt>).
85
- # [scroll_padding] Numeric (nullable, coerced to Integer, default: <tt>nil</tt>).
86
- # [block] Block (optional).
87
- def initialize(items: [], selected_index: nil, style: nil, highlight_style: nil, highlight_symbol: "> ", repeat_highlight_symbol: false, highlight_spacing: :when_selected, direction: :top_to_bottom, scroll_padding: nil, block: nil)
88
- super(
89
- items: items,
90
- selected_index: selected_index.nil? ? nil : Integer(selected_index),
91
- style: style,
92
- highlight_style: highlight_style,
93
- highlight_symbol: highlight_symbol,
94
- repeat_highlight_symbol: repeat_highlight_symbol,
95
- highlight_spacing: highlight_spacing,
96
- direction: direction,
97
- scroll_padding: scroll_padding.nil? ? nil : Integer(scroll_padding),
98
- block: block
99
- )
100
- end
75
+ # Creates a new List.
76
+ #
77
+ # Integer parameters accept any object responding to +to_int+ or +to_i+ (duck-typed).
78
+ #
79
+ # [items] Array of Strings.
80
+ # [selected_index] Numeric (nullable, coerced to Integer).
81
+ # [style] Style object.
82
+ # [highlight_style] Style object.
83
+ # [highlight_symbol] String (default: <tt>"> "</tt>).
84
+ # [repeat_highlight_symbol] Boolean (default: <tt>false</tt>).
85
+ # [highlight_spacing] Symbol (default: <tt>:when_selected</tt>).
86
+ # [direction] Symbol (default: <tt>:top_to_bottom</tt>).
87
+ # [scroll_padding] Numeric (nullable, coerced to Integer, default: <tt>nil</tt>).
88
+ # [block] Block (optional).
89
+ def initialize(items: [], selected_index: nil, style: nil, highlight_style: nil, highlight_symbol: "> ", repeat_highlight_symbol: false, highlight_spacing: :when_selected, direction: :top_to_bottom, scroll_padding: nil, block: nil)
90
+ super(
91
+ items:,
92
+ selected_index: selected_index.nil? ? nil : Integer(selected_index),
93
+ style:,
94
+ highlight_style:,
95
+ highlight_symbol:,
96
+ repeat_highlight_symbol:,
97
+ highlight_spacing:,
98
+ direction:,
99
+ scroll_padding: scroll_padding.nil? ? nil : Integer(scroll_padding),
100
+ block:
101
+ )
101
102
  end
103
+ end
102
104
  end
@@ -4,38 +4,38 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Stacks widgets on top of each other.
7
+ # Stacks widgets on top of each other.
8
+ #
9
+ # Terminal interfaces are 2D grids, but complex UIs require depth. You need to float modals over text,
10
+ # or place a status bar on top of a map.
11
+ #
12
+ # This widget manages the Z-axis. It renders a list of widgets sequentially into the same area.
13
+ # Later widgets draw over earlier ones (Painter's Algorithm).
14
+ #
15
+ # Use overlays to compose complex scenes. Combine backgrounds, main content, and floating elements.
16
+ #
17
+ # === Examples
18
+ #
19
+ # Overlay.new(
20
+ # layers: [
21
+ # BackgroundMap.new,
22
+ # StatusBar.new, # Draws over map
23
+ # ModalDialog.new # Draws over everything
24
+ # ]
25
+ # )
26
+ class Overlay < Data.define(:layers)
27
+ ##
28
+ # :attr_reader: layers
29
+ # The stack of widgets to render.
8
30
  #
9
- # Terminal interfaces are 2D grids, but complex UIs require depth. You need to float modals over text,
10
- # or place a status bar on top of a map.
11
- #
12
- # This widget manages the Z-axis. It renders a list of widgets sequentially into the same area.
13
- # Later widgets draw over earlier ones (Painter's Algorithm).
14
- #
15
- # Use overlays to compose complex scenes. Combine backgrounds, main content, and floating elements.
16
- #
17
- # === Examples
18
- #
19
- # Overlay.new(
20
- # layers: [
21
- # BackgroundMap.new,
22
- # StatusBar.new, # Draws over map
23
- # ModalDialog.new # Draws over everything
24
- # ]
25
- # )
26
- class Overlay < Data.define(:layers)
27
- ##
28
- # :attr_reader: layers
29
- # The stack of widgets to render.
30
- #
31
- # Rendered from index 0 to N. Index N is the top-most layer.
31
+ # Rendered from index 0 to N. Index N is the top-most layer.
32
32
 
33
- # Creates a new Overlay.
34
- #
35
- # [layers]
36
- # Array of widgets.
37
- def initialize(layers: [])
38
- super
39
- end
33
+ # Creates a new Overlay.
34
+ #
35
+ # [layers]
36
+ # Array of widgets.
37
+ def initialize(layers: [])
38
+ super
40
39
  end
40
+ end
41
41
  end
@@ -4,94 +4,94 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays a block of text.
8
- #
9
- # Raw strings are insufficient for UIs. They overflow constraints. They don't respect alignment (left, center, right).
10
- #
11
- # This widget creates a smart text container. It wraps content to fit the area. It aligns text as requested. It supports scrolling.
12
- #
13
- # Use it for everything from simple labels to complex, multi-paragraph documents.
14
- #
15
- # === Examples
16
- #
17
- # # Basic Text
18
- # Paragraph.new(text: "Hello, World!")
19
- #
20
- # # Styled container with wrapping
21
- # Paragraph.new(
22
- # text: "This is a long line that will wrap automatically.",
23
- # style: Style.new(fg: :green),
24
- # wrap: true,
25
- # block: Block.new(title: "Output", borders: [:all])
26
- # )
27
- #
28
- # # Scrolling mechanism
29
- # Paragraph.new(text: large_text, scroll: [scroll_y, 0])
30
- class Paragraph < Data.define(:text, :style, :block, :wrap, :alignment, :scroll)
31
- ##
32
- # :attr_reader: text
33
- # The content to display.
7
+ # Displays a block of text.
8
+ #
9
+ # Raw strings are insufficient for UIs. They overflow constraints. They don't respect alignment (left, center, right).
10
+ #
11
+ # This widget creates a smart text container. It wraps content to fit the area. It aligns text as requested. It supports scrolling.
12
+ #
13
+ # Use it for everything from simple labels to complex, multi-paragraph documents.
14
+ #
15
+ # === Examples
16
+ #
17
+ # # Basic Text
18
+ # Paragraph.new(text: "Hello, World!")
19
+ #
20
+ # # Styled container with wrapping
21
+ # Paragraph.new(
22
+ # text: "This is a long line that will wrap automatically.",
23
+ # style: Style.new(fg: :green),
24
+ # wrap: true,
25
+ # block: Block.new(title: "Output", borders: [:all])
26
+ # )
27
+ #
28
+ # # Scrolling mechanism
29
+ # Paragraph.new(text: large_text, scroll: [scroll_y, 0])
30
+ class Paragraph < Data.define(:text, :style, :block, :wrap, :alignment, :scroll)
31
+ ##
32
+ # :attr_reader: text
33
+ # The content to display.
34
34
 
35
- ##
36
- # :attr_reader: style
37
- # Base style for the text.
35
+ ##
36
+ # :attr_reader: style
37
+ # Base style for the text.
38
38
 
39
- ##
40
- # :attr_reader: block
41
- # Optional wrapping block.
39
+ ##
40
+ # :attr_reader: block
41
+ # Optional wrapping block.
42
42
 
43
- ##
44
- # :attr_reader: wrap
45
- # Whether to wrap text at the edge of the container (Boolean).
43
+ ##
44
+ # :attr_reader: wrap
45
+ # Whether to wrap text at the edge of the container (Boolean).
46
46
 
47
- ##
48
- # :attr_reader: alignment
49
- # Text alignment.
50
- #
51
- # <tt>:left</tt>, <tt>:center</tt>, or <tt>:right</tt>.
47
+ ##
48
+ # :attr_reader: alignment
49
+ # Text alignment.
50
+ #
51
+ # <tt>:left</tt>, <tt>:center</tt>, or <tt>:right</tt>.
52
52
 
53
- ##
54
- # :attr_reader: scroll
55
- # Scroll offset [y, x].
53
+ ##
54
+ # :attr_reader: scroll
55
+ # Scroll offset [y, x].
56
56
 
57
- # Creates a new Paragraph.
58
- #
59
- # [text] String or Text::Line array.
60
- # [style] Style object.
61
- # [block] Block object.
62
- # [wrap] Boolean (default: false).
63
- # [alignment] Symbol (default: <tt>:left</tt>).
64
- # [scroll] Array of [y, x] integers (duck-typed via +to_int+).
65
- def initialize(text:, style: Style.default, block: nil, wrap: false, alignment: :left, scroll: [0, 0])
66
- super(
67
- text: text,
68
- style: style,
69
- block: block,
70
- wrap: wrap,
71
- alignment: alignment,
72
- scroll: [Integer(scroll[0]), Integer(scroll[1])]
73
- )
74
- end
57
+ # Creates a new Paragraph.
58
+ #
59
+ # [text] String or Text::Line array.
60
+ # [style] Style object.
61
+ # [block] Block object.
62
+ # [wrap] Boolean (default: false).
63
+ # [alignment] Symbol (default: <tt>:left</tt>).
64
+ # [scroll] Array of [y, x] integers (duck-typed via +to_int+).
65
+ def initialize(text:, style: Style.default, block: nil, wrap: false, alignment: :left, scroll: [0, 0])
66
+ super(
67
+ text:,
68
+ style:,
69
+ block:,
70
+ wrap:,
71
+ alignment:,
72
+ scroll: [Integer(scroll[0]), Integer(scroll[1])]
73
+ )
74
+ end
75
75
 
76
- # Legacy constructor support.
77
- def self.new(text:, style: nil, fg: nil, bg: nil, block: nil, wrap: false, alignment: :left, scroll: [0, 0])
78
- style ||= Style.new(fg:, bg:)
79
- coerced_scroll = [Integer(scroll[0]), Integer(scroll[1])]
80
- super(text:, style:, block:, wrap:, alignment:, scroll: coerced_scroll)
81
- end
76
+ # Legacy constructor support.
77
+ def self.new(text:, style: nil, fg: nil, bg: nil, block: nil, wrap: false, alignment: :left, scroll: [0, 0])
78
+ style ||= Style.new(fg:, bg:)
79
+ coerced_scroll = [Integer(scroll[0]), Integer(scroll[1])]
80
+ super(text:, style:, block:, wrap:, alignment:, scroll: coerced_scroll)
81
+ end
82
82
 
83
- # Returns the number of lines the paragraph would take up if rendered with the given width.
84
- #
85
- # [width] Integer (max width).
86
- def line_count(width)
87
- RatatuiRuby.warn_experimental_feature("Paragraph#line_count")
88
- RatatuiRuby._paragraph_line_count(self, Integer(width))
89
- end
83
+ # Returns the number of lines the paragraph would take up if rendered with the given width.
84
+ #
85
+ # [width] Integer (max width).
86
+ def line_count(width)
87
+ RatatuiRuby.warn_experimental_feature("Paragraph#line_count")
88
+ RatatuiRuby._paragraph_line_count(self, Integer(width))
89
+ end
90
90
 
91
- # Returns the minimum width needed to not wrap any text.
92
- def line_width
93
- RatatuiRuby.warn_experimental_feature("Paragraph#line_width")
94
- RatatuiRuby._paragraph_line_width(self)
95
- end
91
+ # Returns the minimum width needed to not wrap any text.
92
+ def line_width
93
+ RatatuiRuby.warn_experimental_feature("Paragraph#line_width")
94
+ RatatuiRuby._paragraph_line_width(self)
96
95
  end
96
+ end
97
97
  end
@@ -6,20 +6,24 @@
6
6
  module RatatuiRuby
7
7
  # Displays the Ratatui logo.
8
8
  #
9
- # A simple widget that renders the Ratatui logo. Useful for demos and about screens.
9
+ # Branding is important for identity. Users need to recognize the tools they use.
10
10
  #
11
- # === Examples
11
+ # This widget renders the official Ratatui logo.
12
12
  #
13
- # RatatuiLogo.new
13
+ # Use it for splash screens, about sections, or terminal dashboards.
14
14
  #
15
+ # {rdoc-image:/doc/images/widget_ratatui_logo_demo.png}[link:/examples/widget_ratatui_logo_demo/app_rb.html]
16
+ #
17
+ # === Example
18
+ #
19
+ # Run the interactive demo from the terminal:
20
+ #
21
+ # ruby examples/widget_ratatui_logo_demo/app.rb
15
22
  class RatatuiLogo < Data.define
16
23
  ##
17
24
  # :method: new
18
25
  # :call-seq: new -> RatatuiLogo
19
26
  #
20
27
  # Creates a new RatatuiLogo.
21
- def initialize
22
- super
23
- end
24
28
  end
25
29
  end
@@ -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