ratatui_ruby 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +14 -12
  3. data/.builds/ruby-3.3.yml +14 -12
  4. data/.builds/ruby-3.4.yml +14 -12
  5. data/.builds/ruby-4.0.0.yml +14 -12
  6. data/AGENTS.md +54 -13
  7. data/CHANGELOG.md +186 -1
  8. data/README.md +17 -15
  9. data/doc/application_architecture.md +116 -0
  10. data/doc/application_testing.md +12 -7
  11. data/doc/contributors/better_dx.md +543 -0
  12. data/doc/contributors/design/ruby_frontend.md +1 -1
  13. data/doc/contributors/developing_examples.md +203 -0
  14. data/doc/contributors/documentation_style.md +97 -0
  15. data/doc/contributors/dwim_dx.md +366 -0
  16. data/doc/contributors/example_analysis.md +82 -0
  17. data/doc/custom.css +14 -0
  18. data/doc/event_handling.md +119 -0
  19. data/doc/images/all_events.png +0 -0
  20. data/doc/images/analytics.png +0 -0
  21. data/doc/images/block_padding.png +0 -0
  22. data/doc/images/block_titles.png +0 -0
  23. data/doc/images/box_demo.png +0 -0
  24. data/doc/images/calendar_demo.png +0 -0
  25. data/doc/images/cell_demo.png +0 -0
  26. data/doc/images/chart_demo.png +0 -0
  27. data/doc/images/custom_widget.png +0 -0
  28. data/doc/images/flex_layout.png +0 -0
  29. data/doc/images/gauge_demo.png +0 -0
  30. data/doc/images/hit_test.png +0 -0
  31. data/doc/images/line_gauge_demo.png +0 -0
  32. data/doc/images/list_demo.png +0 -0
  33. data/doc/images/list_styles.png +0 -0
  34. data/doc/images/login_form.png +0 -0
  35. data/doc/images/map_demo.png +0 -0
  36. data/doc/images/mouse_events.png +0 -0
  37. data/doc/images/popup_demo.png +0 -0
  38. data/doc/images/quickstart_dsl.png +0 -0
  39. data/doc/images/quickstart_lifecycle.png +0 -0
  40. data/doc/images/ratatui_logo_demo.png +0 -0
  41. data/doc/images/readme_usage.png +0 -0
  42. data/doc/images/rich_text.png +0 -0
  43. data/doc/images/scroll_text.png +0 -0
  44. data/doc/images/scrollbar_demo.png +0 -0
  45. data/doc/images/sparkline_demo.png +0 -0
  46. data/doc/images/table_flex.png +0 -0
  47. data/doc/images/table_select.png +0 -0
  48. data/doc/images/widget_style_colors.png +0 -0
  49. data/doc/index.md +1 -0
  50. data/doc/interactive_design.md +121 -0
  51. data/doc/quickstart.md +147 -72
  52. data/examples/all_events/app.rb +169 -0
  53. data/examples/all_events/app.rbs +7 -0
  54. data/examples/all_events/test_app.rb +139 -0
  55. data/examples/analytics/app.rb +258 -0
  56. data/examples/analytics/app.rbs +7 -0
  57. data/examples/analytics/test_app.rb +132 -0
  58. data/examples/block_padding/app.rb +63 -0
  59. data/examples/block_padding/app.rbs +7 -0
  60. data/examples/block_padding/test_app.rb +31 -0
  61. data/examples/block_titles/app.rb +61 -0
  62. data/examples/block_titles/app.rbs +7 -0
  63. data/examples/block_titles/test_app.rb +34 -0
  64. data/examples/box_demo/app.rb +216 -0
  65. data/examples/box_demo/app.rbs +7 -0
  66. data/examples/box_demo/test_app.rb +88 -0
  67. data/examples/calendar_demo/app.rb +101 -0
  68. data/examples/calendar_demo/app.rbs +7 -0
  69. data/examples/calendar_demo/test_app.rb +108 -0
  70. data/examples/cell_demo/app.rb +108 -0
  71. data/examples/cell_demo/app.rbs +7 -0
  72. data/examples/cell_demo/test_app.rb +36 -0
  73. data/examples/chart_demo/app.rb +203 -0
  74. data/examples/chart_demo/app.rbs +7 -0
  75. data/examples/chart_demo/test_app.rb +102 -0
  76. data/examples/custom_widget/app.rb +51 -0
  77. data/examples/custom_widget/app.rbs +7 -0
  78. data/examples/custom_widget/test_app.rb +30 -0
  79. data/examples/flex_layout/app.rb +156 -0
  80. data/examples/flex_layout/app.rbs +7 -0
  81. data/examples/flex_layout/test_app.rb +65 -0
  82. data/examples/gauge_demo/app.rb +182 -0
  83. data/examples/gauge_demo/app.rbs +7 -0
  84. data/examples/gauge_demo/test_app.rb +120 -0
  85. data/examples/hit_test/app.rb +175 -0
  86. data/examples/hit_test/app.rbs +7 -0
  87. data/examples/hit_test/test_app.rb +102 -0
  88. data/examples/line_gauge_demo/app.rb +190 -0
  89. data/examples/line_gauge_demo/app.rbs +7 -0
  90. data/examples/line_gauge_demo/test_app.rb +129 -0
  91. data/examples/list_demo/app.rb +253 -0
  92. data/examples/list_demo/app.rbs +12 -0
  93. data/examples/list_demo/test_app.rb +237 -0
  94. data/examples/list_styles/app.rb +140 -0
  95. data/examples/list_styles/app.rbs +7 -0
  96. data/examples/list_styles/test_app.rb +157 -0
  97. data/examples/{login_form.rb → login_form/app.rb} +12 -16
  98. data/examples/login_form/app.rbs +7 -0
  99. data/examples/login_form/test_app.rb +51 -0
  100. data/examples/map_demo/app.rb +90 -0
  101. data/examples/map_demo/app.rbs +7 -0
  102. data/examples/map_demo/test_app.rb +149 -0
  103. data/examples/{mouse_events.rb → mouse_events/app.rb} +29 -27
  104. data/examples/mouse_events/app.rbs +7 -0
  105. data/examples/mouse_events/test_app.rb +53 -0
  106. data/examples/{popup_demo.rb → popup_demo/app.rb} +15 -17
  107. data/examples/popup_demo/app.rbs +7 -0
  108. data/examples/{test_popup_demo.rb → popup_demo/test_app.rb} +18 -26
  109. data/examples/quickstart_dsl/app.rb +36 -0
  110. data/examples/quickstart_dsl/app.rbs +7 -0
  111. data/examples/quickstart_dsl/test_app.rb +29 -0
  112. data/examples/quickstart_lifecycle/app.rb +39 -0
  113. data/examples/quickstart_lifecycle/app.rbs +7 -0
  114. data/examples/quickstart_lifecycle/test_app.rb +29 -0
  115. data/examples/ratatui_logo_demo/app.rb +79 -0
  116. data/examples/ratatui_logo_demo/app.rbs +7 -0
  117. data/examples/ratatui_logo_demo/test_app.rb +51 -0
  118. data/examples/ratatui_mascot_demo/app.rb +84 -0
  119. data/examples/ratatui_mascot_demo/app.rbs +7 -0
  120. data/examples/ratatui_mascot_demo/test_app.rb +47 -0
  121. data/examples/readme_usage/app.rb +29 -0
  122. data/examples/readme_usage/app.rbs +7 -0
  123. data/examples/readme_usage/test_app.rb +29 -0
  124. data/examples/rich_text/app.rb +141 -0
  125. data/examples/rich_text/app.rbs +7 -0
  126. data/examples/rich_text/test_app.rb +166 -0
  127. data/examples/scroll_text/app.rb +103 -0
  128. data/examples/scroll_text/app.rbs +7 -0
  129. data/examples/scroll_text/test_app.rb +110 -0
  130. data/examples/scrollbar_demo/app.rb +143 -0
  131. data/examples/scrollbar_demo/app.rbs +7 -0
  132. data/examples/scrollbar_demo/test_app.rb +77 -0
  133. data/examples/sparkline_demo/app.rb +240 -0
  134. data/examples/sparkline_demo/app.rbs +10 -0
  135. data/examples/sparkline_demo/test_app.rb +107 -0
  136. data/examples/table_flex/app.rb +65 -0
  137. data/examples/table_flex/app.rbs +7 -0
  138. data/examples/table_flex/test_app.rb +36 -0
  139. data/examples/table_select/app.rb +198 -0
  140. data/examples/table_select/app.rbs +7 -0
  141. data/examples/table_select/test_app.rb +180 -0
  142. data/examples/widget_style_colors/app.rb +104 -0
  143. data/examples/widget_style_colors/app.rbs +14 -0
  144. data/examples/widget_style_colors/test_app.rb +48 -0
  145. data/ext/ratatui_ruby/Cargo.lock +889 -115
  146. data/ext/ratatui_ruby/Cargo.toml +4 -3
  147. data/ext/ratatui_ruby/clippy.toml +7 -0
  148. data/ext/ratatui_ruby/extconf.rb +7 -0
  149. data/ext/ratatui_ruby/src/events.rs +218 -229
  150. data/ext/ratatui_ruby/src/lib.rs +38 -10
  151. data/ext/ratatui_ruby/src/rendering.rs +90 -10
  152. data/ext/ratatui_ruby/src/style.rs +281 -98
  153. data/ext/ratatui_ruby/src/terminal.rs +119 -25
  154. data/ext/ratatui_ruby/src/text.rs +171 -0
  155. data/ext/ratatui_ruby/src/widgets/barchart.rs +97 -24
  156. data/ext/ratatui_ruby/src/widgets/block.rs +31 -3
  157. data/ext/ratatui_ruby/src/widgets/calendar.rs +45 -44
  158. data/ext/ratatui_ruby/src/widgets/canvas.rs +46 -29
  159. data/ext/ratatui_ruby/src/widgets/chart.rs +69 -27
  160. data/ext/ratatui_ruby/src/widgets/clear.rs +3 -1
  161. data/ext/ratatui_ruby/src/widgets/gauge.rs +11 -4
  162. data/ext/ratatui_ruby/src/widgets/layout.rs +218 -15
  163. data/ext/ratatui_ruby/src/widgets/line_gauge.rs +92 -0
  164. data/ext/ratatui_ruby/src/widgets/list.rs +91 -11
  165. data/ext/ratatui_ruby/src/widgets/mod.rs +3 -0
  166. data/ext/ratatui_ruby/src/widgets/overlay.rs +3 -2
  167. data/ext/ratatui_ruby/src/widgets/paragraph.rs +35 -13
  168. data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +29 -0
  169. data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +44 -0
  170. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +59 -7
  171. data/ext/ratatui_ruby/src/widgets/sparkline.rs +70 -6
  172. data/ext/ratatui_ruby/src/widgets/table.rs +173 -64
  173. data/ext/ratatui_ruby/src/widgets/tabs.rs +105 -5
  174. data/lib/ratatui_ruby/cell.rb +166 -0
  175. data/lib/ratatui_ruby/event/focus_gained.rb +49 -0
  176. data/lib/ratatui_ruby/event/focus_lost.rb +50 -0
  177. data/lib/ratatui_ruby/event/key.rb +211 -0
  178. data/lib/ratatui_ruby/event/mouse.rb +124 -0
  179. data/lib/ratatui_ruby/event/paste.rb +71 -0
  180. data/lib/ratatui_ruby/event/resize.rb +80 -0
  181. data/lib/ratatui_ruby/event.rb +79 -0
  182. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +45 -0
  183. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +27 -0
  184. data/lib/ratatui_ruby/schema/bar_chart.rb +228 -19
  185. data/lib/ratatui_ruby/schema/block.rb +186 -14
  186. data/lib/ratatui_ruby/schema/calendar.rb +74 -17
  187. data/lib/ratatui_ruby/schema/canvas.rb +215 -48
  188. data/lib/ratatui_ruby/schema/center.rb +49 -11
  189. data/lib/ratatui_ruby/schema/chart.rb +151 -41
  190. data/lib/ratatui_ruby/schema/clear.rb +41 -72
  191. data/lib/ratatui_ruby/schema/constraint.rb +82 -22
  192. data/lib/ratatui_ruby/schema/cursor.rb +27 -9
  193. data/lib/ratatui_ruby/schema/draw.rb +53 -0
  194. data/lib/ratatui_ruby/schema/gauge.rb +59 -15
  195. data/lib/ratatui_ruby/schema/layout.rb +95 -13
  196. data/lib/ratatui_ruby/schema/line_gauge.rb +78 -0
  197. data/lib/ratatui_ruby/schema/list.rb +93 -19
  198. data/lib/ratatui_ruby/schema/overlay.rb +34 -8
  199. data/lib/ratatui_ruby/schema/paragraph.rb +87 -30
  200. data/lib/ratatui_ruby/schema/ratatui_logo.rb +25 -0
  201. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +29 -0
  202. data/lib/ratatui_ruby/schema/rect.rb +64 -15
  203. data/lib/ratatui_ruby/schema/scrollbar.rb +132 -24
  204. data/lib/ratatui_ruby/schema/shape/label.rb +66 -0
  205. data/lib/ratatui_ruby/schema/sparkline.rb +122 -15
  206. data/lib/ratatui_ruby/schema/style.rb +49 -21
  207. data/lib/ratatui_ruby/schema/table.rb +119 -21
  208. data/lib/ratatui_ruby/schema/tabs.rb +75 -13
  209. data/lib/ratatui_ruby/schema/text.rb +90 -0
  210. data/lib/ratatui_ruby/session.rb +146 -0
  211. data/lib/ratatui_ruby/test_helper.rb +156 -13
  212. data/lib/ratatui_ruby/version.rb +1 -1
  213. data/lib/ratatui_ruby.rb +143 -23
  214. data/sig/ratatui_ruby/event.rbs +69 -0
  215. data/sig/ratatui_ruby/ratatui_ruby.rbs +2 -1
  216. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +16 -0
  217. data/sig/ratatui_ruby/schema/bar_chart/bar_group.rbs +13 -0
  218. data/sig/ratatui_ruby/schema/bar_chart.rbs +20 -2
  219. data/sig/ratatui_ruby/schema/block.rbs +5 -4
  220. data/sig/ratatui_ruby/schema/calendar.rbs +6 -2
  221. data/sig/ratatui_ruby/schema/canvas.rbs +52 -39
  222. data/sig/ratatui_ruby/schema/center.rbs +3 -3
  223. data/sig/ratatui_ruby/schema/chart.rbs +8 -5
  224. data/sig/ratatui_ruby/schema/constraint.rbs +8 -5
  225. data/sig/ratatui_ruby/schema/cursor.rbs +1 -1
  226. data/sig/ratatui_ruby/schema/draw.rbs +23 -0
  227. data/sig/ratatui_ruby/schema/gauge.rbs +4 -2
  228. data/sig/ratatui_ruby/schema/layout.rbs +11 -1
  229. data/sig/ratatui_ruby/schema/line_gauge.rbs +16 -0
  230. data/sig/ratatui_ruby/schema/list.rbs +5 -1
  231. data/sig/ratatui_ruby/schema/paragraph.rbs +4 -1
  232. data/{lib/ratatui_ruby/output.rb → sig/ratatui_ruby/schema/ratatui_logo.rbs} +3 -2
  233. data/sig/ratatui_ruby/{buffer.rbs → schema/ratatui_mascot.rbs} +4 -3
  234. data/sig/ratatui_ruby/schema/rect.rbs +2 -1
  235. data/sig/ratatui_ruby/schema/scrollbar.rbs +18 -2
  236. data/sig/ratatui_ruby/schema/sparkline.rbs +6 -2
  237. data/sig/ratatui_ruby/schema/table.rbs +8 -1
  238. data/sig/ratatui_ruby/schema/tabs.rbs +5 -1
  239. data/sig/ratatui_ruby/schema/text.rbs +22 -0
  240. data/tasks/resources/build.yml.erb +13 -11
  241. data/tasks/terminal_preview/app_screenshot.rb +35 -0
  242. data/tasks/terminal_preview/crash_report.rb +54 -0
  243. data/tasks/terminal_preview/example_app.rb +25 -0
  244. data/tasks/terminal_preview/launcher_script.rb +48 -0
  245. data/tasks/terminal_preview/preview_collection.rb +60 -0
  246. data/tasks/terminal_preview/preview_timing.rb +22 -0
  247. data/tasks/terminal_preview/safety_confirmation.rb +58 -0
  248. data/tasks/terminal_preview/saved_screenshot.rb +55 -0
  249. data/tasks/terminal_preview/system_appearance.rb +11 -0
  250. data/tasks/terminal_preview/terminal_window.rb +138 -0
  251. data/tasks/terminal_preview/window_id.rb +14 -0
  252. data/tasks/terminal_preview.rake +28 -0
  253. data/tasks/test.rake +1 -1
  254. metadata +174 -53
  255. data/doc/images/examples-analytics.rb.png +0 -0
  256. data/doc/images/examples-box_demo.rb.png +0 -0
  257. data/doc/images/examples-calendar_demo.rb.png +0 -0
  258. data/doc/images/examples-chart_demo.rb.png +0 -0
  259. data/doc/images/examples-custom_widget.rb.png +0 -0
  260. data/doc/images/examples-dashboard.rb.png +0 -0
  261. data/doc/images/examples-list_styles.rb.png +0 -0
  262. data/doc/images/examples-login_form.rb.png +0 -0
  263. data/doc/images/examples-map_demo.rb.png +0 -0
  264. data/doc/images/examples-mouse_events.rb.png +0 -0
  265. data/doc/images/examples-popup_demo.rb.gif +0 -0
  266. data/doc/images/examples-quickstart_lifecycle.rb.png +0 -0
  267. data/doc/images/examples-scroll_text.rb.png +0 -0
  268. data/doc/images/examples-scrollbar_demo.rb.png +0 -0
  269. data/doc/images/examples-stock_ticker.rb.png +0 -0
  270. data/doc/images/examples-system_monitor.rb.png +0 -0
  271. data/doc/images/examples-table_select.rb.png +0 -0
  272. data/examples/analytics.rb +0 -88
  273. data/examples/box_demo.rb +0 -71
  274. data/examples/calendar_demo.rb +0 -55
  275. data/examples/chart_demo.rb +0 -84
  276. data/examples/custom_widget.rb +0 -43
  277. data/examples/dashboard.rb +0 -72
  278. data/examples/list_styles.rb +0 -66
  279. data/examples/map_demo.rb +0 -58
  280. data/examples/quickstart_dsl.rb +0 -30
  281. data/examples/quickstart_lifecycle.rb +0 -40
  282. data/examples/readme_usage.rb +0 -21
  283. data/examples/scroll_text.rb +0 -74
  284. data/examples/scrollbar_demo.rb +0 -75
  285. data/examples/stock_ticker.rb +0 -93
  286. data/examples/system_monitor.rb +0 -94
  287. data/examples/table_select.rb +0 -70
  288. data/examples/test_analytics.rb +0 -65
  289. data/examples/test_box_demo.rb +0 -38
  290. data/examples/test_calendar_demo.rb +0 -66
  291. data/examples/test_dashboard.rb +0 -38
  292. data/examples/test_list_styles.rb +0 -61
  293. data/examples/test_login_form.rb +0 -63
  294. data/examples/test_map_demo.rb +0 -100
  295. data/examples/test_scroll_text.rb +0 -130
  296. data/examples/test_stock_ticker.rb +0 -39
  297. data/examples/test_system_monitor.rb +0 -40
  298. data/examples/test_table_select.rb +0 -37
  299. data/ext/ratatui_ruby/src/buffer.rs +0 -54
  300. data/lib/ratatui_ruby/dsl.rb +0 -64
@@ -0,0 +1,69 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Event
6
+ def key?: () -> bool
7
+ def mouse?: () -> bool
8
+ def resize?: () -> bool
9
+ def paste?: () -> bool
10
+ def focus_gained?: () -> bool
11
+ def focus_lost?: () -> bool
12
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
13
+
14
+ class Key < Event
15
+ attr_reader code: String
16
+ attr_reader modifiers: Array[String]
17
+
18
+ def initialize: (code: String, modifiers: Array[String]) -> void
19
+ def ==: (untyped other) -> bool
20
+ def to_sym: () -> Symbol
21
+ def to_s: () -> String
22
+ def inspect: () -> String
23
+ def ctrl?: () -> bool
24
+ def alt?: () -> bool
25
+ def shift?: () -> bool
26
+ def text?: () -> bool
27
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
28
+ end
29
+
30
+ class Mouse < Event
31
+ attr_reader kind: String
32
+ attr_reader x: Integer
33
+ attr_reader y: Integer
34
+ attr_reader button: String
35
+ attr_reader modifiers: Array[String]
36
+
37
+ def initialize: (kind: String, x: Integer, y: Integer, button: String?, modifiers: Array[String]) -> void
38
+ def down?: () -> bool
39
+ def up?: () -> bool
40
+ def drag?: () -> bool
41
+ def scroll_up?: () -> bool
42
+ def scroll_down?: () -> bool
43
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
44
+ end
45
+
46
+ class Resize < Event
47
+ attr_reader width: Integer
48
+ attr_reader height: Integer
49
+
50
+ def initialize: (width: Integer, height: Integer) -> void
51
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
52
+ end
53
+
54
+ class Paste < Event
55
+ attr_reader content: String
56
+
57
+ def initialize: (content: String) -> void
58
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
59
+ end
60
+
61
+ class FocusGained < Event
62
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
63
+ end
64
+
65
+ class FocusLost < Event
66
+ def deconstruct_keys: (Array[Symbol]?) -> Hash[Symbol, untyped]
67
+ end
68
+ end
69
+ end
@@ -11,6 +11,7 @@ module RatatuiRuby
11
11
  def self.init_terminal: () -> void
12
12
  def self.restore_terminal: () -> void
13
13
  def self.draw: (widget) -> void
14
- def self.poll_event: () -> Hash[Symbol, untyped]?
14
+ def self._poll_event: () -> Hash[Symbol, untyped]?
15
+ def self.poll_event: () -> Event?
15
16
  def self.inject_test_event: (String, Hash[Symbol, untyped]) -> void
16
17
  end
@@ -0,0 +1,16 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class BarChart
6
+ class Bar < Data
7
+ attr_reader value: Integer
8
+ attr_reader label: String?
9
+ attr_reader style: Style?
10
+ attr_reader value_style: Style?
11
+ attr_reader text_value: String?
12
+
13
+ def self.new: (value: Numeric, ?label: String?, ?style: Style?, ?value_style: Style?, ?text_value: String?) -> Bar
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class BarChart
6
+ class BarGroup < Data
7
+ attr_reader label: String
8
+ attr_reader bars: Array[BarChart::Bar]
9
+
10
+ def self.new: (label: String, bars: Array[BarChart::Bar]) -> BarGroup
11
+ end
12
+ end
13
+ end
@@ -3,12 +3,30 @@
3
3
 
4
4
  module RatatuiRuby
5
5
  class BarChart < Data
6
- attr_reader data: Hash[String | Symbol | _ToS, Integer]
6
+ attr_reader data: Array[BarChart::BarGroup]
7
7
  attr_reader bar_width: Integer
8
8
  attr_reader bar_gap: Integer
9
+ attr_reader group_gap: Integer
9
10
  attr_reader max: Integer?
10
11
  attr_reader style: Style?
11
12
  attr_reader block: Block?
12
- def self.new: (data: Hash[String | Symbol | _ToS, Integer], ?bar_width: Integer, ?bar_gap: Integer, ?max: Integer?, ?style: Style?, ?block: Block?) -> BarChart
13
+ attr_reader direction: :vertical | :horizontal
14
+ attr_reader label_style: Style?
15
+ attr_reader value_style: Style?
16
+ attr_reader bar_set: String?
17
+
18
+ def self.new: (
19
+ data: Hash[String | Symbol | _ToS, Numeric] | Array[Array[String | Symbol | _ToS | Numeric]] | Array[BarChart::BarGroup],
20
+ ?bar_width: Numeric,
21
+ ?bar_gap: Numeric,
22
+ ?group_gap: Numeric,
23
+ ?max: Numeric?,
24
+ ?style: Style?,
25
+ ?block: Block?,
26
+ ?direction: :vertical | :horizontal,
27
+ ?label_style: Style?,
28
+ ?value_style: Style?,
29
+ ?bar_set: String?
30
+ ) -> BarChart
13
31
  end
14
32
  end
@@ -3,9 +3,10 @@
3
3
 
4
4
  module RatatuiRuby
5
5
  class Block < Data
6
- attr_reader title: String?
7
- attr_reader borders: Array[Symbol]
8
- attr_reader border_color: (String | Symbol)?
9
- def self.new: (?title: String?, ?borders: Array[Symbol], ?border_color: (String | Symbol)?) -> Block
6
+ attr_reader titles: Array[Hash[Symbol, untyped]]
7
+ attr_reader title_style: (Style | Hash[Symbol, untyped])?
8
+ attr_reader border_style: (Style | Hash[Symbol, untyped])?
9
+ attr_reader children: Array[untyped]
10
+ def self.new: (?title: String?, ?titles: Array[Hash[Symbol, untyped]], ?title_alignment: Symbol?, ?title_style: (Style | Hash[Symbol, untyped])?, ?borders: Array[Symbol], ?border_color: (String | Symbol)?, ?border_style: (Style | Hash[Symbol, untyped])?, ?border_type: Symbol?, ?border_set: Hash[Symbol, String]?, ?style: (Style | Hash[Symbol, untyped])?, ?padding: (Numeric | Array[Numeric]), ?children: Array[untyped]) -> Block
10
11
  end
11
12
  end
@@ -5,9 +5,13 @@ module RatatuiRuby
5
5
  class Calendar < Data
6
6
  attr_reader year: Integer
7
7
  attr_reader month: Integer
8
- attr_reader day_style: Style?
8
+ attr_reader events: Hash[untyped, Style]
9
+ attr_reader default_style: Style?
9
10
  attr_reader header_style: Style?
10
11
  attr_reader block: Block?
11
- def self.new: (year: Integer, month: Integer, ?day_style: Style?, ?header_style: Style?, ?block: Block?) -> Calendar
12
+ attr_reader show_weekdays_header: bool
13
+ attr_reader show_surrounding: Style?
14
+ attr_reader show_month_header: bool
15
+ def self.new: (year: Numeric, month: Numeric, ?events: Hash[untyped, Style], ?default_style: Style?, ?header_style: Style?, ?block: Block?, ?show_weekdays_header: bool, ?show_surrounding: Style?, ?show_month_header: bool) -> Calendar
12
16
  end
13
17
  end
@@ -2,61 +2,74 @@
2
2
  # SPDX-License-Identifier: AGPL-3.0-or-later
3
3
 
4
4
  module RatatuiRuby
5
- class Point < Data
6
- attr_reader x: Float
7
- attr_reader y: Float
5
+ module Shape
6
+ class Point < Data
7
+ attr_reader x: Float
8
+ attr_reader y: Float
8
9
 
9
- def self.new: (x: Float, y: Float) -> Point
10
- | (Float, Float) -> Point
11
- end
10
+ def self.new: (x: Numeric, y: Numeric) -> Point
11
+ | (Numeric, Numeric) -> Point
12
+ end
12
13
 
13
- class Line < Data
14
- attr_reader x1: Float
15
- attr_reader y1: Float
16
- attr_reader x2: Float
17
- attr_reader y2: Float
18
- attr_reader color: String | Symbol
14
+ class Line < Data
15
+ attr_reader x1: Float
16
+ attr_reader y1: Float
17
+ attr_reader x2: Float
18
+ attr_reader y2: Float
19
+ attr_reader color: String | Symbol
19
20
 
20
- def self.new: (x1: Float, y1: Float, x2: Float, y2: Float, color: String | Symbol) -> Line
21
- | (Float, Float, Float, Float, String | Symbol) -> Line
22
- end
21
+ def self.new: (x1: Numeric, y1: Numeric, x2: Numeric, y2: Numeric, color: String | Symbol) -> Line
22
+ | (Numeric, Numeric, Numeric, Numeric, String | Symbol) -> Line
23
+ end
23
24
 
24
- class Rectangle < Data
25
- attr_reader x: Float
26
- attr_reader y: Float
27
- attr_reader width: Float
28
- attr_reader height: Float
29
- attr_reader color: String | Symbol
25
+ class Rectangle < Data
26
+ attr_reader x: Float
27
+ attr_reader y: Float
28
+ attr_reader width: Float
29
+ attr_reader height: Float
30
+ attr_reader color: String | Symbol
30
31
 
31
- def self.new: (x: Float, y: Float, width: Float, height: Float, color: String | Symbol) -> Rectangle
32
- | (Float, Float, Float, Float, String | Symbol) -> Rectangle
33
- end
32
+ def self.new: (x: Numeric, y: Numeric, width: Numeric, height: Numeric, color: String | Symbol) -> Rectangle
33
+ | (Numeric, Numeric, Numeric, Numeric, String | Symbol) -> Rectangle
34
+ end
34
35
 
35
- class Circle < Data
36
- attr_reader x: Float
37
- attr_reader y: Float
38
- attr_reader radius: Float
39
- attr_reader color: String | Symbol
36
+ class Circle < Data
37
+ attr_reader x: Float
38
+ attr_reader y: Float
39
+ attr_reader radius: Float
40
+ attr_reader color: String | Symbol
40
41
 
41
- def self.new: (x: Float, y: Float, radius: Float, color: String | Symbol) -> Circle
42
- | (Float, Float, Float, String | Symbol) -> Circle
43
- end
42
+ def self.new: (x: Numeric, y: Numeric, radius: Numeric, color: String | Symbol) -> Circle
43
+ | (Numeric, Numeric, Numeric, String | Symbol) -> Circle
44
+ end
44
45
 
45
- class Map < Data
46
- attr_reader color: String | Symbol
47
- attr_reader resolution: Symbol
46
+ class Map < Data
47
+ attr_reader color: String | Symbol
48
+ attr_reader resolution: Symbol
48
49
 
49
- def self.new: (color: String | Symbol, resolution: Symbol) -> Map
50
- | (String | Symbol, Symbol) -> Map
50
+ def self.new: (color: String | Symbol, resolution: Symbol) -> Map
51
+ | (String | Symbol, Symbol) -> Map
52
+ end
53
+
54
+ class Label < Data
55
+ attr_reader x: Float
56
+ attr_reader y: Float
57
+ attr_reader text: String | Text::Line
58
+ attr_reader style: Style?
59
+
60
+ def self.new: (x: Numeric, y: Numeric, text: String | Text::Line, ?style: Style?) -> Label
61
+ end
51
62
  end
52
63
 
53
64
  class Canvas < Data
54
- attr_reader shapes: Array[Line | Rectangle | Circle | Map]
65
+ attr_reader shapes: Array[Shape::Line | Shape::Rectangle | Shape::Circle | Shape::Map | Shape::Label]
55
66
  attr_reader x_bounds: Array[Float]
56
67
  attr_reader y_bounds: Array[Float]
57
68
  attr_reader marker: Symbol
58
69
  attr_reader block: Block?
59
70
 
60
- def self.new: (?shapes: Array[Line | Rectangle | Circle | Map], ?x_bounds: Array[Float], ?y_bounds: Array[Float], ?marker: Symbol, ?block: Block?) -> Canvas
71
+ attr_reader background_color: String | Symbol | nil
72
+
73
+ def self.new: (?shapes: Array[Shape::Line | Shape::Rectangle | Shape::Circle | Shape::Map | Shape::Label], ?x_bounds: Array[Numeric], ?y_bounds: Array[Numeric], ?marker: Symbol, ?block: Block?, ?background_color: String | Symbol | nil) -> Canvas
61
74
  end
62
75
  end
@@ -4,8 +4,8 @@
4
4
  module RatatuiRuby
5
5
  class Center < Data
6
6
  attr_reader child: widget
7
- attr_reader width_percent: Integer
8
- attr_reader height_percent: Integer
9
- def self.new: (child: widget, width_percent: Integer, height_percent: Integer) -> Center
7
+ attr_reader width_percent: Float
8
+ attr_reader height_percent: Float
9
+ def self.new: (child: widget, ?width_percent: Numeric, ?height_percent: Numeric) -> Center
10
10
  end
11
11
  end
@@ -7,16 +7,17 @@ module RatatuiRuby
7
7
  attr_reader bounds: [Float, Float]
8
8
  attr_reader labels: Array[String]
9
9
  attr_reader style: Style?
10
- def self.new: (?title: String, ?bounds: [Float, Float], ?labels: Array[String], ?style: Style?) -> Axis
10
+ attr_reader labels_alignment: Symbol?
11
+ def self.new: (?title: String, ?bounds: [Numeric, Numeric], ?labels: Array[String], ?style: Style?, ?labels_alignment: Symbol?) -> Axis
11
12
  end
12
13
 
13
14
  class Dataset < Data
14
15
  attr_reader name: String | Symbol
15
16
  attr_reader data: Array[[Float, Float]]
16
- attr_reader color: String | Symbol
17
+ attr_reader style: Style?
17
18
  attr_reader marker: Symbol
18
19
  attr_reader graph_type: Symbol
19
- def self.new: (name: String | Symbol, data: Array[[Float, Float]], ?color: String | Symbol, ?marker: Symbol, ?graph_type: Symbol) -> Dataset
20
+ def self.new: (name: String | Symbol, data: Array[[Numeric, Numeric]], ?style: Style?, ?marker: Symbol, ?graph_type: Symbol) -> Dataset
20
21
  end
21
22
 
22
23
  class Chart < Data
@@ -25,7 +26,9 @@ module RatatuiRuby
25
26
  attr_reader y_axis: Axis
26
27
  attr_reader block: Block?
27
28
  attr_reader style: Style?
28
- def self.new: (datasets: Array[Dataset], x_axis: Axis, y_axis: Axis, ?block: Block?, ?style: Style?) -> Chart
29
+ attr_reader legend_position: Symbol?
30
+ attr_reader hidden_legend_constraints: Array[Constraint]
31
+ def self.new: (datasets: Array[Dataset], x_axis: Axis, y_axis: Axis, ?block: Block?, ?style: Style?, ?legend_position: Symbol?, ?hidden_legend_constraints: Array[Constraint]) -> Chart
29
32
  end
30
33
 
31
34
  class LineChart < Data
@@ -34,6 +37,6 @@ module RatatuiRuby
34
37
  attr_reader y_labels: Array[String]
35
38
  attr_reader y_bounds: [Float, Float]
36
39
  attr_reader block: Block?
37
- def self.new: (datasets: Array[Dataset], ?x_labels: Array[String], ?y_labels: Array[String], ?y_bounds: [Float, Float], ?block: Block?) -> LineChart
40
+ def self.new: (datasets: Array[Dataset], ?x_labels: Array[String], ?y_labels: Array[String], ?y_bounds: [Numeric, Numeric], ?block: Block?) -> LineChart
38
41
  end
39
42
  end
@@ -4,10 +4,13 @@
4
4
  module RatatuiRuby
5
5
  class Constraint < Data
6
6
  attr_reader type: Symbol
7
- attr_reader value: Integer
8
- def self.length: (Integer) -> Constraint
9
- def self.percentage: (Integer) -> Constraint
10
- def self.min: (Integer) -> Constraint
11
- def self.new: (type: Symbol, value: Integer) -> Constraint
7
+ attr_reader value: (Integer | Array[Integer])
8
+ def self.length: (Numeric) -> Constraint
9
+ def self.percentage: (Numeric) -> Constraint
10
+ def self.min: (Numeric) -> Constraint
11
+ def self.max: (Numeric) -> Constraint
12
+ def self.fill: (?Numeric) -> Constraint
13
+ def self.ratio: (Numeric, Numeric) -> Constraint
14
+ def self.new: (type: Symbol, value: (Integer | Array[Integer])) -> Constraint
12
15
  end
13
16
  end
@@ -5,6 +5,6 @@ module RatatuiRuby
5
5
  class Cursor < Data
6
6
  attr_reader x: Integer
7
7
  attr_reader y: Integer
8
- def self.new: (x: Integer, y: Integer) -> Cursor
8
+ def self.new: (x: Numeric, y: Numeric) -> Cursor
9
9
  end
10
10
  end
@@ -0,0 +1,23 @@
1
+ module RatatuiRuby
2
+ module Draw
3
+ class StringCmd < Data
4
+ attr_reader x: Integer
5
+ attr_reader y: Integer
6
+ attr_reader string: String
7
+ attr_reader style: Style | Hash[Symbol, untyped]
8
+
9
+ def self.new: (x: Integer, y: Integer, string: String, style: Style | Hash[Symbol, untyped]) -> StringCmd
10
+ end
11
+
12
+ class CellCmd < Data
13
+ attr_reader x: Integer
14
+ attr_reader y: Integer
15
+ attr_reader cell: Cell
16
+
17
+ def self.new: (x: Integer, y: Integer, cell: Cell) -> CellCmd
18
+ end
19
+
20
+ def self.string: (Numeric x, Numeric y, String string, ?Style | Hash[Symbol, untyped] style) -> StringCmd
21
+ def self.cell: (Numeric x, Numeric y, Cell cell) -> CellCmd
22
+ end
23
+ end
@@ -5,9 +5,11 @@ module RatatuiRuby
5
5
  class Gauge < Data
6
6
  attr_reader ratio: Float
7
7
  attr_reader label: String?
8
- attr_reader style: Style
8
+ attr_reader style: Style?
9
+ attr_reader gauge_style: Style?
9
10
  attr_reader block: Block?
10
11
 
11
- def self.new: (?ratio: Float, ?label: String?, ?style: Style, ?block: Block?) -> Gauge
12
+ attr_reader use_unicode: bool
13
+ def self.new: (?ratio: Numeric?, ?percent: Numeric?, ?label: String?, ?style: Style?, ?gauge_style: Style?, ?block: Block?, ?use_unicode: bool) -> Gauge
12
14
  end
13
15
  end
@@ -2,10 +2,20 @@
2
2
  # SPDX-License-Identifier: AGPL-3.0-or-later
3
3
 
4
4
  module RatatuiRuby
5
+ type flex_mode = :legacy | :start | :center | :end | :space_between | :space_around | :space_evenly
6
+
5
7
  class Layout < Data
8
+ FLEX_MODES: Array[Symbol]
9
+
6
10
  attr_reader direction: Symbol
7
11
  attr_reader constraints: Array[Constraint]
8
12
  attr_reader children: Array[widget]
9
- def self.new: (?direction: Symbol, ?constraints: Array[Constraint], ?children: Array[widget]) -> Layout
13
+ attr_reader flex: flex_mode
14
+ def self.new: (?direction: Symbol, ?constraints: Array[Constraint], ?children: Array[widget], ?flex: flex_mode) -> Layout
15
+ def self.split: (Rect | Hash[Symbol, Integer] area, ?direction: Symbol, constraints: Array[Constraint], ?flex: flex_mode) -> Array[Rect]
16
+
17
+ private
18
+
19
+ def self._split: (Rect | Hash[Symbol, Integer], Symbol, Array[Constraint], Symbol) -> Array[Hash[Symbol, Integer]]
10
20
  end
11
21
  end
@@ -0,0 +1,16 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class LineGauge < Data
6
+ attr_reader ratio: Float
7
+ attr_reader label: String?
8
+ attr_reader filled_style: Style?
9
+ attr_reader unfilled_style: Style?
10
+ attr_reader block: Block?
11
+ attr_reader filled_symbol: String
12
+ attr_reader unfilled_symbol: String
13
+
14
+ def self.new: (?ratio: Numeric, ?label: String?, ?style: Style?, ?filled_style: Style?, ?unfilled_style: Style?, ?block: Block?, ?filled_symbol: String, ?unfilled_symbol: String) -> LineGauge
15
+ end
16
+ end
@@ -8,7 +8,11 @@ module RatatuiRuby
8
8
  attr_reader style: Style?
9
9
  attr_reader highlight_style: Style?
10
10
  attr_reader highlight_symbol: String?
11
+ attr_reader repeat_highlight_symbol: bool
12
+ attr_reader highlight_spacing: Symbol
13
+ attr_reader direction: Symbol
14
+ attr_reader scroll_padding: Integer?
11
15
  attr_reader block: Block?
12
- def self.new: (?items: Array[String], ?selected_index: Integer?, ?style: Style?, ?highlight_style: Style?, ?highlight_symbol: String?, ?block: Block?) -> List
16
+ def self.new: (?items: Array[String], ?selected_index: Numeric?, ?style: Style?, ?highlight_style: Style?, ?highlight_symbol: String?, ?repeat_highlight_symbol: bool, ?highlight_spacing: Symbol, ?direction: Symbol, ?scroll_padding: Numeric?, ?block: Block?) -> List
13
17
  end
14
18
  end
@@ -6,6 +6,9 @@ module RatatuiRuby
6
6
  attr_reader text: String
7
7
  attr_reader style: Style
8
8
  attr_reader block: Block?
9
- def self.new: (text: String, ?style: Style?, ?fg: (String | Symbol)?, ?bg: (String | Symbol)?, ?block: Block?) -> Paragraph
9
+ attr_reader wrap: bool
10
+ attr_reader alignment: Symbol
11
+ def initialize: (text: String, ?style: Style, ?block: Block?, ?wrap: bool, ?alignment: Symbol, ?scroll: [Numeric, Numeric]) -> void
12
+ def self.new: (text: String, ?style: Style?, ?fg: (String | Symbol)?, ?bg: (String | Symbol)?, ?block: Block?, ?wrap: bool, ?alignment: Symbol, ?scroll: [Numeric, Numeric]) -> Paragraph
10
13
  end
11
14
  end
@@ -1,7 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
1
  # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
2
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
3
 
6
4
  module RatatuiRuby
5
+ class RatatuiLogo < Data
6
+ def self.new: () -> RatatuiLogo
7
+ end
7
8
  end
@@ -4,8 +4,9 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  module RatatuiRuby
7
- class Buffer
8
- def set_string: (Integer x, Integer y, String string, Style style) -> void
9
- def area: () -> Rect
7
+ class RatatuiMascot < Data
8
+ attr_reader block: Block?
9
+
10
+ def self.new: (?block: Block?) -> RatatuiMascot
10
11
  end
11
12
  end
@@ -9,6 +9,7 @@ module RatatuiRuby
9
9
  attr_reader y: Integer
10
10
  attr_reader width: Integer
11
11
  attr_reader height: Integer
12
- def self.new: (x: Integer, y: Integer, width: Integer, height: Integer) -> instance
12
+ def self.new: (?x: Numeric, ?y: Numeric, ?width: Numeric, ?height: Numeric) -> instance
13
+ def contains?: (Integer px, Integer py) -> bool
13
14
  end
14
15
  end
@@ -7,13 +7,29 @@ module RatatuiRuby
7
7
  attr_reader position: Integer
8
8
  attr_reader orientation: Symbol
9
9
  attr_reader thumb_symbol: String
10
+ attr_reader thumb_style: Style?
11
+ attr_reader track_symbol: String?
12
+ attr_reader track_style: Style?
13
+ attr_reader begin_symbol: String?
14
+ attr_reader begin_style: Style?
15
+ attr_reader end_symbol: String?
16
+ attr_reader end_style: Style?
17
+ attr_reader style: Style?
10
18
  attr_reader block: Block?
11
19
 
12
20
  def self.new: (
13
- content_length: Integer,
14
- position: Integer,
21
+ content_length: Numeric,
22
+ position: Numeric,
15
23
  ?orientation: Symbol,
16
24
  ?thumb_symbol: String,
25
+ ?thumb_style: Style?,
26
+ ?track_symbol: String?,
27
+ ?track_style: Style?,
28
+ ?begin_symbol: String?,
29
+ ?begin_style: Style?,
30
+ ?end_symbol: String?,
31
+ ?end_style: Style?,
32
+ ?style: Style?,
17
33
  ?block: Block?
18
34
  ) -> Scrollbar
19
35
  end
@@ -3,10 +3,14 @@
3
3
 
4
4
  module RatatuiRuby
5
5
  class Sparkline < Data
6
- attr_reader data: Array[Integer]
6
+ attr_reader data: Array[Integer?]
7
7
  attr_reader max: Integer?
8
8
  attr_reader style: Style?
9
9
  attr_reader block: Block?
10
- def self.new: (data: Array[Integer], ?max: Integer?, ?style: Style?, ?block: Block?) -> Sparkline
10
+ attr_reader direction: (:left_to_right | :right_to_left)?
11
+ attr_reader absent_value_symbol: String?
12
+ attr_reader absent_value_style: Style?
13
+ attr_reader bar_set: Hash[Symbol, String]?
14
+ def self.new: (data: Array[Numeric?], ?max: Numeric?, ?style: Style?, ?block: Block?, ?direction: (:left_to_right | :right_to_left)?, ?absent_value_symbol: String?, ?absent_value_style: Style?, ?bar_set: Hash[Symbol, String]?) -> Sparkline
11
15
  end
12
16
  end
@@ -7,7 +7,14 @@ module RatatuiRuby
7
7
  attr_reader rows: Array[Array[String | Paragraph | Style | _ToS]]
8
8
  attr_reader widths: Array[Constraint]
9
9
  attr_reader block: Block?
10
+ attr_reader footer: Array[String | Paragraph]?
11
+ attr_reader flex: Symbol
12
+ attr_reader style: (Style | Hash[Symbol, untyped])?
13
+ attr_reader column_spacing: Integer?
14
+ attr_reader highlight_spacing: Symbol
15
+ attr_reader column_highlight_style: Style?
16
+ attr_reader selected_column: Integer?
10
17
 
11
- def self.new: (?header: Array[String | Paragraph]?, ?rows: Array[Array[String | Paragraph | Style | _ToS]], ?widths: Array[Constraint], ?block: Block?) -> Table
18
+ def self.new: (?header: Array[String | Paragraph]?, ?rows: Array[Array[String | Paragraph | Style | _ToS]], ?widths: Array[Constraint], ?highlight_style: Style?, ?highlight_symbol: String, ?highlight_spacing: Symbol, ?column_highlight_style: Style?, ?cell_highlight_style: Style?, ?selected_row: Numeric?, ?selected_column: Numeric?, ?block: Block?, ?footer: Array[String | Paragraph]?, ?flex: Symbol, ?style: (Style | Hash[Symbol, untyped])?, ?column_spacing: Numeric) -> Table
12
19
  end
13
20
  end
@@ -6,6 +6,10 @@ module RatatuiRuby
6
6
  attr_reader titles: Array[String | _ToS]
7
7
  attr_reader selected_index: Integer
8
8
  attr_reader block: Block?
9
- def self.new: (?titles: Array[String | _ToS], ?selected_index: Integer, ?block: Block?) -> Tabs
9
+ attr_reader divider: String?
10
+ attr_reader highlight_style: Style
11
+ attr_reader padding_left: Integer
12
+ attr_reader padding_right: Integer
13
+ def self.new: (?titles: Array[String | _ToS], ?selected_index: Numeric, ?block: Block?, ?divider: String?, ?highlight_style: Style?, ?style: Style?, ?padding_left: Numeric, ?padding_right: Numeric) -> Tabs
10
14
  end
11
15
  end
@@ -0,0 +1,22 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ module Text
6
+ class Span < Data
7
+ attr_reader content: String
8
+ attr_reader style: Style?
9
+
10
+ def self.new: (content: String, ?style: Style?) -> Span
11
+ def self.styled: (String, ?Style?) -> Span
12
+ end
13
+
14
+ class Line < Data
15
+ attr_reader spans: Array[Span]
16
+ attr_reader alignment: (:left | :center | :right)?
17
+
18
+ def self.new: (?spans: Array[Span], ?alignment: (:left | :center | :right)?) -> Line
19
+ def self.from_string: (String, ?alignment: (:left | :center | :right)?) -> Line
20
+ end
21
+ end
22
+ end