ratatui_ruby 1.4.0-x86_64-linux
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 +7 -0
- data/LICENSE +15 -0
- data/LICENSES/AGPL-3.0-or-later.txt +661 -0
- data/LICENSES/CC-BY-SA-4.0.txt +427 -0
- data/LICENSES/CC0-1.0.txt +121 -0
- data/LICENSES/LGPL-3.0-or-later.txt +304 -0
- data/LICENSES/MIT-0.txt +16 -0
- data/LICENSES/MIT.txt +21 -0
- data/REUSE.toml +42 -0
- data/exe/.gitkeep +0 -0
- data/ext/ratatui_ruby/.cargo/config.toml +13 -0
- data/ext/ratatui_ruby/.gitignore +4 -0
- data/ext/ratatui_ruby/Cargo.lock +1737 -0
- data/ext/ratatui_ruby/Cargo.toml +24 -0
- data/ext/ratatui_ruby/clippy.toml +7 -0
- data/ext/ratatui_ruby/extconf.rb +21 -0
- data/ext/ratatui_ruby/src/color.rs +82 -0
- data/ext/ratatui_ruby/src/errors.rs +28 -0
- data/ext/ratatui_ruby/src/events.rs +700 -0
- data/ext/ratatui_ruby/src/frame.rs +241 -0
- data/ext/ratatui_ruby/src/lib.rs +343 -0
- data/ext/ratatui_ruby/src/lib_header.rs +11 -0
- data/ext/ratatui_ruby/src/rendering.rs +158 -0
- data/ext/ratatui_ruby/src/string_width.rs +101 -0
- data/ext/ratatui_ruby/src/style.rs +469 -0
- data/ext/ratatui_ruby/src/terminal/capabilities.rs +46 -0
- data/ext/ratatui_ruby/src/terminal/init.rs +233 -0
- data/ext/ratatui_ruby/src/terminal/mod.rs +42 -0
- data/ext/ratatui_ruby/src/terminal/mutations.rs +158 -0
- data/ext/ratatui_ruby/src/terminal/queries.rs +231 -0
- data/ext/ratatui_ruby/src/terminal/query.rs +400 -0
- data/ext/ratatui_ruby/src/terminal/storage.rs +109 -0
- data/ext/ratatui_ruby/src/terminal/wrapper.rs +16 -0
- data/ext/ratatui_ruby/src/text.rs +225 -0
- data/ext/ratatui_ruby/src/widgets/barchart.rs +169 -0
- data/ext/ratatui_ruby/src/widgets/block.rs +41 -0
- data/ext/ratatui_ruby/src/widgets/calendar.rs +84 -0
- data/ext/ratatui_ruby/src/widgets/canvas.rs +183 -0
- data/ext/ratatui_ruby/src/widgets/center.rs +79 -0
- data/ext/ratatui_ruby/src/widgets/chart.rs +222 -0
- data/ext/ratatui_ruby/src/widgets/clear.rs +39 -0
- data/ext/ratatui_ruby/src/widgets/cursor.rs +32 -0
- data/ext/ratatui_ruby/src/widgets/gauge.rs +65 -0
- data/ext/ratatui_ruby/src/widgets/layout.rs +379 -0
- data/ext/ratatui_ruby/src/widgets/line_gauge.rs +100 -0
- data/ext/ratatui_ruby/src/widgets/list.rs +378 -0
- data/ext/ratatui_ruby/src/widgets/list_state.rs +173 -0
- data/ext/ratatui_ruby/src/widgets/mod.rs +26 -0
- data/ext/ratatui_ruby/src/widgets/overlay.rs +24 -0
- data/ext/ratatui_ruby/src/widgets/paragraph.rs +87 -0
- data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +40 -0
- data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +55 -0
- data/ext/ratatui_ruby/src/widgets/scrollbar.rs +214 -0
- data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +169 -0
- data/ext/ratatui_ruby/src/widgets/sparkline.rs +127 -0
- data/ext/ratatui_ruby/src/widgets/table.rs +415 -0
- data/ext/ratatui_ruby/src/widgets/table_state.rs +203 -0
- data/ext/ratatui_ruby/src/widgets/tabs.rs +194 -0
- data/lib/ratatui_ruby/backend/window_size.rb +50 -0
- data/lib/ratatui_ruby/backend.rb +59 -0
- data/lib/ratatui_ruby/buffer/cell.rb +212 -0
- data/lib/ratatui_ruby/buffer.rb +149 -0
- data/lib/ratatui_ruby/cell.rb +208 -0
- data/lib/ratatui_ruby/debug.rb +215 -0
- data/lib/ratatui_ruby/draw.rb +63 -0
- data/lib/ratatui_ruby/event/focus_gained.rb +125 -0
- data/lib/ratatui_ruby/event/focus_lost.rb +127 -0
- data/lib/ratatui_ruby/event/key/character.rb +53 -0
- data/lib/ratatui_ruby/event/key/dwim.rb +301 -0
- data/lib/ratatui_ruby/event/key/media.rb +46 -0
- data/lib/ratatui_ruby/event/key/modifier.rb +107 -0
- data/lib/ratatui_ruby/event/key/navigation.rb +72 -0
- data/lib/ratatui_ruby/event/key/system.rb +47 -0
- data/lib/ratatui_ruby/event/key.rb +479 -0
- data/lib/ratatui_ruby/event/mouse.rb +291 -0
- data/lib/ratatui_ruby/event/none.rb +53 -0
- data/lib/ratatui_ruby/event/paste.rb +130 -0
- data/lib/ratatui_ruby/event/resize.rb +221 -0
- data/lib/ratatui_ruby/event/sync.rb +52 -0
- data/lib/ratatui_ruby/event.rb +163 -0
- data/lib/ratatui_ruby/frame.rb +257 -0
- data/lib/ratatui_ruby/labs/a11y.rb +182 -0
- data/lib/ratatui_ruby/labs/frame_a11y_capture.rb +50 -0
- data/lib/ratatui_ruby/labs.rb +47 -0
- data/lib/ratatui_ruby/layout/alignment.rb +91 -0
- data/lib/ratatui_ruby/layout/constraint.rb +337 -0
- data/lib/ratatui_ruby/layout/layout.rb +258 -0
- data/lib/ratatui_ruby/layout/position.rb +81 -0
- data/lib/ratatui_ruby/layout/rect.rb +733 -0
- data/lib/ratatui_ruby/layout/size.rb +62 -0
- data/lib/ratatui_ruby/layout.rb +29 -0
- data/lib/ratatui_ruby/list_state.rb +201 -0
- data/lib/ratatui_ruby/output_guard.rb +171 -0
- data/lib/ratatui_ruby/ratatui_ruby.so +0 -0
- data/lib/ratatui_ruby/scrollbar_state.rb +122 -0
- data/lib/ratatui_ruby/style/color.rb +149 -0
- data/lib/ratatui_ruby/style/style.rb +147 -0
- data/lib/ratatui_ruby/style.rb +19 -0
- data/lib/ratatui_ruby/symbols.rb +435 -0
- data/lib/ratatui_ruby/synthetic_events.rb +106 -0
- data/lib/ratatui_ruby/table_state.rb +251 -0
- data/lib/ratatui_ruby/terminal/capabilities.rb +316 -0
- data/lib/ratatui_ruby/terminal/viewport.rb +80 -0
- data/lib/ratatui_ruby/terminal.rb +66 -0
- data/lib/ratatui_ruby/terminal_lifecycle.rb +303 -0
- data/lib/ratatui_ruby/terminal_lifecycle.rb.bak +197 -0
- data/lib/ratatui_ruby/test_helper/event_injection.rb +241 -0
- data/lib/ratatui_ruby/test_helper/global_state.rb +111 -0
- data/lib/ratatui_ruby/test_helper/snapshot.rb +568 -0
- data/lib/ratatui_ruby/test_helper/snapshots/axis_labels_alignment.ansi +24 -0
- data/lib/ratatui_ruby/test_helper/snapshots/axis_labels_alignment.txt +24 -0
- data/lib/ratatui_ruby/test_helper/snapshots/barchart_styled_label.ansi +5 -0
- data/lib/ratatui_ruby/test_helper/snapshots/barchart_styled_label.txt +5 -0
- data/lib/ratatui_ruby/test_helper/snapshots/chart_rendering.ansi +24 -0
- data/lib/ratatui_ruby/test_helper/snapshots/chart_rendering.txt +24 -0
- data/lib/ratatui_ruby/test_helper/snapshots/half_block_marker.ansi +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/half_block_marker.txt +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_bottom.ansi +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_bottom.txt +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_left.ansi +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_left.txt +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_right.ansi +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_right.txt +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_top.ansi +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/legend_position_top.txt +12 -0
- data/lib/ratatui_ruby/test_helper/snapshots/my_snapshot.txt +1 -0
- data/lib/ratatui_ruby/test_helper/snapshots/styled_axis_title.ansi +10 -0
- data/lib/ratatui_ruby/test_helper/snapshots/styled_axis_title.txt +10 -0
- data/lib/ratatui_ruby/test_helper/snapshots/styled_dataset_name.ansi +10 -0
- data/lib/ratatui_ruby/test_helper/snapshots/styled_dataset_name.txt +10 -0
- data/lib/ratatui_ruby/test_helper/style_assertions.rb +449 -0
- data/lib/ratatui_ruby/test_helper/subprocess_timeout.rb +35 -0
- data/lib/ratatui_ruby/test_helper/terminal.rb +187 -0
- data/lib/ratatui_ruby/test_helper/test_doubles.rb +86 -0
- data/lib/ratatui_ruby/test_helper.rb +115 -0
- data/lib/ratatui_ruby/text/line.rb +245 -0
- data/lib/ratatui_ruby/text/span.rb +158 -0
- data/lib/ratatui_ruby/text.rb +99 -0
- data/lib/ratatui_ruby/tui/buffer_factories.rb +22 -0
- data/lib/ratatui_ruby/tui/canvas_factories.rb +149 -0
- data/lib/ratatui_ruby/tui/core.rb +67 -0
- data/lib/ratatui_ruby/tui/layout_factories.rb +153 -0
- data/lib/ratatui_ruby/tui/state_factories.rb +77 -0
- data/lib/ratatui_ruby/tui/style_factories.rb +22 -0
- data/lib/ratatui_ruby/tui/text_factories.rb +86 -0
- data/lib/ratatui_ruby/tui/widget_factories.rb +272 -0
- data/lib/ratatui_ruby/tui.rb +106 -0
- data/lib/ratatui_ruby/version.rb +12 -0
- data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +51 -0
- data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +29 -0
- data/lib/ratatui_ruby/widgets/bar_chart.rb +308 -0
- data/lib/ratatui_ruby/widgets/block.rb +266 -0
- data/lib/ratatui_ruby/widgets/calendar.rb +88 -0
- data/lib/ratatui_ruby/widgets/canvas.rb +297 -0
- data/lib/ratatui_ruby/widgets/cell.rb +59 -0
- data/lib/ratatui_ruby/widgets/center.rb +71 -0
- data/lib/ratatui_ruby/widgets/chart.rb +172 -0
- data/lib/ratatui_ruby/widgets/clear.rb +66 -0
- data/lib/ratatui_ruby/widgets/coerceable_widget.rb +77 -0
- data/lib/ratatui_ruby/widgets/cursor.rb +54 -0
- data/lib/ratatui_ruby/widgets/gauge.rb +146 -0
- data/lib/ratatui_ruby/widgets/line_gauge.rb +158 -0
- data/lib/ratatui_ruby/widgets/list.rb +252 -0
- data/lib/ratatui_ruby/widgets/list_item.rb +55 -0
- data/lib/ratatui_ruby/widgets/overlay.rb +55 -0
- data/lib/ratatui_ruby/widgets/paragraph.rb +113 -0
- data/lib/ratatui_ruby/widgets/ratatui_logo.rb +35 -0
- data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +40 -0
- data/lib/ratatui_ruby/widgets/row.rb +123 -0
- data/lib/ratatui_ruby/widgets/scrollbar.rb +147 -0
- data/lib/ratatui_ruby/widgets/shape/label.rb +80 -0
- data/lib/ratatui_ruby/widgets/sparkline.rb +153 -0
- data/lib/ratatui_ruby/widgets/table.rb +213 -0
- data/lib/ratatui_ruby/widgets/tabs.rb +91 -0
- data/lib/ratatui_ruby/widgets.rb +43 -0
- data/lib/ratatui_ruby.rb +555 -0
- data/sig/examples/app_all_events/app.rbs +11 -0
- data/sig/examples/app_all_events/model/app_model.rbs +23 -0
- data/sig/examples/app_all_events/model/event_entry.rbs +23 -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 +14 -0
- data/sig/examples/app_cli_rich_moments/app.rbs +12 -0
- data/sig/examples/app_color_picker/app.rbs +17 -0
- data/sig/examples/app_external_editor/app.rbs +12 -0
- data/sig/examples/app_login_form/app.rbs +11 -0
- data/sig/examples/app_stateful_interaction/app.rbs +39 -0
- data/sig/examples/verify_quickstart_dsl/app.rbs +17 -0
- data/sig/examples/verify_quickstart_lifecycle/app.rbs +17 -0
- data/sig/examples/verify_readme_usage/app.rbs +17 -0
- data/sig/examples/widget_block_demo/app.rbs +38 -0
- data/sig/examples/widget_box_demo/app.rbs +17 -0
- data/sig/examples/widget_calendar_demo/app.rbs +17 -0
- data/sig/examples/widget_cell_demo/app.rbs +17 -0
- data/sig/examples/widget_chart_demo/app.rbs +17 -0
- data/sig/examples/widget_gauge_demo/app.rbs +17 -0
- data/sig/examples/widget_layout_split/app.rbs +16 -0
- data/sig/examples/widget_line_gauge_demo/app.rbs +17 -0
- data/sig/examples/widget_list_demo/app.rbs +17 -0
- data/sig/examples/widget_map_demo/app.rbs +17 -0
- data/sig/examples/widget_popup_demo/app.rbs +17 -0
- data/sig/examples/widget_ratatui_logo_demo/app.rbs +17 -0
- data/sig/examples/widget_ratatui_mascot_demo/app.rbs +17 -0
- data/sig/examples/widget_rect/app.rbs +18 -0
- data/sig/examples/widget_render/app.rbs +16 -0
- data/sig/examples/widget_rich_text/app.rbs +17 -0
- data/sig/examples/widget_scroll_text/app.rbs +17 -0
- data/sig/examples/widget_scrollbar_demo/app.rbs +17 -0
- data/sig/examples/widget_sparkline_demo/app.rbs +16 -0
- data/sig/examples/widget_style_colors/app.rbs +20 -0
- data/sig/examples/widget_table_demo/app.rbs +17 -0
- data/sig/examples/widget_text_width/app.rbs +16 -0
- data/sig/generated/event_key_predicates.rbs +1348 -0
- data/sig/manifest.yaml +5 -0
- data/sig/patches/data.rbs +26 -0
- data/sig/patches/debugger__.rbs +8 -0
- data/sig/ratatui_ruby/backend/window_size.rbs +17 -0
- data/sig/ratatui_ruby/backend.rbs +12 -0
- data/sig/ratatui_ruby/buffer/cell.rbs +46 -0
- data/sig/ratatui_ruby/buffer.rbs +18 -0
- data/sig/ratatui_ruby/cell.rbs +44 -0
- data/sig/ratatui_ruby/clear.rbs +18 -0
- data/sig/ratatui_ruby/constraint.rbs +26 -0
- data/sig/ratatui_ruby/debug.rbs +45 -0
- data/sig/ratatui_ruby/draw.rbs +30 -0
- data/sig/ratatui_ruby/event.rbs +249 -0
- data/sig/ratatui_ruby/frame.rbs +23 -0
- data/sig/ratatui_ruby/interfaces.rbs +25 -0
- data/sig/ratatui_ruby/labs.rbs +90 -0
- data/sig/ratatui_ruby/layout/alignment.rbs +26 -0
- data/sig/ratatui_ruby/layout/constraint.rbs +39 -0
- data/sig/ratatui_ruby/layout/layout.rbs +45 -0
- data/sig/ratatui_ruby/layout/position.rbs +18 -0
- data/sig/ratatui_ruby/layout/rect.rbs +64 -0
- data/sig/ratatui_ruby/layout/size.rbs +18 -0
- data/sig/ratatui_ruby/list_state.rbs +23 -0
- data/sig/ratatui_ruby/output_guard.rbs +23 -0
- data/sig/ratatui_ruby/ratatui_ruby.rbs +113 -0
- data/sig/ratatui_ruby/rect.rbs +17 -0
- data/sig/ratatui_ruby/scrollbar_state.rbs +24 -0
- data/sig/ratatui_ruby/session.rbs +93 -0
- data/sig/ratatui_ruby/style/color.rbs +22 -0
- data/sig/ratatui_ruby/style/style.rbs +29 -0
- data/sig/ratatui_ruby/symbols.rbs +141 -0
- data/sig/ratatui_ruby/synthetic_events.rbs +24 -0
- data/sig/ratatui_ruby/table_state.rbs +27 -0
- data/sig/ratatui_ruby/terminal/capabilities.rbs +38 -0
- data/sig/ratatui_ruby/terminal/viewport.rbs +33 -0
- data/sig/ratatui_ruby/terminal_lifecycle.rbs +39 -0
- data/sig/ratatui_ruby/test_helper/event_injection.rbs +22 -0
- data/sig/ratatui_ruby/test_helper/snapshot.rbs +37 -0
- data/sig/ratatui_ruby/test_helper/style_assertions.rbs +77 -0
- data/sig/ratatui_ruby/test_helper/terminal.rbs +20 -0
- data/sig/ratatui_ruby/test_helper/test_doubles.rbs +32 -0
- data/sig/ratatui_ruby/test_helper.rbs +18 -0
- data/sig/ratatui_ruby/text/line.rbs +27 -0
- data/sig/ratatui_ruby/text/span.rbs +23 -0
- data/sig/ratatui_ruby/text.rbs +12 -0
- data/sig/ratatui_ruby/tui/buffer_factories.rbs +16 -0
- data/sig/ratatui_ruby/tui/canvas_factories.rbs +38 -0
- data/sig/ratatui_ruby/tui/core.rbs +23 -0
- data/sig/ratatui_ruby/tui/layout_factories.rbs +39 -0
- data/sig/ratatui_ruby/tui/state_factories.rbs +23 -0
- data/sig/ratatui_ruby/tui/style_factories.rbs +18 -0
- data/sig/ratatui_ruby/tui/text_factories.rbs +23 -0
- data/sig/ratatui_ruby/tui/widget_factories.rbs +138 -0
- data/sig/ratatui_ruby/tui.rbs +25 -0
- data/sig/ratatui_ruby/version.rbs +12 -0
- data/sig/ratatui_ruby/widgets/bar_chart.rbs +95 -0
- data/sig/ratatui_ruby/widgets/block.rbs +51 -0
- data/sig/ratatui_ruby/widgets/calendar.rbs +45 -0
- data/sig/ratatui_ruby/widgets/canvas.rbs +95 -0
- data/sig/ratatui_ruby/widgets/chart.rbs +91 -0
- data/sig/ratatui_ruby/widgets/coerceable_widget.rbs +26 -0
- data/sig/ratatui_ruby/widgets/gauge.rbs +44 -0
- data/sig/ratatui_ruby/widgets/line_gauge.rbs +48 -0
- data/sig/ratatui_ruby/widgets/list.rbs +63 -0
- data/sig/ratatui_ruby/widgets/misc.rbs +158 -0
- data/sig/ratatui_ruby/widgets/paragraph.rbs +45 -0
- data/sig/ratatui_ruby/widgets/row.rbs +43 -0
- data/sig/ratatui_ruby/widgets/scrollbar.rbs +53 -0
- data/sig/ratatui_ruby/widgets/shape/label.rbs +37 -0
- data/sig/ratatui_ruby/widgets/sparkline.rbs +45 -0
- data/sig/ratatui_ruby/widgets/table.rbs +78 -0
- data/sig/ratatui_ruby/widgets/tabs.rbs +44 -0
- data/sig/ratatui_ruby/widgets.rbs +16 -0
- data/vendor/goodcop/base.yml +1047 -0
- metadata +729 -0
|
@@ -0,0 +1,149 @@
|
|
|
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
|
+
module Style
|
|
10
|
+
# Color constructors for creating RGB color values.
|
|
11
|
+
#
|
|
12
|
+
# Styles accept colors in multiple formats: symbols (<tt>:red</tt>),
|
|
13
|
+
# indexed integers (0-255), or hex strings (<tt>"#FF0000"</tt>).
|
|
14
|
+
# Converting from other color representations manually is tedious.
|
|
15
|
+
#
|
|
16
|
+
# This module provides factory methods matching Ratatui's Color API.
|
|
17
|
+
# Convert from hex integers, HSL, or other formats in a single call.
|
|
18
|
+
#
|
|
19
|
+
# Use these constructors when you have color data in non-standard formats.
|
|
20
|
+
#
|
|
21
|
+
# === Example
|
|
22
|
+
#
|
|
23
|
+
#--
|
|
24
|
+
# SPDX-SnippetBegin
|
|
25
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
26
|
+
# SPDX-License-Identifier: MIT-0
|
|
27
|
+
#++
|
|
28
|
+
# # From a hex integer (common in design tools)
|
|
29
|
+
# red = Style::Color.from_u32(0xFF0000)
|
|
30
|
+
# style = Style::Style.new(fg: red)
|
|
31
|
+
#
|
|
32
|
+
# # From HSL (common in color pickers)
|
|
33
|
+
# blue = Style::Color.from_hsl(240, 100, 50)
|
|
34
|
+
# style = Style::Style.new(bg: blue)
|
|
35
|
+
#--
|
|
36
|
+
# SPDX-SnippetEnd
|
|
37
|
+
#++
|
|
38
|
+
module Color
|
|
39
|
+
class << self
|
|
40
|
+
# Creates a color from a 32-bit unsigned integer.
|
|
41
|
+
#
|
|
42
|
+
# Design tools and APIs often represent colors as hex integers.
|
|
43
|
+
# Manually extracting RGB components and formatting is error-prone.
|
|
44
|
+
#
|
|
45
|
+
# This method parses the integer and returns a hex string
|
|
46
|
+
# ready for use with Style.
|
|
47
|
+
#
|
|
48
|
+
# === Example
|
|
49
|
+
#
|
|
50
|
+
#--
|
|
51
|
+
# SPDX-SnippetBegin
|
|
52
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
53
|
+
# SPDX-License-Identifier: MIT-0
|
|
54
|
+
#++
|
|
55
|
+
# Color.from_u32(0xFF0000) # => "#ff0000" (red)
|
|
56
|
+
# Color.from_u32(0x00FF00) # => "#00ff00" (green)
|
|
57
|
+
# Color.from_u32(0x0000FF) # => "#0000ff" (blue)
|
|
58
|
+
#--
|
|
59
|
+
# SPDX-SnippetEnd
|
|
60
|
+
#++
|
|
61
|
+
#
|
|
62
|
+
# [value] Integer in <tt>0xRRGGBB</tt> format.
|
|
63
|
+
#
|
|
64
|
+
# Returns a hex string like <tt>"#rrggbb"</tt>.
|
|
65
|
+
def from_u32(value)
|
|
66
|
+
RatatuiRuby._color_from_u32(value)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Creates a color from HSL (Hue, Saturation, Lightness) values.
|
|
70
|
+
#
|
|
71
|
+
# Color pickers often use HSL because it matches human perception
|
|
72
|
+
# better than RGB. Converting HSL to RGB manually requires math.
|
|
73
|
+
#
|
|
74
|
+
# This method handles the conversion by delegating to Ratatui's
|
|
75
|
+
# palette integration.
|
|
76
|
+
#
|
|
77
|
+
# Note: This implementation uses degrees (0-360) for hue and
|
|
78
|
+
# percentages (0-100) for saturation and lightness, matching
|
|
79
|
+
# common UI conventions.
|
|
80
|
+
#
|
|
81
|
+
# === Example
|
|
82
|
+
#
|
|
83
|
+
#--
|
|
84
|
+
# SPDX-SnippetBegin
|
|
85
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
86
|
+
# SPDX-License-Identifier: MIT-0
|
|
87
|
+
#++
|
|
88
|
+
# Color.from_hsl(0, 100, 50) # => "#ff0000" (red)
|
|
89
|
+
# Color.from_hsl(120, 100, 50) # => "#00ff00" (green)
|
|
90
|
+
# Color.from_hsl(240, 100, 50) # => "#0000ff" (blue)
|
|
91
|
+
# Color.from_hsl(0, 0, 50) # => "#808080" (gray)
|
|
92
|
+
#--
|
|
93
|
+
# SPDX-SnippetEnd
|
|
94
|
+
#++
|
|
95
|
+
#
|
|
96
|
+
# [h] Hue in degrees (0-360). Values wrap automatically.
|
|
97
|
+
# [s] Saturation as percentage (0-100).
|
|
98
|
+
# [l] Lightness as percentage (0-100).
|
|
99
|
+
#
|
|
100
|
+
# Returns a hex string like <tt>"#rrggbb"</tt>.
|
|
101
|
+
def from_hsl(h, s, l)
|
|
102
|
+
RatatuiRuby._color_from_hsl(h.to_f, s.to_f, l.to_f)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Ruby-idiomatic aliases (TIMTOWTDI)
|
|
106
|
+
alias hex from_u32
|
|
107
|
+
alias hsl from_hsl
|
|
108
|
+
|
|
109
|
+
# Creates a color from HSLuv (Human-friendly Hue, Saturation, Lightness) values.
|
|
110
|
+
#
|
|
111
|
+
# HSLuv is a perceptually uniform color space. Unlike standard HSL,
|
|
112
|
+
# colors at the same lightness appear equally bright regardless of hue.
|
|
113
|
+
# This makes it ideal for generating color palettes with consistent
|
|
114
|
+
# perceived brightness.
|
|
115
|
+
#
|
|
116
|
+
# This method delegates to Ratatui's palette integration for the
|
|
117
|
+
# complex HSLuv to RGB conversion.
|
|
118
|
+
#
|
|
119
|
+
# Note: Ratatui uses the range [-180, 180] for hue and [0, 100] for
|
|
120
|
+
# saturation and lightness. This implementation matches those conventions.
|
|
121
|
+
#
|
|
122
|
+
# === Example
|
|
123
|
+
#
|
|
124
|
+
#--
|
|
125
|
+
# SPDX-SnippetBegin
|
|
126
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
127
|
+
# SPDX-License-Identifier: MIT-0
|
|
128
|
+
#++
|
|
129
|
+
# Color.from_hsluv(12.18, 100, 53.2) # => "#ff0000" (bright red)
|
|
130
|
+
# Color.from_hsluv(-94.13, 100, 32.3) # => "#0000ff" (bright blue)
|
|
131
|
+
# Color.from_hsluv(0, 0, 50) # => gray
|
|
132
|
+
#--
|
|
133
|
+
# SPDX-SnippetEnd
|
|
134
|
+
#++
|
|
135
|
+
#
|
|
136
|
+
# [h] Hue in degrees (-180 to 360). Values wrap automatically.
|
|
137
|
+
# [s] Saturation as percentage (0-100). Values are clamped.
|
|
138
|
+
# [l] Lightness as percentage (0-100). Values are clamped.
|
|
139
|
+
#
|
|
140
|
+
# Returns a hex string like <tt>"#rrggbb"</tt>.
|
|
141
|
+
def from_hsluv(h, s, l)
|
|
142
|
+
RatatuiRuby._color_from_hsluv(h.to_f, s.to_f, l.to_f)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
alias hsluv from_hsluv
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
module Style
|
|
10
|
+
# Defines colors and text modifiers.
|
|
11
|
+
#
|
|
12
|
+
# The terminal is traditionally monochrome, but efficient interfaces use color to convey meaning.
|
|
13
|
+
# Red for errors. Green for success. Bold for headers.
|
|
14
|
+
#
|
|
15
|
+
# This value object encapsulates those choices. It applies foreground and background colors. It adds effects like italics or blinking.
|
|
16
|
+
#
|
|
17
|
+
# Use it to theme your application or highlight critical data.
|
|
18
|
+
#
|
|
19
|
+
# === Examples
|
|
20
|
+
#
|
|
21
|
+
#--
|
|
22
|
+
# SPDX-SnippetBegin
|
|
23
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
24
|
+
# SPDX-License-Identifier: MIT-0
|
|
25
|
+
#++
|
|
26
|
+
# # Standard colors
|
|
27
|
+
# Style::Style.new(fg: :red, bg: :white, modifiers: [:bold])
|
|
28
|
+
#
|
|
29
|
+
# # Hex colors
|
|
30
|
+
# Style::Style.new(fg: "#ff00ff")
|
|
31
|
+
#
|
|
32
|
+
#--
|
|
33
|
+
# SPDX-SnippetEnd
|
|
34
|
+
#++
|
|
35
|
+
# === Supported Colors
|
|
36
|
+
#
|
|
37
|
+
# ==== Integer
|
|
38
|
+
# Represents an indexed color from the Xterm 256-color palette (0-255).
|
|
39
|
+
# * <tt>0</tt>–<tt>15</tt>: Standard and bright ANSI colors.
|
|
40
|
+
# * <tt>16</tt>–<tt>231</tt>: {6x6x6 Color Cube}[https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit].
|
|
41
|
+
# * <tt>232</tt>–<tt>255</tt>: Grayscale ramp.
|
|
42
|
+
#
|
|
43
|
+
# ==== Symbol
|
|
44
|
+
# Represents a named color from the standard ANSI palette. Supported values:
|
|
45
|
+
# * <tt>:black</tt>, <tt>:red</tt>, <tt>:green</tt>, <tt>:yellow</tt>,
|
|
46
|
+
# <tt>:blue</tt>, <tt>:magenta</tt>, <tt>:cyan</tt>, <tt>:gray</tt>
|
|
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
|
+
#++
|
|
53
|
+
# <tt>:light_yellow</tt>, <tt>:light_blue</tt>, <tt>:light_magenta</tt>,
|
|
54
|
+
# <tt>:light_cyan</tt>, <tt>:white</tt>
|
|
55
|
+
#--
|
|
56
|
+
# SPDX-SnippetEnd
|
|
57
|
+
#++
|
|
58
|
+
# * <tt>:reset</tt> — Restores the terminal's default color.
|
|
59
|
+
#
|
|
60
|
+
# ==== String
|
|
61
|
+
# Represents a specific RGB color using a Hex code (<tt>"#RRGGBB"</tt>).
|
|
62
|
+
# Requires a terminal emulator with "True Color" (24-bit color) support.
|
|
63
|
+
class Style < Data.define(:fg, :bg, :underline_color, :modifiers, :remove_modifiers)
|
|
64
|
+
##
|
|
65
|
+
# :attr_reader: fg
|
|
66
|
+
# Foreground color.
|
|
67
|
+
#
|
|
68
|
+
# Symbol (<tt>:red</tt>), Hex String (<tt>"#ffffff"</tt>), or Integer (0-255).
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# :attr_reader: bg
|
|
72
|
+
# Background color.
|
|
73
|
+
#
|
|
74
|
+
# Symbol (<tt>:black</tt>), Hex String (<tt>"#000000"</tt>), or Integer (0-255).
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# :attr_reader: underline_color
|
|
78
|
+
# Color of the underline.
|
|
79
|
+
#
|
|
80
|
+
# Symbol (<tt>:red</tt>), Hex String (<tt>"#ff0000"</tt>), or Integer (0-255).
|
|
81
|
+
# Distinct from foreground color. Terminals supporting this feature render
|
|
82
|
+
# the underline in this color while text remains in the foreground color.
|
|
83
|
+
|
|
84
|
+
##
|
|
85
|
+
# :attr_reader: modifiers
|
|
86
|
+
# Text effects to add.
|
|
87
|
+
#
|
|
88
|
+
# Array of symbols: <tt>:bold</tt>, <tt>:dim</tt>, <tt>:italic</tt>, <tt>:underlined</tt>,
|
|
89
|
+
# <tt>:slow_blink</tt>, <tt>:rapid_blink</tt>, <tt>:reversed</tt>, <tt>:hidden</tt>, <tt>:crossed_out</tt>.
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# :attr_reader: remove_modifiers
|
|
93
|
+
# Text effects to remove.
|
|
94
|
+
#
|
|
95
|
+
# Array of symbols. When this style is applied, these modifiers are removed
|
|
96
|
+
# from any inherited/patched styles. Corresponds to Ratatui's sub_modifier.
|
|
97
|
+
|
|
98
|
+
# Creates a new Style.
|
|
99
|
+
#
|
|
100
|
+
# [fg] Color (Symbol/String/Integer).
|
|
101
|
+
# [bg] Color (Symbol/String/Integer).
|
|
102
|
+
# [underline_color] Color for underline (Symbol/String/Integer).
|
|
103
|
+
# [modifiers] Array of Symbols to add.
|
|
104
|
+
# [remove_modifiers] Array of Symbols to remove (Ratatui: sub_modifier).
|
|
105
|
+
def initialize(fg: nil, bg: nil, underline_color: nil, modifiers: [], remove_modifiers: [])
|
|
106
|
+
super
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Returns an empty style.
|
|
110
|
+
#
|
|
111
|
+
# Use this as a baseline to prevent style inheritance issues or when no styling is required.
|
|
112
|
+
def self.default
|
|
113
|
+
new
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Creates a new Style (convenience alias for {#initialize}).
|
|
117
|
+
#
|
|
118
|
+
# Constructor keyword arguments require typing out the full <tt>Style.new</tt> form.
|
|
119
|
+
# This gets verbose in tight layout code or one-liners.
|
|
120
|
+
#
|
|
121
|
+
# <tt>Style.with</tt> reads more naturally and enables method chaining.
|
|
122
|
+
# It shows intent: "use this style with these properties."
|
|
123
|
+
#
|
|
124
|
+
# Use it for inline styling where conciseness matters.
|
|
125
|
+
#
|
|
126
|
+
# === Examples
|
|
127
|
+
#
|
|
128
|
+
#--
|
|
129
|
+
# SPDX-SnippetBegin
|
|
130
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
131
|
+
# SPDX-License-Identifier: MIT-0
|
|
132
|
+
#++
|
|
133
|
+
# Style.with(fg: :red, bg: :black, modifiers: [:bold])
|
|
134
|
+
# Style.with(fg: :white, modifiers: [:underlined], underline_color: :red)
|
|
135
|
+
# Style.with(modifiers: [:bold], remove_modifiers: [:italic]) # Add bold, remove italic
|
|
136
|
+
# paragraph = Paragraph.new(text: "Alert!", style: Style.with(fg: :red))
|
|
137
|
+
#--
|
|
138
|
+
# SPDX-SnippetEnd
|
|
139
|
+
#++
|
|
140
|
+
#
|
|
141
|
+
# @return [Style]
|
|
142
|
+
def self.with(fg: nil, bg: nil, underline_color: nil, modifiers: [], remove_modifiers: [])
|
|
143
|
+
new(fg:, bg:, underline_color:, modifiers:, remove_modifiers:)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
# Styling primitives for colors and text effects.
|
|
10
|
+
#
|
|
11
|
+
# This module mirrors +ratatui::style+ and contains:
|
|
12
|
+
# - {Style} — Colors and modifiers
|
|
13
|
+
# - {Color} — Color constructors
|
|
14
|
+
module Style
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
require_relative "style/style"
|
|
19
|
+
require_relative "style/color"
|