ratatui_ruby 0.8.0 → 0.9.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 (352) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +2 -2
  3. data/.builds/ruby-3.3.yml +2 -2
  4. data/.builds/ruby-3.4.yml +2 -2
  5. data/.builds/ruby-4.0.0.yml +2 -2
  6. data/.pre-commit-config.yaml +1 -1
  7. data/AGENTS.md +3 -3
  8. data/CHANGELOG.md +53 -1
  9. data/LICENSES/LGPL-3.0-or-later.txt +304 -0
  10. data/LICENSES/MIT-0.txt +16 -0
  11. data/README.md +33 -5
  12. data/Rakefile +1 -1
  13. data/doc/concepts/application_architecture.md +44 -3
  14. data/doc/concepts/application_testing.md +43 -1
  15. data/doc/concepts/async.md +32 -2
  16. data/doc/concepts/custom_widgets.md +247 -0
  17. data/doc/concepts/event_handling.md +32 -3
  18. data/doc/concepts/interactive_design.md +32 -2
  19. data/doc/contributors/auditing/parity.md +7 -1
  20. data/doc/contributors/design/ruby_frontend.md +85 -1
  21. data/doc/contributors/design/rust_backend.md +67 -1
  22. data/doc/contributors/developing_examples.md +56 -2
  23. data/doc/contributors/documentation_style.md +20 -3
  24. data/doc/contributors/future_work.md +169 -0
  25. data/doc/contributors/index.md +1 -1
  26. data/doc/contributors/v1.0.0_blockers.md +15 -175
  27. data/doc/getting_started/quickstart.md +22 -4
  28. data/doc/getting_started/why.md +1 -1
  29. data/doc/index.md +2 -1
  30. data/doc/troubleshooting/debugging.md +32 -2
  31. data/doc/troubleshooting/terminal_limitations.md +8 -2
  32. data/doc/troubleshooting/tui_output.md +42 -0
  33. data/examples/app_all_events/README.md +14 -2
  34. data/examples/app_all_events/app.rb +1 -1
  35. data/examples/app_all_events/model/app_model.rb +1 -1
  36. data/examples/app_all_events/model/event_color_cycle.rb +1 -1
  37. data/examples/app_all_events/model/event_entry.rb +1 -1
  38. data/examples/app_all_events/model/msg.rb +1 -1
  39. data/examples/app_all_events/model/timestamp.rb +1 -1
  40. data/examples/app_all_events/update.rb +1 -1
  41. data/examples/app_all_events/view/app_view.rb +1 -1
  42. data/examples/app_all_events/view/controls_view.rb +1 -1
  43. data/examples/app_all_events/view/counts_view.rb +1 -1
  44. data/examples/app_all_events/view/live_view.rb +1 -1
  45. data/examples/app_all_events/view/log_view.rb +1 -1
  46. data/examples/app_all_events/view.rb +1 -1
  47. data/examples/app_color_picker/README.md +20 -2
  48. data/examples/app_color_picker/app.rb +1 -1
  49. data/examples/app_color_picker/clipboard.rb +1 -1
  50. data/examples/app_color_picker/color.rb +1 -1
  51. data/examples/app_color_picker/controls.rb +1 -1
  52. data/examples/app_color_picker/copy_dialog.rb +1 -1
  53. data/examples/app_color_picker/export_pane.rb +1 -1
  54. data/examples/app_color_picker/harmony.rb +1 -1
  55. data/examples/app_color_picker/input.rb +1 -1
  56. data/examples/app_color_picker/main_container.rb +1 -1
  57. data/examples/app_color_picker/palette.rb +1 -1
  58. data/examples/app_login_form/README.md +8 -2
  59. data/examples/app_login_form/app.rb +1 -1
  60. data/examples/app_stateful_interaction/README.md +2 -2
  61. data/examples/app_stateful_interaction/app.rb +71 -17
  62. data/examples/timeout_demo.rb +1 -1
  63. data/examples/verify_quickstart_dsl/README.md +6 -0
  64. data/examples/verify_quickstart_dsl/app.rb +3 -3
  65. data/examples/verify_quickstart_layout/README.md +6 -0
  66. data/examples/verify_quickstart_layout/app.rb +3 -3
  67. data/examples/verify_quickstart_lifecycle/README.md +6 -0
  68. data/examples/verify_quickstart_lifecycle/app.rb +3 -3
  69. data/examples/verify_readme_usage/README.md +6 -0
  70. data/examples/verify_readme_usage/app.rb +3 -3
  71. data/examples/widget_barchart/README.md +6 -0
  72. data/examples/widget_barchart/app.rb +2 -2
  73. data/examples/widget_block/README.md +7 -1
  74. data/examples/widget_block/app.rb +2 -2
  75. data/examples/widget_box/README.md +6 -0
  76. data/examples/widget_box/app.rb +9 -6
  77. data/examples/widget_calendar/README.md +6 -0
  78. data/examples/widget_calendar/app.rb +2 -2
  79. data/examples/widget_canvas/README.md +4 -0
  80. data/examples/widget_canvas/app.rb +2 -2
  81. data/examples/widget_cell/README.md +6 -0
  82. data/examples/widget_cell/app.rb +2 -3
  83. data/examples/widget_center/README.md +4 -0
  84. data/examples/widget_center/app.rb +2 -2
  85. data/examples/widget_chart/README.md +6 -0
  86. data/examples/widget_chart/app.rb +2 -2
  87. data/examples/widget_gauge/README.md +6 -0
  88. data/examples/widget_gauge/app.rb +2 -2
  89. data/examples/widget_layout_split/README.md +6 -0
  90. data/examples/widget_layout_split/app.rb +3 -3
  91. data/examples/widget_line_gauge/README.md +6 -0
  92. data/examples/widget_line_gauge/app.rb +2 -2
  93. data/examples/widget_list/README.md +6 -0
  94. data/examples/widget_list/app.rb +2 -2
  95. data/examples/widget_map/README.md +8 -2
  96. data/examples/widget_map/app.rb +2 -2
  97. data/examples/widget_overlay/README.md +7 -1
  98. data/examples/widget_overlay/app.rb +2 -2
  99. data/examples/widget_popup/README.md +6 -0
  100. data/examples/widget_popup/app.rb +2 -2
  101. data/examples/widget_ratatui_logo/README.md +6 -0
  102. data/examples/widget_ratatui_logo/app.rb +2 -3
  103. data/examples/widget_ratatui_mascot/README.md +6 -0
  104. data/examples/widget_ratatui_mascot/app.rb +2 -2
  105. data/examples/widget_rect/README.md +12 -0
  106. data/examples/widget_rect/app.rb +40 -26
  107. data/examples/widget_render/README.md +6 -0
  108. data/examples/widget_render/app.rb +2 -2
  109. data/examples/widget_render/app.rbs +41 -0
  110. data/examples/widget_rich_text/README.md +6 -0
  111. data/examples/widget_rich_text/app.rb +2 -2
  112. data/examples/widget_scroll_text/README.md +6 -0
  113. data/examples/widget_scroll_text/app.rb +2 -2
  114. data/examples/widget_scrollbar/README.md +6 -0
  115. data/examples/widget_scrollbar/app.rb +2 -2
  116. data/examples/widget_sparkline/README.md +6 -0
  117. data/examples/widget_sparkline/app.rb +2 -2
  118. data/examples/widget_style_colors/README.md +6 -0
  119. data/examples/widget_style_colors/app.rb +2 -2
  120. data/examples/widget_table/README.md +8 -2
  121. data/examples/widget_table/app.rb +2 -2
  122. data/examples/widget_tabs/README.md +6 -0
  123. data/examples/widget_tabs/app.rb +2 -2
  124. data/examples/widget_text_width/README.md +6 -0
  125. data/examples/widget_text_width/app.rb +4 -4
  126. data/ext/ratatui_ruby/Cargo.lock +1 -1
  127. data/ext/ratatui_ruby/Cargo.toml +1 -1
  128. data/ext/ratatui_ruby/extconf.rb +2 -2
  129. data/ext/ratatui_ruby/src/rendering.rs +1 -1
  130. data/ext/ratatui_ruby/src/style.rs +0 -8
  131. data/ext/ratatui_ruby/src/widgets/chart.rs +0 -118
  132. data/ext/ratatui_ruby/src/widgets/list_state.rs +36 -0
  133. data/lib/ratatui_ruby/buffer/cell.rb +34 -2
  134. data/lib/ratatui_ruby/buffer.rb +2 -2
  135. data/lib/ratatui_ruby/cell.rb +34 -2
  136. data/lib/ratatui_ruby/event/focus_gained.rb +26 -2
  137. data/lib/ratatui_ruby/event/focus_lost.rb +26 -2
  138. data/lib/ratatui_ruby/event/key/character.rb +18 -2
  139. data/lib/ratatui_ruby/event/key/media.rb +2 -2
  140. data/lib/ratatui_ruby/event/key/modifier.rb +10 -2
  141. data/lib/ratatui_ruby/event/key/navigation.rb +2 -2
  142. data/lib/ratatui_ruby/event/key/system.rb +2 -2
  143. data/lib/ratatui_ruby/event/key.rb +114 -2
  144. data/lib/ratatui_ruby/event/mouse.rb +42 -2
  145. data/lib/ratatui_ruby/event/none.rb +10 -2
  146. data/lib/ratatui_ruby/event/paste.rb +34 -2
  147. data/lib/ratatui_ruby/event/resize.rb +34 -2
  148. data/lib/ratatui_ruby/event.rb +26 -2
  149. data/lib/ratatui_ruby/frame.rb +74 -2
  150. data/lib/ratatui_ruby/layout/constraint.rb +58 -2
  151. data/lib/ratatui_ruby/layout/layout.rb +47 -2
  152. data/lib/ratatui_ruby/layout/rect.rb +403 -2
  153. data/lib/ratatui_ruby/layout.rb +2 -2
  154. data/lib/ratatui_ruby/list_state.rb +113 -2
  155. data/lib/ratatui_ruby/output_guard.rb +26 -3
  156. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
  157. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +2 -2
  158. data/lib/ratatui_ruby/schema/bar_chart.rb +50 -2
  159. data/lib/ratatui_ruby/schema/block.rb +21 -15
  160. data/lib/ratatui_ruby/schema/calendar.rb +2 -2
  161. data/lib/ratatui_ruby/schema/canvas.rb +10 -2
  162. data/lib/ratatui_ruby/schema/center.rb +10 -2
  163. data/lib/ratatui_ruby/schema/chart.rb +2 -28
  164. data/lib/ratatui_ruby/schema/clear.rb +10 -2
  165. data/lib/ratatui_ruby/schema/constraint.rb +58 -2
  166. data/lib/ratatui_ruby/schema/cursor.rb +10 -2
  167. data/lib/ratatui_ruby/schema/draw.rb +10 -2
  168. data/lib/ratatui_ruby/schema/gauge.rb +2 -2
  169. data/lib/ratatui_ruby/schema/layout.rb +18 -2
  170. data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
  171. data/lib/ratatui_ruby/schema/list.rb +10 -2
  172. data/lib/ratatui_ruby/schema/list_item.rb +10 -2
  173. data/lib/ratatui_ruby/schema/overlay.rb +10 -2
  174. data/lib/ratatui_ruby/schema/paragraph.rb +10 -2
  175. data/lib/ratatui_ruby/schema/ratatui_logo.rb +2 -2
  176. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +2 -2
  177. data/lib/ratatui_ruby/schema/rect.rb +58 -2
  178. data/lib/ratatui_ruby/schema/row.rb +10 -2
  179. data/lib/ratatui_ruby/schema/scrollbar.rb +2 -2
  180. data/lib/ratatui_ruby/schema/shape/label.rb +10 -2
  181. data/lib/ratatui_ruby/schema/sparkline.rb +10 -2
  182. data/lib/ratatui_ruby/schema/style.rb +18 -2
  183. data/lib/ratatui_ruby/schema/table.rb +2 -2
  184. data/lib/ratatui_ruby/schema/tabs.rb +2 -2
  185. data/lib/ratatui_ruby/schema/text.rb +34 -2
  186. data/lib/ratatui_ruby/scrollbar_state.rb +10 -2
  187. data/lib/ratatui_ruby/style/style.rb +18 -2
  188. data/lib/ratatui_ruby/style.rb +2 -2
  189. data/lib/ratatui_ruby/table_state.rb +10 -2
  190. data/lib/ratatui_ruby/terminal_lifecycle.rb +18 -3
  191. data/lib/ratatui_ruby/test_helper/event_injection.rb +34 -2
  192. data/lib/ratatui_ruby/test_helper/snapshot.rb +74 -9
  193. data/lib/ratatui_ruby/test_helper/style_assertions.rb +98 -2
  194. data/lib/ratatui_ruby/test_helper/terminal.rb +50 -2
  195. data/lib/ratatui_ruby/test_helper/test_doubles.rb +18 -2
  196. data/lib/ratatui_ruby/test_helper.rb +10 -2
  197. data/lib/ratatui_ruby/tui/buffer_factories.rb +2 -2
  198. data/lib/ratatui_ruby/tui/canvas_factories.rb +2 -2
  199. data/lib/ratatui_ruby/tui/core.rb +2 -2
  200. data/lib/ratatui_ruby/tui/layout_factories.rb +32 -2
  201. data/lib/ratatui_ruby/tui/state_factories.rb +2 -2
  202. data/lib/ratatui_ruby/tui/style_factories.rb +2 -2
  203. data/lib/ratatui_ruby/tui/text_factories.rb +2 -2
  204. data/lib/ratatui_ruby/tui/widget_factories.rb +2 -2
  205. data/lib/ratatui_ruby/tui.rb +11 -3
  206. data/lib/ratatui_ruby/version.rb +3 -3
  207. data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +2 -2
  208. data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +2 -2
  209. data/lib/ratatui_ruby/widgets/bar_chart.rb +58 -2
  210. data/lib/ratatui_ruby/widgets/block.rb +37 -15
  211. data/lib/ratatui_ruby/widgets/calendar.rb +2 -2
  212. data/lib/ratatui_ruby/widgets/canvas.rb +10 -2
  213. data/lib/ratatui_ruby/widgets/cell.rb +10 -2
  214. data/lib/ratatui_ruby/widgets/center.rb +10 -2
  215. data/lib/ratatui_ruby/widgets/chart.rb +2 -28
  216. data/lib/ratatui_ruby/widgets/clear.rb +10 -2
  217. data/lib/ratatui_ruby/widgets/cursor.rb +10 -2
  218. data/lib/ratatui_ruby/widgets/gauge.rb +16 -2
  219. data/lib/ratatui_ruby/widgets/line_gauge.rb +16 -2
  220. data/lib/ratatui_ruby/widgets/list.rb +41 -2
  221. data/lib/ratatui_ruby/widgets/list_item.rb +10 -2
  222. data/lib/ratatui_ruby/widgets/overlay.rb +10 -2
  223. data/lib/ratatui_ruby/widgets/paragraph.rb +10 -2
  224. data/lib/ratatui_ruby/widgets/ratatui_logo.rb +2 -2
  225. data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +2 -2
  226. data/lib/ratatui_ruby/widgets/row.rb +10 -2
  227. data/lib/ratatui_ruby/widgets/scrollbar.rb +2 -2
  228. data/lib/ratatui_ruby/widgets/shape/label.rb +10 -2
  229. data/lib/ratatui_ruby/widgets/sparkline.rb +10 -2
  230. data/lib/ratatui_ruby/widgets/table.rb +62 -2
  231. data/lib/ratatui_ruby/widgets/tabs.rb +2 -2
  232. data/lib/ratatui_ruby/widgets.rb +2 -2
  233. data/lib/ratatui_ruby.rb +90 -2
  234. data/sig/examples/app_all_events/view.rbs +7 -1
  235. data/sig/examples/app_all_events/view_state.rbs +7 -1
  236. data/sig/examples/app_color_picker/app.rbs +5 -0
  237. data/sig/examples/app_stateful_interaction/app.rbs +7 -1
  238. data/sig/examples/verify_quickstart_dsl/app.rbs +7 -1
  239. data/sig/examples/verify_quickstart_lifecycle/app.rbs +7 -1
  240. data/sig/examples/verify_readme_usage/app.rbs +7 -1
  241. data/sig/examples/widget_block_demo/app.rbs +6 -0
  242. data/sig/examples/widget_box_demo/app.rbs +7 -1
  243. data/sig/examples/widget_calendar_demo/app.rbs +7 -1
  244. data/sig/examples/widget_cell_demo/app.rbs +7 -1
  245. data/sig/examples/widget_chart_demo/app.rbs +7 -1
  246. data/sig/examples/widget_gauge_demo/app.rbs +7 -1
  247. data/sig/examples/widget_layout_split/app.rbs +7 -1
  248. data/sig/examples/widget_line_gauge_demo/app.rbs +7 -1
  249. data/sig/examples/widget_list_demo/app.rbs +5 -0
  250. data/sig/examples/widget_map_demo/app.rbs +7 -1
  251. data/sig/examples/widget_popup_demo/app.rbs +7 -1
  252. data/sig/examples/widget_ratatui_logo_demo/app.rbs +7 -1
  253. data/sig/examples/widget_ratatui_mascot_demo/app.rbs +7 -1
  254. data/sig/examples/widget_rect/app.rbs +7 -1
  255. data/sig/examples/widget_render/app.rbs +7 -1
  256. data/sig/examples/widget_rich_text/app.rbs +7 -1
  257. data/sig/examples/widget_scroll_text/app.rbs +7 -1
  258. data/sig/examples/widget_scrollbar_demo/app.rbs +7 -1
  259. data/sig/examples/widget_sparkline_demo/app.rbs +7 -1
  260. data/sig/examples/widget_style_colors/app.rbs +7 -1
  261. data/sig/examples/widget_table_demo/app.rbs +7 -1
  262. data/sig/examples/widget_text_width/app.rbs +7 -1
  263. data/sig/ratatui_ruby/event.rbs +7 -1
  264. data/sig/ratatui_ruby/frame.rbs +15 -3
  265. data/sig/ratatui_ruby/list_state.rbs +11 -1
  266. data/sig/ratatui_ruby/ratatui_ruby.rbs +8 -2
  267. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +7 -1
  268. data/sig/ratatui_ruby/schema/bar_chart/bar_group.rbs +6 -0
  269. data/sig/ratatui_ruby/schema/bar_chart.rbs +6 -0
  270. data/sig/ratatui_ruby/schema/block.rbs +7 -1
  271. data/sig/ratatui_ruby/schema/calendar.rbs +6 -0
  272. data/sig/ratatui_ruby/schema/canvas.rbs +6 -0
  273. data/sig/ratatui_ruby/schema/center.rbs +6 -0
  274. data/sig/ratatui_ruby/schema/chart.rbs +6 -9
  275. data/sig/ratatui_ruby/schema/constraint.rbs +6 -0
  276. data/sig/ratatui_ruby/schema/cursor.rbs +6 -0
  277. data/sig/ratatui_ruby/schema/draw.rbs +6 -0
  278. data/sig/ratatui_ruby/schema/gauge.rbs +9 -1
  279. data/sig/ratatui_ruby/schema/layout.rbs +6 -0
  280. data/sig/ratatui_ruby/schema/line_gauge.rbs +9 -1
  281. data/sig/ratatui_ruby/schema/list.rbs +9 -1
  282. data/sig/ratatui_ruby/schema/list_item.rbs +7 -1
  283. data/sig/ratatui_ruby/schema/overlay.rbs +6 -0
  284. data/sig/ratatui_ruby/schema/paragraph.rbs +6 -0
  285. data/sig/ratatui_ruby/schema/ratatui_logo.rbs +6 -0
  286. data/sig/ratatui_ruby/schema/ratatui_mascot.rbs +5 -0
  287. data/sig/ratatui_ruby/schema/rect.rbs +30 -0
  288. data/sig/ratatui_ruby/schema/row.rbs +7 -1
  289. data/sig/ratatui_ruby/schema/scrollbar.rbs +6 -0
  290. data/sig/ratatui_ruby/schema/sparkline.rbs +6 -0
  291. data/sig/ratatui_ruby/schema/style.rbs +7 -1
  292. data/sig/ratatui_ruby/schema/table.rbs +11 -1
  293. data/sig/ratatui_ruby/schema/tabs.rbs +6 -0
  294. data/sig/ratatui_ruby/schema/text.rbs +7 -1
  295. data/sig/ratatui_ruby/scrollbar_state.rbs +7 -1
  296. data/sig/ratatui_ruby/session.rbs +7 -1
  297. data/sig/ratatui_ruby/table_state.rbs +7 -1
  298. data/sig/ratatui_ruby/test_helper/event_injection.rbs +7 -1
  299. data/sig/ratatui_ruby/test_helper/snapshot.rbs +7 -1
  300. data/sig/ratatui_ruby/test_helper/style_assertions.rbs +7 -1
  301. data/sig/ratatui_ruby/test_helper/terminal.rbs +7 -1
  302. data/sig/ratatui_ruby/test_helper/test_doubles.rbs +7 -1
  303. data/sig/ratatui_ruby/test_helper.rbs +7 -1
  304. data/sig/ratatui_ruby/tui/buffer_factories.rbs +7 -1
  305. data/sig/ratatui_ruby/tui/canvas_factories.rbs +7 -1
  306. data/sig/ratatui_ruby/tui/core.rbs +7 -1
  307. data/sig/ratatui_ruby/tui/layout_factories.rbs +7 -1
  308. data/sig/ratatui_ruby/tui/state_factories.rbs +7 -1
  309. data/sig/ratatui_ruby/tui/style_factories.rbs +7 -1
  310. data/sig/ratatui_ruby/tui/text_factories.rbs +7 -1
  311. data/sig/ratatui_ruby/tui/widget_factories.rbs +7 -1
  312. data/sig/ratatui_ruby/tui.rbs +7 -1
  313. data/sig/ratatui_ruby/version.rbs +6 -0
  314. data/tasks/autodoc/examples.rb +1 -1
  315. data/tasks/autodoc/member.rb +1 -1
  316. data/tasks/autodoc/name.rb +1 -1
  317. data/tasks/bump/cargo_lockfile.rb +1 -1
  318. data/tasks/bump/changelog.rb +1 -1
  319. data/tasks/bump/header.rb +1 -1
  320. data/tasks/bump/history.rb +1 -1
  321. data/tasks/bump/links.rb +1 -1
  322. data/tasks/bump/manifest.rb +1 -1
  323. data/tasks/bump/ruby_gem.rb +1 -1
  324. data/tasks/bump/sem_ver.rb +1 -1
  325. data/tasks/bump/unreleased_section.rb +1 -1
  326. data/tasks/license/headers_md.rb +223 -0
  327. data/tasks/license/headers_rb.rb +210 -0
  328. data/tasks/license/license_utils.rb +130 -0
  329. data/tasks/license/snippets_md.rb +315 -0
  330. data/tasks/license/snippets_rdoc.rb +150 -0
  331. data/tasks/license.rake +91 -0
  332. data/tasks/rdoc_config.rb +1 -1
  333. data/tasks/resources/build.yml.erb +13 -7
  334. data/tasks/sourcehut.rake +3 -1
  335. data/tasks/terminal_preview/app_screenshot.rb +1 -1
  336. data/tasks/terminal_preview/crash_report.rb +1 -1
  337. data/tasks/terminal_preview/example_app.rb +1 -1
  338. data/tasks/terminal_preview/launcher_script.rb +1 -1
  339. data/tasks/terminal_preview/preview_collection.rb +1 -1
  340. data/tasks/terminal_preview/preview_timing.rb +1 -1
  341. data/tasks/terminal_preview/safety_confirmation.rb +1 -1
  342. data/tasks/terminal_preview/saved_screenshot.rb +1 -1
  343. data/tasks/terminal_preview/system_appearance.rb +1 -1
  344. data/tasks/terminal_preview/terminal_window.rb +1 -1
  345. data/tasks/terminal_preview/window_id.rb +1 -1
  346. data/tasks/website/index_page.rb +1 -1
  347. data/tasks/website/version.rb +1 -1
  348. data/tasks/website/version_menu.rb +1 -1
  349. data/tasks/website/versioned_documentation.rb +1 -1
  350. data/tasks/website/website.rb +1 -1
  351. metadata +13 -3
  352. data/doc/migration/v0_7_0.md +0 -236
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
5
  # SPDX-License-Identifier: AGPL-3.0-or-later
6
6
  #++
7
7
 
@@ -1,6 +1,6 @@
1
1
  <!--
2
- SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
3
- SPDX-License-Identifier: CC-BY-SA-4.0
2
+ SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
+ SPDX-License-Identifier: CC-BY-SA-4.0
4
4
  -->
5
5
 
6
6
  # Login Form Example
@@ -36,9 +36,15 @@ This example solves this by using the `Overlay` widget to stack a centered popup
36
36
 
37
37
  ## Usage
38
38
 
39
+ <!-- SPDX-SnippetBegin -->
40
+ <!--
41
+ SPDX-FileCopyrightText: 2026 Kerrick Long
42
+ SPDX-License-Identifier: MIT-0
43
+ -->
39
44
  ```bash
40
45
  ruby examples/app_login_form/app.rb
41
46
  ```
47
+ <!-- SPDX-SnippetEnd -->
42
48
 
43
49
  ## Learning Outcomes
44
50
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
5
  # SPDX-License-Identifier: AGPL-3.0-or-later
6
6
  #++
7
7
 
@@ -1,6 +1,6 @@
1
1
  <!--
2
- SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
3
- SPDX-License-Identifier: CC-BY-SA-4.0
2
+ SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
+ SPDX-License-Identifier: CC-BY-SA-4.0
4
4
  -->
5
5
 
6
6
  # Stateful Interaction Example
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
5
  # SPDX-License-Identifier: AGPL-3.0-or-later
6
6
  #++
7
7
 
@@ -106,7 +106,7 @@ class AppStatefulInteraction
106
106
  render_table(frame, table_area)
107
107
 
108
108
  # 4. Render Help
109
- help_text = "q: Quit | Tab/Arrows: Nav | Mouse: Click rows (Try it!)"
109
+ help_text = "q: Quit | Tab/Arrows: Nav | Home/End: Jump | Mouse: Click rows"
110
110
  frame.render_widget(@tui.paragraph(text: help_text), help_area)
111
111
  end
112
112
  end
@@ -193,10 +193,16 @@ class AppStatefulInteraction
193
193
  @active_pane = (@active_pane == :list) ? :table : :list
194
194
 
195
195
  in { type: :key, code: "down" }
196
- scroll_active(1)
196
+ move_selection_next
197
197
 
198
198
  in { type: :key, code: "up" }
199
- scroll_active(-1)
199
+ move_selection_previous
200
+
201
+ in { type: :key, code: "home" }
202
+ move_selection_first
203
+
204
+ in { type: :key, code: "end" }
205
+ move_selection_last
200
206
 
201
207
  # Mouse Interaction
202
208
  in { type: :mouse, kind: "down", x:, y: }
@@ -207,24 +213,72 @@ class AppStatefulInteraction
207
213
  end
208
214
  end
209
215
 
210
- private def scroll_active(delta)
216
+ private def move_selection_next
211
217
  if @active_pane == :list
212
- i = @list_state.selected || 0
213
- new_i = (i + delta).clamp(0, @tables.size - 1)
214
- @list_state.select(new_i)
215
- # Reset table selection when switching categories
216
- if i != new_i
217
- @table_state.select(0)
218
- @table_state.select_column(nil) # Ensure clean slate
219
- end
218
+ current = @list_state.selected || 0
219
+ max_index = @tables.size - 1
220
+ return if current >= max_index # Already at end
221
+
222
+ @list_state.select_next
223
+ reset_table_selection
220
224
  else
221
- current_rows = @data[@tables[@list_state.selected || 0]].size
222
- i = @table_state.selected || 0
223
- new_i = (i + delta).clamp(0, current_rows - 1)
224
- @table_state.select(new_i)
225
+ current = @table_state.selected || 0
226
+ max_index = current_table_rows.size - 1
227
+ return if current >= max_index
228
+
229
+ @table_state.select_next
225
230
  end
226
231
  end
227
232
 
233
+ private def move_selection_previous
234
+ if @active_pane == :list
235
+ current = @list_state.selected || 0
236
+ return if current <= 0 # Already at start
237
+
238
+ @list_state.select_previous
239
+ reset_table_selection
240
+ else
241
+ current = @table_state.selected || 0
242
+ return if current <= 0
243
+
244
+ @table_state.select_previous
245
+ end
246
+ end
247
+
248
+ private def move_selection_first
249
+ if @active_pane == :list
250
+ current = @list_state.selected || 0
251
+ return if current == 0 # Already at first
252
+
253
+ @list_state.select_first
254
+ reset_table_selection
255
+ else
256
+ @table_state.select_first
257
+ end
258
+ end
259
+
260
+ private def move_selection_last
261
+ if @active_pane == :list
262
+ current = @list_state.selected || 0
263
+ max_index = @tables.size - 1
264
+ return if current == max_index # Already at last
265
+
266
+ @list_state.select(max_index)
267
+ reset_table_selection
268
+ else
269
+ @table_state.select(current_table_rows.size - 1)
270
+ end
271
+ end
272
+
273
+ private def reset_table_selection
274
+ @table_state.select(0)
275
+ @table_state.select_column(nil)
276
+ end
277
+
278
+ private def current_table_rows
279
+ @data[@tables[@list_state.selected || 0]]
280
+ end
281
+
228
282
  private def handle_click(x, y)
229
283
  if @list_area.contains?(x, y)
230
284
  handle_list_click(y)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
5
  # SPDX-License-Identifier: AGPL-3.0-or-later
6
6
  #++
7
7
 
@@ -11,6 +11,11 @@ This example exists as a documentation regression test. It ensures the recommend
11
11
 
12
12
  ## Usage
13
13
 
14
+ <!-- SPDX-SnippetBegin -->
15
+ <!--
16
+ SPDX-FileCopyrightText: 2026 Kerrick Long
17
+ SPDX-License-Identifier: MIT-0
18
+ -->
14
19
  <!-- SYNC:START:app.rb:main -->
15
20
  ```ruby
16
21
  # 1. Initialize the terminal, start the run loop, and ensure the terminal is restored.
@@ -45,5 +50,6 @@ RatatuiRuby.run do |tui|
45
50
  end
46
51
  ```
47
52
  <!-- SYNC:END -->
53
+ <!-- SPDX-SnippetEnd -->
48
54
 
49
55
  [![verify_quickstart_dsl](../../doc/images/verify_quickstart_dsl.png)](../../doc/getting_started/quickstart.md#simplified-api)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -23,7 +23,7 @@ class VerifyQuickstartDsl
23
23
  title: "My Ruby TUI App",
24
24
  title_alignment: :center,
25
25
  borders: [:all],
26
- border_color: "cyan",
26
+ border_style: { fg: "cyan" },
27
27
  style: { fg: "white" }
28
28
  )
29
29
  )
@@ -11,6 +11,11 @@ This example exists as a documentation regression test. It ensures the layout an
11
11
 
12
12
  ## Usage
13
13
 
14
+ <!-- SPDX-SnippetBegin -->
15
+ <!--
16
+ SPDX-FileCopyrightText: 2026 Kerrick Long
17
+ SPDX-License-Identifier: MIT-0
18
+ -->
14
19
  <!-- SYNC:START:app.rb:main -->
15
20
  ```ruby
16
21
  loop do
@@ -67,5 +72,6 @@ loop do
67
72
  end
68
73
  ```
69
74
  <!-- SYNC:END -->
75
+ <!-- SPDX-SnippetEnd -->
70
76
 
71
77
  [![verify_quickstart_layout](../../doc/images/verify_quickstart_layout.png)](../../doc/getting_started/quickstart.md#adding-layouts)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -30,7 +30,7 @@ class VerifyQuickstartLayout
30
30
  tui.paragraph(
31
31
  text: "Hello, Ratatui!",
32
32
  alignment: :center,
33
- block: tui.block(title: "Content", borders: [:all], border_color: "cyan")
33
+ block: tui.block(title: "Content", borders: [:all], border_style: { fg: "cyan" })
34
34
  ),
35
35
  top
36
36
  )
@@ -11,6 +11,11 @@ This example exists as a documentation regression test. It ensures the core life
11
11
 
12
12
  ## Usage
13
13
 
14
+ <!-- SPDX-SnippetBegin -->
15
+ <!--
16
+ SPDX-FileCopyrightText: 2026 Kerrick Long
17
+ SPDX-License-Identifier: MIT-0
18
+ -->
14
19
  <!-- SYNC:START:app.rb:main -->
15
20
  ```ruby
16
21
  # 1. Initialize the terminal
@@ -58,5 +63,6 @@ ensure
58
63
  end
59
64
  ```
60
65
  <!-- SYNC:END -->
66
+ <!-- SPDX-SnippetEnd -->
61
67
 
62
68
  [![verify_quickstart_lifecycle](../../doc/images/verify_quickstart_lifecycle.png)](../../doc/getting_started/quickstart.md#basic-application)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -27,7 +27,7 @@ class VerifyQuickstartLifecycle
27
27
  title: "My Ruby TUI App",
28
28
  title_alignment: :center,
29
29
  borders: [:all],
30
- border_color: "cyan",
30
+ border_style: { fg: "cyan" },
31
31
  style: { fg: "white" }
32
32
  )
33
33
  )
@@ -11,6 +11,11 @@ This example exists as a documentation regression test. It ensures that the very
11
11
 
12
12
  ## Usage
13
13
 
14
+ <!-- SPDX-SnippetBegin -->
15
+ <!--
16
+ SPDX-FileCopyrightText: 2026 Kerrick Long
17
+ SPDX-License-Identifier: MIT-0
18
+ -->
14
19
  <!-- SYNC:START:app.rb:main -->
15
20
  ```ruby
16
21
  RatatuiRuby.run do |tui|
@@ -39,5 +44,6 @@ RatatuiRuby.run do |tui|
39
44
  end
40
45
  ```
41
46
  <!-- SYNC:END -->
47
+ <!-- SPDX-SnippetEnd -->
42
48
 
43
49
  [![verify_readme_usage](../../doc/images/verify_readme_usage.png)](../../README.md#usage)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -21,7 +21,7 @@ class VerifyReadmeUsage
21
21
  block: tui.block(
22
22
  title: "My Ruby TUI App",
23
23
  borders: [:all],
24
- border_color: "cyan"
24
+ border_style: { fg: "cyan" }
25
25
  )
26
26
  ),
27
27
  frame.area
@@ -37,9 +37,15 @@ Comparing magnitudes in raw tables requires mental arithmetic. Bar charts make t
37
37
 
38
38
  ## Usage
39
39
 
40
+ <!-- SPDX-SnippetBegin -->
41
+ <!--
42
+ SPDX-FileCopyrightText: 2026 Kerrick Long
43
+ SPDX-License-Identifier: MIT-0
44
+ -->
40
45
  ```bash
41
46
  ruby examples/widget_barchart/app.rb
42
47
  ```
48
+ <!-- SPDX-SnippetEnd -->
43
49
 
44
50
  ## Learning Outcomes
45
51
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -1,5 +1,5 @@
1
1
  <!--
2
- SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
3
  SPDX-License-Identifier: CC-BY-SA-4.0
4
4
  -->
5
5
  # Block Example
@@ -31,8 +31,14 @@ This example demonstrates the versatile `Block` widget, which provides the visua
31
31
 
32
32
  ## Usage
33
33
 
34
+ <!-- SPDX-SnippetBegin -->
35
+ <!--
36
+ SPDX-FileCopyrightText: 2026 Kerrick Long
37
+ SPDX-License-Identifier: MIT-0
38
+ -->
34
39
  ```bash
35
40
  ruby examples/widget_block/app.rb
36
41
  ```
42
+ <!-- SPDX-SnippetEnd -->
37
43
 
38
44
  [Read the source code →](app.rb)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -32,9 +32,15 @@ Widgets often float in a void. Without boundaries, interfaces become a chaotic m
32
32
 
33
33
  ## Usage
34
34
 
35
+ <!-- SPDX-SnippetBegin -->
36
+ <!--
37
+ SPDX-FileCopyrightText: 2026 Kerrick Long
38
+ SPDX-License-Identifier: MIT-0
39
+ -->
35
40
  ```bash
36
41
  ruby examples/widget_box/app.rb
37
42
  ```
43
+ <!-- SPDX-SnippetEnd -->
38
44
 
39
45
  ## Learning Outcomes
40
46
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -132,9 +132,13 @@ set: {
132
132
  border_style_config = @border_styles[@border_style_index]
133
133
 
134
134
  # 1. State/View
135
- # Use border_style if provided, otherwise fall back to border_color
136
- effective_border_style = border_style_config[:style]
137
- effective_border_color = effective_border_style ? nil : (style_config[:style] ? nil : color_config[:color])
135
+ # Use border_style if explicitly set; otherwise, only apply color picker
136
+ # color when no content style is set (preserves original border_color behavior)
137
+ effective_border_style = if border_style_config[:style]
138
+ border_style_config[:style]
139
+ elsif style_config[:style].nil?
140
+ @tui.style(fg: color_config[:color])
141
+ end
138
142
 
139
143
  # Show overridden status if border_set is active
140
144
  type_display = border_type_config[:name]
@@ -147,7 +151,6 @@ set: {
147
151
  title_alignment: title_alignment_config[:alignment],
148
152
  title_style: title_style_config[:style],
149
153
  borders: [:all],
150
- border_color: effective_border_color,
151
154
  border_style: effective_border_style,
152
155
  border_type: border_type_config[:type],
153
156
  border_set: border_set_config[:set],
@@ -27,9 +27,15 @@ Rendering dates in a grid involves complex calculations for leap years and weekd
27
27
 
28
28
  ## Usage
29
29
 
30
+ <!-- SPDX-SnippetBegin -->
31
+ <!--
32
+ SPDX-FileCopyrightText: 2026 Kerrick Long
33
+ SPDX-License-Identifier: MIT-0
34
+ -->
30
35
  ```bash
31
36
  ruby examples/widget_calendar/app.rb
32
37
  ```
38
+ <!-- SPDX-SnippetEnd -->
33
39
 
34
40
  ## Learning Outcomes
35
41
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -1,3 +1,7 @@
1
+ <!--
2
+ SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
+ SPDX-License-Identifier: CC-BY-SA-4.0
4
+ -->
1
5
  # Canvas (Circle, Line, Point, Rectangle) Example
2
6
 
3
7
  [![widget_canvas](../../doc/images/widget_canvas.png)](app.rb)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -24,9 +24,15 @@ Sometimes you need to render specific characters with unique styles outside of s
24
24
 
25
25
  ## Usage
26
26
 
27
+ <!-- SPDX-SnippetBegin -->
28
+ <!--
29
+ SPDX-FileCopyrightText: 2026 Kerrick Long
30
+ SPDX-License-Identifier: MIT-0
31
+ -->
27
32
  ```bash
28
33
  ruby examples/widget_cell/app.rb
29
34
  ```
35
+ <!-- SPDX-SnippetEnd -->
30
36
 
31
37
  ## Learning Outcomes
32
38
 
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- #
6
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
7
6
  #++
8
7
 
9
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -1,3 +1,7 @@
1
+ <!--
2
+ SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
+ SPDX-License-Identifier: CC-BY-SA-4.0
4
+ -->
1
5
  # Center Example
2
6
 
3
7
  [![widget_center](../../doc/images/widget_center.png)](app.rb)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -29,9 +29,15 @@ Trends and patterns are invisible in raw logs. Charts visualize X/Y datasets to
29
29
 
30
30
  ## Usage
31
31
 
32
+ <!-- SPDX-SnippetBegin -->
33
+ <!--
34
+ SPDX-FileCopyrightText: 2026 Kerrick Long
35
+ SPDX-License-Identifier: MIT-0
36
+ -->
32
37
  ```bash
33
38
  ruby examples/widget_chart/app.rb
34
39
  ```
40
+ <!-- SPDX-SnippetEnd -->
35
41
 
36
42
  ## Learning Outcomes
37
43
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -29,9 +29,15 @@ Long-running tasks create anxiety. Users need to know the system is working. Gau
29
29
 
30
30
  ## Usage
31
31
 
32
+ <!-- SPDX-SnippetBegin -->
33
+ <!--
34
+ SPDX-FileCopyrightText: 2026 Kerrick Long
35
+ SPDX-License-Identifier: MIT-0
36
+ -->
32
37
  ```bash
33
38
  ruby examples/widget_gauge/app.rb
34
39
  ```
40
+ <!-- SPDX-SnippetEnd -->
35
41
 
36
42
  ## Learning Outcomes
37
43
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -31,9 +31,15 @@ Terminal screens vary in size. Hardcoded layouts break. `Layout.split` manages s
31
31
 
32
32
  ## Usage
33
33
 
34
+ <!-- SPDX-SnippetBegin -->
35
+ <!--
36
+ SPDX-FileCopyrightText: 2026 Kerrick Long
37
+ SPDX-License-Identifier: MIT-0
38
+ -->
34
39
  ```bash
35
40
  ruby examples/widget_layout_split/app.rb
36
41
  ```
42
+ <!-- SPDX-SnippetEnd -->
37
43
 
38
44
  ## Learning Outcomes
39
45
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
4
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
5
+ # SPDX-License-Identifier: MIT-0
6
6
  #++
7
7
 
8
8
  $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
@@ -193,7 +193,7 @@ class WidgetLayoutSplit
193
193
  block = @tui.block(
194
194
  title: "Block #{i + 1}",
195
195
  borders: [:all],
196
- border_color: BLOCK_COLORS[i % BLOCK_COLORS.length]
196
+ border_style: @tui.style(fg: BLOCK_COLORS[i % BLOCK_COLORS.length])
197
197
  )
198
198
  frame.render_widget(block, block_area)
199
199
  end