ratatui_ruby 0.8.0 → 0.9.1
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 +2 -2
- data/.builds/ruby-3.3.yml +2 -2
- data/.builds/ruby-3.4.yml +2 -2
- data/.builds/ruby-4.0.0.yml +2 -2
- data/.pre-commit-config.yaml +1 -1
- data/AGENTS.md +3 -3
- data/CHANGELOG.md +77 -1
- data/LICENSES/LGPL-3.0-or-later.txt +304 -0
- data/LICENSES/MIT-0.txt +16 -0
- data/README.md +33 -5
- data/Rakefile +1 -1
- data/doc/concepts/application_architecture.md +44 -3
- data/doc/concepts/application_testing.md +43 -1
- data/doc/concepts/async.md +32 -2
- data/doc/concepts/custom_widgets.md +247 -0
- data/doc/concepts/event_handling.md +32 -3
- data/doc/concepts/interactive_design.md +32 -2
- data/doc/contributors/auditing/parity.md +7 -1
- data/doc/contributors/design/ruby_frontend.md +85 -1
- data/doc/contributors/design/rust_backend.md +67 -1
- data/doc/contributors/developing_examples.md +56 -2
- data/doc/contributors/documentation_style.md +20 -3
- data/doc/contributors/future_work.md +169 -0
- data/doc/contributors/index.md +1 -1
- data/doc/contributors/v1.0.0_blockers.md +19 -185
- data/doc/getting_started/quickstart.md +22 -4
- data/doc/getting_started/why.md +1 -1
- data/doc/index.md +2 -1
- data/doc/troubleshooting/debugging.md +32 -2
- data/doc/troubleshooting/terminal_limitations.md +8 -2
- data/doc/troubleshooting/tui_output.md +42 -0
- data/examples/app_all_events/README.md +14 -2
- data/examples/app_all_events/app.rb +1 -1
- data/examples/app_all_events/model/app_model.rb +1 -1
- data/examples/app_all_events/model/event_color_cycle.rb +1 -1
- data/examples/app_all_events/model/event_entry.rb +1 -1
- data/examples/app_all_events/model/msg.rb +1 -1
- data/examples/app_all_events/model/timestamp.rb +1 -1
- data/examples/app_all_events/update.rb +1 -1
- data/examples/app_all_events/view/app_view.rb +1 -1
- data/examples/app_all_events/view/controls_view.rb +1 -1
- data/examples/app_all_events/view/counts_view.rb +1 -1
- data/examples/app_all_events/view/live_view.rb +1 -1
- data/examples/app_all_events/view/log_view.rb +1 -1
- data/examples/app_all_events/view.rb +1 -1
- data/examples/app_color_picker/README.md +20 -2
- data/examples/app_color_picker/app.rb +1 -1
- data/examples/app_color_picker/clipboard.rb +1 -1
- data/examples/app_color_picker/color.rb +1 -1
- data/examples/app_color_picker/controls.rb +1 -1
- data/examples/app_color_picker/copy_dialog.rb +1 -1
- data/examples/app_color_picker/export_pane.rb +1 -1
- data/examples/app_color_picker/harmony.rb +1 -1
- data/examples/app_color_picker/input.rb +1 -1
- data/examples/app_color_picker/main_container.rb +1 -1
- data/examples/app_color_picker/palette.rb +1 -1
- data/examples/app_login_form/README.md +8 -2
- data/examples/app_login_form/app.rb +1 -1
- data/examples/app_stateful_interaction/README.md +2 -2
- data/examples/app_stateful_interaction/app.rb +71 -17
- data/examples/timeout_demo.rb +1 -1
- data/examples/verify_quickstart_dsl/README.md +6 -0
- data/examples/verify_quickstart_dsl/app.rb +3 -3
- data/examples/verify_quickstart_layout/README.md +6 -0
- data/examples/verify_quickstart_layout/app.rb +3 -3
- data/examples/verify_quickstart_lifecycle/README.md +6 -0
- data/examples/verify_quickstart_lifecycle/app.rb +3 -3
- data/examples/verify_readme_usage/README.md +6 -0
- data/examples/verify_readme_usage/app.rb +3 -3
- data/examples/widget_barchart/README.md +6 -0
- data/examples/widget_barchart/app.rb +2 -2
- data/examples/widget_block/README.md +7 -1
- data/examples/widget_block/app.rb +2 -2
- data/examples/widget_box/README.md +6 -0
- data/examples/widget_box/app.rb +9 -6
- data/examples/widget_calendar/README.md +6 -0
- data/examples/widget_calendar/app.rb +2 -2
- data/examples/widget_canvas/README.md +4 -0
- data/examples/widget_canvas/app.rb +2 -2
- data/examples/widget_cell/README.md +6 -0
- data/examples/widget_cell/app.rb +2 -3
- data/examples/widget_center/README.md +4 -0
- data/examples/widget_center/app.rb +2 -2
- data/examples/widget_chart/README.md +6 -0
- data/examples/widget_chart/app.rb +2 -2
- data/examples/widget_gauge/README.md +6 -0
- data/examples/widget_gauge/app.rb +2 -2
- data/examples/widget_layout_split/README.md +6 -0
- data/examples/widget_layout_split/app.rb +9 -3
- data/examples/widget_line_gauge/README.md +6 -0
- data/examples/widget_line_gauge/app.rb +2 -2
- data/examples/widget_list/README.md +6 -0
- data/examples/widget_list/app.rb +2 -2
- data/examples/widget_map/README.md +8 -2
- data/examples/widget_map/app.rb +2 -2
- data/examples/widget_overlay/README.md +7 -1
- data/examples/widget_overlay/app.rb +2 -2
- data/examples/widget_popup/README.md +6 -0
- data/examples/widget_popup/app.rb +2 -2
- data/examples/widget_ratatui_logo/README.md +6 -0
- data/examples/widget_ratatui_logo/app.rb +2 -3
- data/examples/widget_ratatui_mascot/README.md +6 -0
- data/examples/widget_ratatui_mascot/app.rb +2 -2
- data/examples/widget_rect/README.md +12 -0
- data/examples/widget_rect/app.rb +40 -26
- data/examples/widget_render/README.md +6 -0
- data/examples/widget_render/app.rb +2 -2
- data/examples/widget_render/app.rbs +41 -0
- data/examples/widget_rich_text/README.md +6 -0
- data/examples/widget_rich_text/app.rb +2 -2
- data/examples/widget_scroll_text/README.md +6 -0
- data/examples/widget_scroll_text/app.rb +2 -2
- data/examples/widget_scrollbar/README.md +6 -0
- data/examples/widget_scrollbar/app.rb +2 -2
- data/examples/widget_sparkline/README.md +6 -0
- data/examples/widget_sparkline/app.rb +2 -2
- data/examples/widget_style_colors/README.md +6 -0
- data/examples/widget_style_colors/app.rb +2 -2
- data/examples/widget_table/README.md +8 -2
- data/examples/widget_table/app.rb +2 -2
- data/examples/widget_tabs/README.md +6 -0
- data/examples/widget_tabs/app.rb +2 -2
- data/examples/widget_text_width/README.md +6 -0
- data/examples/widget_text_width/app.rb +4 -4
- data/ext/ratatui_ruby/Cargo.lock +1 -1
- data/ext/ratatui_ruby/Cargo.toml +1 -1
- data/ext/ratatui_ruby/extconf.rb +2 -2
- data/ext/ratatui_ruby/src/events.rs +1 -0
- data/ext/ratatui_ruby/src/rendering.rs +1 -1
- data/ext/ratatui_ruby/src/style.rs +0 -8
- data/ext/ratatui_ruby/src/widgets/chart.rs +0 -118
- data/ext/ratatui_ruby/src/widgets/list_state.rs +36 -0
- data/lib/ratatui_ruby/buffer/cell.rb +34 -2
- data/lib/ratatui_ruby/buffer.rb +2 -2
- data/lib/ratatui_ruby/cell.rb +34 -2
- data/lib/ratatui_ruby/event/focus_gained.rb +26 -2
- data/lib/ratatui_ruby/event/focus_lost.rb +26 -2
- data/lib/ratatui_ruby/event/key/character.rb +18 -2
- data/lib/ratatui_ruby/event/key/media.rb +2 -2
- data/lib/ratatui_ruby/event/key/modifier.rb +10 -2
- data/lib/ratatui_ruby/event/key/navigation.rb +2 -2
- data/lib/ratatui_ruby/event/key/system.rb +2 -2
- data/lib/ratatui_ruby/event/key.rb +114 -2
- data/lib/ratatui_ruby/event/mouse.rb +42 -2
- data/lib/ratatui_ruby/event/none.rb +10 -2
- data/lib/ratatui_ruby/event/paste.rb +34 -2
- data/lib/ratatui_ruby/event/resize.rb +34 -2
- data/lib/ratatui_ruby/event/sync.rb +52 -0
- data/lib/ratatui_ruby/event.rb +32 -2
- data/lib/ratatui_ruby/frame.rb +74 -2
- data/lib/ratatui_ruby/layout/constraint.rb +193 -2
- data/lib/ratatui_ruby/layout/layout.rb +47 -2
- data/lib/ratatui_ruby/layout/rect.rb +403 -2
- data/lib/ratatui_ruby/layout.rb +2 -2
- data/lib/ratatui_ruby/list_state.rb +113 -2
- data/lib/ratatui_ruby/output_guard.rb +26 -3
- data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
- data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +2 -2
- data/lib/ratatui_ruby/schema/bar_chart.rb +50 -2
- data/lib/ratatui_ruby/schema/block.rb +21 -15
- data/lib/ratatui_ruby/schema/calendar.rb +2 -2
- data/lib/ratatui_ruby/schema/canvas.rb +10 -2
- data/lib/ratatui_ruby/schema/center.rb +10 -2
- data/lib/ratatui_ruby/schema/chart.rb +2 -28
- data/lib/ratatui_ruby/schema/clear.rb +10 -2
- data/lib/ratatui_ruby/schema/constraint.rb +58 -2
- data/lib/ratatui_ruby/schema/cursor.rb +10 -2
- data/lib/ratatui_ruby/schema/draw.rb +10 -2
- data/lib/ratatui_ruby/schema/gauge.rb +2 -2
- data/lib/ratatui_ruby/schema/layout.rb +18 -2
- data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
- data/lib/ratatui_ruby/schema/list.rb +10 -2
- data/lib/ratatui_ruby/schema/list_item.rb +10 -2
- data/lib/ratatui_ruby/schema/overlay.rb +10 -2
- data/lib/ratatui_ruby/schema/paragraph.rb +10 -2
- data/lib/ratatui_ruby/schema/ratatui_logo.rb +2 -2
- data/lib/ratatui_ruby/schema/ratatui_mascot.rb +2 -2
- data/lib/ratatui_ruby/schema/rect.rb +58 -2
- data/lib/ratatui_ruby/schema/row.rb +10 -2
- data/lib/ratatui_ruby/schema/scrollbar.rb +2 -2
- data/lib/ratatui_ruby/schema/shape/label.rb +10 -2
- data/lib/ratatui_ruby/schema/sparkline.rb +10 -2
- data/lib/ratatui_ruby/schema/style.rb +18 -2
- data/lib/ratatui_ruby/schema/table.rb +2 -2
- data/lib/ratatui_ruby/schema/tabs.rb +2 -2
- data/lib/ratatui_ruby/schema/text.rb +34 -2
- data/lib/ratatui_ruby/scrollbar_state.rb +10 -2
- data/lib/ratatui_ruby/style/style.rb +18 -2
- data/lib/ratatui_ruby/style.rb +2 -2
- data/lib/ratatui_ruby/synthetic_events.rb +86 -0
- data/lib/ratatui_ruby/table_state.rb +10 -2
- data/lib/ratatui_ruby/terminal_lifecycle.rb +18 -3
- data/lib/ratatui_ruby/test_helper/event_injection.rb +62 -2
- data/lib/ratatui_ruby/test_helper/snapshot.rb +74 -9
- data/lib/ratatui_ruby/test_helper/style_assertions.rb +98 -2
- data/lib/ratatui_ruby/test_helper/terminal.rb +50 -2
- data/lib/ratatui_ruby/test_helper/test_doubles.rb +18 -2
- data/lib/ratatui_ruby/test_helper.rb +10 -2
- data/lib/ratatui_ruby/tui/buffer_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/canvas_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/core.rb +2 -2
- data/lib/ratatui_ruby/tui/layout_factories.rb +32 -2
- data/lib/ratatui_ruby/tui/state_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/style_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/text_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/widget_factories.rb +2 -2
- data/lib/ratatui_ruby/tui.rb +11 -3
- data/lib/ratatui_ruby/version.rb +3 -3
- data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +2 -2
- data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +2 -2
- data/lib/ratatui_ruby/widgets/bar_chart.rb +58 -2
- data/lib/ratatui_ruby/widgets/block.rb +37 -15
- data/lib/ratatui_ruby/widgets/calendar.rb +2 -2
- data/lib/ratatui_ruby/widgets/canvas.rb +10 -2
- data/lib/ratatui_ruby/widgets/cell.rb +10 -2
- data/lib/ratatui_ruby/widgets/center.rb +10 -2
- data/lib/ratatui_ruby/widgets/chart.rb +2 -28
- data/lib/ratatui_ruby/widgets/clear.rb +10 -2
- data/lib/ratatui_ruby/widgets/cursor.rb +10 -2
- data/lib/ratatui_ruby/widgets/gauge.rb +16 -2
- data/lib/ratatui_ruby/widgets/line_gauge.rb +16 -2
- data/lib/ratatui_ruby/widgets/list.rb +41 -2
- data/lib/ratatui_ruby/widgets/list_item.rb +10 -2
- data/lib/ratatui_ruby/widgets/overlay.rb +10 -2
- data/lib/ratatui_ruby/widgets/paragraph.rb +10 -2
- data/lib/ratatui_ruby/widgets/ratatui_logo.rb +2 -2
- data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +2 -2
- data/lib/ratatui_ruby/widgets/row.rb +10 -2
- data/lib/ratatui_ruby/widgets/scrollbar.rb +2 -2
- data/lib/ratatui_ruby/widgets/shape/label.rb +10 -2
- data/lib/ratatui_ruby/widgets/sparkline.rb +10 -2
- data/lib/ratatui_ruby/widgets/table.rb +62 -2
- data/lib/ratatui_ruby/widgets/tabs.rb +2 -2
- data/lib/ratatui_ruby/widgets.rb +2 -2
- data/lib/ratatui_ruby.rb +101 -9
- data/sig/examples/app_all_events/view.rbs +7 -1
- data/sig/examples/app_all_events/view_state.rbs +7 -1
- data/sig/examples/app_color_picker/app.rbs +5 -0
- data/sig/examples/app_stateful_interaction/app.rbs +7 -1
- data/sig/examples/verify_quickstart_dsl/app.rbs +7 -1
- data/sig/examples/verify_quickstart_lifecycle/app.rbs +7 -1
- data/sig/examples/verify_readme_usage/app.rbs +7 -1
- data/sig/examples/widget_block_demo/app.rbs +6 -0
- data/sig/examples/widget_box_demo/app.rbs +7 -1
- data/sig/examples/widget_calendar_demo/app.rbs +7 -1
- data/sig/examples/widget_cell_demo/app.rbs +7 -1
- data/sig/examples/widget_chart_demo/app.rbs +7 -1
- data/sig/examples/widget_gauge_demo/app.rbs +7 -1
- data/sig/examples/widget_layout_split/app.rbs +7 -1
- data/sig/examples/widget_line_gauge_demo/app.rbs +7 -1
- data/sig/examples/widget_list_demo/app.rbs +5 -0
- data/sig/examples/widget_map_demo/app.rbs +7 -1
- data/sig/examples/widget_popup_demo/app.rbs +7 -1
- data/sig/examples/widget_ratatui_logo_demo/app.rbs +7 -1
- data/sig/examples/widget_ratatui_mascot_demo/app.rbs +7 -1
- data/sig/examples/widget_rect/app.rbs +7 -1
- data/sig/examples/widget_render/app.rbs +7 -1
- data/sig/examples/widget_rich_text/app.rbs +7 -1
- data/sig/examples/widget_scroll_text/app.rbs +7 -1
- data/sig/examples/widget_scrollbar_demo/app.rbs +7 -1
- data/sig/examples/widget_sparkline_demo/app.rbs +7 -1
- data/sig/examples/widget_style_colors/app.rbs +7 -1
- data/sig/examples/widget_table_demo/app.rbs +7 -1
- data/sig/examples/widget_text_width/app.rbs +7 -1
- data/sig/ratatui_ruby/event.rbs +7 -1
- data/sig/ratatui_ruby/frame.rbs +15 -3
- data/sig/ratatui_ruby/list_state.rbs +11 -1
- data/sig/ratatui_ruby/ratatui_ruby.rbs +8 -2
- data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +7 -1
- data/sig/ratatui_ruby/schema/bar_chart/bar_group.rbs +6 -0
- data/sig/ratatui_ruby/schema/bar_chart.rbs +6 -0
- data/sig/ratatui_ruby/schema/block.rbs +7 -1
- data/sig/ratatui_ruby/schema/calendar.rbs +6 -0
- data/sig/ratatui_ruby/schema/canvas.rbs +6 -0
- data/sig/ratatui_ruby/schema/center.rbs +6 -0
- data/sig/ratatui_ruby/schema/chart.rbs +6 -9
- data/sig/ratatui_ruby/schema/constraint.rbs +14 -0
- data/sig/ratatui_ruby/schema/cursor.rbs +6 -0
- data/sig/ratatui_ruby/schema/draw.rbs +6 -0
- data/sig/ratatui_ruby/schema/gauge.rbs +9 -1
- data/sig/ratatui_ruby/schema/layout.rbs +6 -0
- data/sig/ratatui_ruby/schema/line_gauge.rbs +9 -1
- data/sig/ratatui_ruby/schema/list.rbs +9 -1
- data/sig/ratatui_ruby/schema/list_item.rbs +7 -1
- data/sig/ratatui_ruby/schema/overlay.rbs +6 -0
- data/sig/ratatui_ruby/schema/paragraph.rbs +6 -0
- data/sig/ratatui_ruby/schema/ratatui_logo.rbs +6 -0
- data/sig/ratatui_ruby/schema/ratatui_mascot.rbs +5 -0
- data/sig/ratatui_ruby/schema/rect.rbs +30 -0
- data/sig/ratatui_ruby/schema/row.rbs +7 -1
- data/sig/ratatui_ruby/schema/scrollbar.rbs +6 -0
- data/sig/ratatui_ruby/schema/sparkline.rbs +6 -0
- data/sig/ratatui_ruby/schema/style.rbs +7 -1
- data/sig/ratatui_ruby/schema/table.rbs +11 -1
- data/sig/ratatui_ruby/schema/tabs.rbs +6 -0
- data/sig/ratatui_ruby/schema/text.rbs +7 -1
- data/sig/ratatui_ruby/scrollbar_state.rbs +7 -1
- data/sig/ratatui_ruby/session.rbs +7 -1
- data/sig/ratatui_ruby/table_state.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/event_injection.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/snapshot.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/style_assertions.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/terminal.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/test_doubles.rbs +7 -1
- data/sig/ratatui_ruby/test_helper.rbs +7 -1
- data/sig/ratatui_ruby/tui/buffer_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/canvas_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/core.rbs +7 -1
- data/sig/ratatui_ruby/tui/layout_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/state_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/style_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/text_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/widget_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui.rbs +7 -1
- data/sig/ratatui_ruby/version.rbs +6 -0
- data/tasks/autodoc/examples.rb +1 -1
- data/tasks/autodoc/member.rb +1 -1
- data/tasks/autodoc/name.rb +1 -1
- data/tasks/bump/cargo_lockfile.rb +1 -1
- data/tasks/bump/changelog.rb +1 -1
- data/tasks/bump/header.rb +1 -1
- data/tasks/bump/history.rb +1 -1
- data/tasks/bump/links.rb +1 -1
- data/tasks/bump/manifest.rb +1 -1
- data/tasks/bump/ruby_gem.rb +1 -1
- data/tasks/bump/sem_ver.rb +1 -1
- data/tasks/bump/unreleased_section.rb +1 -1
- data/tasks/license/headers_md.rb +223 -0
- data/tasks/license/headers_rb.rb +210 -0
- data/tasks/license/license_utils.rb +130 -0
- data/tasks/license/snippets_md.rb +315 -0
- data/tasks/license/snippets_rdoc.rb +150 -0
- data/tasks/license.rake +91 -0
- data/tasks/rdoc_config.rb +1 -1
- data/tasks/resources/build.yml.erb +13 -7
- data/tasks/sourcehut.rake +3 -1
- data/tasks/terminal_preview/app_screenshot.rb +1 -1
- data/tasks/terminal_preview/crash_report.rb +1 -1
- data/tasks/terminal_preview/example_app.rb +1 -1
- data/tasks/terminal_preview/launcher_script.rb +1 -1
- data/tasks/terminal_preview/preview_collection.rb +1 -1
- data/tasks/terminal_preview/preview_timing.rb +1 -1
- data/tasks/terminal_preview/safety_confirmation.rb +1 -1
- data/tasks/terminal_preview/saved_screenshot.rb +1 -1
- data/tasks/terminal_preview/system_appearance.rb +1 -1
- data/tasks/terminal_preview/terminal_window.rb +1 -1
- data/tasks/terminal_preview/window_id.rb +1 -1
- data/tasks/website/index_page.rb +1 -1
- data/tasks/website/version.rb +1 -1
- data/tasks/website/version_menu.rb +1 -1
- data/tasks/website/versioned_documentation.rb +1 -1
- data/tasks/website/website.rb +1 -1
- metadata +15 -3
- data/doc/migration/v0_7_0.md +0 -236
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -18,6 +18,11 @@ module RatatuiRuby
|
|
|
18
18
|
#
|
|
19
19
|
# === Examples
|
|
20
20
|
#
|
|
21
|
+
#--
|
|
22
|
+
# SPDX-SnippetBegin
|
|
23
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
24
|
+
# SPDX-License-Identifier: MIT-0
|
|
25
|
+
#++
|
|
21
26
|
# Overlay.new(
|
|
22
27
|
# layers: [
|
|
23
28
|
# BackgroundMap.new,
|
|
@@ -25,6 +30,9 @@ module RatatuiRuby
|
|
|
25
30
|
# ModalDialog.new # Draws over everything
|
|
26
31
|
# ]
|
|
27
32
|
# )
|
|
33
|
+
#--
|
|
34
|
+
# SPDX-SnippetEnd
|
|
35
|
+
#++
|
|
28
36
|
class Overlay < Data.define(:layers)
|
|
29
37
|
##
|
|
30
38
|
# :attr_reader: layers
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -16,6 +16,11 @@ module RatatuiRuby
|
|
|
16
16
|
#
|
|
17
17
|
# === Examples
|
|
18
18
|
#
|
|
19
|
+
#--
|
|
20
|
+
# SPDX-SnippetBegin
|
|
21
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
22
|
+
# SPDX-License-Identifier: MIT-0
|
|
23
|
+
#++
|
|
19
24
|
# # Basic Text
|
|
20
25
|
# Paragraph.new(text: "Hello, World!")
|
|
21
26
|
#
|
|
@@ -29,6 +34,9 @@ module RatatuiRuby
|
|
|
29
34
|
#
|
|
30
35
|
# # Scrolling mechanism
|
|
31
36
|
# Paragraph.new(text: large_text, scroll: [scroll_y, 0])
|
|
37
|
+
#--
|
|
38
|
+
# SPDX-SnippetEnd
|
|
39
|
+
#++
|
|
32
40
|
class Paragraph < Data.define(:text, :style, :block, :wrap, :alignment, :scroll)
|
|
33
41
|
##
|
|
34
42
|
# :attr_reader: text
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -18,8 +18,16 @@ module RatatuiRuby
|
|
|
18
18
|
#
|
|
19
19
|
# === Examples
|
|
20
20
|
#
|
|
21
|
+
#--
|
|
22
|
+
# SPDX-SnippetBegin
|
|
23
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
24
|
+
# SPDX-License-Identifier: MIT-0
|
|
25
|
+
#++
|
|
21
26
|
# area = Rect.new(x: 0, y: 0, width: 80, height: 24)
|
|
22
27
|
# puts area.width # => 80
|
|
28
|
+
#--
|
|
29
|
+
# SPDX-SnippetEnd
|
|
30
|
+
#++
|
|
23
31
|
class Rect < Data.define(:x, :y, :width, :height)
|
|
24
32
|
##
|
|
25
33
|
# :attr_reader: x
|
|
@@ -58,15 +66,31 @@ module RatatuiRuby
|
|
|
58
66
|
#
|
|
59
67
|
# Essential for hit testing mouse clicks against layout regions.
|
|
60
68
|
#
|
|
69
|
+
#--
|
|
70
|
+
# SPDX-SnippetBegin
|
|
71
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
72
|
+
# SPDX-License-Identifier: MIT-0
|
|
73
|
+
#++
|
|
61
74
|
# area = Rect.new(x: 10, y: 5, width: 20, height: 10)
|
|
62
75
|
# area.contains?(15, 8) # => true
|
|
63
76
|
# area.contains?(5, 8) # => false
|
|
64
77
|
#
|
|
78
|
+
#--
|
|
79
|
+
# SPDX-SnippetEnd
|
|
80
|
+
#++
|
|
65
81
|
# [px]
|
|
66
82
|
# X coordinate to test (column).
|
|
67
83
|
# [py]
|
|
84
|
+
#--
|
|
85
|
+
# SPDX-SnippetBegin
|
|
86
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
87
|
+
# SPDX-License-Identifier: MIT-0
|
|
88
|
+
#++
|
|
68
89
|
# Y coordinate to test (row).
|
|
69
90
|
#
|
|
91
|
+
#--
|
|
92
|
+
# SPDX-SnippetEnd
|
|
93
|
+
#++
|
|
70
94
|
# Returns true if the point (px, py) is within the rectangle bounds.
|
|
71
95
|
def contains?(px, py)
|
|
72
96
|
px >= x && px < x + width && py >= y && py < y + height
|
|
@@ -76,13 +100,29 @@ module RatatuiRuby
|
|
|
76
100
|
#
|
|
77
101
|
# Essential for determining if a widget is visible within a viewport or clipping area.
|
|
78
102
|
#
|
|
103
|
+
#--
|
|
104
|
+
# SPDX-SnippetBegin
|
|
105
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
106
|
+
# SPDX-License-Identifier: MIT-0
|
|
107
|
+
#++
|
|
79
108
|
# viewport = Rect.new(x: 0, y: 0, width: 80, height: 24)
|
|
80
109
|
# widget = Rect.new(x: 70, y: 20, width: 20, height: 10)
|
|
81
110
|
# viewport.intersects?(widget) # => true (partial overlap)
|
|
82
111
|
#
|
|
112
|
+
#--
|
|
113
|
+
# SPDX-SnippetEnd
|
|
114
|
+
#++
|
|
83
115
|
# [other]
|
|
116
|
+
#--
|
|
117
|
+
# SPDX-SnippetBegin
|
|
118
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
119
|
+
# SPDX-License-Identifier: MIT-0
|
|
120
|
+
#++
|
|
84
121
|
# Another Rect to test against.
|
|
85
122
|
#
|
|
123
|
+
#--
|
|
124
|
+
# SPDX-SnippetEnd
|
|
125
|
+
#++
|
|
86
126
|
# Returns true if the rectangles overlap.
|
|
87
127
|
def intersects?(other)
|
|
88
128
|
x < other.x + other.width &&
|
|
@@ -95,14 +135,30 @@ module RatatuiRuby
|
|
|
95
135
|
#
|
|
96
136
|
# Essential for calculating visible portions of widgets inside scroll views.
|
|
97
137
|
#
|
|
138
|
+
#--
|
|
139
|
+
# SPDX-SnippetBegin
|
|
140
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
141
|
+
# SPDX-License-Identifier: MIT-0
|
|
142
|
+
#++
|
|
98
143
|
# viewport = Rect.new(x: 0, y: 0, width: 80, height: 24)
|
|
99
144
|
# widget = Rect.new(x: 70, y: 20, width: 20, height: 10)
|
|
100
145
|
# visible = viewport.intersection(widget)
|
|
101
146
|
# # => Rect(x: 70, y: 20, width: 10, height: 4)
|
|
102
147
|
#
|
|
148
|
+
#--
|
|
149
|
+
# SPDX-SnippetEnd
|
|
150
|
+
#++
|
|
103
151
|
# [other]
|
|
152
|
+
#--
|
|
153
|
+
# SPDX-SnippetBegin
|
|
154
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
155
|
+
# SPDX-License-Identifier: MIT-0
|
|
156
|
+
#++
|
|
104
157
|
# Another Rect to intersect with.
|
|
105
158
|
#
|
|
159
|
+
#--
|
|
160
|
+
# SPDX-SnippetEnd
|
|
161
|
+
#++
|
|
106
162
|
# Returns a new Rect representing the intersection, or +nil+ if no overlap.
|
|
107
163
|
def intersection(other)
|
|
108
164
|
return nil unless intersects?(other)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -16,6 +16,11 @@ module RatatuiRuby
|
|
|
16
16
|
#
|
|
17
17
|
# === Examples
|
|
18
18
|
#
|
|
19
|
+
#--
|
|
20
|
+
# SPDX-SnippetBegin
|
|
21
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
22
|
+
# SPDX-License-Identifier: MIT-0
|
|
23
|
+
#++
|
|
19
24
|
# # Row with red background
|
|
20
25
|
# Row.new(cells: ["Error", "Something went wrong"], style: Style.new(bg: :red))
|
|
21
26
|
#
|
|
@@ -27,6 +32,9 @@ module RatatuiRuby
|
|
|
27
32
|
# ],
|
|
28
33
|
# height: 2
|
|
29
34
|
# )
|
|
35
|
+
#--
|
|
36
|
+
# SPDX-SnippetEnd
|
|
37
|
+
#++
|
|
30
38
|
class Row < Data.define(:cells, :style, :height, :top_margin, :bottom_margin)
|
|
31
39
|
##
|
|
32
40
|
# :attr_reader: cells
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -19,6 +19,11 @@ module RatatuiRuby
|
|
|
19
19
|
#
|
|
20
20
|
# === Examples
|
|
21
21
|
#
|
|
22
|
+
#--
|
|
23
|
+
# SPDX-SnippetBegin
|
|
24
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
25
|
+
# SPDX-License-Identifier: MIT-0
|
|
26
|
+
#++
|
|
22
27
|
# # Simple label
|
|
23
28
|
# Shape::Label.new(x: 0, y: 0, text: "Origin")
|
|
24
29
|
#
|
|
@@ -37,6 +42,9 @@ module RatatuiRuby
|
|
|
37
42
|
# Text::Span.new(content: "World", style: Style.new(fg: :blue))
|
|
38
43
|
# ])
|
|
39
44
|
# )
|
|
45
|
+
#--
|
|
46
|
+
# SPDX-SnippetEnd
|
|
47
|
+
#++
|
|
40
48
|
class Label < Data.define(:x, :y, :text, :style)
|
|
41
49
|
##
|
|
42
50
|
# :attr_reader: x
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -71,6 +71,11 @@ module RatatuiRuby
|
|
|
71
71
|
#
|
|
72
72
|
# === Examples
|
|
73
73
|
#
|
|
74
|
+
#--
|
|
75
|
+
# SPDX-SnippetBegin
|
|
76
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
77
|
+
# SPDX-License-Identifier: MIT-0
|
|
78
|
+
#++
|
|
74
79
|
# bar_set: {
|
|
75
80
|
# empty: " ",
|
|
76
81
|
# one_eighth: " ",
|
|
@@ -90,6 +95,9 @@ module RatatuiRuby
|
|
|
90
95
|
#
|
|
91
96
|
# # Array (9 items)
|
|
92
97
|
# bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
|
|
98
|
+
#--
|
|
99
|
+
# SPDX-SnippetEnd
|
|
100
|
+
#++
|
|
93
101
|
|
|
94
102
|
BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
|
|
95
103
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -17,12 +17,20 @@ module RatatuiRuby
|
|
|
17
17
|
#
|
|
18
18
|
# === Examples
|
|
19
19
|
#
|
|
20
|
+
#--
|
|
21
|
+
# SPDX-SnippetBegin
|
|
22
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
23
|
+
# SPDX-License-Identifier: MIT-0
|
|
24
|
+
#++
|
|
20
25
|
# # Standard colors
|
|
21
26
|
# Style.new(fg: :red, bg: :white, modifiers: [:bold])
|
|
22
27
|
#
|
|
23
28
|
# # Hex colors
|
|
24
29
|
# Style.new(fg: "#ff00ff")
|
|
25
30
|
#
|
|
31
|
+
#--
|
|
32
|
+
# SPDX-SnippetEnd
|
|
33
|
+
#++
|
|
26
34
|
# === Supported Colors
|
|
27
35
|
#
|
|
28
36
|
# ==== Integer
|
|
@@ -36,9 +44,17 @@ module RatatuiRuby
|
|
|
36
44
|
# * <tt>:black</tt>, <tt>:red</tt>, <tt>:green</tt>, <tt>:yellow</tt>,
|
|
37
45
|
# <tt>:blue</tt>, <tt>:magenta</tt>, <tt>:cyan</tt>, <tt>:gray</tt>
|
|
38
46
|
# * <tt>:dark_gray</tt>, <tt>:light_red</tt>, <tt>:light_green</tt>,
|
|
47
|
+
#--
|
|
48
|
+
# SPDX-SnippetBegin
|
|
49
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
50
|
+
# SPDX-License-Identifier: MIT-0
|
|
51
|
+
#++
|
|
39
52
|
# <tt>:light_yellow</tt>, <tt>:light_blue</tt>, <tt>:light_magenta</tt>,
|
|
40
53
|
# <tt>:light_cyan</tt>, <tt>:white</tt>
|
|
41
54
|
#
|
|
55
|
+
#--
|
|
56
|
+
# SPDX-SnippetEnd
|
|
57
|
+
#++
|
|
42
58
|
# ==== String
|
|
43
59
|
# Represents a specific RGB color using a Hex code (<tt>"#RRGGBB"</tt>).
|
|
44
60
|
# Requires a terminal emulator with "True Color" (24-bit color) support.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -31,6 +31,11 @@ module RatatuiRuby
|
|
|
31
31
|
#
|
|
32
32
|
# === Examples
|
|
33
33
|
#
|
|
34
|
+
#--
|
|
35
|
+
# SPDX-SnippetBegin
|
|
36
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
37
|
+
# SPDX-License-Identifier: MIT-0
|
|
38
|
+
#++
|
|
34
39
|
# # Simple ASCII text
|
|
35
40
|
# RatatuiRuby::Text.width("Hello") # => 5
|
|
36
41
|
#
|
|
@@ -42,6 +47,9 @@ module RatatuiRuby
|
|
|
42
47
|
#
|
|
43
48
|
# # Mixed content
|
|
44
49
|
# RatatuiRuby::Text.width("Hi 你好 👍") # => 11 (2 + space + 4 + space + 2)
|
|
50
|
+
#--
|
|
51
|
+
# SPDX-SnippetEnd
|
|
52
|
+
#++
|
|
45
53
|
module Text
|
|
46
54
|
# A styled string fragment.
|
|
47
55
|
#
|
|
@@ -90,12 +98,20 @@ module RatatuiRuby
|
|
|
90
98
|
#
|
|
91
99
|
# === Examples
|
|
92
100
|
#
|
|
101
|
+
#--
|
|
102
|
+
# SPDX-SnippetBegin
|
|
103
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
104
|
+
# SPDX-License-Identifier: MIT-0
|
|
105
|
+
#++
|
|
93
106
|
# Text::Line.new(
|
|
94
107
|
# spans: [
|
|
95
108
|
# Text::Span.styled("User: ", Style.new(modifiers: [:bold])),
|
|
96
109
|
# Text::Span.styled("kerrick", Style.new(fg: :blue))
|
|
97
110
|
# ]
|
|
98
111
|
# )
|
|
112
|
+
#--
|
|
113
|
+
# SPDX-SnippetEnd
|
|
114
|
+
#++
|
|
99
115
|
class Line < Data.define(:spans, :alignment, :style)
|
|
100
116
|
##
|
|
101
117
|
# :attr_reader: spans
|
|
@@ -136,12 +152,20 @@ module RatatuiRuby
|
|
|
136
152
|
#
|
|
137
153
|
# === Examples
|
|
138
154
|
#
|
|
155
|
+
#--
|
|
156
|
+
# SPDX-SnippetBegin
|
|
157
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
158
|
+
# SPDX-License-Identifier: MIT-0
|
|
159
|
+
#++
|
|
139
160
|
# line = Text::Line.new(spans: [
|
|
140
161
|
# Text::Span.new(content: "Hello "),
|
|
141
162
|
# Text::Span.new(content: "世界")
|
|
142
163
|
# ])
|
|
143
164
|
# line.width # => 10 (6 ASCII + 4 CJK)
|
|
144
165
|
#
|
|
166
|
+
#--
|
|
167
|
+
# SPDX-SnippetEnd
|
|
168
|
+
#++
|
|
145
169
|
# Returns: Integer (number of terminal cells)
|
|
146
170
|
def width
|
|
147
171
|
RatatuiRuby::Text.width(spans.map { |s| s.content.to_s }.join)
|
|
@@ -162,6 +186,11 @@ module RatatuiRuby
|
|
|
162
186
|
#
|
|
163
187
|
# === Examples
|
|
164
188
|
#
|
|
189
|
+
#--
|
|
190
|
+
# SPDX-SnippetBegin
|
|
191
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
192
|
+
# SPDX-License-Identifier: MIT-0
|
|
193
|
+
#++
|
|
165
194
|
# RatatuiRuby::Text.width("Hello") # => 5 (5 ASCII chars × 1 cell)
|
|
166
195
|
#
|
|
167
196
|
# RatatuiRuby::Text.width("你好") # => 4 (2 CJK chars × 2 cells)
|
|
@@ -173,6 +202,9 @@ module RatatuiRuby
|
|
|
173
202
|
# width = tui.text_width("Hello 👍")
|
|
174
203
|
# end
|
|
175
204
|
#
|
|
205
|
+
#--
|
|
206
|
+
# SPDX-SnippetEnd
|
|
207
|
+
#++
|
|
176
208
|
# [string] String to measure (String or object convertible to String)
|
|
177
209
|
# Returns: Integer (number of terminal cells the string occupies)
|
|
178
210
|
# Raises: TypeError if the argument is not a String
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -14,6 +14,11 @@ module RatatuiRuby
|
|
|
14
14
|
#
|
|
15
15
|
# == Example
|
|
16
16
|
#
|
|
17
|
+
#--
|
|
18
|
+
# SPDX-SnippetBegin
|
|
19
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
20
|
+
# SPDX-License-Identifier: MIT-0
|
|
21
|
+
#++
|
|
17
22
|
# @scrollbar_state = RatatuiRuby::ScrollbarState.new(100)
|
|
18
23
|
# @scrollbar_state.position = 25
|
|
19
24
|
#
|
|
@@ -22,6 +27,9 @@ module RatatuiRuby
|
|
|
22
27
|
# frame.render_stateful_widget(scrollbar, frame.area, @scrollbar_state)
|
|
23
28
|
# end
|
|
24
29
|
#
|
|
30
|
+
#--
|
|
31
|
+
# SPDX-SnippetEnd
|
|
32
|
+
#++
|
|
25
33
|
class ScrollbarState
|
|
26
34
|
##
|
|
27
35
|
# :method: new
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -18,12 +18,20 @@ module RatatuiRuby
|
|
|
18
18
|
#
|
|
19
19
|
# === Examples
|
|
20
20
|
#
|
|
21
|
+
#--
|
|
22
|
+
# SPDX-SnippetBegin
|
|
23
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
24
|
+
# SPDX-License-Identifier: MIT-0
|
|
25
|
+
#++
|
|
21
26
|
# # Standard colors
|
|
22
27
|
# Style::Style.new(fg: :red, bg: :white, modifiers: [:bold])
|
|
23
28
|
#
|
|
24
29
|
# # Hex colors
|
|
25
30
|
# Style::Style.new(fg: "#ff00ff")
|
|
26
31
|
#
|
|
32
|
+
#--
|
|
33
|
+
# SPDX-SnippetEnd
|
|
34
|
+
#++
|
|
27
35
|
# === Supported Colors
|
|
28
36
|
#
|
|
29
37
|
# ==== Integer
|
|
@@ -37,8 +45,16 @@ module RatatuiRuby
|
|
|
37
45
|
# * <tt>:black</tt>, <tt>:red</tt>, <tt>:green</tt>, <tt>:yellow</tt>,
|
|
38
46
|
# <tt>:blue</tt>, <tt>:magenta</tt>, <tt>:cyan</tt>, <tt>:gray</tt>
|
|
39
47
|
# * <tt>:dark_gray</tt>, <tt>:light_red</tt>, <tt>:light_green</tt>,
|
|
48
|
+
#--
|
|
49
|
+
# SPDX-SnippetBegin
|
|
50
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
51
|
+
# SPDX-License-Identifier: MIT-0
|
|
52
|
+
#++
|
|
40
53
|
# <tt>:light_yellow</tt>, <tt>:light_blue</tt>, <tt>:light_magenta</tt>,
|
|
41
54
|
# <tt>:light_cyan</tt>, <tt>:white</tt>
|
|
55
|
+
#--
|
|
56
|
+
# SPDX-SnippetEnd
|
|
57
|
+
#++
|
|
42
58
|
# * <tt>:reset</tt> — Restores the terminal's default color.
|
|
43
59
|
#
|
|
44
60
|
# ==== String
|
data/lib/ratatui_ruby/style.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#--
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
|
+
#++
|
|
7
|
+
|
|
8
|
+
module RatatuiRuby
|
|
9
|
+
##
|
|
10
|
+
# Ruby-only event queue for synthetic events.
|
|
11
|
+
#
|
|
12
|
+
# Native events flow through the Rust backend. Synthetic events bypass it.
|
|
13
|
+
# Runtimes (Tea, Kit) check this queue and handle events like
|
|
14
|
+
# <tt>Event::Sync</tt> specially.
|
|
15
|
+
#
|
|
16
|
+
# *For runtime authors:* Check <tt>pending?</tt> each loop iteration after
|
|
17
|
+
# polling native events. When true, pop the event and handle it. For
|
|
18
|
+
# <tt>Event::Sync</tt>, wait for pending threads and process background
|
|
19
|
+
# results before continuing.
|
|
20
|
+
#
|
|
21
|
+
# *For app developers:* Push <tt>Event::Sync</tt> when you need async
|
|
22
|
+
# results before continuing. The runtime will block until all pending
|
|
23
|
+
# work completes. Use this for "ensure saves complete before quit."
|
|
24
|
+
#
|
|
25
|
+
# *For test authors:* Use <tt>inject_sync</tt> between events to create
|
|
26
|
+
# synchronization points. This enables deterministic testing of async
|
|
27
|
+
# behavior.
|
|
28
|
+
#
|
|
29
|
+
# === Example
|
|
30
|
+
#
|
|
31
|
+
#--
|
|
32
|
+
# SPDX-SnippetBegin
|
|
33
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
34
|
+
# SPDX-License-Identifier: MIT-0
|
|
35
|
+
#++
|
|
36
|
+
# # Production: ensure async saves finish before exiting
|
|
37
|
+
# RatatuiRuby::SyntheticEvents.push(RatatuiRuby::Event::Sync.new)
|
|
38
|
+
#
|
|
39
|
+
# # Runtime authors: check in your event loop
|
|
40
|
+
# if RatatuiRuby::SyntheticEvents.pending?
|
|
41
|
+
# event = RatatuiRuby::SyntheticEvents.pop
|
|
42
|
+
# handle_sync if event.sync?
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
#--
|
|
46
|
+
# SPDX-SnippetEnd
|
|
47
|
+
#++
|
|
48
|
+
module SyntheticEvents
|
|
49
|
+
@queue = []
|
|
50
|
+
@mutex = Mutex.new
|
|
51
|
+
|
|
52
|
+
class << self
|
|
53
|
+
##
|
|
54
|
+
# Pushes an event to the synthetic queue.
|
|
55
|
+
#
|
|
56
|
+
# [event] An <tt>Event</tt> object (typically <tt>Event::Sync</tt>).
|
|
57
|
+
def push(event)
|
|
58
|
+
@mutex.synchronize { @queue << event }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
##
|
|
62
|
+
# Pops an event from the synthetic queue.
|
|
63
|
+
#
|
|
64
|
+
# Returns the oldest pending event, or <tt>nil</tt> if empty.
|
|
65
|
+
def pop
|
|
66
|
+
@mutex.synchronize { @queue.shift }
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Clears all pending synthetic events.
|
|
71
|
+
#
|
|
72
|
+
# Test helpers call this during teardown to reset state between tests.
|
|
73
|
+
def clear
|
|
74
|
+
@mutex.synchronize { @queue.clear }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
##
|
|
78
|
+
# Checks for pending synthetic events.
|
|
79
|
+
#
|
|
80
|
+
# Returns <tt>true</tt> if the queue has events waiting.
|
|
81
|
+
def pending?
|
|
82
|
+
@mutex.synchronize { !@queue.empty? }
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|