ratatui_ruby 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.builds/ruby-3.2.yml +1 -1
- data/.builds/ruby-3.3.yml +1 -1
- data/.builds/ruby-3.4.yml +1 -1
- data/.builds/ruby-4.0.0.yml +1 -1
- data/AGENTS.md +98 -176
- data/CHANGELOG.md +80 -6
- data/README.md +19 -7
- data/REUSE.toml +15 -0
- data/doc/application_architecture.md +179 -45
- data/doc/application_testing.md +80 -32
- data/doc/contributors/design/ruby_frontend.md +48 -8
- data/doc/contributors/design/rust_backend.md +1 -0
- data/doc/contributors/developing_examples.md +191 -48
- data/doc/contributors/documentation_style.md +7 -0
- data/doc/contributors/examples_audit/p1_high.md +21 -0
- data/doc/contributors/examples_audit/p2_moderate.md +81 -0
- data/doc/contributors/examples_audit.md +41 -0
- data/doc/contributors/index.md +2 -0
- data/doc/event_handling.md +21 -7
- data/doc/images/app_all_events.png +0 -0
- data/doc/images/app_color_picker.png +0 -0
- data/doc/images/app_login_form.png +0 -0
- data/doc/images/app_stateful_interaction.png +0 -0
- data/doc/images/verify_quickstart_dsl.png +0 -0
- data/doc/images/verify_quickstart_layout.png +0 -0
- data/doc/images/verify_quickstart_lifecycle.png +0 -0
- data/doc/images/verify_readme_usage.png +0 -0
- data/doc/images/widget_barchart_demo.png +0 -0
- data/doc/images/widget_block_demo.png +0 -0
- data/doc/images/widget_box_demo.png +0 -0
- data/doc/images/widget_calendar_demo.png +0 -0
- data/doc/images/widget_canvas_demo.png +0 -0
- data/doc/images/widget_cell_demo.png +0 -0
- data/doc/images/widget_center_demo.png +0 -0
- data/doc/images/widget_chart_demo.png +0 -0
- data/doc/images/widget_gauge_demo.png +0 -0
- data/doc/images/widget_layout_split.png +0 -0
- data/doc/images/widget_line_gauge_demo.png +0 -0
- data/doc/images/widget_list_demo.png +0 -0
- data/doc/images/widget_overlay_demo.png +0 -0
- data/doc/images/widget_ratatui_logo_demo.png +0 -0
- data/doc/images/widget_ratatui_mascot_demo.png +0 -0
- data/doc/images/widget_render.png +0 -0
- data/doc/images/widget_rich_text.png +0 -0
- data/doc/images/widget_scroll_text.png +0 -0
- data/doc/images/widget_scrollbar_demo.png +0 -0
- data/doc/images/widget_sparkline_demo.png +0 -0
- data/doc/images/widget_style_colors.png +0 -0
- data/doc/images/widget_table_demo.png +0 -0
- data/doc/images/widget_table_flex.png +0 -0
- data/doc/images/widget_tabs_demo.png +0 -0
- data/doc/images/widget_text_width.png +0 -0
- data/doc/interactive_design.md +25 -30
- data/doc/quickstart.md +150 -130
- data/doc/terminal_limitations.md +92 -0
- data/examples/app_all_events/README.md +99 -0
- data/examples/app_all_events/app.rb +96 -0
- data/examples/app_all_events/model/app_model.rb +157 -0
- data/examples/app_all_events/model/event_color_cycle.rb +41 -0
- data/examples/app_all_events/model/event_entry.rb +92 -0
- data/examples/app_all_events/model/msg.rb +37 -0
- data/examples/app_all_events/model/timestamp.rb +54 -0
- data/examples/app_all_events/update.rb +73 -0
- data/examples/app_all_events/view/app_view.rb +78 -0
- data/examples/app_all_events/view/controls_view.rb +52 -0
- data/examples/app_all_events/view/counts_view.rb +59 -0
- data/examples/app_all_events/view/live_view.rb +70 -0
- data/examples/app_all_events/view/log_view.rb +55 -0
- data/examples/app_all_events/view.rb +7 -0
- data/examples/app_color_picker/README.md +134 -0
- data/examples/app_color_picker/app.rb +74 -0
- data/examples/app_color_picker/clipboard.rb +84 -0
- data/examples/app_color_picker/color.rb +191 -0
- data/examples/app_color_picker/controls.rb +90 -0
- data/examples/app_color_picker/copy_dialog.rb +166 -0
- data/examples/app_color_picker/export_pane.rb +126 -0
- data/examples/app_color_picker/harmony.rb +56 -0
- data/examples/app_color_picker/input.rb +174 -0
- data/examples/app_color_picker/main_container.rb +178 -0
- data/examples/app_color_picker/palette.rb +109 -0
- data/examples/app_login_form/README.md +47 -0
- data/examples/{login_form → app_login_form}/app.rb +38 -42
- data/examples/app_stateful_interaction/README.md +31 -0
- data/examples/app_stateful_interaction/app.rb +272 -0
- data/examples/timeout_demo.rb +43 -0
- data/examples/verify_quickstart_dsl/README.md +48 -0
- data/examples/{quickstart_dsl → verify_quickstart_dsl}/app.rb +17 -6
- data/examples/verify_quickstart_layout/README.md +71 -0
- data/examples/verify_quickstart_layout/app.rb +71 -0
- data/examples/verify_quickstart_lifecycle/README.md +56 -0
- data/examples/verify_quickstart_lifecycle/app.rb +54 -0
- data/examples/verify_readme_usage/README.md +43 -0
- data/examples/verify_readme_usage/app.rb +40 -0
- data/examples/widget_barchart_demo/README.md +49 -0
- data/examples/widget_barchart_demo/app.rb +238 -0
- data/examples/widget_block_demo/README.md +34 -0
- data/examples/widget_block_demo/app.rb +256 -0
- data/examples/widget_box_demo/README.md +45 -0
- data/examples/{box_demo → widget_box_demo}/app.rb +99 -65
- data/examples/widget_calendar_demo/README.md +39 -0
- data/examples/widget_calendar_demo/app.rb +109 -0
- data/examples/widget_canvas_demo/README.md +27 -0
- data/examples/widget_canvas_demo/app.rb +123 -0
- data/examples/widget_cell_demo/README.md +36 -0
- data/examples/widget_cell_demo/app.rb +111 -0
- data/examples/widget_center_demo/README.md +29 -0
- data/examples/widget_center_demo/app.rb +116 -0
- data/examples/widget_chart_demo/README.md +41 -0
- data/examples/widget_chart_demo/app.rb +218 -0
- data/examples/widget_gauge_demo/README.md +41 -0
- data/examples/widget_gauge_demo/app.rb +212 -0
- data/examples/widget_layout_split/README.md +44 -0
- data/examples/widget_layout_split/app.rb +246 -0
- data/examples/widget_line_gauge_demo/README.md +41 -0
- data/examples/widget_line_gauge_demo/app.rb +217 -0
- data/examples/widget_list_demo/README.md +49 -0
- data/examples/widget_list_demo/app.rb +366 -0
- data/examples/widget_map_demo/README.md +39 -0
- data/examples/{map_demo → widget_map_demo}/app.rb +24 -21
- data/examples/widget_overlay_demo/app.rb +248 -0
- data/examples/widget_popup_demo/README.md +36 -0
- data/examples/widget_popup_demo/app.rb +104 -0
- data/examples/widget_ratatui_logo_demo/README.md +34 -0
- data/examples/widget_ratatui_logo_demo/app.rb +103 -0
- data/examples/widget_ratatui_mascot_demo/README.md +34 -0
- data/examples/widget_ratatui_mascot_demo/app.rb +93 -0
- data/examples/widget_rect/README.md +38 -0
- data/examples/widget_rect/app.rb +205 -0
- data/examples/widget_render/README.md +37 -0
- data/examples/widget_render/app.rb +184 -0
- data/examples/widget_rich_text/README.md +35 -0
- data/examples/widget_rich_text/app.rb +166 -0
- data/examples/widget_scroll_text/README.md +37 -0
- data/examples/widget_scroll_text/app.rb +107 -0
- data/examples/widget_scrollbar_demo/README.md +37 -0
- data/examples/widget_scrollbar_demo/app.rb +153 -0
- data/examples/widget_sparkline_demo/README.md +42 -0
- data/examples/widget_sparkline_demo/app.rb +275 -0
- data/examples/widget_style_colors/README.md +34 -0
- data/examples/widget_style_colors/app.rb +19 -21
- data/examples/widget_table_demo/README.md +48 -0
- data/examples/widget_table_demo/app.rb +239 -0
- data/examples/widget_tabs_demo/README.md +41 -0
- data/examples/widget_tabs_demo/app.rb +181 -0
- data/examples/widget_text_width/README.md +35 -0
- data/examples/widget_text_width/app.rb +106 -0
- data/ext/ratatui_ruby/Cargo.lock +11 -4
- data/ext/ratatui_ruby/Cargo.toml +2 -1
- data/ext/ratatui_ruby/src/events.rs +359 -62
- data/ext/ratatui_ruby/src/frame.rs +227 -0
- data/ext/ratatui_ruby/src/lib.rs +110 -27
- data/ext/ratatui_ruby/src/rendering.rs +8 -4
- data/ext/ratatui_ruby/src/string_width.rs +101 -0
- data/ext/ratatui_ruby/src/style.rs +138 -57
- data/ext/ratatui_ruby/src/terminal.rs +42 -22
- data/ext/ratatui_ruby/src/text.rs +14 -7
- data/ext/ratatui_ruby/src/widgets/barchart.rs +74 -54
- data/ext/ratatui_ruby/src/widgets/block.rs +7 -6
- data/ext/ratatui_ruby/src/widgets/canvas.rs +21 -3
- data/ext/ratatui_ruby/src/widgets/chart.rs +20 -10
- data/ext/ratatui_ruby/src/widgets/gauge.rs +9 -2
- data/ext/ratatui_ruby/src/widgets/layout.rs +9 -4
- data/ext/ratatui_ruby/src/widgets/line_gauge.rs +9 -2
- data/ext/ratatui_ruby/src/widgets/list.rs +211 -12
- data/ext/ratatui_ruby/src/widgets/list_state.rs +137 -0
- data/ext/ratatui_ruby/src/widgets/mod.rs +3 -0
- data/ext/ratatui_ruby/src/widgets/overlay.rs +2 -1
- data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
- data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +19 -8
- data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +17 -10
- data/ext/ratatui_ruby/src/widgets/scrollbar.rs +97 -3
- data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +169 -0
- data/ext/ratatui_ruby/src/widgets/sparkline.rs +14 -11
- data/ext/ratatui_ruby/src/widgets/table.rs +121 -5
- data/ext/ratatui_ruby/src/widgets/table_state.rs +121 -0
- data/ext/ratatui_ruby/src/widgets/tabs.rs +11 -11
- data/lib/ratatui_ruby/cell.rb +7 -7
- data/lib/ratatui_ruby/event/key/character.rb +35 -0
- data/lib/ratatui_ruby/event/key/media.rb +44 -0
- data/lib/ratatui_ruby/event/key/modifier.rb +95 -0
- data/lib/ratatui_ruby/event/key/navigation.rb +55 -0
- data/lib/ratatui_ruby/event/key/system.rb +45 -0
- data/lib/ratatui_ruby/event/key.rb +112 -52
- data/lib/ratatui_ruby/event/mouse.rb +3 -3
- data/lib/ratatui_ruby/event/none.rb +43 -0
- data/lib/ratatui_ruby/event/paste.rb +1 -1
- data/lib/ratatui_ruby/event.rb +56 -4
- data/lib/ratatui_ruby/frame.rb +183 -0
- data/lib/ratatui_ruby/list_state.rb +88 -0
- data/lib/ratatui_ruby/schema/bar_chart/bar.rb +13 -13
- data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +1 -5
- data/lib/ratatui_ruby/schema/bar_chart.rb +217 -217
- data/lib/ratatui_ruby/schema/block.rb +163 -168
- data/lib/ratatui_ruby/schema/calendar.rb +66 -67
- data/lib/ratatui_ruby/schema/canvas.rb +63 -63
- data/lib/ratatui_ruby/schema/center.rb +46 -46
- data/lib/ratatui_ruby/schema/chart.rb +135 -143
- data/lib/ratatui_ruby/schema/clear.rb +42 -42
- data/lib/ratatui_ruby/schema/constraint.rb +76 -76
- data/lib/ratatui_ruby/schema/cursor.rb +30 -25
- data/lib/ratatui_ruby/schema/gauge.rb +54 -52
- data/lib/ratatui_ruby/schema/layout.rb +87 -87
- data/lib/ratatui_ruby/schema/line_gauge.rb +62 -62
- data/lib/ratatui_ruby/schema/list.rb +103 -80
- data/lib/ratatui_ruby/schema/list_item.rb +41 -0
- data/lib/ratatui_ruby/schema/overlay.rb +31 -31
- data/lib/ratatui_ruby/schema/paragraph.rb +80 -80
- data/lib/ratatui_ruby/schema/ratatui_logo.rb +10 -6
- data/lib/ratatui_ruby/schema/ratatui_mascot.rb +10 -5
- data/lib/ratatui_ruby/schema/rect.rb +99 -56
- data/lib/ratatui_ruby/schema/scrollbar.rb +119 -119
- data/lib/ratatui_ruby/schema/shape/label.rb +1 -1
- data/lib/ratatui_ruby/schema/sparkline.rb +111 -110
- data/lib/ratatui_ruby/schema/style.rb +66 -46
- data/lib/ratatui_ruby/schema/table.rb +126 -115
- data/lib/ratatui_ruby/schema/tabs.rb +66 -67
- data/lib/ratatui_ruby/schema/text.rb +69 -1
- data/lib/ratatui_ruby/scrollbar_state.rb +112 -0
- data/lib/ratatui_ruby/session/autodoc.rb +482 -0
- data/lib/ratatui_ruby/session.rb +55 -23
- data/lib/ratatui_ruby/table_state.rb +90 -0
- data/lib/ratatui_ruby/test_helper/event_injection.rb +169 -0
- data/lib/ratatui_ruby/test_helper/snapshot.rb +390 -0
- data/lib/ratatui_ruby/test_helper/style_assertions.rb +351 -0
- data/lib/ratatui_ruby/test_helper/terminal.rb +127 -0
- data/lib/ratatui_ruby/test_helper/test_doubles.rb +68 -0
- data/lib/ratatui_ruby/test_helper.rb +66 -193
- data/lib/ratatui_ruby/version.rb +1 -1
- data/lib/ratatui_ruby.rb +100 -51
- data/{examples/sparkline_demo → sig/examples/app_all_events}/app.rbs +3 -2
- data/sig/examples/app_all_events/model/event_entry.rbs +16 -0
- data/sig/examples/app_all_events/model/events.rbs +15 -0
- data/sig/examples/app_all_events/model/timestamp.rbs +11 -0
- data/sig/examples/app_all_events/view/app_view.rbs +8 -0
- data/sig/examples/app_all_events/view/controls_view.rbs +6 -0
- data/sig/examples/app_all_events/view/counts_view.rbs +6 -0
- data/sig/examples/app_all_events/view/live_view.rbs +6 -0
- data/sig/examples/app_all_events/view/log_view.rbs +6 -0
- data/sig/examples/app_all_events/view.rbs +8 -0
- data/sig/examples/app_all_events/view_state.rbs +15 -0
- data/{examples/list_demo → sig/examples/app_color_picker}/app.rbs +2 -2
- data/sig/examples/app_login_form/app.rbs +11 -0
- data/sig/examples/app_stateful_interaction/app.rbs +33 -0
- data/sig/examples/verify_quickstart_dsl/app.rbs +11 -0
- data/sig/examples/verify_quickstart_lifecycle/app.rbs +11 -0
- data/sig/examples/verify_readme_usage/app.rbs +11 -0
- data/sig/examples/widget_block_demo/app.rbs +32 -0
- data/sig/examples/widget_box_demo/app.rbs +11 -0
- data/sig/examples/widget_calendar_demo/app.rbs +11 -0
- data/sig/examples/widget_cell_demo/app.rbs +11 -0
- data/sig/examples/widget_chart_demo/app.rbs +11 -0
- data/{examples/gauge_demo → sig/examples/widget_gauge_demo}/app.rbs +4 -0
- data/sig/examples/widget_layout_split/app.rbs +10 -0
- data/sig/examples/widget_line_gauge_demo/app.rbs +11 -0
- data/sig/examples/widget_list_demo/app.rbs +12 -0
- data/sig/examples/widget_map_demo/app.rbs +11 -0
- data/sig/examples/widget_popup_demo/app.rbs +11 -0
- data/sig/examples/widget_ratatui_logo_demo/app.rbs +11 -0
- data/sig/examples/widget_ratatui_mascot_demo/app.rbs +11 -0
- data/sig/examples/widget_rect/app.rbs +12 -0
- data/sig/examples/widget_render/app.rbs +10 -0
- data/sig/examples/widget_rich_text/app.rbs +11 -0
- data/sig/examples/widget_scroll_text/app.rbs +11 -0
- data/sig/examples/widget_scrollbar_demo/app.rbs +11 -0
- data/sig/examples/widget_sparkline_demo/app.rbs +10 -0
- data/{examples → sig/examples}/widget_style_colors/app.rbs +1 -1
- data/sig/examples/widget_table_demo/app.rbs +11 -0
- data/sig/examples/widget_text_width/app.rbs +10 -0
- data/sig/ratatui_ruby/event.rbs +11 -1
- data/sig/ratatui_ruby/frame.rbs +11 -0
- data/sig/ratatui_ruby/list_state.rbs +13 -0
- data/sig/ratatui_ruby/ratatui_ruby.rbs +5 -4
- data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +3 -3
- data/sig/ratatui_ruby/schema/draw.rbs +4 -0
- data/sig/ratatui_ruby/schema/gauge.rbs +2 -2
- data/sig/ratatui_ruby/schema/layout.rbs +1 -1
- data/sig/ratatui_ruby/schema/line_gauge.rbs +2 -2
- data/sig/ratatui_ruby/schema/list.rbs +4 -2
- data/sig/ratatui_ruby/schema/list_item.rbs +10 -0
- data/sig/ratatui_ruby/schema/rect.rbs +3 -0
- data/sig/ratatui_ruby/schema/style.rbs +3 -3
- data/sig/ratatui_ruby/schema/table.rbs +3 -1
- data/sig/ratatui_ruby/schema/text.rbs +8 -6
- data/sig/ratatui_ruby/scrollbar_state.rbs +18 -0
- data/sig/ratatui_ruby/session.rbs +107 -0
- data/sig/ratatui_ruby/table_state.rbs +15 -0
- data/sig/ratatui_ruby/test_helper/event_injection.rbs +16 -0
- data/sig/ratatui_ruby/test_helper/snapshot.rbs +12 -0
- data/sig/ratatui_ruby/test_helper/style_assertions.rbs +64 -0
- data/sig/ratatui_ruby/test_helper/terminal.rbs +14 -0
- data/sig/ratatui_ruby/test_helper/test_doubles.rbs +22 -0
- data/sig/ratatui_ruby/test_helper.rbs +5 -4
- data/tasks/autodoc/examples.rb +79 -0
- data/tasks/autodoc/inventory.rb +63 -0
- data/tasks/autodoc/member.rb +56 -0
- data/tasks/autodoc/name.rb +19 -0
- data/tasks/autodoc/notice.rb +26 -0
- data/tasks/autodoc/rbs.rb +38 -0
- data/tasks/autodoc/rdoc.rb +45 -0
- data/tasks/autodoc.rake +53 -0
- data/tasks/bump/changelog.rb +3 -3
- data/tasks/bump/history.rb +2 -2
- data/tasks/bump/links.rb +67 -0
- data/tasks/doc.rake +600 -6
- data/tasks/example_viewer.html.erb +172 -0
- data/tasks/lint.rake +8 -4
- data/tasks/resources/index.html.erb +6 -0
- data/tasks/sourcehut.rake +70 -30
- data/tasks/terminal_preview/app_screenshot.rb +14 -6
- data/tasks/terminal_preview/crash_report.rb +7 -9
- data/tasks/terminal_preview/launcher_script.rb +4 -6
- data/tasks/terminal_preview/preview_collection.rb +4 -6
- data/tasks/terminal_preview/safety_confirmation.rb +3 -5
- data/tasks/terminal_preview/saved_screenshot.rb +10 -11
- data/tasks/terminal_preview/terminal_window.rb +7 -9
- data/tasks/test.rake +1 -1
- data/tasks/website/index_page.rb +3 -3
- data/tasks/website/version.rb +10 -10
- data/tasks/website/version_menu.rb +10 -12
- data/tasks/website/versioned_documentation.rb +49 -17
- data/tasks/website/website.rb +6 -8
- data/tasks/website.rake +4 -4
- metadata +232 -127
- data/LICENSES/BSD-2-Clause.txt +0 -9
- data/doc/contributors/better_dx.md +0 -543
- data/doc/contributors/example_analysis.md +0 -82
- data/doc/images/all_events.png +0 -0
- data/doc/images/block_padding.png +0 -0
- data/doc/images/block_titles.png +0 -0
- data/doc/images/box_demo.png +0 -0
- data/doc/images/calendar_demo.png +0 -0
- data/doc/images/cell_demo.png +0 -0
- data/doc/images/chart_demo.png +0 -0
- data/doc/images/flex_layout.png +0 -0
- data/doc/images/gauge_demo.png +0 -0
- data/doc/images/line_gauge_demo.png +0 -0
- data/doc/images/list_demo.png +0 -0
- data/doc/images/list_styles.png +0 -0
- data/doc/images/login_form.png +0 -0
- data/doc/images/quickstart_dsl.png +0 -0
- data/doc/images/quickstart_lifecycle.png +0 -0
- data/doc/images/readme_usage.png +0 -0
- data/doc/images/rich_text.png +0 -0
- data/doc/images/scroll_text.png +0 -0
- data/doc/images/scrollbar_demo.png +0 -0
- data/doc/images/sparkline_demo.png +0 -0
- data/doc/images/table_flex.png +0 -0
- data/doc/images/table_select.png +0 -0
- data/examples/all_events/app.rb +0 -169
- data/examples/all_events/app.rbs +0 -7
- data/examples/all_events/test_app.rb +0 -139
- data/examples/analytics/app.rb +0 -258
- data/examples/analytics/app.rbs +0 -7
- data/examples/analytics/test_app.rb +0 -132
- data/examples/block_padding/app.rb +0 -63
- data/examples/block_padding/app.rbs +0 -7
- data/examples/block_padding/test_app.rb +0 -31
- data/examples/block_titles/app.rb +0 -61
- data/examples/block_titles/app.rbs +0 -7
- data/examples/block_titles/test_app.rb +0 -34
- data/examples/box_demo/app.rbs +0 -7
- data/examples/box_demo/test_app.rb +0 -88
- data/examples/calendar_demo/app.rb +0 -101
- data/examples/calendar_demo/app.rbs +0 -7
- data/examples/calendar_demo/test_app.rb +0 -108
- data/examples/cell_demo/app.rb +0 -108
- data/examples/cell_demo/app.rbs +0 -7
- data/examples/cell_demo/test_app.rb +0 -36
- data/examples/chart_demo/app.rb +0 -203
- data/examples/chart_demo/app.rbs +0 -7
- data/examples/chart_demo/test_app.rb +0 -102
- data/examples/custom_widget/app.rb +0 -51
- data/examples/custom_widget/app.rbs +0 -7
- data/examples/custom_widget/test_app.rb +0 -30
- data/examples/flex_layout/app.rb +0 -156
- data/examples/flex_layout/app.rbs +0 -7
- data/examples/flex_layout/test_app.rb +0 -65
- data/examples/gauge_demo/app.rb +0 -182
- data/examples/gauge_demo/test_app.rb +0 -120
- data/examples/hit_test/app.rb +0 -175
- data/examples/hit_test/app.rbs +0 -7
- data/examples/hit_test/test_app.rb +0 -102
- data/examples/line_gauge_demo/app.rb +0 -190
- data/examples/line_gauge_demo/app.rbs +0 -7
- data/examples/line_gauge_demo/test_app.rb +0 -129
- data/examples/list_demo/app.rb +0 -253
- data/examples/list_demo/test_app.rb +0 -237
- data/examples/list_styles/app.rb +0 -140
- data/examples/list_styles/app.rbs +0 -7
- data/examples/list_styles/test_app.rb +0 -157
- data/examples/login_form/app.rbs +0 -7
- data/examples/login_form/test_app.rb +0 -51
- data/examples/map_demo/app.rbs +0 -7
- data/examples/map_demo/test_app.rb +0 -149
- data/examples/mouse_events/app.rb +0 -97
- data/examples/mouse_events/app.rbs +0 -7
- data/examples/mouse_events/test_app.rb +0 -53
- data/examples/popup_demo/app.rb +0 -103
- data/examples/popup_demo/app.rbs +0 -7
- data/examples/popup_demo/test_app.rb +0 -54
- data/examples/quickstart_dsl/app.rbs +0 -7
- data/examples/quickstart_dsl/test_app.rb +0 -29
- data/examples/quickstart_lifecycle/app.rb +0 -39
- data/examples/quickstart_lifecycle/app.rbs +0 -7
- data/examples/quickstart_lifecycle/test_app.rb +0 -29
- data/examples/ratatui_logo_demo/app.rb +0 -79
- data/examples/ratatui_logo_demo/app.rbs +0 -7
- data/examples/ratatui_logo_demo/test_app.rb +0 -51
- data/examples/ratatui_mascot_demo/app.rb +0 -84
- data/examples/ratatui_mascot_demo/app.rbs +0 -7
- data/examples/ratatui_mascot_demo/test_app.rb +0 -47
- data/examples/readme_usage/app.rb +0 -29
- data/examples/readme_usage/app.rbs +0 -7
- data/examples/readme_usage/test_app.rb +0 -29
- data/examples/rich_text/app.rb +0 -141
- data/examples/rich_text/app.rbs +0 -7
- data/examples/rich_text/test_app.rb +0 -166
- data/examples/scroll_text/app.rb +0 -103
- data/examples/scroll_text/app.rbs +0 -7
- data/examples/scroll_text/test_app.rb +0 -110
- data/examples/scrollbar_demo/app.rb +0 -143
- data/examples/scrollbar_demo/app.rbs +0 -7
- data/examples/scrollbar_demo/test_app.rb +0 -77
- data/examples/sparkline_demo/app.rb +0 -240
- data/examples/sparkline_demo/test_app.rb +0 -107
- data/examples/table_flex/app.rb +0 -65
- data/examples/table_flex/app.rbs +0 -7
- data/examples/table_flex/test_app.rb +0 -36
- data/examples/table_select/app.rb +0 -198
- data/examples/table_select/app.rbs +0 -7
- data/examples/table_select/test_app.rb +0 -180
- data/examples/widget_style_colors/test_app.rb +0 -48
- data/tasks/bump/comparison_links.rb +0 -41
- /data/doc/images/{analytics.png → app_analytics.png} +0 -0
- /data/doc/images/{custom_widget.png → app_custom_widget.png} +0 -0
- /data/doc/images/{mouse_events.png → app_mouse_events.png} +0 -0
- /data/doc/images/{map_demo.png → widget_map_demo.png} +0 -0
- /data/doc/images/{popup_demo.png → widget_popup_demo.png} +0 -0
- /data/doc/images/{hit_test.png → widget_rect.png} +0 -0
- /data/{doc/images/ratatui_logo_demo.png → exe/.gitkeep} +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
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
|
+
module RatatuiRuby
|
|
7
|
+
# Provides access to the terminal buffer for rendering widgets.
|
|
8
|
+
#
|
|
9
|
+
# Rendering in immediate-mode TUIs requires knowing the terminal dimensions and
|
|
10
|
+
# placing widgets at specific positions. Without explicit control, layout
|
|
11
|
+
# calculations become duplicated between rendering and hit testing.
|
|
12
|
+
#
|
|
13
|
+
# This class exposes the terminal frame during a draw call. It provides the
|
|
14
|
+
# current area and methods to render widgets at precise locations.
|
|
15
|
+
#
|
|
16
|
+
# Use it inside a <tt>RatatuiRuby.draw</tt> block to render widgets with full
|
|
17
|
+
# control over placement.
|
|
18
|
+
#
|
|
19
|
+
# == Thread/Ractor Safety
|
|
20
|
+
#
|
|
21
|
+
# Frame is an *I/O handle*, not a data object. It has side effects
|
|
22
|
+
# (render_widget, set_cursor_position) and is intentionally *not*
|
|
23
|
+
# Ractor-shareable. Passing it to helper methods during the draw block is
|
|
24
|
+
# fine. However, do not include it in immutable TEA Models/Messages or pass
|
|
25
|
+
# it to other Ractors. Frame is only valid during the draw block's execution.
|
|
26
|
+
#
|
|
27
|
+
# === Examples
|
|
28
|
+
#
|
|
29
|
+
# Basic usage with a single widget:
|
|
30
|
+
#
|
|
31
|
+
# RatatuiRuby.draw do |frame|
|
|
32
|
+
# paragraph = RatatuiRuby::Paragraph.new(text: "Hello, world!")
|
|
33
|
+
# frame.render_widget(paragraph, frame.area)
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
# Using Layout.split for multi-region layouts:
|
|
37
|
+
#
|
|
38
|
+
# RatatuiRuby.draw do |frame|
|
|
39
|
+
# sidebar, main = RatatuiRuby::Layout.split(
|
|
40
|
+
# frame.area,
|
|
41
|
+
# direction: :horizontal,
|
|
42
|
+
# constraints: [
|
|
43
|
+
# RatatuiRuby::Constraint.length(20),
|
|
44
|
+
# RatatuiRuby::Constraint.fill(1)
|
|
45
|
+
# ]
|
|
46
|
+
# )
|
|
47
|
+
#
|
|
48
|
+
# frame.render_widget(sidebar_widget, sidebar)
|
|
49
|
+
# frame.render_widget(main_widget, main)
|
|
50
|
+
#
|
|
51
|
+
# # Store rects for hit testing — no duplication!
|
|
52
|
+
# @regions = { sidebar: sidebar, main: main }
|
|
53
|
+
# end
|
|
54
|
+
class Frame
|
|
55
|
+
##
|
|
56
|
+
# :method: area
|
|
57
|
+
# :call-seq: area() -> Rect
|
|
58
|
+
#
|
|
59
|
+
# Returns the full terminal area as a Rect.
|
|
60
|
+
#
|
|
61
|
+
# The returned Rect represents the entire drawable area of the terminal.
|
|
62
|
+
# Use it as the starting point for layout calculations.
|
|
63
|
+
#
|
|
64
|
+
# === Example
|
|
65
|
+
#
|
|
66
|
+
# RatatuiRuby.draw do |frame|
|
|
67
|
+
# puts "Terminal size: #{frame.area.width}x#{frame.area.height}"
|
|
68
|
+
# end
|
|
69
|
+
#
|
|
70
|
+
# (Native method implemented in Rust)
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# :method: render_widget
|
|
74
|
+
# :call-seq: render_widget(widget, area) -> nil
|
|
75
|
+
#
|
|
76
|
+
# Renders a widget at the specified area.
|
|
77
|
+
#
|
|
78
|
+
# Widgets in RatatuiRuby are immutable Data objects. This method takes a
|
|
79
|
+
# widget and a Rect, rendering the widget's content within that region.
|
|
80
|
+
#
|
|
81
|
+
# [widget]
|
|
82
|
+
# The widget to render (Paragraph, Layout, List, Table, etc.).
|
|
83
|
+
# [area]
|
|
84
|
+
# A Rect specifying where to render the widget.
|
|
85
|
+
#
|
|
86
|
+
# === Example
|
|
87
|
+
#
|
|
88
|
+
# RatatuiRuby.draw do |frame|
|
|
89
|
+
# para = RatatuiRuby::Paragraph.new(text: "Content")
|
|
90
|
+
# frame.render_widget(para, frame.area)
|
|
91
|
+
# end
|
|
92
|
+
#
|
|
93
|
+
# (Native method implemented in Rust)
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
# :method: render_stateful_widget
|
|
97
|
+
# :call-seq: render_stateful_widget(widget, area, state) -> nil
|
|
98
|
+
#
|
|
99
|
+
# Renders a widget with persistent state.
|
|
100
|
+
#
|
|
101
|
+
# Some UI components (like List or Table) have **runtime status** (Status) that
|
|
102
|
+
# changes during rendering, such as the current scroll offset.
|
|
103
|
+
#
|
|
104
|
+
# Since Widget definitions (Configuration Definition) are immutable inputs,
|
|
105
|
+
# you must pass a separate mutable State object (Output Status) to capture
|
|
106
|
+
# these changes.
|
|
107
|
+
#
|
|
108
|
+
# Note: The Widget configuration is *always* required. The State object is
|
|
109
|
+
# only used for specific widgets that need to persist runtime status.
|
|
110
|
+
#
|
|
111
|
+
#
|
|
112
|
+
# [widget]
|
|
113
|
+
# The immutable widget configuration (Input) (e.g., RatatuiRuby::List).
|
|
114
|
+
# [area]
|
|
115
|
+
# The Rect area to render into.
|
|
116
|
+
# [state]
|
|
117
|
+
# The mutable state object (Output) (e.g., RatatuiRuby::ListState).
|
|
118
|
+
#
|
|
119
|
+
# === Example
|
|
120
|
+
#
|
|
121
|
+
# # Initialize state once (outside the loop)
|
|
122
|
+
# @list_state = RatatuiRuby::ListState.new
|
|
123
|
+
#
|
|
124
|
+
# RatatuiRuby.draw do |frame|
|
|
125
|
+
# list = RatatuiRuby::List.new(items: ["A", "B"])
|
|
126
|
+
# frame.render_stateful_widget(list, frame.area, @list_state)
|
|
127
|
+
# end
|
|
128
|
+
#
|
|
129
|
+
# # Read back the offset calculated by Ratatui
|
|
130
|
+
# puts @list_state.offset
|
|
131
|
+
#
|
|
132
|
+
# (Native method implemented in Rust)
|
|
133
|
+
|
|
134
|
+
##
|
|
135
|
+
# :method: set_cursor_position
|
|
136
|
+
# :call-seq: set_cursor_position(x, y) -> nil
|
|
137
|
+
#
|
|
138
|
+
# Positions the blinking cursor at the given coordinates.
|
|
139
|
+
#
|
|
140
|
+
# Text input fields show users where typed characters will appear. Without
|
|
141
|
+
# a visible cursor, users cannot tell if the input is focused or where text
|
|
142
|
+
# will insert.
|
|
143
|
+
#
|
|
144
|
+
# This method moves the terminal cursor to a specific cell. Coordinates are
|
|
145
|
+
# 0-indexed from the terminal's top-left corner.
|
|
146
|
+
#
|
|
147
|
+
# Use it when building login forms, search bars, or command palettes.
|
|
148
|
+
#
|
|
149
|
+
# [x]
|
|
150
|
+
# Column position (<tt>0</tt> = leftmost column).
|
|
151
|
+
# [y]
|
|
152
|
+
# Row position (<tt>0</tt> = topmost row).
|
|
153
|
+
#
|
|
154
|
+
# === Example
|
|
155
|
+
#
|
|
156
|
+
# Position the cursor at the end of typed text in a login form:
|
|
157
|
+
#
|
|
158
|
+
# PREFIX = "Username: [ "
|
|
159
|
+
# username = "alice"
|
|
160
|
+
#
|
|
161
|
+
# RatatuiRuby.draw do |frame|
|
|
162
|
+
# # Render the input field
|
|
163
|
+
# prompt = RatatuiRuby::Paragraph.new(
|
|
164
|
+
# text: "#{PREFIX}#{username} ]",
|
|
165
|
+
# block: RatatuiRuby::Block.new(borders: :all)
|
|
166
|
+
# )
|
|
167
|
+
# frame.render_widget(prompt, frame.area)
|
|
168
|
+
#
|
|
169
|
+
# # Position cursor after the typed text
|
|
170
|
+
# # Account for border (1) + prefix length + username length
|
|
171
|
+
# cursor_x = 1 + PREFIX.length + username.length
|
|
172
|
+
# cursor_y = 1 # First line inside border
|
|
173
|
+
# frame.set_cursor_position(cursor_x, cursor_y)
|
|
174
|
+
# end
|
|
175
|
+
#
|
|
176
|
+
# See also:
|
|
177
|
+
# - {Component-based implementation using Frame API}[link:/examples/app_color_picker/app_rb.html]
|
|
178
|
+
# - {Declarative implementation using Tree API}[link:/examples/app_login_form/app_rb.html]
|
|
179
|
+
# - RatatuiRuby::Cursor (Tree API alternative)
|
|
180
|
+
#
|
|
181
|
+
# (Native method implemented in Rust)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
module RatatuiRuby
|
|
7
|
+
# Mutable state object for List widgets.
|
|
8
|
+
#
|
|
9
|
+
# When using {Frame#render_stateful_widget}, the State object is the
|
|
10
|
+
# *single source of truth* for selection and scroll offset. Widget
|
|
11
|
+
# properties (+selected_index+, +offset+) are *ignored* in stateful mode.
|
|
12
|
+
#
|
|
13
|
+
# State objects persist across frames, allowing you to:
|
|
14
|
+
# - Track selection without manual index management
|
|
15
|
+
# - Read back the scroll offset calculated by Ratatui
|
|
16
|
+
# - Implement mouse click-to-row hit testing
|
|
17
|
+
#
|
|
18
|
+
# == Thread/Ractor Safety
|
|
19
|
+
#
|
|
20
|
+
# ListState is *not* Ractor-shareable. It contains mutable internal state.
|
|
21
|
+
# Store it in instance variables, not in immutable TEA Models.
|
|
22
|
+
#
|
|
23
|
+
# == Example
|
|
24
|
+
#
|
|
25
|
+
# @list_state = RatatuiRuby::ListState.new
|
|
26
|
+
# @list_state.select(2) # Select third item
|
|
27
|
+
#
|
|
28
|
+
# RatatuiRuby.draw do |frame|
|
|
29
|
+
# list = RatatuiRuby::List.new(items: ["A", "B", "C", "D", "E"])
|
|
30
|
+
# frame.render_stateful_widget(list, frame.area, @list_state)
|
|
31
|
+
# end
|
|
32
|
+
#
|
|
33
|
+
# puts @list_state.offset # Scroll position after render
|
|
34
|
+
#
|
|
35
|
+
class ListState
|
|
36
|
+
##
|
|
37
|
+
# :method: new
|
|
38
|
+
# :call-seq: new(selected = nil) -> ListState
|
|
39
|
+
#
|
|
40
|
+
# Creates a new ListState with optional initial selection.
|
|
41
|
+
#
|
|
42
|
+
# (Native method implemented in Rust)
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# :method: select
|
|
46
|
+
# :call-seq: select(index) -> nil
|
|
47
|
+
#
|
|
48
|
+
# Sets the selected index. Pass +nil+ to deselect.
|
|
49
|
+
#
|
|
50
|
+
# (Native method implemented in Rust)
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# :method: selected
|
|
54
|
+
# :call-seq: selected() -> Integer or nil
|
|
55
|
+
#
|
|
56
|
+
# Returns the currently selected index, or +nil+ if nothing is selected.
|
|
57
|
+
#
|
|
58
|
+
# (Native method implemented in Rust)
|
|
59
|
+
|
|
60
|
+
##
|
|
61
|
+
# :method: offset
|
|
62
|
+
# :call-seq: offset() -> Integer
|
|
63
|
+
#
|
|
64
|
+
# Returns the current scroll offset.
|
|
65
|
+
#
|
|
66
|
+
# This is the critical read-back method. After +render_stateful_widget+,
|
|
67
|
+
# this returns the scroll position calculated by Ratatui to keep the
|
|
68
|
+
# selection visible.
|
|
69
|
+
#
|
|
70
|
+
# (Native method implemented in Rust)
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# :method: scroll_down_by
|
|
74
|
+
# :call-seq: scroll_down_by(n) -> nil
|
|
75
|
+
#
|
|
76
|
+
# Scrolls down by +n+ items.
|
|
77
|
+
#
|
|
78
|
+
# (Native method implemented in Rust)
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
# :method: scroll_up_by
|
|
82
|
+
# :call-seq: scroll_up_by(n) -> nil
|
|
83
|
+
#
|
|
84
|
+
# Scrolls up by +n+ items.
|
|
85
|
+
#
|
|
86
|
+
# (Native method implemented in Rust)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
module RatatuiRuby
|
|
7
7
|
class BarChart
|
|
8
8
|
# A bar in a grouped bar chart.
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# === Examples
|
|
11
11
|
#
|
|
12
12
|
# BarChart::Bar.new(value: 10, style: Style.new(fg: :red), label: "A")
|
|
@@ -14,32 +14,32 @@ module RatatuiRuby
|
|
|
14
14
|
##
|
|
15
15
|
# :attr_reader: value
|
|
16
16
|
# The value of the bar (Integer).
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
##
|
|
19
19
|
# :attr_reader: label
|
|
20
|
-
# The label of the bar (optional String).
|
|
21
|
-
|
|
20
|
+
# The label of the bar (optional String, Text::Span, or Text::Line for rich styling).
|
|
21
|
+
|
|
22
22
|
##
|
|
23
23
|
# :attr_reader: style
|
|
24
24
|
# The style of the bar (optional Style).
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
##
|
|
27
27
|
# :attr_reader: value_style
|
|
28
28
|
# The style of the value (optional Style).
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
##
|
|
31
31
|
# :attr_reader: text_value
|
|
32
|
-
# The text to display as the value (optional String).
|
|
33
|
-
|
|
32
|
+
# The text to display as the value (optional String, Text::Span, or Text::Line for rich styling).
|
|
33
|
+
|
|
34
34
|
def initialize(value:, label: nil, style: nil, value_style: nil, text_value: nil)
|
|
35
35
|
super(
|
|
36
36
|
value: Integer(value),
|
|
37
|
-
label
|
|
38
|
-
style
|
|
39
|
-
value_style
|
|
40
|
-
text_value:
|
|
37
|
+
label:,
|
|
38
|
+
style:,
|
|
39
|
+
value_style:,
|
|
40
|
+
text_value:
|
|
41
41
|
)
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
-
end
|
|
45
|
+
end
|