ratatui_ruby 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +1 -1
  3. data/.builds/ruby-3.3.yml +1 -1
  4. data/.builds/ruby-3.4.yml +1 -1
  5. data/.builds/ruby-4.0.0.yml +1 -1
  6. data/AGENTS.md +87 -171
  7. data/CHANGELOG.md +38 -1
  8. data/README.md +8 -3
  9. data/REUSE.toml +20 -0
  10. data/doc/application_architecture.md +105 -45
  11. data/doc/application_testing.md +5 -3
  12. data/doc/contributors/design/ruby_frontend.md +9 -5
  13. data/doc/contributors/developing_examples.md +76 -18
  14. data/doc/contributors/documentation_style.md +7 -0
  15. data/doc/contributors/index.md +2 -0
  16. data/doc/event_handling.md +10 -4
  17. data/doc/images/app_all_events.png +0 -0
  18. data/doc/images/app_color_picker.png +0 -0
  19. data/doc/images/verify_readme_usage.png +0 -0
  20. data/doc/images/widget_barchart_demo.png +0 -0
  21. data/doc/images/widget_block_padding.png +0 -0
  22. data/doc/images/widget_block_titles.png +0 -0
  23. data/doc/images/widget_box_demo.png +0 -0
  24. data/doc/images/widget_calendar_demo.png +0 -0
  25. data/doc/images/widget_cell_demo.png +0 -0
  26. data/doc/images/widget_chart_demo.png +0 -0
  27. data/doc/images/widget_gauge_demo.png +0 -0
  28. data/doc/images/widget_layout_split.png +0 -0
  29. data/doc/images/widget_line_gauge_demo.png +0 -0
  30. data/doc/images/widget_list_demo.png +0 -0
  31. data/doc/images/widget_ratatui_logo_demo.png +0 -0
  32. data/doc/images/widget_ratatui_mascot_demo.png +0 -0
  33. data/doc/images/widget_render.png +0 -0
  34. data/doc/images/widget_scrollbar_demo.png +0 -0
  35. data/doc/images/widget_sparkline_demo.png +0 -0
  36. data/doc/images/widget_style_colors.png +0 -0
  37. data/doc/images/widget_table_flex.png +0 -0
  38. data/doc/images/widget_tabs_demo.png +0 -0
  39. data/doc/interactive_design.md +25 -30
  40. data/doc/quickstart.md +147 -120
  41. data/examples/app_all_events/README.md +81 -0
  42. data/examples/app_all_events/app.rb +93 -0
  43. data/examples/app_all_events/model/event_color_cycle.rb +41 -0
  44. data/examples/app_all_events/model/event_entry.rb +75 -0
  45. data/examples/app_all_events/model/events.rb +180 -0
  46. data/examples/app_all_events/model/highlight.rb +57 -0
  47. data/examples/app_all_events/model/timestamp.rb +54 -0
  48. data/examples/app_all_events/test/snapshots/after_focus_lost.txt +24 -0
  49. data/examples/app_all_events/test/snapshots/after_focus_regained.txt +24 -0
  50. data/examples/app_all_events/test/snapshots/after_horizontal_resize.txt +24 -0
  51. data/examples/app_all_events/test/snapshots/after_key_a.txt +24 -0
  52. data/examples/app_all_events/test/snapshots/after_key_ctrl_x.txt +24 -0
  53. data/examples/app_all_events/test/snapshots/after_mouse_click.txt +24 -0
  54. data/examples/app_all_events/test/snapshots/after_mouse_drag.txt +24 -0
  55. data/examples/app_all_events/test/snapshots/after_multiple_events.txt +24 -0
  56. data/examples/app_all_events/test/snapshots/after_paste.txt +24 -0
  57. data/examples/app_all_events/test/snapshots/after_resize.txt +24 -0
  58. data/examples/app_all_events/test/snapshots/after_right_click.txt +24 -0
  59. data/examples/app_all_events/test/snapshots/after_vertical_resize.txt +24 -0
  60. data/examples/app_all_events/test/snapshots/initial_state.txt +24 -0
  61. data/examples/app_all_events/view/app_view.rb +78 -0
  62. data/examples/app_all_events/view/controls_view.rb +50 -0
  63. data/examples/app_all_events/view/counts_view.rb +55 -0
  64. data/examples/app_all_events/view/live_view.rb +69 -0
  65. data/examples/app_all_events/view/log_view.rb +60 -0
  66. data/examples/app_all_events/view.rb +7 -0
  67. data/examples/app_all_events/view_state.rb +42 -0
  68. data/examples/app_color_picker/README.md +94 -0
  69. data/examples/app_color_picker/app.rb +112 -0
  70. data/examples/app_color_picker/clipboard.rb +84 -0
  71. data/examples/app_color_picker/color.rb +191 -0
  72. data/examples/app_color_picker/copy_dialog.rb +170 -0
  73. data/examples/app_color_picker/harmony.rb +56 -0
  74. data/examples/app_color_picker/input.rb +142 -0
  75. data/examples/app_color_picker/palette.rb +80 -0
  76. data/examples/app_color_picker/scene.rb +201 -0
  77. data/examples/{login_form → app_login_form}/app.rb +39 -42
  78. data/examples/{map_demo → app_map_demo}/app.rb +24 -21
  79. data/examples/{table_select → app_table_select}/app.rb +68 -65
  80. data/examples/{quickstart_dsl → verify_quickstart_dsl}/app.rb +15 -6
  81. data/examples/verify_quickstart_layout/app.rb +69 -0
  82. data/examples/{quickstart_lifecycle → verify_quickstart_lifecycle}/app.rb +19 -10
  83. data/examples/verify_readme_usage/app.rb +34 -0
  84. data/examples/widget_barchart_demo/app.rb +238 -0
  85. data/examples/{block_padding → widget_block_padding}/app.rb +17 -13
  86. data/examples/{block_titles → widget_block_titles}/app.rb +25 -17
  87. data/examples/{box_demo → widget_box_demo}/app.rb +99 -65
  88. data/examples/widget_calendar_demo/app.rb +109 -0
  89. data/examples/widget_cell_demo/app.rb +104 -0
  90. data/examples/widget_chart_demo/app.rb +213 -0
  91. data/examples/widget_gauge_demo/app.rb +212 -0
  92. data/examples/widget_layout_split/app.rb +246 -0
  93. data/examples/widget_line_gauge_demo/app.rb +217 -0
  94. data/examples/widget_list_demo/app.rb +382 -0
  95. data/examples/widget_list_styles/app.rb +141 -0
  96. data/examples/widget_popup_demo/app.rb +104 -0
  97. data/examples/widget_ratatui_logo_demo/app.rb +103 -0
  98. data/examples/widget_ratatui_mascot_demo/app.rb +93 -0
  99. data/examples/widget_rect/app.rb +205 -0
  100. data/examples/widget_render/app.rb +184 -0
  101. data/examples/widget_rich_text/app.rb +137 -0
  102. data/examples/widget_scroll_text/app.rb +108 -0
  103. data/examples/widget_scrollbar_demo/app.rb +153 -0
  104. data/examples/widget_sparkline_demo/app.rb +274 -0
  105. data/examples/widget_style_colors/app.rb +19 -21
  106. data/examples/widget_table_flex/app.rb +95 -0
  107. data/examples/widget_tabs_demo/app.rb +167 -0
  108. data/ext/ratatui_ruby/Cargo.lock +1 -1
  109. data/ext/ratatui_ruby/Cargo.toml +1 -1
  110. data/ext/ratatui_ruby/src/events.rs +121 -36
  111. data/ext/ratatui_ruby/src/frame.rs +115 -0
  112. data/ext/ratatui_ruby/src/lib.rs +79 -26
  113. data/ext/ratatui_ruby/src/rendering.rs +8 -4
  114. data/ext/ratatui_ruby/src/style.rs +138 -57
  115. data/ext/ratatui_ruby/src/terminal.rs +5 -9
  116. data/ext/ratatui_ruby/src/text.rs +13 -6
  117. data/ext/ratatui_ruby/src/widgets/barchart.rs +56 -54
  118. data/ext/ratatui_ruby/src/widgets/block.rs +7 -6
  119. data/ext/ratatui_ruby/src/widgets/canvas.rs +21 -3
  120. data/ext/ratatui_ruby/src/widgets/chart.rs +20 -10
  121. data/ext/ratatui_ruby/src/widgets/layout.rs +9 -4
  122. data/ext/ratatui_ruby/src/widgets/list.rs +32 -9
  123. data/ext/ratatui_ruby/src/widgets/overlay.rs +2 -1
  124. data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
  125. data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +19 -8
  126. data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +17 -10
  127. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +4 -2
  128. data/ext/ratatui_ruby/src/widgets/sparkline.rs +14 -11
  129. data/ext/ratatui_ruby/src/widgets/table.rs +8 -4
  130. data/ext/ratatui_ruby/src/widgets/tabs.rs +11 -11
  131. data/lib/ratatui_ruby/cell.rb +3 -3
  132. data/lib/ratatui_ruby/event/key.rb +1 -1
  133. data/lib/ratatui_ruby/event/none.rb +43 -0
  134. data/lib/ratatui_ruby/event.rb +56 -4
  135. data/lib/ratatui_ruby/frame.rb +87 -0
  136. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +11 -11
  137. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +1 -5
  138. data/lib/ratatui_ruby/schema/bar_chart.rb +217 -217
  139. data/lib/ratatui_ruby/schema/block.rb +163 -168
  140. data/lib/ratatui_ruby/schema/calendar.rb +66 -67
  141. data/lib/ratatui_ruby/schema/canvas.rb +63 -63
  142. data/lib/ratatui_ruby/schema/center.rb +46 -46
  143. data/lib/ratatui_ruby/schema/chart.rb +135 -143
  144. data/lib/ratatui_ruby/schema/clear.rb +42 -42
  145. data/lib/ratatui_ruby/schema/constraint.rb +76 -76
  146. data/lib/ratatui_ruby/schema/cursor.rb +25 -25
  147. data/lib/ratatui_ruby/schema/gauge.rb +53 -53
  148. data/lib/ratatui_ruby/schema/layout.rb +87 -87
  149. data/lib/ratatui_ruby/schema/line_gauge.rb +62 -62
  150. data/lib/ratatui_ruby/schema/list.rb +86 -84
  151. data/lib/ratatui_ruby/schema/overlay.rb +31 -31
  152. data/lib/ratatui_ruby/schema/paragraph.rb +80 -80
  153. data/lib/ratatui_ruby/schema/ratatui_logo.rb +10 -6
  154. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +10 -5
  155. data/lib/ratatui_ruby/schema/rect.rb +60 -60
  156. data/lib/ratatui_ruby/schema/scrollbar.rb +119 -119
  157. data/lib/ratatui_ruby/schema/shape/label.rb +1 -1
  158. data/lib/ratatui_ruby/schema/sparkline.rb +111 -110
  159. data/lib/ratatui_ruby/schema/style.rb +46 -46
  160. data/lib/ratatui_ruby/schema/table.rb +112 -119
  161. data/lib/ratatui_ruby/schema/tabs.rb +66 -67
  162. data/lib/ratatui_ruby/session/autodoc.rb +417 -0
  163. data/lib/ratatui_ruby/session.rb +40 -23
  164. data/lib/ratatui_ruby/test_helper.rb +185 -19
  165. data/lib/ratatui_ruby/version.rb +1 -1
  166. data/lib/ratatui_ruby.rb +65 -39
  167. data/{examples/sparkline_demo → sig/examples/app_all_events}/app.rbs +3 -2
  168. data/sig/examples/app_all_events/model/event_entry.rbs +16 -0
  169. data/sig/examples/app_all_events/model/events.rbs +15 -0
  170. data/sig/examples/app_all_events/model/timestamp.rbs +11 -0
  171. data/sig/examples/app_all_events/view/app_view.rbs +8 -0
  172. data/sig/examples/app_all_events/view/controls_view.rbs +6 -0
  173. data/sig/examples/app_all_events/view/counts_view.rbs +6 -0
  174. data/sig/examples/app_all_events/view/live_view.rbs +6 -0
  175. data/sig/examples/app_all_events/view/log_view.rbs +6 -0
  176. data/sig/examples/app_all_events/view.rbs +8 -0
  177. data/sig/examples/app_all_events/view_state.rbs +15 -0
  178. data/{examples/list_demo → sig/examples/app_color_picker}/app.rbs +2 -2
  179. data/sig/examples/app_login_form/app.rbs +11 -0
  180. data/sig/examples/app_map_demo/app.rbs +11 -0
  181. data/sig/examples/app_table_select/app.rbs +11 -0
  182. data/sig/examples/verify_quickstart_dsl/app.rbs +11 -0
  183. data/sig/examples/verify_quickstart_lifecycle/app.rbs +11 -0
  184. data/sig/examples/verify_readme_usage/app.rbs +11 -0
  185. data/sig/examples/widget_block_padding/app.rbs +11 -0
  186. data/sig/examples/widget_block_titles/app.rbs +11 -0
  187. data/sig/examples/widget_box_demo/app.rbs +11 -0
  188. data/sig/examples/widget_calendar_demo/app.rbs +11 -0
  189. data/sig/examples/widget_cell_demo/app.rbs +11 -0
  190. data/sig/examples/widget_chart_demo/app.rbs +11 -0
  191. data/{examples/gauge_demo → sig/examples/widget_gauge_demo}/app.rbs +4 -0
  192. data/sig/examples/widget_layout_split/app.rbs +10 -0
  193. data/sig/examples/widget_line_gauge_demo/app.rbs +11 -0
  194. data/sig/examples/widget_list_demo/app.rbs +12 -0
  195. data/sig/examples/widget_list_styles/app.rbs +11 -0
  196. data/sig/examples/widget_popup_demo/app.rbs +11 -0
  197. data/sig/examples/widget_ratatui_logo_demo/app.rbs +11 -0
  198. data/sig/examples/widget_ratatui_mascot_demo/app.rbs +11 -0
  199. data/sig/examples/widget_rect/app.rbs +12 -0
  200. data/sig/examples/widget_render/app.rbs +10 -0
  201. data/sig/examples/widget_rich_text/app.rbs +11 -0
  202. data/sig/examples/widget_scroll_text/app.rbs +11 -0
  203. data/sig/examples/widget_scrollbar_demo/app.rbs +11 -0
  204. data/sig/examples/widget_sparkline_demo/app.rbs +10 -0
  205. data/{examples → sig/examples}/widget_style_colors/app.rbs +1 -1
  206. data/sig/examples/widget_table_flex/app.rbs +11 -0
  207. data/sig/ratatui_ruby/frame.rbs +9 -0
  208. data/sig/ratatui_ruby/ratatui_ruby.rbs +3 -2
  209. data/sig/ratatui_ruby/schema/draw.rbs +4 -0
  210. data/sig/ratatui_ruby/schema/layout.rbs +1 -1
  211. data/sig/ratatui_ruby/session.rbs +94 -0
  212. data/tasks/autodoc/inventory.rb +61 -0
  213. data/tasks/autodoc/member.rb +56 -0
  214. data/tasks/autodoc/name.rb +19 -0
  215. data/tasks/autodoc/notice.rb +26 -0
  216. data/tasks/autodoc/rbs.rb +38 -0
  217. data/tasks/autodoc/rdoc.rb +45 -0
  218. data/tasks/autodoc.rake +47 -0
  219. data/tasks/bump/history.rb +2 -2
  220. data/tasks/doc.rake +600 -6
  221. data/tasks/example_viewer.html.erb +172 -0
  222. data/tasks/lint.rake +8 -4
  223. data/tasks/resources/index.html.erb +6 -0
  224. data/tasks/sourcehut.rake +4 -4
  225. data/tasks/terminal_preview/app_screenshot.rb +1 -3
  226. data/tasks/terminal_preview/crash_report.rb +7 -9
  227. data/tasks/terminal_preview/launcher_script.rb +4 -6
  228. data/tasks/terminal_preview/preview_collection.rb +4 -6
  229. data/tasks/terminal_preview/safety_confirmation.rb +3 -5
  230. data/tasks/terminal_preview/saved_screenshot.rb +7 -9
  231. data/tasks/terminal_preview/terminal_window.rb +7 -9
  232. data/tasks/test.rake +1 -1
  233. data/tasks/website/index_page.rb +3 -3
  234. data/tasks/website/version.rb +10 -10
  235. data/tasks/website/version_menu.rb +10 -12
  236. data/tasks/website/versioned_documentation.rb +49 -17
  237. data/tasks/website/website.rb +6 -8
  238. data/tasks/website.rake +4 -4
  239. metadata +156 -125
  240. data/LICENSES/BSD-2-Clause.txt +0 -9
  241. data/doc/contributors/better_dx.md +0 -543
  242. data/doc/contributors/example_analysis.md +0 -82
  243. data/doc/images/all_events.png +0 -0
  244. data/doc/images/block_padding.png +0 -0
  245. data/doc/images/block_titles.png +0 -0
  246. data/doc/images/box_demo.png +0 -0
  247. data/doc/images/calendar_demo.png +0 -0
  248. data/doc/images/cell_demo.png +0 -0
  249. data/doc/images/chart_demo.png +0 -0
  250. data/doc/images/flex_layout.png +0 -0
  251. data/doc/images/gauge_demo.png +0 -0
  252. data/doc/images/line_gauge_demo.png +0 -0
  253. data/doc/images/list_demo.png +0 -0
  254. data/doc/images/readme_usage.png +0 -0
  255. data/doc/images/scrollbar_demo.png +0 -0
  256. data/doc/images/sparkline_demo.png +0 -0
  257. data/doc/images/table_flex.png +0 -0
  258. data/examples/all_events/app.rb +0 -169
  259. data/examples/all_events/app.rbs +0 -7
  260. data/examples/all_events/test_app.rb +0 -139
  261. data/examples/analytics/app.rb +0 -258
  262. data/examples/analytics/app.rbs +0 -7
  263. data/examples/analytics/test_app.rb +0 -132
  264. data/examples/block_padding/app.rbs +0 -7
  265. data/examples/block_padding/test_app.rb +0 -31
  266. data/examples/block_titles/app.rbs +0 -7
  267. data/examples/block_titles/test_app.rb +0 -34
  268. data/examples/box_demo/app.rbs +0 -7
  269. data/examples/box_demo/test_app.rb +0 -88
  270. data/examples/calendar_demo/app.rb +0 -101
  271. data/examples/calendar_demo/app.rbs +0 -7
  272. data/examples/calendar_demo/test_app.rb +0 -108
  273. data/examples/cell_demo/app.rb +0 -108
  274. data/examples/cell_demo/app.rbs +0 -7
  275. data/examples/cell_demo/test_app.rb +0 -36
  276. data/examples/chart_demo/app.rb +0 -203
  277. data/examples/chart_demo/app.rbs +0 -7
  278. data/examples/chart_demo/test_app.rb +0 -102
  279. data/examples/custom_widget/app.rb +0 -51
  280. data/examples/custom_widget/app.rbs +0 -7
  281. data/examples/custom_widget/test_app.rb +0 -30
  282. data/examples/flex_layout/app.rb +0 -156
  283. data/examples/flex_layout/app.rbs +0 -7
  284. data/examples/flex_layout/test_app.rb +0 -65
  285. data/examples/gauge_demo/app.rb +0 -182
  286. data/examples/gauge_demo/test_app.rb +0 -120
  287. data/examples/hit_test/app.rb +0 -175
  288. data/examples/hit_test/app.rbs +0 -7
  289. data/examples/hit_test/test_app.rb +0 -102
  290. data/examples/line_gauge_demo/app.rb +0 -190
  291. data/examples/line_gauge_demo/app.rbs +0 -7
  292. data/examples/line_gauge_demo/test_app.rb +0 -129
  293. data/examples/list_demo/app.rb +0 -253
  294. data/examples/list_demo/test_app.rb +0 -237
  295. data/examples/list_styles/app.rb +0 -140
  296. data/examples/list_styles/app.rbs +0 -7
  297. data/examples/list_styles/test_app.rb +0 -157
  298. data/examples/login_form/app.rbs +0 -7
  299. data/examples/login_form/test_app.rb +0 -51
  300. data/examples/map_demo/app.rbs +0 -7
  301. data/examples/map_demo/test_app.rb +0 -149
  302. data/examples/mouse_events/app.rb +0 -97
  303. data/examples/mouse_events/app.rbs +0 -7
  304. data/examples/mouse_events/test_app.rb +0 -53
  305. data/examples/popup_demo/app.rb +0 -103
  306. data/examples/popup_demo/app.rbs +0 -7
  307. data/examples/popup_demo/test_app.rb +0 -54
  308. data/examples/quickstart_dsl/app.rbs +0 -7
  309. data/examples/quickstart_dsl/test_app.rb +0 -29
  310. data/examples/quickstart_lifecycle/app.rbs +0 -7
  311. data/examples/quickstart_lifecycle/test_app.rb +0 -29
  312. data/examples/ratatui_logo_demo/app.rb +0 -79
  313. data/examples/ratatui_logo_demo/app.rbs +0 -7
  314. data/examples/ratatui_logo_demo/test_app.rb +0 -51
  315. data/examples/ratatui_mascot_demo/app.rb +0 -84
  316. data/examples/ratatui_mascot_demo/app.rbs +0 -7
  317. data/examples/ratatui_mascot_demo/test_app.rb +0 -47
  318. data/examples/readme_usage/app.rb +0 -29
  319. data/examples/readme_usage/app.rbs +0 -7
  320. data/examples/readme_usage/test_app.rb +0 -29
  321. data/examples/rich_text/app.rb +0 -141
  322. data/examples/rich_text/app.rbs +0 -7
  323. data/examples/rich_text/test_app.rb +0 -166
  324. data/examples/scroll_text/app.rb +0 -103
  325. data/examples/scroll_text/app.rbs +0 -7
  326. data/examples/scroll_text/test_app.rb +0 -110
  327. data/examples/scrollbar_demo/app.rb +0 -143
  328. data/examples/scrollbar_demo/app.rbs +0 -7
  329. data/examples/scrollbar_demo/test_app.rb +0 -77
  330. data/examples/sparkline_demo/app.rb +0 -240
  331. data/examples/sparkline_demo/test_app.rb +0 -107
  332. data/examples/table_flex/app.rb +0 -65
  333. data/examples/table_flex/app.rbs +0 -7
  334. data/examples/table_flex/test_app.rb +0 -36
  335. data/examples/table_select/app.rbs +0 -7
  336. data/examples/table_select/test_app.rb +0 -180
  337. data/examples/widget_style_colors/test_app.rb +0 -48
  338. /data/doc/images/{analytics.png → app_analytics.png} +0 -0
  339. /data/doc/images/{custom_widget.png → app_custom_widget.png} +0 -0
  340. /data/doc/images/{login_form.png → app_login_form.png} +0 -0
  341. /data/doc/images/{map_demo.png → app_map_demo.png} +0 -0
  342. /data/doc/images/{mouse_events.png → app_mouse_events.png} +0 -0
  343. /data/doc/images/{table_select.png → app_table_select.png} +0 -0
  344. /data/doc/images/{quickstart_dsl.png → verify_quickstart_dsl.png} +0 -0
  345. /data/doc/images/{ratatui_logo_demo.png → verify_quickstart_layout.png} +0 -0
  346. /data/doc/images/{quickstart_lifecycle.png → verify_quickstart_lifecycle.png} +0 -0
  347. /data/doc/images/{list_styles.png → widget_list_styles.png} +0 -0
  348. /data/doc/images/{popup_demo.png → widget_popup_demo.png} +0 -0
  349. /data/doc/images/{hit_test.png → widget_rect.png} +0 -0
  350. /data/doc/images/{rich_text.png → widget_rich_text.png} +0 -0
  351. /data/doc/images/{scroll_text.png → widget_scroll_text.png} +0 -0
@@ -4,56 +4,56 @@
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
+ class Style < Data.define(:fg, :bg, :modifiers)
24
+ ##
25
+ # :attr_reader: fg
26
+ # Foreground color.
8
27
  #
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>).
28
+ # Symbol (<tt>:red</tt>) or Hex String (<tt>"#ffffff"</tt>).
29
29
 
30
- ##
31
- # :attr_reader: bg
32
- # Background color.
33
- #
34
- # Symbol (<tt>:black</tt>) or Hex String (<tt>"#000000"</tt>).
30
+ ##
31
+ # :attr_reader: bg
32
+ # Background color.
33
+ #
34
+ # Symbol (<tt>:black</tt>) or Hex String (<tt>"#000000"</tt>).
35
35
 
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>.
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>.
42
42
 
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
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
51
51
 
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
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
58
57
  end
58
+ end
59
59
  end
@@ -4,125 +4,118 @@
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, :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 (:always, :when_selected, :never).
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: block
66
+ # Optional wrapping block.
67
+
68
+ ##
69
+ # :attr_reader: footer
70
+ # Footer row content (Array of Strings).
71
+
72
+ ##
73
+ # :attr_reader: flex
74
+ # Flex mode for column distribution.
75
+
76
+ ##
77
+ # :attr_reader: style
78
+ # Base style for the entire table.
79
+
80
+ ##
81
+ # :attr_reader: column_spacing
82
+ # Spacing between columns (Integer, default 1).
83
+
84
+ # Creates a new Table.
8
85
  #
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
- # === Examples
17
- #
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
86
+ # [header] Array of strings/paragraphs.
87
+ # [rows] 2D Array of strings/paragraphs.
88
+ # [widths] Array of Constraints.
89
+ # [highlight_style] Style object.
90
+ # [highlight_symbol] String.
91
+ # [highlight_spacing] Symbol (optional, default: <tt>:when_selected</tt>).
92
+ # [column_highlight_style] Style object.
93
+ # [cell_highlight_style] Style object.
94
+ # [selected_row] Integer (nullable).
95
+ # [selected_column] Integer (nullable).
96
+ # [block] Block (optional).
97
+ # [footer] Array of strings/paragraphs (optional).
98
+ # [flex] Symbol (optional, default: <tt>:legacy</tt>).
99
+ # [style] Style object or Hash (optional).
100
+ # [column_spacing] Integer (optional, default: 1).
101
+ 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)
102
+ super(
103
+ header:,
104
+ rows:,
105
+ widths:,
106
+ highlight_style:,
107
+ highlight_symbol:,
108
+ highlight_spacing:,
109
+ column_highlight_style:,
110
+ cell_highlight_style:,
111
+ selected_row: selected_row.nil? ? nil : Integer(selected_row),
112
+ selected_column: selected_column.nil? ? nil : Integer(selected_column),
113
+ block:,
114
+ footer:,
115
+ flex:,
116
+ style:,
117
+ column_spacing: Integer(column_spacing)
118
+ )
127
119
  end
120
+ end
128
121
  end
@@ -4,81 +4,80 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- # Displays a tab bar for navigation.
8
- #
9
- # Screen real estate is limited. You cannot show everything at once. Segregating content into views is necessary for complex apps.
10
- #
11
- # This widget separates dimensions. It displays a row of titles, indicating which view is active.
12
- #
13
- # Use it at the top of your interface to switch between major modes or contexts.
14
- #
15
- # === Examples
16
- #
17
- # Tabs.new(
18
- # titles: ["Home", "Settings", "Logs"],
19
- # selected_index: 0,
20
- # highlight_style: Style.new(fg: :yellow),
21
- # divider: "|"
22
- # )
23
- class Tabs < Data.define(:titles, :selected_index, :block, :divider, :highlight_style, :style, :padding_left, :padding_right)
24
- ##
25
- # :attr_reader: titles
26
- # Tab titles (Array of Strings).
7
+ # Displays a tab bar for navigation.
8
+ #
9
+ # Screen real estate is limited. You cannot show everything at once. Segregating content into views is necessary for complex apps.
10
+ #
11
+ # This widget separates dimensions. It displays a row of titles, indicating which view is active.
12
+ #
13
+ # Use it at the top of your interface to switch between major modes or contexts.
14
+ #
15
+ # {rdoc-image:/doc/images/widget_tabs_demo.png}[link:/examples/widget_tabs_demo/app_rb.html]
16
+ #
17
+ # === Example
18
+ #
19
+ # Run the interactive demo from the terminal:
20
+ #
21
+ # ruby examples/widget_tabs_demo/app.rb
22
+ class Tabs < Data.define(:titles, :selected_index, :block, :divider, :highlight_style, :style, :padding_left, :padding_right)
23
+ ##
24
+ # :attr_reader: titles
25
+ # Tab titles (Array of Strings).
27
26
 
28
- ##
29
- # :attr_reader: selected_index
30
- # Index of the active tab.
27
+ ##
28
+ # :attr_reader: selected_index
29
+ # Index of the active tab.
31
30
 
32
- ##
33
- # :attr_reader: block
34
- # Optional wrapping block.
31
+ ##
32
+ # :attr_reader: block
33
+ # Optional wrapping block.
35
34
 
36
- ##
37
- # :attr_reader: divider
38
- # Separator string between tabs.
35
+ ##
36
+ # :attr_reader: divider
37
+ # Separator string between tabs.
39
38
 
40
- ##
41
- # :attr_reader: highlight_style
42
- # Style for the selected tab title.
39
+ ##
40
+ # :attr_reader: highlight_style
41
+ # Style for the selected tab title.
43
42
 
44
- ##
45
- # :attr_reader: style
46
- # Base style for the tabs area.
43
+ ##
44
+ # :attr_reader: style
45
+ # Base style for the tabs area.
47
46
 
48
- ##
49
- # :attr_reader: padding_left
50
- # Left padding for the tabs area (Integer, default: 0).
47
+ ##
48
+ # :attr_reader: padding_left
49
+ # Left padding for the tabs area (Integer, default: 0).
51
50
 
52
- ##
53
- # :attr_reader: padding_right
54
- # Right padding for the tabs area (Integer, default: 0).
51
+ ##
52
+ # :attr_reader: padding_right
53
+ # Right padding for the tabs area (Integer, default: 0).
55
54
 
56
- # Creates a new Tabs widget.
57
- #
58
- # [titles] Array of Strings/Lines.
59
- # [selected_index] Integer (default: 0).
60
- # [block] Block (optional).
61
- # [divider] String (optional).
62
- # [highlight_style] Style (optional).
63
- # [style] Style (optional).
64
- # [padding_left] Integer (default: 0).
65
- # [padding_right] Integer (default: 0).
66
- def initialize(titles: [], selected_index: 0, block: nil, divider: nil, highlight_style: nil, style: nil, padding_left: 0, padding_right: 0)
67
- super(
68
- titles: titles,
69
- selected_index: Integer(selected_index),
70
- block: block,
71
- divider: divider,
72
- highlight_style: highlight_style,
73
- style: style,
74
- padding_left: Integer(padding_left),
75
- padding_right: Integer(padding_right)
76
- )
77
- end
55
+ # Creates a new Tabs widget.
56
+ #
57
+ # [titles] Array of Strings/Lines.
58
+ # [selected_index] Integer (default: 0).
59
+ # [block] Block (optional).
60
+ # [divider] String (optional).
61
+ # [highlight_style] Style (optional).
62
+ # [style] Style (optional).
63
+ # [padding_left] Integer (default: 0).
64
+ # [padding_right] Integer (default: 0).
65
+ def initialize(titles: [], selected_index: 0, block: nil, divider: nil, highlight_style: nil, style: nil, padding_left: 0, padding_right: 0)
66
+ super(
67
+ titles:,
68
+ selected_index: Integer(selected_index),
69
+ block:,
70
+ divider:,
71
+ highlight_style:,
72
+ style:,
73
+ padding_left: Integer(padding_left),
74
+ padding_right: Integer(padding_right)
75
+ )
76
+ end
78
77
 
79
- # Returns the total width of the tabs.
80
- def width
81
- RatatuiRuby._tabs_width(self)
82
- end
78
+ # Returns the total width of the tabs.
79
+ def width
80
+ RatatuiRuby._tabs_width(self)
83
81
  end
82
+ end
84
83
  end