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,128 +4,129 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays high-density data in a compact row.
8
- #
9
- # Users need context. A single value ("90% CPU") tells you current status, but not the trend.
10
- # Full charts take up too much room.
11
- #
12
- # This widget solves the density problem. It condenses history into a single line of variable-height blocks.
13
- #
14
- # Use it in dashboards, headers, or list items to providing trending data at a glance.
15
- #
16
- # === Examples
17
- #
18
- # Sparkline.new(
19
- # data: [1, 4, 3, 8, 2, 9, 3, 2],
20
- # style: Style.new(fg: :yellow)
21
- # )
22
- class Sparkline < Data.define(:data, :max, :style, :block, :direction, :absent_value_symbol, :absent_value_style, :bar_set)
23
- ##
24
- # :attr_reader: data
25
- # Array of integer values to plot.
7
+ # Displays high-density data in a compact row.
8
+ #
9
+ # Users need context. A single value ("90% CPU") tells you current status, but not the trend.
10
+ # Full charts take up too much room.
11
+ #
12
+ # This widget solves the density problem. It condenses history into a single line of variable-height blocks.
13
+ #
14
+ # Use it in dashboards, headers, or list items to providing trending data at a glance.
15
+ #
16
+ # {rdoc-image:/doc/images/widget_sparkline_demo.png}[link:/examples/widget_sparkline_demo/app_rb.html]
17
+ #
18
+ # === Example
19
+ #
20
+ # Run the interactive demo from the terminal:
21
+ #
22
+ # ruby examples/widget_sparkline_demo/app.rb
23
+ class Sparkline < Data.define(:data, :max, :style, :block, :direction, :absent_value_symbol, :absent_value_style, :bar_set)
24
+ ##
25
+ # :attr_reader: data
26
+ # Array of integer values to plot.
26
27
 
27
- ##
28
- # :attr_reader: max
29
- # Maximum value for scaling (optional).
30
- #
31
- # If nil, derived from data max.
28
+ ##
29
+ # :attr_reader: max
30
+ # Maximum value for scaling (optional).
31
+ #
32
+ # If nil, derived from data max.
32
33
 
33
- ##
34
- # :attr_reader: style
35
- # Style for the bars.
34
+ ##
35
+ # :attr_reader: style
36
+ # Style for the bars.
36
37
 
37
- ##
38
- # :attr_reader: block
39
- # Optional wrapping block.
38
+ ##
39
+ # :attr_reader: block
40
+ # Optional wrapping block.
40
41
 
41
- ##
42
- # :attr_reader: direction
43
- # Direction to render data.
44
- #
45
- # Accepts +:left_to_right+ (default) or +:right_to_left+.
46
- # Use +:right_to_left+ when new data should appear on the left.
42
+ ##
43
+ # :attr_reader: direction
44
+ # Direction to render data.
45
+ #
46
+ # Accepts +:left_to_right+ (default) or +:right_to_left+.
47
+ # Use +:right_to_left+ when new data should appear on the left.
47
48
 
48
- ##
49
- # :attr_reader: absent_value_symbol
50
- # Character to render for absent (nil) values (optional).
51
- #
52
- # If nil, absent values are rendered with a space.
49
+ ##
50
+ # :attr_reader: absent_value_symbol
51
+ # Character to render for absent (nil) values (optional).
52
+ #
53
+ # If nil, absent values are rendered with a space.
53
54
 
54
- ##
55
- # :attr_reader: absent_value_style
56
- # Style for absent (nil) values (optional).
55
+ ##
56
+ # :attr_reader: absent_value_style
57
+ # Style for absent (nil) values (optional).
57
58
 
58
- ##
59
- # :attr_reader: bar_set
60
- # Custom characters for the bars (optional).
61
- #
62
- # A Hash with keys defining the characters for the bars.
63
- # Keys: <tt>:empty</tt>, <tt>:one_eighth</tt>, <tt>:one_quarter</tt>, <tt>:three_eighths</tt>, <tt>:half</tt>, <tt>:five_eighths</tt>, <tt>:three_quarters</tt>, <tt>:seven_eighths</tt>, <tt>:full</tt>.
64
- #
65
- # You can also use integers (0-8) as keys, where 0 is empty, 4 is half, and 8 is full.
66
- #
67
- # Alternatively, you can pass an Array of 9 strings, where index 0 is empty and index 8 is full.
68
- #
69
- # === Examples
70
- #
71
- # bar_set: {
72
- # empty: " ",
73
- # one_eighth: " ",
74
- # one_quarter: "▂",
75
- # three_eighths: "▃",
76
- # half: "▄",
77
- # five_eighths: "▅",
78
- # three_quarters: "▆",
79
- # seven_eighths: "▇",
80
- # full: "█"
81
- # }
82
- #
83
- # # Numeric keys (0-8)
84
- # bar_set: {
85
- # 0 => " ", 1 => " ", 2 => "▂", 3 => "▃", 4 => "▄", 5 => "▅", 6 => "▆", 7 => "▇", 8 => "█"
86
- # }
87
- #
88
- # # Array (9 items)
89
- # bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
59
+ ##
60
+ # :attr_reader: bar_set
61
+ # Custom characters for the bars (optional).
62
+ #
63
+ # A Hash with keys defining the characters for the bars.
64
+ # Keys: <tt>:empty</tt>, <tt>:one_eighth</tt>, <tt>:one_quarter</tt>, <tt>:three_eighths</tt>, <tt>:half</tt>, <tt>:five_eighths</tt>, <tt>:three_quarters</tt>, <tt>:seven_eighths</tt>, <tt>:full</tt>.
65
+ #
66
+ # You can also use integers (0-8) as keys, where 0 is empty, 4 is half, and 8 is full.
67
+ #
68
+ # Alternatively, you can pass an Array of 9 strings, where index 0 is empty and index 8 is full.
69
+ #
70
+ # === Examples
71
+ #
72
+ # bar_set: {
73
+ # empty: " ",
74
+ # one_eighth: " ",
75
+ # one_quarter: "▂",
76
+ # three_eighths: "▃",
77
+ # half: "▄",
78
+ # five_eighths: "▅",
79
+ # three_quarters: "▆",
80
+ # seven_eighths: "▇",
81
+ # full: "█"
82
+ # }
83
+ #
84
+ # # Numeric keys (0-8)
85
+ # bar_set: {
86
+ # 0 => " ", 1 => " ", 2 => "▂", 3 => "▃", 4 => "▄", 5 => "▅", 6 => "▆", 7 => "▇", 8 => "█"
87
+ # }
88
+ #
89
+ # # Array (9 items)
90
+ # bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
90
91
 
91
- BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
92
+ BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
92
93
 
93
- # Creates a new Sparkline widget.
94
- #
95
- # [data] Array of Integers or nil. nil marks an absent value (distinct from 0).
96
- # [max] Max value (optional).
97
- # [style] Style (optional).
98
- # [block] Block (optional).
99
- # [direction] +:left_to_right+ or +:right_to_left+ (default: +:left_to_right+).
100
- # [absent_value_symbol] Character for absent (nil) values (optional).
101
- # [absent_value_style] Style for absent (nil) values (optional).
102
- # [bar_set] Hash or Array of custom characters (optional).
103
- def initialize(data:, max: nil, style: nil, block: nil, direction: :left_to_right, absent_value_symbol: nil, absent_value_style: nil, bar_set: nil)
104
- if bar_set
105
- if bar_set.is_a?(Array) && bar_set.size == 9
106
- # Convert Array to Hash using BAR_KEYS order
107
- bar_set = BAR_KEYS.zip(bar_set).to_h
108
- else
109
- bar_set = bar_set.dup
110
- # Normalize numeric keys (0-8) to symbolic keys
111
- BAR_KEYS.each_with_index do |key, i|
112
- if val = bar_set.delete(i) || bar_set.delete(i.to_s)
113
- bar_set[key] = val
114
- end
94
+ # Creates a new Sparkline widget.
95
+ #
96
+ # [data] Array of Integers or nil. nil marks an absent value (distinct from 0).
97
+ # [max] Max value (optional).
98
+ # [style] Style (optional).
99
+ # [block] Block (optional).
100
+ # [direction] +:left_to_right+ or +:right_to_left+ (default: +:left_to_right+).
101
+ # [absent_value_symbol] Character for absent (nil) values (optional).
102
+ # [absent_value_style] Style for absent (nil) values (optional).
103
+ # [bar_set] Hash or Array of custom characters (optional).
104
+ def initialize(data:, max: nil, style: nil, block: nil, direction: :left_to_right, absent_value_symbol: nil, absent_value_style: nil, bar_set: nil)
105
+ if bar_set
106
+ if bar_set.is_a?(Array) && bar_set.size == 9
107
+ # Convert Array to Hash using BAR_KEYS order
108
+ bar_set = BAR_KEYS.zip(bar_set).to_h
109
+ else
110
+ bar_set = bar_set.dup
111
+ # Normalize numeric keys (0-8) to symbolic keys
112
+ BAR_KEYS.each_with_index do |key, i|
113
+ if (val = bar_set.delete(i) || bar_set.delete(i.to_s))
114
+ bar_set[key] = val
115
115
  end
116
116
  end
117
117
  end
118
- coerced_data = data.map { |v| v.nil? ? nil : Integer(v) }
119
- super(
120
- data: coerced_data,
121
- max: max.nil? ? nil : Integer(max),
122
- style: style,
123
- block: block,
124
- direction: direction,
125
- absent_value_symbol: absent_value_symbol,
126
- absent_value_style: absent_value_style,
127
- bar_set: bar_set
128
- )
129
118
  end
119
+ coerced_data = data.map { |v| v.nil? ? nil : Integer(v) }
120
+ super(
121
+ data: coerced_data,
122
+ max: max.nil? ? nil : Integer(max),
123
+ style:,
124
+ block:,
125
+ direction:,
126
+ absent_value_symbol:,
127
+ absent_value_style:,
128
+ bar_set:
129
+ )
130
130
  end
131
+ end
131
132
  end
@@ -4,56 +4,76 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Defines colors and text modifiers.
7
+ # Defines colors and text modifiers.
8
+ #
9
+ # The terminal is traditionally monochrome, but efficient interfaces use color to convey meaning.
10
+ # Red for errors. Green for success. Bold for headers.
11
+ #
12
+ # This value object encapsulates those choices. It applies foreground and background colors. It adds effects like italics or blinking.
13
+ #
14
+ # Use it to theme your application or highlight critical data.
15
+ #
16
+ # === Examples
17
+ #
18
+ # # Standard colors
19
+ # Style.new(fg: :red, bg: :white, modifiers: [:bold])
20
+ #
21
+ # # Hex colors
22
+ # Style.new(fg: "#ff00ff")
23
+ #
24
+ # === Supported Colors
25
+ #
26
+ # ==== Integer
27
+ # Represents an indexed color from the Xterm 256-color palette (0-255).
28
+ # * <tt>0</tt>–<tt>15</tt>: Standard and bright ANSI colors.
29
+ # * <tt>16</tt>–<tt>231</tt>: {6x6x6 Color Cube}[https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit].
30
+ # * <tt>232</tt>–<tt>255</tt>: Grayscale ramp.
31
+ #
32
+ # ==== Symbol
33
+ # Represents a named color from the standard ANSI palette. Supported values:
34
+ # * <tt>:black</tt>, <tt>:red</tt>, <tt>:green</tt>, <tt>:yellow</tt>,
35
+ # <tt>:blue</tt>, <tt>:magenta</tt>, <tt>:cyan</tt>, <tt>:gray</tt>
36
+ # * <tt>:dark_gray</tt>, <tt>:light_red</tt>, <tt>:light_green</tt>,
37
+ # <tt>:light_yellow</tt>, <tt>:light_blue</tt>, <tt>:light_magenta</tt>,
38
+ # <tt>:light_cyan</tt>, <tt>:white</tt>
39
+ #
40
+ # ==== String
41
+ # Represents a specific RGB color using a Hex code (<tt>"#RRGGBB"</tt>).
42
+ # Requires a terminal emulator with "True Color" (24-bit color) support.
43
+ class Style < Data.define(:fg, :bg, :modifiers)
44
+ ##
45
+ # :attr_reader: fg
46
+ # Foreground color.
8
47
  #
9
- # The terminal is traditionally monochrome, but efficient interfaces use color to convey meaning.
10
- # Red for errors. Green for success. Bold for headers.
11
- #
12
- # This value object encapsulates those choices. It applies foreground and background colors. It adds effects like italics or blinking.
13
- #
14
- # Use it to theme your application or highlight critical data.
15
- #
16
- # === Examples
17
- #
18
- # # Standard colors
19
- # Style.new(fg: :red, bg: :white, modifiers: [:bold])
20
- #
21
- # # Hex colors
22
- # Style.new(fg: "#ff00ff")
23
- class Style < Data.define(:fg, :bg, :modifiers)
24
- ##
25
- # :attr_reader: fg
26
- # Foreground color.
27
- #
28
- # Symbol (<tt>:red</tt>) or Hex String (<tt>"#ffffff"</tt>).
48
+ # Symbol (<tt>:red</tt>), Hex String (<tt>"#ffffff"</tt>), or Integer (0-255).
29
49
 
30
- ##
31
- # :attr_reader: bg
32
- # Background color.
33
- #
34
- # Symbol (<tt>:black</tt>) or Hex String (<tt>"#000000"</tt>).
50
+ ##
51
+ # :attr_reader: bg
52
+ # Background color.
53
+ #
54
+ # Symbol (<tt>:black</tt>), Hex String (<tt>"#000000"</tt>), or Integer (0-255).
35
55
 
36
- ##
37
- # :attr_reader: modifiers
38
- # Text effects.
39
- #
40
- # Array of symbols: <tt>:bold</tt>, <tt>:dim</tt>, <tt>:italic</tt>, <tt>:underlined</tt>,
41
- # <tt>:slow_blink</tt>, <tt>:rapid_blink</tt>, <tt>:reversed</tt>, <tt>:hidden</tt>, <tt>:crossed_out</tt>.
56
+ ##
57
+ # :attr_reader: modifiers
58
+ # Text effects.
59
+ #
60
+ # Array of symbols: <tt>:bold</tt>, <tt>:dim</tt>, <tt>:italic</tt>, <tt>:underlined</tt>,
61
+ # <tt>:slow_blink</tt>, <tt>:rapid_blink</tt>, <tt>:reversed</tt>, <tt>:hidden</tt>, <tt>:crossed_out</tt>.
42
62
 
43
- # Creates a new Style.
44
- #
45
- # [fg] Color (Symbol/String).
46
- # [bg] Color (Symbol/String).
47
- # [modifiers] Array of Symbols.
48
- def initialize(fg: nil, bg: nil, modifiers: [])
49
- super
50
- end
63
+ # Creates a new Style.
64
+ #
65
+ # [fg] Color (Symbol/String/Integer).
66
+ # [bg] Color (Symbol/String/Integer).
67
+ # [modifiers] Array of Symbols.
68
+ def initialize(fg: nil, bg: nil, modifiers: [])
69
+ super
70
+ end
51
71
 
52
- # Returns an empty style.
53
- #
54
- # Use this as a baseline to prevent style inheritance issues or when no styling is required.
55
- def self.default
56
- new
57
- end
72
+ # Returns an empty style.
73
+ #
74
+ # Use this as a baseline to prevent style inheritance issues or when no styling is required.
75
+ def self.default
76
+ new
58
77
  end
78
+ end
59
79
  end
@@ -4,125 +4,136 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays structured data in rows and columns.
7
+ # Displays structured data in rows and columns.
8
+ #
9
+ # Data is often multidimensional. You need to show relationships between fields (Name, Age, ID).
10
+ # Aligning columns manually in a monospaced environment is painful and error-prone.
11
+ #
12
+ # This widget creates a grid. It enforces column widths using constraints. It renders headers, rows, and footers aligned perfectly.
13
+ #
14
+ # Use it to display database records, logs, or file lists.
15
+ #
16
+ # {rdoc-image:/doc/images/widget_table_flex.png}[link:/examples/widget_table_flex/app_rb.html]
17
+ #
18
+ # === Example
19
+ #
20
+ # Run the interactive demo from the terminal:
21
+ #
22
+ # ruby examples/widget_table_flex/app.rb
23
+ class Table < Data.define(:header, :rows, :widths, :highlight_style, :highlight_symbol, :highlight_spacing, :column_highlight_style, :cell_highlight_style, :selected_row, :selected_column, :offset, :block, :footer, :flex, :style, :column_spacing)
24
+ ##
25
+ # :attr_reader: header
26
+ # Header row content (Array of Strings).
27
+
28
+ ##
29
+ # :attr_reader: rows
30
+ # Data rows (Array of Arrays of Strings).
31
+
32
+ ##
33
+ # :attr_reader: widths
34
+ # Column width constraints (Array of Constraint).
35
+
36
+ ##
37
+ # :attr_reader: highlight_style
38
+ # Style for the selected row.
39
+
40
+ ##
41
+ # :attr_reader: highlight_symbol
42
+ # Symbol for the selected row.
43
+
44
+ ##
45
+ # :attr_reader: highlight_spacing
46
+ # When to show the highlight symbol column (<tt>:always</tt>, <tt>:when_selected</tt>, <tt>:never</tt>).
47
+
48
+ ##
49
+ # :attr_reader: column_highlight_style
50
+ # Style for the selected column.
51
+
52
+ ##
53
+ # :attr_reader: cell_highlight_style
54
+ # Style for the selected cell (intersection of row and column).
55
+
56
+ ##
57
+ # :attr_reader: selected_row
58
+ # Index of the selected row (Integer or nil).
59
+
60
+ ##
61
+ # :attr_reader: selected_column
62
+ # Index of the selected column (Integer or nil).
63
+
64
+ ##
65
+ # :attr_reader: offset
66
+ # Scroll offset (Integer or nil).
8
67
  #
9
- # Data is often multidimensional. You need to show relationships between fields (Name, Age, ID).
10
- # Aligning columns manually in a monospaced environment is painful and error-prone.
68
+ # Controls the viewport's starting row position in the table.
11
69
  #
12
- # This widget creates a grid. It enforces column widths using constraints. It renders headers, rows, and footers aligned perfectly.
70
+ # When +nil+ (default), Ratatui auto-scrolls to keep the selection visible ("natural scrolling").
13
71
  #
14
- # Use it to display database records, logs, or file lists.
72
+ # When set, forces the viewport to start at this row index. Use this for:
73
+ # - **Passive scrolling**: Scroll through a log table without selecting rows.
74
+ # - **Click-to-select math**: Calculate which row index corresponds to a click coordinate.
15
75
  #
16
- # === Examples
76
+ # *Important*: When both +offset+ and +selected_row+ are set, Ratatui may still adjust
77
+ # the viewport during rendering to ensure the selection stays visible. Set +selected_row+
78
+ # to +nil+ for fully manual scroll control.
79
+
80
+ ##
81
+ # :attr_reader: block
82
+ # Optional wrapping block.
83
+
84
+ ##
85
+ # :attr_reader: footer
86
+ # Footer row content (Array of Strings).
87
+
88
+ ##
89
+ # :attr_reader: flex
90
+ # Flex mode for column distribution.
91
+
92
+ ##
93
+ # :attr_reader: style
94
+ # Base style for the entire table.
95
+
96
+ ##
97
+ # :attr_reader: column_spacing
98
+ # Spacing between columns (Integer, default 1).
99
+
100
+ # Creates a new Table.
17
101
  #
18
- # Table.new(
19
- # header: ["ID", "Name", "Status"],
20
- # rows: [
21
- # ["1", "Hideo", "Active"],
22
- # ["2", "Kojima", "Idle"]
23
- # ],
24
- # widths: [
25
- # Constraint.length(5),
26
- # Constraint.fill(1),
27
- # Constraint.length(10)
28
- # ]
29
- # )
30
- class Table < Data.define(:header, :rows, :widths, :highlight_style, :highlight_symbol, :highlight_spacing, :column_highlight_style, :cell_highlight_style, :selected_row, :selected_column, :block, :footer, :flex, :style, :column_spacing)
31
- ##
32
- # :attr_reader: header
33
- # Header row content (Array of Strings).
34
-
35
- ##
36
- # :attr_reader: rows
37
- # Data rows (Array of Arrays of Strings).
38
-
39
- ##
40
- # :attr_reader: widths
41
- # Column width constraints (Array of Constraint).
42
-
43
- ##
44
- # :attr_reader: highlight_style
45
- # Style for the selected row.
46
-
47
- ##
48
- # :attr_reader: highlight_symbol
49
- # Symbol for the selected row.
50
-
51
- ##
52
- # :attr_reader: highlight_spacing
53
- # When to show the highlight symbol column (:always, :when_selected, :never).
54
-
55
- ##
56
- # :attr_reader: column_highlight_style
57
- # Style for the selected column.
58
-
59
- ##
60
- # :attr_reader: cell_highlight_style
61
- # Style for the selected cell (intersection of row and column).
62
-
63
- ##
64
- # :attr_reader: selected_row
65
- # Index of the selected row (Integer or nil).
66
-
67
- ##
68
- # :attr_reader: selected_column
69
- # Index of the selected column (Integer or nil).
70
-
71
- ##
72
- # :attr_reader: block
73
- # Optional wrapping block.
74
-
75
- ##
76
- # :attr_reader: footer
77
- # Footer row content (Array of Strings).
78
-
79
- ##
80
- # :attr_reader: flex
81
- # Flex mode for column distribution.
82
-
83
- ##
84
- # :attr_reader: style
85
- # Base style for the entire table.
86
-
87
- ##
88
- # :attr_reader: column_spacing
89
- # Spacing between columns (Integer, default 1).
90
-
91
- # Creates a new Table.
92
- #
93
- # [header] Array of strings/paragraphs.
94
- # [rows] 2D Array of strings/paragraphs.
95
- # [widths] Array of Constraints.
96
- # [highlight_style] Style object.
97
- # [highlight_symbol] String.
98
- # [highlight_spacing] Symbol (optional, default: <tt>:when_selected</tt>).
99
- # [column_highlight_style] Style object.
100
- # [cell_highlight_style] Style object.
101
- # [selected_row] Integer (nullable).
102
- # [selected_column] Integer (nullable).
103
- # [block] Block (optional).
104
- # [footer] Array of strings/paragraphs (optional).
105
- # [flex] Symbol (optional, default: <tt>:legacy</tt>).
106
- # [style] Style object or Hash (optional).
107
- # [column_spacing] Integer (optional, default: 1).
108
- def initialize(header: nil, rows: [], widths: [], highlight_style: nil, highlight_symbol: "> ", highlight_spacing: :when_selected, column_highlight_style: nil, cell_highlight_style: nil, selected_row: nil, selected_column: nil, block: nil, footer: nil, flex: :legacy, style: nil, column_spacing: 1)
109
- super(
110
- header: header,
111
- rows: rows,
112
- widths: widths,
113
- highlight_style: highlight_style,
114
- highlight_symbol: highlight_symbol,
115
- highlight_spacing: highlight_spacing,
116
- column_highlight_style: column_highlight_style,
117
- cell_highlight_style: cell_highlight_style,
118
- selected_row: selected_row.nil? ? nil : Integer(selected_row),
119
- selected_column: selected_column.nil? ? nil : Integer(selected_column),
120
- block: block,
121
- footer: footer,
122
- flex: flex,
123
- style: style,
124
- column_spacing: Integer(column_spacing)
125
- )
126
- end
102
+ # [header] Array of strings/paragraphs.
103
+ # [rows] 2D Array of strings/paragraphs.
104
+ # [widths] Array of Constraints.
105
+ # [highlight_style] Style object.
106
+ # [highlight_symbol] String.
107
+ # [highlight_spacing] Symbol (optional, default: <tt>:when_selected</tt>).
108
+ # [column_highlight_style] Style object.
109
+ # [cell_highlight_style] Style object.
110
+ # [selected_row] Integer (nullable).
111
+ # [selected_column] Integer (nullable).
112
+ # [offset] Numeric (nullable, coerced to Integer). Forces scroll position when set.
113
+ # [block] Block (optional).
114
+ # [footer] Array of strings/paragraphs (optional).
115
+ # [flex] Symbol (optional, default: <tt>:legacy</tt>).
116
+ # [style] Style object or Hash (optional).
117
+ # [column_spacing] Integer (optional, default: 1).
118
+ def initialize(header: nil, rows: [], widths: [], highlight_style: nil, highlight_symbol: "> ", highlight_spacing: :when_selected, column_highlight_style: nil, cell_highlight_style: nil, selected_row: nil, selected_column: nil, offset: nil, block: nil, footer: nil, flex: :legacy, style: nil, column_spacing: 1)
119
+ super(
120
+ header:,
121
+ rows:,
122
+ widths:,
123
+ highlight_style:,
124
+ highlight_symbol:,
125
+ highlight_spacing:,
126
+ column_highlight_style:,
127
+ cell_highlight_style:,
128
+ selected_row: selected_row.nil? ? nil : Integer(selected_row),
129
+ selected_column: selected_column.nil? ? nil : Integer(selected_column),
130
+ offset: offset.nil? ? nil : Integer(offset),
131
+ block:,
132
+ footer:,
133
+ flex:,
134
+ style:,
135
+ column_spacing: Integer(column_spacing)
136
+ )
127
137
  end
138
+ end
128
139
  end