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
@@ -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 (String or Text::Span for rich styling).
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 or Text::Span (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,122 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays a selectable list of items.
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, :offset, :style, :highlight_style, :highlight_symbol, :repeat_highlight_symbol, :highlight_spacing, :direction, :scroll_padding, :block)
31
+ ##
32
+ # :attr_reader: items
33
+ # The items to display.
8
34
  #
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.
35
+ # Accepts Array of Strings, Text::Spans, Text::Lines, or ListItem objects.
36
+ # For styled individual rows, use ListItem with a style.
37
+
38
+ ##
39
+ # :attr_reader: selected_index
40
+ # Index of the active selection (Integer or nil).
41
+
42
+ ##
43
+ # :attr_reader: offset
44
+ # Scroll offset (Integer or nil).
13
45
  #
14
- # Use it to build main menus, navigation sidebars, or logs.
46
+ # Controls the viewport's starting position in the list.
15
47
  #
16
- # === Examples
48
+ # When +nil+ (default), Ratatui auto-scrolls to keep the selection visible ("natural scrolling").
17
49
  #
18
- # # Basic List
19
- # List.new(items: ["Item 1", "Item 2"])
50
+ # When set, forces the viewport to start at this item index. Use this for:
51
+ # - **Passive scrolling**: Scroll through a log viewer without selecting items.
52
+ # - **Click-to-select math**: Calculate which item index corresponds to a click coordinate.
20
53
  #
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).
32
-
33
- ##
34
- # :attr_reader: selected_index
35
- # Index of the active selection (Integer or nil).
54
+ # *Important*: When both +offset+ and +selected_index+ are set, Ratatui may still adjust
55
+ # the viewport during rendering to ensure the selection stays visible. Set +selected_index+
56
+ # to +nil+ for fully manual scroll control.
36
57
 
37
- ##
38
- # :attr_reader: style
39
- # Base style for unselected items.
58
+ ##
59
+ # :attr_reader: style
60
+ # Base style for unselected items.
40
61
 
41
- ##
42
- # :attr_reader: highlight_style
43
- # Style for the selected item.
62
+ ##
63
+ # :attr_reader: highlight_style
64
+ # Style for the selected item.
44
65
 
45
- ##
46
- # :attr_reader: highlight_symbol
47
- # Symbol drawn before the selected item.
66
+ ##
67
+ # :attr_reader: highlight_symbol
68
+ # Symbol drawn before the selected item.
48
69
 
49
- ##
50
- # :attr_reader: repeat_highlight_symbol
51
- # Whether to repeat the highlight symbol for each line of the selected item.
70
+ ##
71
+ # :attr_reader: repeat_highlight_symbol
72
+ # Whether to repeat the highlight symbol for each line of the selected item.
52
73
 
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>.
74
+ ##
75
+ # :attr_reader: highlight_spacing
76
+ # When to show the highlight symbol column.
77
+ #
78
+ # <tt>:always</tt>, <tt>:when_selected</tt>, or <tt>:never</tt>.
58
79
 
59
- ##
60
- # :attr_reader: direction
61
- # Render direction.
62
- #
63
- # <tt>:top_to_bottom</tt> or <tt>:bottom_to_top</tt>.
80
+ ##
81
+ # :attr_reader: direction
82
+ # Render direction.
83
+ #
84
+ # <tt>:top_to_bottom</tt> or <tt>:bottom_to_top</tt>.
64
85
 
65
- ##
66
- # :attr_reader: scroll_padding
67
- # Number of items to keep visible above/below the selected item when scrolling (Integer or nil).
86
+ ##
87
+ # :attr_reader: scroll_padding
88
+ # Number of items to keep visible above/below the selected item when scrolling (Integer or nil).
68
89
 
69
- ##
70
- # :attr_reader: block
71
- # Optional wrapping block.
90
+ ##
91
+ # :attr_reader: block
92
+ # Optional wrapping block.
72
93
 
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
94
+ # Creates a new List.
95
+ #
96
+ # Integer parameters accept any object responding to +to_int+ or +to_i+ (duck-typed).
97
+ #
98
+ # [items] Array of Strings, Text::Spans, Text::Lines, or ListItem objects.
99
+ # [selected_index] Numeric (nullable, coerced to Integer).
100
+ # [offset] Numeric (nullable, coerced to Integer). Forces scroll position when set.
101
+ # [style] Style object.
102
+ # [highlight_style] Style object.
103
+ # [highlight_symbol] String (default: <tt>"> "</tt>).
104
+ # [repeat_highlight_symbol] Boolean (default: <tt>false</tt>).
105
+ # [highlight_spacing] Symbol (default: <tt>:when_selected</tt>).
106
+ # [direction] Symbol (default: <tt>:top_to_bottom</tt>).
107
+ # [scroll_padding] Numeric (nullable, coerced to Integer, default: <tt>nil</tt>).
108
+ # [block] Block (optional).
109
+ def initialize(items: [], selected_index: nil, offset: 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)
110
+ super(
111
+ items:,
112
+ selected_index: selected_index.nil? ? nil : Integer(selected_index),
113
+ offset: offset.nil? ? nil : Integer(offset),
114
+ style:,
115
+ highlight_style:,
116
+ highlight_symbol:,
117
+ repeat_highlight_symbol:,
118
+ highlight_spacing:,
119
+ direction:,
120
+ scroll_padding: scroll_padding.nil? ? nil : Integer(scroll_padding),
121
+ block:
122
+ )
101
123
  end
124
+ end
102
125
  end
@@ -0,0 +1,41 @@
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
+ module RatatuiRuby
7
+ # A styled list item combining content with optional style.
8
+ #
9
+ # By default, List items are strings. For more control over styling individual rows,
10
+ # wrap the content in a ListItem to apply a style specific to that item.
11
+ #
12
+ # The content can be a String, Text::Span, or Text::Line. The style applies to the
13
+ # entire row background.
14
+ #
15
+ # === Examples
16
+ #
17
+ # # Item with red background
18
+ # ListItem.new(content: "Error", style: Style.new(bg: :red))
19
+ #
20
+ # # Item with styled content
21
+ # ListItem.new(
22
+ # content: Text::Span.new(content: "Status: OK", style: Style.new(fg: :green, modifiers: [:bold]))
23
+ # )
24
+ class ListItem < Data.define(:content, :style)
25
+ ##
26
+ # :attr_reader: content
27
+ # The content to display (String, Text::Span, or Text::Line).
28
+
29
+ ##
30
+ # :attr_reader: style
31
+ # The style to apply to the item (optional Style).
32
+
33
+ # Creates a new ListItem.
34
+ #
35
+ # [content] String, Text::Span, or Text::Line.
36
+ # [style] Style object (optional).
37
+ def initialize(content:, style: nil)
38
+ super
39
+ end
40
+ end
41
+ 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