ratatui_ruby 1.3.0 → 1.3.3

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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/ext/ratatui_ruby/Cargo.lock +2 -1
  3. data/ext/ratatui_ruby/Cargo.toml +2 -1
  4. data/ext/ratatui_ruby/src/color.rs +1 -1
  5. data/ext/ratatui_ruby/src/errors.rs +1 -1
  6. data/ext/ratatui_ruby/src/events.rs +158 -19
  7. data/ext/ratatui_ruby/src/frame.rs +1 -1
  8. data/ext/ratatui_ruby/src/lib.rs +1 -1
  9. data/ext/ratatui_ruby/src/lib_header.rs +1 -1
  10. data/ext/ratatui_ruby/src/rendering.rs +1 -1
  11. data/ext/ratatui_ruby/src/string_width.rs +1 -1
  12. data/ext/ratatui_ruby/src/style.rs +1 -1
  13. data/ext/ratatui_ruby/src/terminal/capabilities.rs +1 -1
  14. data/ext/ratatui_ruby/src/terminal/init.rs +1 -1
  15. data/ext/ratatui_ruby/src/terminal/mod.rs +1 -1
  16. data/ext/ratatui_ruby/src/terminal/mutations.rs +1 -1
  17. data/ext/ratatui_ruby/src/terminal/queries.rs +1 -1
  18. data/ext/ratatui_ruby/src/terminal/query.rs +1 -1
  19. data/ext/ratatui_ruby/src/terminal/storage.rs +1 -1
  20. data/ext/ratatui_ruby/src/terminal/wrapper.rs +1 -1
  21. data/ext/ratatui_ruby/src/text.rs +1 -1
  22. data/ext/ratatui_ruby/src/widgets/barchart.rs +1 -1
  23. data/ext/ratatui_ruby/src/widgets/block.rs +1 -1
  24. data/ext/ratatui_ruby/src/widgets/calendar.rs +1 -1
  25. data/ext/ratatui_ruby/src/widgets/canvas.rs +1 -1
  26. data/ext/ratatui_ruby/src/widgets/center.rs +1 -1
  27. data/ext/ratatui_ruby/src/widgets/chart.rs +1 -1
  28. data/ext/ratatui_ruby/src/widgets/clear.rs +1 -1
  29. data/ext/ratatui_ruby/src/widgets/cursor.rs +1 -1
  30. data/ext/ratatui_ruby/src/widgets/gauge.rs +1 -1
  31. data/ext/ratatui_ruby/src/widgets/layout.rs +1 -1
  32. data/ext/ratatui_ruby/src/widgets/line_gauge.rs +1 -1
  33. data/ext/ratatui_ruby/src/widgets/list.rs +1 -1
  34. data/ext/ratatui_ruby/src/widgets/list_state.rs +1 -1
  35. data/ext/ratatui_ruby/src/widgets/mod.rs +1 -1
  36. data/ext/ratatui_ruby/src/widgets/overlay.rs +1 -1
  37. data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
  38. data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +1 -1
  39. data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +1 -1
  40. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +1 -1
  41. data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +1 -1
  42. data/ext/ratatui_ruby/src/widgets/sparkline.rs +1 -1
  43. data/ext/ratatui_ruby/src/widgets/table.rs +1 -1
  44. data/ext/ratatui_ruby/src/widgets/table_state.rs +1 -1
  45. data/ext/ratatui_ruby/src/widgets/tabs.rs +1 -1
  46. data/lib/ratatui_ruby/version.rb +1 -1
  47. metadata +1 -255
  48. data/.builds/ruby-3.2.yml +0 -54
  49. data/.builds/ruby-3.3.yml +0 -54
  50. data/.builds/ruby-3.4.yml +0 -54
  51. data/.builds/ruby-4.0.0.yml +0 -54
  52. data/.pre-commit-config.yaml +0 -16
  53. data/.rubocop.yml +0 -10
  54. data/AGENTS.md +0 -147
  55. data/CHANGELOG.md +0 -771
  56. data/README.md +0 -187
  57. data/README.rdoc +0 -302
  58. data/Rakefile +0 -11
  59. data/Steepfile +0 -50
  60. data/doc/concepts/application_architecture.md +0 -321
  61. data/doc/concepts/application_testing.md +0 -193
  62. data/doc/concepts/async.md +0 -190
  63. data/doc/concepts/custom_widgets.md +0 -247
  64. data/doc/concepts/debugging.md +0 -401
  65. data/doc/concepts/event_handling.md +0 -162
  66. data/doc/concepts/interactive_design.md +0 -146
  67. data/doc/contributors/auditing/parity.md +0 -239
  68. data/doc/contributors/design/ruby_frontend.md +0 -448
  69. data/doc/contributors/design/rust_backend.md +0 -434
  70. data/doc/contributors/design.md +0 -11
  71. data/doc/contributors/developing_examples.md +0 -400
  72. data/doc/contributors/documentation_style.md +0 -121
  73. data/doc/contributors/index.md +0 -21
  74. data/doc/contributors/releasing.md +0 -215
  75. data/doc/contributors/todo/align/api_completeness_audit-finished.md +0 -381
  76. data/doc/contributors/todo/align/api_completeness_audit-unfinished.md +0 -200
  77. data/doc/contributors/todo/align/term.md +0 -351
  78. data/doc/contributors/todo/align/terminal.md +0 -647
  79. data/doc/contributors/todo/future_work.md +0 -169
  80. data/doc/contributors/upstream_requests/paragraph_span_rects.md +0 -259
  81. data/doc/contributors/upstream_requests/tab_rects.md +0 -173
  82. data/doc/contributors/upstream_requests/title_rects.md +0 -132
  83. data/doc/custom.css +0 -22
  84. data/doc/getting_started/quickstart.md +0 -291
  85. data/doc/getting_started/why.md +0 -93
  86. data/doc/images/app_all_events.png +0 -0
  87. data/doc/images/app_cli_rich_moments.gif +0 -0
  88. data/doc/images/app_color_picker.png +0 -0
  89. data/doc/images/app_debugging_showcase.gif +0 -0
  90. data/doc/images/app_debugging_showcase.png +0 -0
  91. data/doc/images/app_external_editor.gif +0 -0
  92. data/doc/images/app_login_form.png +0 -0
  93. data/doc/images/app_stateful_interaction.png +0 -0
  94. data/doc/images/verify_quickstart_dsl.png +0 -0
  95. data/doc/images/verify_quickstart_layout.png +0 -0
  96. data/doc/images/verify_quickstart_lifecycle.png +0 -0
  97. data/doc/images/verify_readme_usage.png +0 -0
  98. data/doc/images/widget_barchart.png +0 -0
  99. data/doc/images/widget_block.png +0 -0
  100. data/doc/images/widget_box.png +0 -0
  101. data/doc/images/widget_calendar.png +0 -0
  102. data/doc/images/widget_canvas.png +0 -0
  103. data/doc/images/widget_cell.png +0 -0
  104. data/doc/images/widget_center.png +0 -0
  105. data/doc/images/widget_chart.png +0 -0
  106. data/doc/images/widget_gauge.png +0 -0
  107. data/doc/images/widget_layout_split.png +0 -0
  108. data/doc/images/widget_line_gauge.png +0 -0
  109. data/doc/images/widget_list.png +0 -0
  110. data/doc/images/widget_map.png +0 -0
  111. data/doc/images/widget_overlay.png +0 -0
  112. data/doc/images/widget_popup.png +0 -0
  113. data/doc/images/widget_ratatui_logo.png +0 -0
  114. data/doc/images/widget_ratatui_mascot.png +0 -0
  115. data/doc/images/widget_rect.png +0 -0
  116. data/doc/images/widget_render.png +0 -0
  117. data/doc/images/widget_rich_text.png +0 -0
  118. data/doc/images/widget_scroll_text.png +0 -0
  119. data/doc/images/widget_scrollbar.png +0 -0
  120. data/doc/images/widget_sparkline.png +0 -0
  121. data/doc/images/widget_style_colors.png +0 -0
  122. data/doc/images/widget_table.png +0 -0
  123. data/doc/images/widget_tabs.png +0 -0
  124. data/doc/images/widget_text_width.png +0 -0
  125. data/doc/index.md +0 -34
  126. data/doc/troubleshooting/async.md +0 -4
  127. data/doc/troubleshooting/terminal_limitations.md +0 -131
  128. data/doc/troubleshooting/tui_output.md +0 -197
  129. data/examples/app_all_events/README.md +0 -114
  130. data/examples/app_all_events/app.rb +0 -98
  131. data/examples/app_all_events/model/app_model.rb +0 -159
  132. data/examples/app_all_events/model/event_color_cycle.rb +0 -43
  133. data/examples/app_all_events/model/event_entry.rb +0 -94
  134. data/examples/app_all_events/model/msg.rb +0 -39
  135. data/examples/app_all_events/model/timestamp.rb +0 -56
  136. data/examples/app_all_events/update.rb +0 -75
  137. data/examples/app_all_events/view/app_view.rb +0 -80
  138. data/examples/app_all_events/view/controls_view.rb +0 -54
  139. data/examples/app_all_events/view/counts_view.rb +0 -61
  140. data/examples/app_all_events/view/live_view.rb +0 -72
  141. data/examples/app_all_events/view/log_view.rb +0 -57
  142. data/examples/app_all_events/view.rb +0 -9
  143. data/examples/app_cli_rich_moments/README.md +0 -81
  144. data/examples/app_cli_rich_moments/app.rb +0 -189
  145. data/examples/app_color_picker/README.md +0 -156
  146. data/examples/app_color_picker/app.rb +0 -76
  147. data/examples/app_color_picker/clipboard.rb +0 -86
  148. data/examples/app_color_picker/color.rb +0 -193
  149. data/examples/app_color_picker/controls.rb +0 -92
  150. data/examples/app_color_picker/copy_dialog.rb +0 -168
  151. data/examples/app_color_picker/export_pane.rb +0 -128
  152. data/examples/app_color_picker/harmony.rb +0 -58
  153. data/examples/app_color_picker/input.rb +0 -176
  154. data/examples/app_color_picker/main_container.rb +0 -180
  155. data/examples/app_color_picker/palette.rb +0 -111
  156. data/examples/app_debugging_showcase/README.md +0 -119
  157. data/examples/app_debugging_showcase/app.rb +0 -318
  158. data/examples/app_external_editor/README.md +0 -62
  159. data/examples/app_external_editor/app.rb +0 -344
  160. data/examples/app_login_form/README.md +0 -58
  161. data/examples/app_login_form/app.rb +0 -109
  162. data/examples/app_stateful_interaction/README.md +0 -35
  163. data/examples/app_stateful_interaction/app.rb +0 -328
  164. data/examples/timeout_demo.rb +0 -45
  165. data/examples/verify_quickstart_dsl/README.md +0 -55
  166. data/examples/verify_quickstart_dsl/app.rb +0 -49
  167. data/examples/verify_quickstart_layout/README.md +0 -77
  168. data/examples/verify_quickstart_layout/app.rb +0 -73
  169. data/examples/verify_quickstart_lifecycle/README.md +0 -68
  170. data/examples/verify_quickstart_lifecycle/app.rb +0 -62
  171. data/examples/verify_readme_usage/README.md +0 -49
  172. data/examples/verify_readme_usage/app.rb +0 -42
  173. data/examples/verify_website_managed/README.md +0 -48
  174. data/examples/verify_website_managed/app.rb +0 -36
  175. data/examples/verify_website_menu/README.md +0 -60
  176. data/examples/verify_website_menu/app.rb +0 -84
  177. data/examples/verify_website_spinner/README.md +0 -44
  178. data/examples/verify_website_spinner/app.rb +0 -34
  179. data/examples/widget_barchart/README.md +0 -58
  180. data/examples/widget_barchart/app.rb +0 -240
  181. data/examples/widget_block/README.md +0 -44
  182. data/examples/widget_block/app.rb +0 -258
  183. data/examples/widget_box/README.md +0 -54
  184. data/examples/widget_box/app.rb +0 -255
  185. data/examples/widget_calendar/README.md +0 -48
  186. data/examples/widget_calendar/app.rb +0 -115
  187. data/examples/widget_canvas/README.md +0 -31
  188. data/examples/widget_canvas/app.rb +0 -130
  189. data/examples/widget_cell/README.md +0 -45
  190. data/examples/widget_cell/app.rb +0 -112
  191. data/examples/widget_center/README.md +0 -33
  192. data/examples/widget_center/app.rb +0 -118
  193. data/examples/widget_chart/README.md +0 -50
  194. data/examples/widget_chart/app.rb +0 -220
  195. data/examples/widget_gauge/README.md +0 -50
  196. data/examples/widget_gauge/app.rb +0 -229
  197. data/examples/widget_layout_split/README.md +0 -53
  198. data/examples/widget_layout_split/app.rb +0 -260
  199. data/examples/widget_line_gauge/README.md +0 -50
  200. data/examples/widget_line_gauge/app.rb +0 -219
  201. data/examples/widget_list/README.md +0 -58
  202. data/examples/widget_list/app.rb +0 -382
  203. data/examples/widget_map/README.md +0 -48
  204. data/examples/widget_map/app.rb +0 -95
  205. data/examples/widget_overlay/README.md +0 -45
  206. data/examples/widget_overlay/app.rb +0 -250
  207. data/examples/widget_popup/README.md +0 -45
  208. data/examples/widget_popup/app.rb +0 -106
  209. data/examples/widget_ratatui_logo/README.md +0 -43
  210. data/examples/widget_ratatui_logo/app.rb +0 -104
  211. data/examples/widget_ratatui_mascot/README.md +0 -43
  212. data/examples/widget_ratatui_mascot/app.rb +0 -95
  213. data/examples/widget_rect/README.md +0 -53
  214. data/examples/widget_rect/app.rb +0 -222
  215. data/examples/widget_render/README.md +0 -46
  216. data/examples/widget_render/app.rb +0 -186
  217. data/examples/widget_render/app.rbs +0 -41
  218. data/examples/widget_rich_text/README.md +0 -44
  219. data/examples/widget_rich_text/app.rb +0 -193
  220. data/examples/widget_scroll_text/README.md +0 -46
  221. data/examples/widget_scroll_text/app.rb +0 -109
  222. data/examples/widget_scrollbar/README.md +0 -46
  223. data/examples/widget_scrollbar/app.rb +0 -155
  224. data/examples/widget_sparkline/README.md +0 -51
  225. data/examples/widget_sparkline/app.rb +0 -277
  226. data/examples/widget_style_colors/README.md +0 -43
  227. data/examples/widget_style_colors/app.rb +0 -83
  228. data/examples/widget_table/README.md +0 -57
  229. data/examples/widget_table/app.rb +0 -285
  230. data/examples/widget_tabs/README.md +0 -50
  231. data/examples/widget_tabs/app.rb +0 -183
  232. data/examples/widget_text_width/README.md +0 -44
  233. data/examples/widget_text_width/app.rb +0 -117
  234. data/migrate_to_buffer.rb +0 -145
  235. data/mise.toml +0 -8
  236. data/tasks/autodoc/examples.rb +0 -87
  237. data/tasks/autodoc/member.rb +0 -58
  238. data/tasks/autodoc/name.rb +0 -21
  239. data/tasks/autodoc.rake +0 -21
  240. data/tasks/bump/bump_workflow.rb +0 -49
  241. data/tasks/bump/cargo_lockfile.rb +0 -21
  242. data/tasks/bump/changelog.rb +0 -104
  243. data/tasks/bump/header.rb +0 -32
  244. data/tasks/bump/history.rb +0 -32
  245. data/tasks/bump/links.rb +0 -69
  246. data/tasks/bump/manifest.rb +0 -33
  247. data/tasks/bump/patch_release.rb +0 -19
  248. data/tasks/bump/release_branch.rb +0 -17
  249. data/tasks/bump/release_from_trunk.rb +0 -49
  250. data/tasks/bump/repository.rb +0 -54
  251. data/tasks/bump/ruby_gem.rb +0 -29
  252. data/tasks/bump/sem_ver.rb +0 -44
  253. data/tasks/bump/unreleased_section.rb +0 -73
  254. data/tasks/bump.rake +0 -61
  255. data/tasks/doc/documentation.rb +0 -59
  256. data/tasks/doc/link/file_url.rb +0 -30
  257. data/tasks/doc/link/relative_path.rb +0 -61
  258. data/tasks/doc/link/web_url.rb +0 -55
  259. data/tasks/doc/link.rb +0 -52
  260. data/tasks/doc/link_audit.rb +0 -116
  261. data/tasks/doc/problem.rb +0 -40
  262. data/tasks/doc/source_file.rb +0 -93
  263. data/tasks/doc.rake +0 -905
  264. data/tasks/example_viewer.html.erb +0 -172
  265. data/tasks/extension.rake +0 -14
  266. data/tasks/license/headers_md.rb +0 -223
  267. data/tasks/license/headers_rb.rb +0 -210
  268. data/tasks/license/license_utils.rb +0 -130
  269. data/tasks/license/snippets_md.rb +0 -315
  270. data/tasks/license/snippets_rdoc.rb +0 -150
  271. data/tasks/license.rake +0 -91
  272. data/tasks/lint.rake +0 -170
  273. data/tasks/rbs_predicates/predicate_catalog.rb +0 -52
  274. data/tasks/rbs_predicates/predicate_tests.rb +0 -124
  275. data/tasks/rbs_predicates/rbs_signature.rb +0 -63
  276. data/tasks/rbs_predicates.rake +0 -31
  277. data/tasks/rdoc_config.rb +0 -29
  278. data/tasks/resources/build.yml.erb +0 -60
  279. data/tasks/resources/index.html.erb +0 -141
  280. data/tasks/resources/rubies.yml +0 -7
  281. data/tasks/sourcehut.rake +0 -122
  282. data/tasks/steep.rake +0 -11
  283. data/tasks/terminal_preview/app_screenshot.rb +0 -45
  284. data/tasks/terminal_preview/crash_report.rb +0 -54
  285. data/tasks/terminal_preview/example_app.rb +0 -27
  286. data/tasks/terminal_preview/launcher_script.rb +0 -48
  287. data/tasks/terminal_preview/preview_collection.rb +0 -60
  288. data/tasks/terminal_preview/preview_timing.rb +0 -24
  289. data/tasks/terminal_preview/safety_confirmation.rb +0 -58
  290. data/tasks/terminal_preview/saved_screenshot.rb +0 -56
  291. data/tasks/terminal_preview/system_appearance.rb +0 -13
  292. data/tasks/terminal_preview/terminal_window.rb +0 -138
  293. data/tasks/terminal_preview/window_id.rb +0 -16
  294. data/tasks/terminal_preview.rake +0 -30
  295. data/tasks/test.rake +0 -36
  296. data/tasks/website/index_page.rb +0 -30
  297. data/tasks/website/version.rb +0 -122
  298. data/tasks/website/version_menu.rb +0 -68
  299. data/tasks/website/versioned_documentation.rb +0 -83
  300. data/tasks/website/website.rb +0 -53
  301. data/tasks/website.rake +0 -28
@@ -1,200 +0,0 @@
1
- <!--
2
- SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
-
4
- SPDX-License-Identifier: CC-BY-SA-4.0
5
- -->
6
-
7
- # Ratatui Features Audit - Complete Comprehensive Catalog
8
-
9
- These documents catalog EVERY public feature, method, function, enum variant, and constructor in the Ratatui Rust library with precise file/line references. This has the unfinished items; [the other has the finished items](./api_completeness_audit-finished.md).
10
-
11
- ## Terminal & Initialization Features
12
-
13
- | Feature Name | File/Line | Status |
14
- |--------------|-----------|--------|
15
- | try_init | ratatui/src/init.rs:330 | ❌ |
16
- | try_init_with_options | ratatui/src/init.rs:425 | ❌ |
17
- | try_restore | ratatui/src/init.rs:487 | ❌ |
18
- | Viewport::Fixed(Rect) | ratatui-core/src/terminal/viewport.rs:30 | ❌ |
19
- | Terminal struct | ratatui-core/src/terminal/terminal.rs:76 | ⚠️ |
20
- | Terminal::hide_cursor | ratatui-core/src/terminal/terminal.rs:495 | ❌ |
21
- | Terminal::show_cursor | ratatui-core/src/terminal/terminal.rs:502 | ❌ |
22
- | Terminal::get_cursor | ratatui-core/src/terminal/terminal.rs:513 | ❌ |
23
- | Terminal::set_cursor | ratatui-core/src/terminal/terminal.rs:520 | ❌ |
24
- | Terminal::get_cursor_position | ratatui-core/src/terminal/terminal.rs:527 | ⚠️ |
25
- | Terminal::set_cursor_position | ratatui-core/src/terminal/terminal.rs:532 | ⚠️ |
26
- | Terminal::clear | ratatui-core/src/terminal/terminal.rs:540 | ❌ |
27
- | Terminal::swap_buffers | ratatui-core/src/terminal/terminal.rs:562 | ❌ |
28
- | CompletedFrame struct | ratatui-core/src/terminal/frame.rs:40 | ❌ |
29
-
30
- **Notes:**
31
- - **Terminal struct**: No direct Terminal object; abstracted behind `RatatuiRuby` module methods
32
- - **Terminal::get_cursor_position/set_cursor_position**: Only available via [Frame](../../../../lib/ratatui_ruby/frame.rb#72-257) during draw, not on Terminal
33
-
34
- ## Layout Features
35
-
36
- | Feature Name | File/Line | Status |
37
- |--------------|-----------|--------|
38
- | Spacing enum | ratatui-core/src/layout/layout.rs:80 | ❌ |
39
- | Offset struct | ratatui-core/src/layout/offset.rs:10 | ❌ |
40
- | Margin struct | ratatui-core/src/layout/margin.rs:38 | ❌ |
41
-
42
- ## Style Features
43
-
44
- | Feature Name | File/Line | Status |
45
- |--------------|-----------|--------|
46
- | Styled trait | ratatui-core/src/style/stylize.rs:15 | ❌ |
47
- | Stylize trait | ratatui-core/src/style/stylize.rs:* | ❌ |
48
-
49
- ## Text Features
50
-
51
- | Feature Name | File/Line | Status |
52
- |--------------|-----------| -------|
53
- | Masked struct | ratatui-core/src/text/masked.rs:26 | ❌ |
54
- | ToText trait | ratatui-core/src/text/text.rs:721 | ❌ |
55
- | ToSpan trait | ratatui-core/src/text/span.rs:481 | ❌ |
56
- | StyledGrapheme struct | ratatui-core/src/text/grapheme.rs:12 | ❌ |
57
- | ToLine trait | ratatui-core/src/text/line.rs:810 | ❌ |
58
-
59
- ## Widgets
60
-
61
- ### Block Widget
62
-
63
- | Feature Name | File/Line | Status |
64
- |--------------|-----------|--------|
65
- | BorderType::LightDoubleDashed | ratatui-widgets/src/borders.rs:89 | ❌ |
66
- | BorderType::HeavyDoubleDashed | ratatui-widgets/src/borders.rs:97 | ❌ |
67
- | BorderType::LightTripleDashed | ratatui-widgets/src/borders.rs:105 | ❌ |
68
- | BorderType::HeavyTripleDashed | ratatui-widgets/src/borders.rs:113 | ❌ |
69
- | BorderType::LightQuadrupleDashed | ratatui-widgets/src/borders.rs:121 | ❌ |
70
- | BorderType::HeavyQuadrupleDashed | ratatui-widgets/src/borders.rs:129 | ❌ |
71
-
72
- ### Table Widget
73
-
74
- | Feature Name | File/Line | Status |
75
- |--------------|-----------|--------|
76
- | TableState struct | ratatui-widgets/src/table/state.rs:55 | ⚠️ |
77
- | TableState::new | ratatui-widgets/src/table/state.rs:62 | ⚠️ |
78
- | TableState::with_offset | ratatui-widgets/src/table/state.rs:79 | ❌ |
79
- | TableState::with_selected | ratatui-widgets/src/table/state.rs:96 | ❌ |
80
- | TableState::with_selected_column | ratatui-widgets/src/table/state.rs:116 | ❌ |
81
- | TableState::with_selected_cell | ratatui-widgets/src/table/state.rs:135 | ❌ |
82
- | TableState::offset | ratatui-widgets/src/table/state.rs:161 | ⚠️ |
83
- | TableState::offset_mut | ratatui-widgets/src/table/state.rs:175 | ❌ |
84
- | TableState::selected | ratatui-widgets/src/table/state.rs:189 | ⚠️ |
85
- | TableState::selected_column | ratatui-widgets/src/table/state.rs:205 | ⚠️ |
86
- | TableState::selected_cell | ratatui-widgets/src/table/state.rs:220 | ❌ |
87
- | TableState::selected_mut | ratatui-widgets/src/table/state.rs:238 | ❌ |
88
- | TableState::select | ratatui-widgets/src/table/state.rs:269 | ⚠️ |
89
- | TableState::select_next | ratatui-widgets/src/table/state.rs:336 | ❌ |
90
- | TableState::select_previous | ratatui-widgets/src/table/state.rs:371 | ❌ |
91
- | TableState::select_next_column | ratatui-widgets/src/table/state.rs:353 | ❌ |
92
- | TableState::select_previous_column | ratatui-widgets/src/table/state.rs:388 | ❌ |
93
- | TableState::scroll_down_by | ratatui-widgets/src/table/state.rs:475 | ❌ |
94
- | TableState::scroll_up_by | ratatui-widgets/src/table/state.rs:494 | ❌ |
95
-
96
- **Notes:**
97
- - **TableState**: Implemented as Data.define attributes on Table widget itself (selected_row, selected_column, offset) instead of separate state object
98
-
99
- ### List Widget
100
-
101
- | Feature Name | File/Line | Status |
102
- |--------------|-----------|--------|
103
- | ListState struct | ratatui-widgets/src/list/state.rs:45 | ⚠️ |
104
- | ListState::with_offset | ratatui-widgets/src/list/state.rs:51 | ❌ |
105
- | ListState::with_selected | ratatui-widgets/src/list/state.rs:68 | ❌ |
106
- | ListState::offset | ratatui-widgets/src/list/state.rs:85 | ⚠️ |
107
- | ListState::offset_mut | ratatui-widgets/src/list/state.rs:99 | ❌ |
108
- | ListState::selected | ratatui-widgets/src/list/state.rs:113 | ⚠️ |
109
- | ListState::selected_mut | ratatui-widgets/src/list/state.rs:129 | ❌ |
110
- | ListState::select | ratatui-widgets/src/list/state.rs:145 | ⚠️ |
111
- | ListState::select_next | ratatui-widgets/src/list/state.rs:177 | ❌ |
112
- | ListState::select_previous | ratatui-widgets/src/list/state.rs:195 | ❌ |
113
- | ListState::select_first | ratatui-widgets/src/list/state.rs:200 | ❌ |
114
- | ListState::select_last | ratatui-widgets/src/list/state.rs:217 | ❌ |
115
-
116
- **Notes:**
117
- - **ListState**: Implemented as Data.define attributes on List widget itself (selected_index, offset) instead of separate state object
118
- | ListState::scroll_down_by | ratatui-widgets/src/list/state.rs:248 | ❌ |
119
- | ListState::scroll_up_by | ratatui-widgets/src/list/state.rs:267 | ❌ |
120
-
121
- ### Sparkline Widget
122
-
123
- | Feature Name | File/Line | Status |
124
- |--------------|-----------|--------|
125
- | SparklineBar struct | ratatui-widgets/src/sparkline.rs:253 | ❌ |
126
-
127
- ### Scrollbar Widget
128
-
129
- | Feature Name | File/Line | Status |
130
- |--------------|-----------|--------|
131
- | ScrollbarState struct | ratatui-widgets/src/scrollbar.rs:149 | ⚠️ |
132
- | ScrollDirection::Forward | ratatui-widgets/src/scrollbar.rs:169 | ❌ |
133
- | ScrollDirection::Backward | ratatui-widgets/src/scrollbar.rs:172 | ❌ |
134
-
135
- **Notes:**
136
- - **ScrollbarState**: Implemented as Data.define attributes on Scrollbar widget itself (content_length, position) instead of separate state object
137
-
138
- ### Calendar Widget
139
-
140
- | Feature Name | File/Line | Status |
141
- |--------------|-----------|--------|
142
- | CalendarEventStore struct | ratatui-widgets/src/calendar.rs:258 | ❌ |
143
-
144
- ### Canvas Widget
145
-
146
- | Feature Name | File/Line | Status |
147
- |--------------|-----------|--------|
148
- | Context struct | ratatui-widgets/src/canvas.rs:515 | ❌ |
149
- | Painter struct | ratatui-widgets/src/canvas.rs:403 | ❌ |
150
- | Label struct | ratatui-widgets/src/canvas.rs:61 | ❌ |
151
- | Points shape | ratatui-widgets/src/canvas/points.rs:7 | ❌ |
152
-
153
- ## Buffer Features
154
-
155
- | Feature Name | File/Line | Status |
156
- |--------------|-----------|--------|
157
- | Buffer::empty | ratatui-core/src/buffer/buffer.rs:77 | ❌ |
158
- | Buffer::filled | ratatui-core/src/buffer/buffer.rs:83 | ❌ |
159
- | Buffer::with_lines | ratatui-core/src/buffer/buffer.rs:91 | ❌ |
160
- | Buffer::get_mut | ratatui-core/src/buffer/buffer.rs:150 | ❌ |
161
- | Buffer::index_of | ratatui-core/src/buffer/buffer.rs:248 | ❌ |
162
- | Buffer::set_string | ratatui-core/src/buffer/buffer.rs:323 | ❌ |
163
- | Buffer::set_stringn | ratatui-core/src/buffer/buffer.rs:335 | ❌ |
164
- | Buffer::set_line | ratatui-core/src/buffer/buffer.rs:372 | ❌ |
165
- | Buffer::set_span | ratatui-core/src/buffer/buffer.rs:394 | ❌ |
166
- | Buffer::set_style | ratatui-core/src/buffer/buffer.rs:404 | ❌ |
167
- | Buffer::reset | ratatui-core/src/buffer/buffer.rs:427 | ❌ |
168
- | Cell::set_style | ratatui-core/src/buffer/cell.rs:153 | ❌ |
169
- | Cell::reset | ratatui-core/src/buffer/cell.rs:193 | ❌ |
170
-
171
- **Notes:**
172
- - **Buffer**: Read-only access implemented via `RatatuiRuby.get_cell_at`. Direct mutation methods not exposed in Ruby API
173
-
174
- ## Widget Traits
175
-
176
- | Feature Name | File/Line | Status |
177
- |--------------|-----------|--------|
178
- | Widget trait | ratatui-core/src/widgets/widget.rs:70 | ⚠️ |
179
- | StatefulWidget trait | ratatui-core/src/widgets/stateful_widget.rs:124 | ⚠️ |
180
-
181
- **Notes:**
182
- - **Widget/StatefulWidget traits**: Not exposed as Ruby traits. Widgets implement `CoerceableWidget` mixin and rendering handled via FFI
183
-
184
- ## Backend Features
185
-
186
- | Feature Name | File/Line | Status |
187
- |--------------|-----------|--------|
188
- | Backend trait | ratatui-core/src/backend.rs:148 | ⚠️ |
189
- | ClearType::All | ratatui-core/src/backend.rs:117 | ❌ |
190
- | ClearType::AfterCursor | ratatui-core/src/backend.rs:119 | ❌ |
191
- | ClearType::BeforeCursor | ratatui-core/src/backend.rs:121 | ❌ |
192
- | ClearType::CurrentLine | ratatui-core/src/backend.rs:123 | ❌ |
193
- | ClearType::UntilNewLine | ratatui-core/src/backend.rs:125 | ❌ |
194
- | WindowSize struct | ratatui-core/src/backend.rs:130 | ❌ |
195
- | TermionBackend | ratatui-termion/src/lib.rs:* | ❌ |
196
- | TermwizBackend | ratatui-termwiz/src/lib.rs:* | ❌ |
197
-
198
- **Notes:**
199
- - **Backend trait**: Abstracted away. Terminal uses Crossterm backend internally, not exposed to Ruby API
200
- - **ClearType**: Not exposed. Clearing handled via `Clear` widget
@@ -1,351 +0,0 @@
1
- <!--
2
- SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
- SPDX-License-Identifier: CC-BY-SA-4.0
4
- -->
5
-
6
- # TERM Environment Variable Respect
7
-
8
- Expose terminal capability detection so applications can degrade gracefully.
9
-
10
- ---
11
-
12
- ## Crossterm Audit (2026-01-17)
13
-
14
- What crossterm actually exposes that we can wrap:
15
-
16
- ### Available Public APIs
17
-
18
- | Function | Location | Notes |
19
- |----------|----------|-------|
20
- | `available_color_count()` | `src/style.rs:163` | Returns `u16`: 8, 256, or `u16::MAX` (truecolor). Checks `COLORTERM`, `TERM` env vars. |
21
- | `force_color_output(bool)` | `src/style.rs:191` | Override `NO_COLOR` check globally. |
22
- | `supports_keyboard_enhancement()` | `src/terminal/sys/unix.rs:188` | Requires `events` feature. Queries terminal via escape sequence. |
23
- | `window_size()` | `src/terminal.rs:148` | Returns `WindowSize { columns, rows, width, height }` including **pixel dimensions**. |
24
- | `supports_ansi()` | `src/ansi_support.rs:33` | **Windows only**. Checks VT processing + `TERM != "dumb"`. |
25
-
26
- ### Internal Logic (Not Exposed, But Informs Design)
27
-
28
- From `src/style.rs:174-180`:
29
- <!-- SPDX-SnippetBegin -->
30
- <!--
31
- SPDX-FileCopyrightText: 2026 Kerrick Long
32
- SPDX-License-Identifier: MIT-0
33
- -->
34
- ```rust
35
- env::var("COLORTERM")
36
- .or_else(|_| env::var("TERM"))
37
- .map_or(DEFAULT, |x| match x {
38
- _ if x.contains("24bit") || x.contains("truecolor") => u16::MAX,
39
- _ if x.contains("256") => 256,
40
- _ => DEFAULT, // 8 colors
41
- })
42
- ```
43
- <!-- SPDX-SnippetEnd -->
44
-
45
- From `src/ansi_support.rs:39-40` (Windows):
46
- <!-- SPDX-SnippetBegin -->
47
- <!--
48
- SPDX-FileCopyrightText: 2026 Kerrick Long
49
- SPDX-License-Identifier: MIT-0
50
- -->
51
- ```rust
52
- let supported = enable_vt_processing().is_ok()
53
- || std::env::var("TERM").map_or(false, |term| term != "dumb");
54
- ```
55
- <!-- SPDX-SnippetEnd -->
56
-
57
- ### What Ratatui Exposes
58
-
59
- The `Backend` trait in `ratatui-core/src/backend.rs` exposes:
60
- - `size()` → `Result<Size>` (columns/rows)
61
- - `window_size()` → `Result<WindowSize>` (columns/rows + pixels)
62
-
63
- **No capability detection is exposed through ratatui itself.** We must call crossterm directly.
64
-
65
- ### Audit Summary
66
-
67
- | Proposed API | Implementation | Source |
68
- |--------------|----------------|--------|
69
- | `tty?` | Pure Ruby | `$stdout.tty?` |
70
- | `dumb?` | Pure Ruby | `ENV["TERM"]` |
71
- | `no_color?` | Pure Ruby | `ENV.key?("NO_COLOR")` |
72
- | `force_color?` | Pure Ruby | `ENV.key?("FORCE_COLOR")` |
73
- | `color_support` | **Wrap crossterm** | `crossterm::style::available_color_count()` |
74
- | `supports_keyboard_enhancement?` | **Wrap crossterm** | `crossterm::terminal::supports_keyboard_enhancement()` |
75
- | `size_pixels` | **Wrap crossterm** | `crossterm::terminal::window_size().{width,height}` |
76
- | `interactive?` | Pure Ruby | Combines `tty?` + `dumb?` |
77
- | `suggested_style` | Pure Ruby | Derives from `color_support` |
78
-
79
- ---
80
-
81
- ## Problem Statement
82
-
83
- Rust-based CLI libraries often ignore the `TERM` environment variable and assume modern terminal features. This causes issues in:
84
-
85
- - **CI environments** — `TERM=dumb` or missing entirely
86
- - **Piped output** — stdout isn't a TTY
87
- - **Legacy terminals** — SSH to old systems, embedded devices
88
- - **Accessibility** — Screen readers need simpler output
89
- - **`NO_COLOR` movement** — Users explicitly disable color
90
-
91
- RatatuiRuby currently provides no capability detection APIs. Applications cannot query terminal support before rendering.
92
-
93
- ---
94
-
95
- ## Proposed API
96
-
97
- > [!NOTE]
98
- > These capability detection methods integrate with the `Terminal` class design from [terminal.md](terminal.md).
99
- > They are **class methods** on `RatatuiRuby::Terminal`, not a separate module.
100
-
101
- ### Phase 1: Environment Detection (Ruby-side)
102
-
103
- Pure Ruby class methods using environment variables and standard library.
104
-
105
- <!-- SPDX-SnippetBegin -->
106
- <!--
107
- SPDX-FileCopyrightText: 2026 Kerrick Long
108
- SPDX-License-Identifier: MIT-0
109
- -->
110
- ```ruby
111
- # lib/ratatui_ruby/terminal.rb (additions to existing Terminal class)
112
- module RatatuiRuby
113
- class Terminal
114
- class << self
115
- # Is stdout connected to a terminal?
116
- def tty? = $stdout.tty?
117
-
118
- # Is this a dumb terminal with no capabilities?
119
- def dumb? = ENV["TERM"] == "dumb" || ENV["TERM"].to_s.empty?
120
-
121
- # Should color be disabled? (NO_COLOR standard)
122
- def no_color? = ENV.key?("NO_COLOR")
123
-
124
- # Should color be forced? (overrides tty? check)
125
- def force_color? = ENV.key?("FORCE_COLOR")
126
-
127
- # Detected color support level
128
- # :none - No color (dumb terminal, NO_COLOR set, not a tty)
129
- # :basic - 16 colors (standard ANSI)
130
- # :ansi256 - 256 colors
131
- # :truecolor - 24-bit RGB
132
- def color_support
133
- return :none if no_color? || dumb?
134
- return detect_color_level if tty? || force_color?
135
- :none
136
- end
137
-
138
- private
139
-
140
- def detect_color_level
141
- colorterm = ENV["COLORTERM"]
142
- return :truecolor if colorterm == "truecolor" || colorterm == "24bit"
143
-
144
- term = ENV["TERM"].to_s
145
- return :truecolor if term.include?("truecolor") || term.include?("24bit")
146
- return :ansi256 if term.include?("256color")
147
- return :basic if term.start_with?("xterm", "screen", "vt100", "linux")
148
-
149
- :basic # Conservative default for unknown terminals
150
- end
151
- end
152
- end
153
- end
154
- ```
155
- <!-- SPDX-SnippetEnd -->
156
-
157
- ### Phase 2: Crossterm Capability Queries (Rust-side)
158
-
159
- Expose crossterm's runtime detection through Magnus bindings.
160
-
161
- <!-- SPDX-SnippetBegin -->
162
- <!--
163
- SPDX-FileCopyrightText: 2026 Kerrick Long
164
- SPDX-License-Identifier: MIT-0
165
- -->
166
- ```rust
167
- // ext/ratatui_ruby/src/terminal_capabilities.rs
168
-
169
- use crossterm::terminal;
170
- use magnus::{function, Error, Module, Object};
171
-
172
- /// Query if the terminal supports the Kitty keyboard protocol
173
- pub fn supports_keyboard_enhancement() -> Result<bool, Error> {
174
- Ok(terminal::supports_keyboard_enhancement()
175
- .map_err(|e| Error::new(magnus::exception::runtime_error(), e.to_string()))?)
176
- }
177
-
178
- /// Query terminal size in pixels (if supported)
179
- pub fn terminal_size_pixels() -> Result<Option<(u16, u16)>, Error> {
180
- match crossterm::terminal::window_size() {
181
- Ok(size) => Ok(Some((size.width, size.height))),
182
- Err(_) => Ok(None),
183
- }
184
- }
185
-
186
- pub fn register(ruby: &magnus::Ruby, module: &magnus::RModule) -> Result<(), Error> {
187
- module.define_module_function("_supports_keyboard_enhancement",
188
- function!(supports_keyboard_enhancement, 0))?;
189
- module.define_module_function("_terminal_size_pixels",
190
- function!(terminal_size_pixels, 0))?;
191
- Ok(())
192
- }
193
- ```
194
- <!-- SPDX-SnippetEnd -->
195
-
196
- Ruby wrapper (class methods on Terminal):
197
-
198
- <!-- SPDX-SnippetBegin -->
199
- <!--
200
- SPDX-FileCopyrightText: 2026 Kerrick Long
201
- SPDX-License-Identifier: MIT-0
202
- -->
203
- ```ruby
204
- # lib/ratatui_ruby/terminal.rb (continued)
205
- module RatatuiRuby
206
- class Terminal
207
- class << self
208
- # Does the terminal support the Kitty keyboard protocol?
209
- def supports_keyboard_enhancement?
210
- RatatuiRuby._supports_keyboard_enhancement
211
- rescue
212
- false
213
- end
214
-
215
- # Terminal size in pixels (for graphics protocols)
216
- # Returns { width:, height: } or nil if unsupported
217
- def size_pixels
218
- result = RatatuiRuby._terminal_size_pixels
219
- result ? { width: result[0], height: result[1] } : nil
220
- rescue
221
- nil
222
- end
223
- end
224
- end
225
- end
226
- ```
227
- <!-- SPDX-SnippetEnd -->
228
-
229
- ### Phase 3: Graceful Degradation Helpers
230
-
231
- Convenience class methods for common patterns.
232
-
233
- <!-- SPDX-SnippetBegin -->
234
- <!--
235
- SPDX-FileCopyrightText: 2026 Kerrick Long
236
- SPDX-License-Identifier: MIT-0
237
- -->
238
- ```ruby
239
- # lib/ratatui_ruby/terminal.rb (continued)
240
- module RatatuiRuby
241
- class Terminal
242
- class << self
243
- # Should the application use TUI mode?
244
- # Returns false for dumb terminals, piped output, etc.
245
- def interactive?
246
- tty? && !dumb?
247
- end
248
-
249
- # Suggested style based on terminal capabilities
250
- def suggested_style
251
- case color_support
252
- when :none then :plain
253
- when :basic then :ansi16
254
- when :ansi256 then :ansi256
255
- when :truecolor then :truecolor
256
- end
257
- end
258
- end
259
- end
260
- end
261
- ```
262
- <!-- SPDX-SnippetEnd -->
263
-
264
- ---
265
-
266
- ## Implementation Plan
267
-
268
- ### Phase 1: Environment Detection
269
-
270
- | File | Change |
271
- |------|--------|
272
- | [NEW] `lib/ratatui_ruby/terminal.rb` | `Terminal` module with `tty?`, `dumb?`, `no_color?`, `force_color?`, `color_support` |
273
- | [NEW] `sig/ratatui_ruby/terminal.rbs` | RBS type declarations |
274
- | [NEW] `test/test_terminal_capabilities.rb` | Unit tests with mocked ENV |
275
- | [MODIFY] `lib/ratatui_ruby.rb` | Require the new module |
276
-
277
- ### Phase 2: Crossterm Queries
278
-
279
- | File | Change |
280
- |------|--------|
281
- | [NEW] `ext/ratatui_ruby/src/terminal_capabilities.rs` | `supports_keyboard_enhancement`, `terminal_size_pixels` |
282
- | [MODIFY] `ext/ratatui_ruby/src/lib.rs` | Register new module |
283
- | [MODIFY] `lib/ratatui_ruby/terminal.rb` | Add `supports_keyboard_enhancement?`, `size_pixels` |
284
- | [MODIFY] `sig/ratatui_ruby/terminal.rbs` | Add new method types |
285
- | [MODIFY] `test/test_terminal_capabilities.rb` | Add integration tests |
286
-
287
- ### Phase 3: Convenience Methods
288
-
289
- | File | Change |
290
- |------|--------|
291
- | [MODIFY] `lib/ratatui_ruby/terminal.rb` | Add `interactive?`, `suggested_style` |
292
- | [MODIFY] `sig/ratatui_ruby/terminal.rbs` | Add new method types |
293
- | [MODIFY] `test/test_terminal_capabilities.rb` | Add convenience method tests |
294
-
295
- ---
296
-
297
- ## Documentation Updates
298
-
299
- | File | Change |
300
- |------|--------|
301
- | [NEW] `doc/concepts/terminal_capabilities.md` | Guide for capability detection |
302
- | [MODIFY] `doc/troubleshooting/terminal_limitations.md` | Reference new detection APIs |
303
- | [MODIFY] `CHANGELOG.md` | Document new feature |
304
-
305
- ---
306
-
307
- ## Verification Plan
308
-
309
- ### Automated Tests
310
-
311
- <!-- SPDX-SnippetBegin -->
312
- <!--
313
- SPDX-FileCopyrightText: 2026 Kerrick Long
314
- SPDX-License-Identifier: MIT-0
315
- -->
316
- ```bash
317
- bundle exec rake test TEST=test/test_terminal_capabilities.rb
318
- bundle exec steep check
319
- ```
320
- <!-- SPDX-SnippetEnd -->
321
-
322
- ### Manual Verification
323
-
324
- <!-- SPDX-SnippetBegin -->
325
- <!--
326
- SPDX-FileCopyrightText: 2026 Kerrick Long
327
- SPDX-License-Identifier: MIT-0
328
- -->
329
- ```bash
330
- # Test NO_COLOR respect
331
- NO_COLOR=1 bundle exec ruby -e "require 'ratatui_ruby'; p RatatuiRuby::Terminal.color_support"
332
- # Expected: :none
333
-
334
- # Test dumb terminal
335
- TERM=dumb bundle exec ruby -e "require 'ratatui_ruby'; p RatatuiRuby::Terminal.dumb?"
336
- # Expected: true
337
-
338
- # Test truecolor detection
339
- COLORTERM=truecolor bundle exec ruby -e "require 'ratatui_ruby'; p RatatuiRuby::Terminal.color_support"
340
- # Expected: :truecolor
341
- ```
342
- <!-- SPDX-SnippetEnd -->
343
-
344
- ---
345
-
346
- ## References
347
-
348
- - [NO_COLOR Standard](https://no-color.org/)
349
- - [Crossterm Terminal Queries](https://docs.rs/crossterm/latest/crossterm/terminal/index.html)
350
- - [Kitty Keyboard Protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/)
351
- - [terminfo(5)](https://man7.org/linux/man-pages/man5/terminfo.5.html)