ratatui_ruby 0.5.0 → 0.7.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 (311) 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 +10 -4
  7. data/CHANGELOG.md +79 -7
  8. data/README.md +37 -5
  9. data/REUSE.toml +2 -7
  10. data/doc/application_architecture.md +96 -22
  11. data/doc/application_testing.md +76 -30
  12. data/doc/contributors/architectural_overhaul/chat_conversations.md +4952 -0
  13. data/doc/contributors/architectural_overhaul/implementation_plan.md +60 -0
  14. data/doc/contributors/architectural_overhaul/task.md +37 -0
  15. data/doc/contributors/design/ruby_frontend.md +288 -56
  16. data/doc/contributors/design/rust_backend.md +349 -54
  17. data/doc/contributors/developing_examples.md +134 -49
  18. data/doc/contributors/index.md +7 -5
  19. data/doc/contributors/v1.0.0_blockers.md +1729 -0
  20. data/doc/event_handling.md +11 -3
  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_canvas_demo.png +0 -0
  32. data/doc/images/widget_cell_demo.png +0 -0
  33. data/doc/images/widget_center_demo.png +0 -0
  34. data/doc/images/widget_chart_demo.png +0 -0
  35. data/doc/images/widget_list_demo.png +0 -0
  36. data/doc/images/widget_overlay_demo.png +0 -0
  37. data/doc/images/widget_render.png +0 -0
  38. data/doc/images/widget_rich_text.png +0 -0
  39. data/doc/images/widget_scroll_text.png +0 -0
  40. data/doc/images/widget_sparkline_demo.png +0 -0
  41. data/doc/images/widget_table_demo.png +0 -0
  42. data/doc/images/widget_tabs_demo.png +0 -0
  43. data/doc/images/widget_text_width.png +0 -0
  44. data/doc/index.md +11 -6
  45. data/doc/interactive_design.md +2 -2
  46. data/doc/quickstart.md +127 -165
  47. data/doc/terminal_limitations.md +92 -0
  48. data/doc/v0.7.0_migration.md +236 -0
  49. data/doc/why.md +93 -0
  50. data/examples/app_all_events/README.md +47 -27
  51. data/examples/app_all_events/app.rb +38 -35
  52. data/examples/app_all_events/model/app_model.rb +157 -0
  53. data/examples/app_all_events/model/event_entry.rb +17 -0
  54. data/examples/app_all_events/model/msg.rb +37 -0
  55. data/examples/app_all_events/update.rb +73 -0
  56. data/examples/app_all_events/view/app_view.rb +9 -9
  57. data/examples/app_all_events/view/controls_view.rb +9 -7
  58. data/examples/app_all_events/view/counts_view.rb +13 -9
  59. data/examples/app_all_events/view/live_view.rb +9 -8
  60. data/examples/app_all_events/view/log_view.rb +11 -16
  61. data/examples/app_color_picker/README.md +84 -42
  62. data/examples/app_color_picker/app.rb +24 -62
  63. data/examples/app_color_picker/controls.rb +90 -0
  64. data/examples/app_color_picker/copy_dialog.rb +45 -49
  65. data/examples/app_color_picker/export_pane.rb +126 -0
  66. data/examples/app_color_picker/input.rb +99 -67
  67. data/examples/app_color_picker/main_container.rb +178 -0
  68. data/examples/app_color_picker/palette.rb +55 -26
  69. data/examples/app_login_form/README.md +49 -0
  70. data/examples/app_login_form/app.rb +2 -3
  71. data/examples/app_stateful_interaction/README.md +33 -0
  72. data/examples/app_stateful_interaction/app.rb +272 -0
  73. data/examples/timeout_demo.rb +43 -0
  74. data/examples/verify_quickstart_dsl/README.md +49 -0
  75. data/examples/verify_quickstart_dsl/app.rb +2 -0
  76. data/examples/verify_quickstart_layout/README.md +71 -0
  77. data/examples/verify_quickstart_layout/app.rb +2 -0
  78. data/examples/verify_quickstart_lifecycle/README.md +56 -0
  79. data/examples/verify_quickstart_lifecycle/app.rb +10 -4
  80. data/examples/verify_readme_usage/README.md +43 -0
  81. data/examples/verify_readme_usage/app.rb +8 -2
  82. data/examples/widget_barchart_demo/README.md +50 -0
  83. data/examples/widget_barchart_demo/app.rb +5 -5
  84. data/examples/widget_block_demo/README.md +36 -0
  85. data/examples/widget_block_demo/app.rb +256 -0
  86. data/examples/widget_box_demo/README.md +45 -0
  87. data/examples/widget_calendar_demo/README.md +39 -0
  88. data/examples/widget_calendar_demo/app.rb +5 -1
  89. data/examples/widget_canvas_demo/README.md +27 -0
  90. data/examples/widget_canvas_demo/app.rb +123 -0
  91. data/examples/widget_cell_demo/README.md +36 -0
  92. data/examples/widget_cell_demo/app.rb +31 -24
  93. data/examples/widget_center_demo/README.md +29 -0
  94. data/examples/widget_center_demo/app.rb +116 -0
  95. data/examples/widget_chart_demo/README.md +41 -0
  96. data/examples/widget_chart_demo/app.rb +7 -2
  97. data/examples/widget_gauge_demo/README.md +41 -0
  98. data/examples/widget_layout_split/README.md +44 -0
  99. data/examples/widget_line_gauge_demo/README.md +41 -0
  100. data/examples/widget_list_demo/README.md +49 -0
  101. data/examples/widget_list_demo/app.rb +91 -107
  102. data/examples/widget_map_demo/README.md +39 -0
  103. data/examples/{app_map_demo → widget_map_demo}/app.rb +4 -4
  104. data/examples/widget_overlay_demo/README.md +36 -0
  105. data/examples/widget_overlay_demo/app.rb +248 -0
  106. data/examples/widget_popup_demo/README.md +36 -0
  107. data/examples/widget_ratatui_logo_demo/README.md +34 -0
  108. data/examples/widget_ratatui_logo_demo/app.rb +1 -1
  109. data/examples/widget_ratatui_mascot_demo/README.md +34 -0
  110. data/examples/widget_rect/README.md +38 -0
  111. data/examples/widget_render/README.md +37 -0
  112. data/examples/widget_render/app.rb +3 -3
  113. data/examples/widget_rich_text/README.md +35 -0
  114. data/examples/widget_rich_text/app.rb +62 -33
  115. data/examples/widget_scroll_text/README.md +37 -0
  116. data/examples/widget_scroll_text/app.rb +0 -1
  117. data/examples/widget_scrollbar_demo/README.md +37 -0
  118. data/examples/widget_sparkline_demo/README.md +42 -0
  119. data/examples/widget_sparkline_demo/app.rb +4 -3
  120. data/examples/widget_style_colors/README.md +34 -0
  121. data/examples/widget_table_demo/README.md +48 -0
  122. data/examples/{app_table_select → widget_table_demo}/app.rb +65 -12
  123. data/examples/widget_tabs_demo/README.md +41 -0
  124. data/examples/widget_tabs_demo/app.rb +15 -1
  125. data/examples/widget_text_width/README.md +35 -0
  126. data/examples/widget_text_width/app.rb +113 -0
  127. data/exe/.gitkeep +0 -0
  128. data/ext/ratatui_ruby/Cargo.lock +11 -4
  129. data/ext/ratatui_ruby/Cargo.toml +2 -1
  130. data/ext/ratatui_ruby/src/events.rs +238 -26
  131. data/ext/ratatui_ruby/src/frame.rs +116 -3
  132. data/ext/ratatui_ruby/src/lib.rs +37 -6
  133. data/ext/ratatui_ruby/src/rendering.rs +22 -21
  134. data/ext/ratatui_ruby/src/string_width.rs +101 -0
  135. data/ext/ratatui_ruby/src/terminal.rs +39 -15
  136. data/ext/ratatui_ruby/src/text.rs +13 -4
  137. data/ext/ratatui_ruby/src/widgets/barchart.rs +24 -6
  138. data/ext/ratatui_ruby/src/widgets/canvas.rs +5 -5
  139. data/ext/ratatui_ruby/src/widgets/gauge.rs +9 -2
  140. data/ext/ratatui_ruby/src/widgets/line_gauge.rs +9 -2
  141. data/ext/ratatui_ruby/src/widgets/list.rs +179 -3
  142. data/ext/ratatui_ruby/src/widgets/list_state.rs +137 -0
  143. data/ext/ratatui_ruby/src/widgets/mod.rs +3 -0
  144. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +93 -1
  145. data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +169 -0
  146. data/ext/ratatui_ruby/src/widgets/table.rs +191 -34
  147. data/ext/ratatui_ruby/src/widgets/table_state.rs +121 -0
  148. data/lib/ratatui_ruby/buffer/cell.rb +168 -0
  149. data/lib/ratatui_ruby/buffer.rb +15 -0
  150. data/lib/ratatui_ruby/cell.rb +4 -4
  151. data/lib/ratatui_ruby/event/key/character.rb +35 -0
  152. data/lib/ratatui_ruby/event/key/media.rb +44 -0
  153. data/lib/ratatui_ruby/event/key/modifier.rb +95 -0
  154. data/lib/ratatui_ruby/event/key/navigation.rb +55 -0
  155. data/lib/ratatui_ruby/event/key/system.rb +45 -0
  156. data/lib/ratatui_ruby/event/key.rb +111 -51
  157. data/lib/ratatui_ruby/event/mouse.rb +3 -3
  158. data/lib/ratatui_ruby/event/paste.rb +1 -1
  159. data/lib/ratatui_ruby/frame.rb +100 -4
  160. data/lib/ratatui_ruby/layout/constraint.rb +95 -0
  161. data/lib/ratatui_ruby/layout/layout.rb +106 -0
  162. data/lib/ratatui_ruby/layout/rect.rb +118 -0
  163. data/lib/ratatui_ruby/layout.rb +19 -0
  164. data/lib/ratatui_ruby/list_state.rb +88 -0
  165. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
  166. data/lib/ratatui_ruby/schema/cursor.rb +5 -0
  167. data/lib/ratatui_ruby/schema/gauge.rb +3 -1
  168. data/lib/ratatui_ruby/schema/layout.rb +1 -1
  169. data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
  170. data/lib/ratatui_ruby/schema/list.rb +25 -4
  171. data/lib/ratatui_ruby/schema/list_item.rb +41 -0
  172. data/lib/ratatui_ruby/schema/rect.rb +43 -0
  173. data/lib/ratatui_ruby/schema/row.rb +66 -0
  174. data/lib/ratatui_ruby/schema/style.rb +24 -4
  175. data/lib/ratatui_ruby/schema/table.rb +29 -11
  176. data/lib/ratatui_ruby/schema/text.rb +96 -3
  177. data/lib/ratatui_ruby/scrollbar_state.rb +112 -0
  178. data/lib/ratatui_ruby/style/style.rb +81 -0
  179. data/lib/ratatui_ruby/style.rb +15 -0
  180. data/lib/ratatui_ruby/table_state.rb +90 -0
  181. data/lib/ratatui_ruby/test_helper/event_injection.rb +169 -0
  182. data/lib/ratatui_ruby/test_helper/snapshot.rb +414 -0
  183. data/lib/ratatui_ruby/test_helper/style_assertions.rb +351 -0
  184. data/lib/ratatui_ruby/test_helper/terminal.rb +127 -0
  185. data/lib/ratatui_ruby/test_helper/test_doubles.rb +68 -0
  186. data/lib/ratatui_ruby/test_helper.rb +65 -358
  187. data/lib/ratatui_ruby/tui/buffer_factories.rb +20 -0
  188. data/lib/ratatui_ruby/tui/canvas_factories.rb +44 -0
  189. data/lib/ratatui_ruby/tui/core.rb +38 -0
  190. data/lib/ratatui_ruby/tui/layout_factories.rb +74 -0
  191. data/lib/ratatui_ruby/tui/state_factories.rb +33 -0
  192. data/lib/ratatui_ruby/tui/style_factories.rb +20 -0
  193. data/lib/ratatui_ruby/tui/text_factories.rb +44 -0
  194. data/lib/ratatui_ruby/tui/widget_factories.rb +195 -0
  195. data/lib/ratatui_ruby/tui.rb +75 -0
  196. data/lib/ratatui_ruby/version.rb +1 -1
  197. data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +47 -0
  198. data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +25 -0
  199. data/lib/ratatui_ruby/widgets/bar_chart.rb +239 -0
  200. data/lib/ratatui_ruby/widgets/block.rb +192 -0
  201. data/lib/ratatui_ruby/widgets/calendar.rb +84 -0
  202. data/lib/ratatui_ruby/widgets/canvas.rb +231 -0
  203. data/lib/ratatui_ruby/widgets/cell.rb +47 -0
  204. data/lib/ratatui_ruby/widgets/center.rb +59 -0
  205. data/lib/ratatui_ruby/widgets/chart.rb +185 -0
  206. data/lib/ratatui_ruby/widgets/clear.rb +54 -0
  207. data/lib/ratatui_ruby/widgets/cursor.rb +42 -0
  208. data/lib/ratatui_ruby/widgets/gauge.rb +72 -0
  209. data/lib/ratatui_ruby/widgets/line_gauge.rb +80 -0
  210. data/lib/ratatui_ruby/widgets/list.rb +127 -0
  211. data/lib/ratatui_ruby/widgets/list_item.rb +43 -0
  212. data/lib/ratatui_ruby/widgets/overlay.rb +43 -0
  213. data/lib/ratatui_ruby/widgets/paragraph.rb +99 -0
  214. data/lib/ratatui_ruby/widgets/ratatui_logo.rb +31 -0
  215. data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +36 -0
  216. data/lib/ratatui_ruby/widgets/row.rb +68 -0
  217. data/lib/ratatui_ruby/widgets/scrollbar.rb +143 -0
  218. data/lib/ratatui_ruby/widgets/shape/label.rb +68 -0
  219. data/lib/ratatui_ruby/widgets/sparkline.rb +134 -0
  220. data/lib/ratatui_ruby/widgets/table.rb +141 -0
  221. data/lib/ratatui_ruby/widgets/tabs.rb +85 -0
  222. data/lib/ratatui_ruby/widgets.rb +40 -0
  223. data/lib/ratatui_ruby.rb +64 -57
  224. data/sig/examples/app_all_events/view.rbs +1 -1
  225. data/sig/examples/app_all_events/view_state.rbs +1 -1
  226. data/sig/examples/app_stateful_interaction/app.rbs +33 -0
  227. data/sig/examples/widget_block_demo/app.rbs +32 -0
  228. data/sig/examples/{app_map_demo → widget_map_demo}/app.rbs +2 -2
  229. data/sig/examples/{app_table_select → widget_table_demo}/app.rbs +2 -2
  230. data/sig/examples/{widget_table_flex → widget_text_width}/app.rbs +2 -3
  231. data/sig/ratatui_ruby/event.rbs +11 -1
  232. data/sig/ratatui_ruby/frame.rbs +2 -0
  233. data/sig/ratatui_ruby/list_state.rbs +13 -0
  234. data/sig/ratatui_ruby/ratatui_ruby.rbs +2 -2
  235. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +3 -3
  236. data/sig/ratatui_ruby/schema/gauge.rbs +2 -2
  237. data/sig/ratatui_ruby/schema/line_gauge.rbs +2 -2
  238. data/sig/ratatui_ruby/schema/list.rbs +4 -2
  239. data/sig/ratatui_ruby/schema/list_item.rbs +10 -0
  240. data/sig/ratatui_ruby/schema/rect.rbs +3 -0
  241. data/sig/ratatui_ruby/schema/row.rbs +22 -0
  242. data/sig/ratatui_ruby/schema/style.rbs +3 -3
  243. data/sig/ratatui_ruby/schema/table.rbs +3 -1
  244. data/sig/ratatui_ruby/schema/text.rbs +9 -6
  245. data/sig/ratatui_ruby/scrollbar_state.rbs +18 -0
  246. data/sig/ratatui_ruby/session.rbs +41 -48
  247. data/sig/ratatui_ruby/table_state.rbs +15 -0
  248. data/sig/ratatui_ruby/test_helper/event_injection.rbs +16 -0
  249. data/sig/ratatui_ruby/test_helper/snapshot.rbs +12 -0
  250. data/sig/ratatui_ruby/test_helper/style_assertions.rbs +64 -0
  251. data/sig/ratatui_ruby/test_helper/terminal.rbs +14 -0
  252. data/sig/ratatui_ruby/test_helper/test_doubles.rbs +22 -0
  253. data/sig/ratatui_ruby/test_helper.rbs +5 -4
  254. data/sig/ratatui_ruby/tui/buffer_factories.rbs +10 -0
  255. data/sig/ratatui_ruby/tui/canvas_factories.rbs +14 -0
  256. data/sig/ratatui_ruby/tui/core.rbs +14 -0
  257. data/sig/ratatui_ruby/tui/layout_factories.rbs +19 -0
  258. data/sig/ratatui_ruby/tui/state_factories.rbs +12 -0
  259. data/sig/ratatui_ruby/tui/style_factories.rbs +10 -0
  260. data/sig/ratatui_ruby/tui/text_factories.rbs +14 -0
  261. data/sig/ratatui_ruby/tui/widget_factories.rbs +39 -0
  262. data/sig/ratatui_ruby/tui.rbs +19 -0
  263. data/tasks/autodoc/examples.rb +79 -0
  264. data/tasks/autodoc.rake +7 -35
  265. data/tasks/bump/changelog.rb +3 -3
  266. data/tasks/bump/links.rb +67 -0
  267. data/tasks/sourcehut.rake +64 -21
  268. data/tasks/terminal_preview/app_screenshot.rb +13 -3
  269. data/tasks/terminal_preview/saved_screenshot.rb +4 -3
  270. metadata +169 -48
  271. data/doc/contributors/dwim_dx.md +0 -366
  272. data/doc/images/app_analytics.png +0 -0
  273. data/doc/images/app_custom_widget.png +0 -0
  274. data/doc/images/app_mouse_events.png +0 -0
  275. data/doc/images/app_table_select.png +0 -0
  276. data/doc/images/widget_block_padding.png +0 -0
  277. data/doc/images/widget_block_titles.png +0 -0
  278. data/doc/images/widget_list_styles.png +0 -0
  279. data/doc/images/widget_table_flex.png +0 -0
  280. data/examples/app_all_events/model/events.rb +0 -180
  281. data/examples/app_all_events/model/highlight.rb +0 -57
  282. data/examples/app_all_events/test/snapshots/after_focus_lost.txt +0 -24
  283. data/examples/app_all_events/test/snapshots/after_focus_regained.txt +0 -24
  284. data/examples/app_all_events/test/snapshots/after_horizontal_resize.txt +0 -24
  285. data/examples/app_all_events/test/snapshots/after_key_a.txt +0 -24
  286. data/examples/app_all_events/test/snapshots/after_key_ctrl_x.txt +0 -24
  287. data/examples/app_all_events/test/snapshots/after_mouse_click.txt +0 -24
  288. data/examples/app_all_events/test/snapshots/after_mouse_drag.txt +0 -24
  289. data/examples/app_all_events/test/snapshots/after_multiple_events.txt +0 -24
  290. data/examples/app_all_events/test/snapshots/after_paste.txt +0 -24
  291. data/examples/app_all_events/test/snapshots/after_resize.txt +0 -24
  292. data/examples/app_all_events/test/snapshots/after_right_click.txt +0 -24
  293. data/examples/app_all_events/test/snapshots/after_vertical_resize.txt +0 -24
  294. data/examples/app_all_events/test/snapshots/initial_state.txt +0 -24
  295. data/examples/app_all_events/view_state.rb +0 -42
  296. data/examples/app_color_picker/scene.rb +0 -201
  297. data/examples/widget_block_padding/app.rb +0 -67
  298. data/examples/widget_block_titles/app.rb +0 -69
  299. data/examples/widget_list_styles/app.rb +0 -141
  300. data/examples/widget_table_flex/app.rb +0 -95
  301. data/lib/ratatui_ruby/session/autodoc.rb +0 -417
  302. data/lib/ratatui_ruby/session.rb +0 -163
  303. data/sig/examples/widget_block_padding/app.rbs +0 -11
  304. data/sig/examples/widget_block_titles/app.rbs +0 -11
  305. data/sig/examples/widget_list_styles/app.rbs +0 -11
  306. data/tasks/autodoc/inventory.rb +0 -61
  307. data/tasks/autodoc/notice.rb +0 -26
  308. data/tasks/autodoc/rbs.rb +0 -38
  309. data/tasks/autodoc/rdoc.rb +0 -45
  310. data/tasks/bump/comparison_links.rb +0 -41
  311. /data/doc/images/{app_map_demo.png → widget_map_demo.png} +0 -0
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize XX:XX:XX #<RatatuiRuby::Event::Resize:0xXXXXXX│
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Resize:0xXXXXXX │
12
- │Resize: 1 │ │@width=100, @height=24> │
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 1 │ │Type Time Description │
3
- │ Unmodified: 1 │ │Key XX:XX:XX #<RatatuiRuby::Event::Key code="a" mod│
4
- │ Modified: 0 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize — — │
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Key code="a" modifiers=[]> │
12
- │Resize: 0 │ │ │
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 1 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key XX:XX:XX #<RatatuiRuby::Event::Key code="x" mod│
4
- │ Modified: 1 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize — — │
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Key code="x" modifiers=["ctrl"]> │
12
- │Resize: 0 │ │ │
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse XX:XX:XX #<RatatuiRuby::Event::Mouse:0xXXXXXX│
5
- │Mouse: 1 │ │Resize — — │
6
- │ Down: 1 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Mouse:0xXXXXXX │
12
- │Resize: 0 │ │@kind="down", @x=40, @y=12, @button="left", │
13
- │Paste: 0 │ │@modifiers=[]> │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse XX:XX:XX #<RatatuiRuby::Event::Mouse:0xXXXXXX│
5
- │Mouse: 1 │ │Resize — — │
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 1 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Mouse:0xXXXXXX │
12
- │Resize: 0 │ │@kind="drag", @x=25, @y=8, @button="left", @modifiers=[]>│
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 3 │ │Type Time Description │
3
- │ Unmodified: 3 │ │Key XX:XX:XX #<RatatuiRuby::Event::Key code="c" mod│
4
- │ Modified: 0 │ │Mouse XX:XX:XX #<RatatuiRuby::Event::Mouse:0xXXXXXX│
5
- │Mouse: 1 │ │Resize — — │
6
- │ Down: 1 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Key code="a" modifiers=[]> │
12
- │Resize: 0 │ │ │
13
- │Paste: 0 │ │#<RatatuiRuby::Event::Key code="b" modifiers=[]> │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │#<RatatuiRuby::Event::Key code="c" modifiers=[]> │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │#<RatatuiRuby::Event::Mouse:0xXXXXXX │
18
- │ │ │@kind="down", @x=10, @y=5, @button="left", @modifiers=[]>│
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize — — │
6
- │ Down: 0 │ │Paste XX:XX:XX #<RatatuiRuby::Event::Paste:0xXXXXXX│
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Paste:0xXXXXXX │
12
- │Resize: 0 │ │@content="Hello World"> │
13
- │Paste: 1 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize XX:XX:XX #<RatatuiRuby::Event::Resize:0xXXXXXX│
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Resize:0xXXXXXX │
12
- │Resize: 1 │ │@width=100, @height=30> │
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse XX:XX:XX #<RatatuiRuby::Event::Mouse:0xXXXXXX│
5
- │Mouse: 1 │ │Resize — — │
6
- │ Down: 1 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Mouse:0xXXXXXX │
12
- │Resize: 0 │ │@kind="down", @x=50, @y=10, @button="right", │
13
- │Paste: 0 │ │@modifiers=[]> │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize XX:XX:XX #<RatatuiRuby::Event::Resize:0xXXXXXX│
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │#<RatatuiRuby::Event::Resize:0xXXXXXX │
12
- │Resize: 1 │ │@width=80, @height=30> │
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,24 +0,0 @@
1
- ┌Event Counts──────┐ ┌Live Display─────────────────────────────────────────────┐
2
- │Key: 0 │ │Type Time Description │
3
- │ Unmodified: 0 │ │Key — — │
4
- │ Modified: 0 │ │Mouse — — │
5
- │Mouse: 0 │ │Resize — — │
6
- │ Down: 0 │ │Paste — — │
7
- │ Up: 0 │ │Focus — — │
8
- │ Drag: 0 │ │ │
9
- │ Moved: 0 │ └─────────────────────────────────────────────────────────┘
10
- │ Scroll_up: 0 │ ┌Event Log────────────────────────────────────────────────┐
11
- │ Scroll_down: 0 │ │No events yet... │
12
- │Resize: 0 │ │ │
13
- │Paste: 0 │ │ │
14
- │Focus: 0 │ │ │
15
- │ Gained: 0 │ │ │
16
- │ Lost: 0 │ │ │
17
- │None: 0 │ │ │
18
- │ │ │ │
19
- │ │ │ │
20
- │ │ │ │
21
- └──────────────────┘ └─────────────────────────────────────────────────────────┘
22
- ┌Controls──────────────────────────────────────────────────────────────────────┐
23
- │q: Quit Ctrl+C: Quit │
24
- └──────────────────────────────────────────────────────────────────────────────┘
@@ -1,42 +0,0 @@
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
- # Encapsulates all data required to render the application view.
7
- #
8
- # Views need access to models, global settings, and calculated styles.
9
- # Passing dozens of individual parameters to view components is messy and unmaintainable.
10
- #
11
- # This class provides a single, structured object containing all state necessary for rendering.
12
- #
13
- # Use it to shuttle data from the main application to the various view components.
14
- #
15
- # === Examples
16
- #
17
- # state = ViewState.build(events, true, tui, nil)
18
- # puts state.focused #=> true
19
- # app_view.call(state, tui, frame, area)
20
- class ViewState < Data.define(:events, :focused, :hotkey_style, :dimmed_style, :lit_style, :border_color, :area)
21
- # Builds a new ViewState with calculated styles.
22
- #
23
- # [events] Events model instance.
24
- # [focused] Boolean indicating if the app has focus.
25
- # [tui] RatatuiRuby instance for style creation.
26
- # [_resize_sub_counter] Unused parameter (reserved for future use).
27
- #
28
- # === Example
29
- #
30
- # ViewState.build(events, true, tui, nil) #=> #<ViewState ...>
31
- def self.build(events, focused, tui, _resize_sub_counter)
32
- new(
33
- events:,
34
- focused:,
35
- hotkey_style: tui.style(modifiers: [:bold, :underlined]),
36
- dimmed_style: tui.style(fg: :dark_gray),
37
- lit_style: tui.style(fg: :green, modifiers: [:bold]),
38
- border_color: focused ? :green : :gray,
39
- area: nil
40
- )
41
- end
42
- end
@@ -1,201 +0,0 @@
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
- require_relative "input"
7
- require_relative "palette"
8
- require_relative "clipboard"
9
- require_relative "copy_dialog"
10
-
11
- # Orchestrates layout and rendering of the color picker UI.
12
- #
13
- # Building a complete color picker UI involves layout calculation, widget
14
- # composition, and coordinate tracking for hit testing. Keeping this logic
15
- # scattered across the main app makes the app harder to read and test.
16
- #
17
- # This object owns the layout logic. It orchestrates all sections. It calculates
18
- # and caches rects for hit testing.
19
- #
20
- # Use it to encapsulate complex UI composition.
21
- #
22
- # === Example
23
- #
24
- # scene = Scene.new(tui)
25
- # scene.render(frame, input:, palette:, clipboard:, dialog:)
26
- #
27
- # # For hit testing:
28
- # rect = scene.export_rect
29
- # if rect.contains?(x, y)
30
- # # Handle click
31
- # end
32
- class Scene
33
- def initialize(tui)
34
- @tui = tui
35
- @export_area_rect = nil
36
- @hotkey_style = @tui.style(modifiers: [:bold, :underlined])
37
- end
38
-
39
- # Renders the complete UI given all model objects.
40
- #
41
- # Calculates layout once per frame. Renders input, palette, export, controls,
42
- # and dialog sections. Caches the export area rect for hit testing.
43
- #
44
- # [frame] Frame object from RatatuiRuby.draw block
45
- # [input] Input object for text input display
46
- # [palette] Palette object for color display
47
- # [clipboard] Clipboard object for feedback message
48
- # [dialog] CopyDialog object for confirmation dialog
49
- #
50
- # === Example
51
- #
52
- # scene.render(frame, input: @input, palette: @palette, clipboard: @clipboard, dialog: @dialog)
53
- def render(frame, input:, palette:, clipboard:, dialog:)
54
- input_area, rest = @tui.layout_split(
55
- frame.area,
56
- direction: :vertical,
57
- constraints: [
58
- @tui.constraint_length(3),
59
- @tui.constraint_fill(1),
60
- ]
61
- )
62
-
63
- color_area, control_area = @tui.layout_split(
64
- rest,
65
- direction: :vertical,
66
- constraints: [
67
- @tui.constraint_length(14),
68
- @tui.constraint_fill(1),
69
- ]
70
- )
71
-
72
- harmony_area, @export_area_rect = @tui.layout_split(
73
- color_area,
74
- direction: :vertical,
75
- constraints: [
76
- @tui.constraint_length(7),
77
- @tui.constraint_fill(1),
78
- ]
79
- )
80
-
81
- frame.render_widget(input.render(@tui), input_area)
82
- frame.render_widget(build_palette_section(palette, harmony_area), harmony_area)
83
- frame.render_widget(build_export_section(palette), @export_area_rect)
84
- frame.render_widget(build_controls_section(clipboard), control_area)
85
-
86
- if dialog.active?
87
- dialog_center = calculate_center_area(frame.area, 40, 8)
88
- frame.render_widget(@tui.clear, frame.area)
89
- frame.render_widget(dialog.render(@tui, dialog_center), dialog_center)
90
- end
91
- end
92
-
93
- # The cached rectangle of the export formats section, used for hit testing.
94
- #
95
- # Populated during #render. Use this to detect clicks on the export section.
96
- #
97
- # === Example
98
- #
99
- # scene.render(frame, ...)
100
- # if scene.export_rect.contains?(x, y)
101
- # # Click on export section
102
- # end
103
- def export_rect
104
- @export_area_rect
105
- end
106
-
107
- private def build_palette_section(palette, _harmony_area)
108
- if palette.main.nil?
109
- @tui.paragraph(text: "No color selected")
110
- else
111
- blocks = palette.as_blocks(@tui)
112
- @tui.layout(
113
- direction: :horizontal,
114
- constraints: Array.new(blocks.size) { @tui.constraint_fill(1) },
115
- children: blocks
116
- )
117
- end
118
- end
119
-
120
- private def build_export_section(palette)
121
- if palette.main.nil?
122
- @tui.block(
123
- title: "Export Formats",
124
- borders: [:all],
125
- children: [
126
- @tui.paragraph(
127
- text: @tui.text_line(spans: [
128
- @tui.text_span(content: "Enter a color to see formats"),
129
- ])
130
- ),
131
- ]
132
- )
133
- else
134
- color = palette.main
135
- hex = color.hex
136
- rgb = color.rgb
137
- hsl = color.hsl_string
138
- text_color = color.contrasting_text_color
139
- bg_style = @tui.style(bg: hex, fg: text_color)
140
-
141
- @tui.block(
142
- title: "Export Formats",
143
- borders: [:all],
144
- style: bg_style,
145
- children: [
146
- @tui.paragraph(
147
- text: [
148
- @tui.text_line(spans: [
149
- @tui.text_span(content: "HEX: ", style: bg_style),
150
- @tui.text_span(content: hex, style: @tui.style(bg: hex, fg: text_color, modifiers: [:underlined])),
151
- ]),
152
- @tui.text_line(spans: [
153
- @tui.text_span(content: "RGB: ", style: bg_style),
154
- @tui.text_span(content: rgb, style: @tui.style(bg: hex, fg: text_color, modifiers: [:underlined])),
155
- ]),
156
- @tui.text_line(spans: [
157
- @tui.text_span(content: "HSL: ", style: bg_style),
158
- @tui.text_span(content: hsl, style: @tui.style(bg: hex, fg: text_color, modifiers: [:underlined])),
159
- ]),
160
- ]
161
- ),
162
- ]
163
- )
164
- end
165
- end
166
-
167
- private def build_controls_section(clipboard)
168
- control_lines = [
169
- @tui.text_line(spans: [
170
- @tui.text_span(content: "a-z/0-9", style: @hotkey_style),
171
- @tui.text_span(content: ": Type "),
172
- @tui.text_span(content: "enter", style: @hotkey_style),
173
- @tui.text_span(content: ": Parse "),
174
- @tui.text_span(content: "bksp", style: @hotkey_style),
175
- @tui.text_span(content: ": Erase "),
176
- @tui.text_span(content: "esc", style: @hotkey_style),
177
- @tui.text_span(content: ": Quit"),
178
- ]),
179
- ]
180
-
181
- unless clipboard.message.empty?
182
- control_lines << @tui.text_line(spans: [
183
- @tui.text_span(content: clipboard.message, style: @tui.style(fg: :green, modifiers: [:bold])),
184
- ])
185
- end
186
-
187
- @tui.block(
188
- title: "Controls",
189
- borders: [:all],
190
- children: [
191
- @tui.paragraph(text: control_lines),
192
- ]
193
- )
194
- end
195
-
196
- private def calculate_center_area(parent_area, width, height)
197
- x = (parent_area.width - width) / 2
198
- y = (parent_area.height - height) / 2
199
- @tui.rect(x:, y:, width:, height:)
200
- end
201
- end
@@ -1,67 +0,0 @@
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
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
-
9
- # A demo showing Block padding capabilities
10
- class WidgetBlockPadding
11
- def run
12
- RatatuiRuby.run do |tui|
13
- loop do
14
- # 1. Uniform Padding
15
- block1 = RatatuiRuby::Block.new(
16
- title: "Uniform Padding (2)",
17
- borders: [:all],
18
- padding: 2
19
- )
20
- para1 = RatatuiRuby::Paragraph.new(
21
- text: "This text is padded by 2 on all sides.\nNotice the space between the border and this text.",
22
- block: block1
23
- )
24
-
25
- # 2. Directional Padding
26
- block2 = RatatuiRuby::Block.new(
27
- title: "Directional Padding [Left: 4, Right: 0, Top: 2, Bottom: 0]",
28
- borders: [:all],
29
- padding: [4, 0, 2, 0]
30
- )
31
- para2 = RatatuiRuby::Paragraph.new(
32
- text: "This text has different padding per side.\nLeft: 4, Top: 2.",
33
- block: block2
34
- )
35
-
36
- # Instructions
37
- para3 = RatatuiRuby::Paragraph.new(
38
- text: "Press 'q' to quit."
39
- )
40
-
41
- tui.draw do |frame|
42
- # Layout
43
- areas = RatatuiRuby::Layout.split(
44
- frame.area,
45
- direction: :vertical,
46
- constraints: [
47
- RatatuiRuby::Constraint.length(10), # Uniform Padding
48
- RatatuiRuby::Constraint.length(10), # Directional Padding
49
- RatatuiRuby::Constraint.min(0),
50
- ]
51
- )
52
-
53
- frame.render_widget(para1, areas[0])
54
- frame.render_widget(para2, areas[1])
55
- frame.render_widget(para3, areas[2])
56
- end
57
-
58
- event = tui.poll_event
59
- break if event == "q" || event == :ctrl_c
60
- end
61
- end
62
- end
63
- end
64
-
65
- if __FILE__ == $0
66
- WidgetBlockPadding.new.run
67
- end