sai 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d27e2e0d0202e3dc41887be8cfa58f3d862fdee0c9fc3dbd0db792bac1d8f91
4
- data.tar.gz: c1a6cd0918fd89b72fe1bd22479192354293a270803297fe901df818032fbfb5
3
+ metadata.gz: 77b862fa47bb8861e21f03dc023a4b411b22b40e345a7e74895eab4c2d7e416b
4
+ data.tar.gz: b579615c7b59bc268ac222ec678b3d4656a886f892229c794429f82d400c3d68
5
5
  SHA512:
6
- metadata.gz: 958aae38da9095a09347a97dd5eddca62a2ac2b4f2eddf51ee4e5b11f4ffdeed26918dad6f00bd85129f82de8eafbde5eb1ed6e3c6a8136d6d5ad6cf3b3765fe
7
- data.tar.gz: cce26cf788ae60731b58cf2460cea923bda925db36a75f009ec4846046edf47afbd10a81990c7651a0cde21d1090c725dbc7b5e290f412968b83c0dc5f61e1db
6
+ metadata.gz: 131c38f0d73c9899fe2b7baf6a98af00bb1afdbfd26141d630362ba08da157430ad3cd5cd89a3cf0b2e5c786630f29a06cdd087704807c882db0ba96ccbbaedd
7
+ data.tar.gz: 8ea163a5901b333aa06589434b553a3655225b222341ad542ffdb078e96916f89b8feee995c2efb7058fae882871c2f35e891c3186fd1d488ad7fcdc3f1ca15a
data/.yardopts CHANGED
@@ -8,4 +8,4 @@ lib/**/*.rb
8
8
  --embed-mixins
9
9
  --tag rbs
10
10
  --hide-tag rbs
11
- --files LICENSE
11
+ --files LICENSE,docs/USAGE.md
data/CHANGELOG.md CHANGED
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog], and this project adheres to [Break Ve
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0] - 2025-01-20
10
+
11
+ ### Added
12
+
13
+ * [#6](https://github.com/aaronmallen/sai/pull/6) - Add `Sai::ANSI::SequencedString` for ANSI string manipulation by
14
+ [@aaronmallen](https://github.com/aaronmallen)
15
+
16
+ ### Changed
17
+
18
+ * [#5](https://github.com/aaronmallen/sai/pull/5) - Remove unnecessary error handling in `Sai::Decorator` by
19
+ [@aaronmallen](https://github.com/aaronmallen)
20
+
21
+ * [#6](https://github.com/aaronmallen/sai/pull/6) - Changed `Sai::Decorator#decorate` now returns a
22
+ `Sai::ANSI::SequencedString` by [@aaronmallen](https://github.com/aaronmallen)
23
+
9
24
  ## [0.2.0] - 2025-01-20
10
25
 
11
26
  ### Added
@@ -29,5 +44,6 @@ The format is based on [Keep a Changelog], and this project adheres to [Break Ve
29
44
 
30
45
  <!-- versions -->
31
46
 
32
- [Unreleased]: https://github.com/aaronmallen/sai/compare/0.2.0..HEAD
47
+ [Unreleased]: https://github.com/aaronmallen/sai/compare/0.3.0..HEAD
48
+ [0.3.0]: https://github.com/aaronmallen/sai/compare/0.2.0..0.3.0
33
49
  [0.2.0]: https://github.com/aaronmallen/sai/compare/0.1.0..0.2.0
data/README.md CHANGED
@@ -1,36 +1,39 @@
1
1
  # Sai
2
2
 
3
3
  [![Sai Version](https://img.shields.io/gem/v/sai?style=for-the-badge&logo=rubygems&logoColor=white&logoSize=auto&label=Gem%20Version)](https://rubygems.org/gems/sai)
4
+ [![Sai Codacy grade](https://img.shields.io/codacy/grade/0f9a91b573ed4768a773867b95ed4894/main?style=for-the-badge&logo=codacy&logoColor=white&logoSize=auto)](https://app.codacy.com/gh/aaronmallen/sai)
5
+ [![Sai Codacy coverage](https://img.shields.io/codacy/coverage/0f9a91b573ed4768a773867b95ed4894/main?style=for-the-badge&logo=codacy&logoColor=white&logoSize=auto)](https://app.codacy.com/gh/aaronmallen/sai/coverage)
4
6
  [![Sai License](https://img.shields.io/github/license/aaronmallen/sai?style=for-the-badge&logo=opensourceinitiative&logoColor=white&logoSize=auto)](./LICENSE)
5
- [![Sai Docs](https://img.shields.io/badge/rubydoc-blue?style=for-the-badge&logo=readthedocs&logoColor=white&logoSize=auto&label=docs)](https://rubydoc.info/gems/sai/0.2.0)
7
+ [![Sai Docs](https://img.shields.io/badge/rubydoc-blue?style=for-the-badge&logo=readthedocs&logoColor=white&logoSize=auto&label=docs)](https://rubydoc.info/gems/sai/0.3.0)
6
8
  [![Sai Open Issues](https://img.shields.io/github/issues-search/aaronmallen/sai?query=state%3Aopen&style=for-the-badge&logo=github&logoColor=white&logoSize=auto&label=issues&color=red)](https://github.com/aaronmallen/sai/issues?q=state%3Aopen%20)
7
9
 
8
10
  An elegant color management system for crafting sophisticated CLI applications
9
11
 
10
12
  ```ruby
11
- puts Sai.rgb(255, 128, 0).bold.decorate('Create beautiful CLI applications')
12
- puts Sai.hex('#4834d4').italic.decorate('with intuitive color management')
13
- puts Sai.bright_cyan.on_blue.underline.decorate('that adapts to any terminal')
13
+ # Create beautiful CLI applications with intuitive color management
14
+ puts Sai.rgb(255, 128, 0).bold.decorate('Warning: Battery Low')
15
+ puts Sai.hex('#4834d4').italic.decorate('Processing request...')
16
+ puts Sai.bright_cyan.on_blue.underline.decorate('Download Complete!')
17
+
18
+ # Analyze and manipulate ANSI-encoded text
19
+ text = Sai.sequence("\e[31mError:\e[0m Connection failed")
20
+ puts text.without_color # Keep formatting, remove colors
21
+ puts text.stripped # Get plain text without any formatting
14
22
  ```
15
23
 
16
24
  Sai (彩) - meaning 'coloring' or 'paint' in Japanese - is a powerful and intuitive system for managing color output in
17
25
  command-line applications. Drawing inspiration from traditional Japanese artistic techniques, Sai brings vibrancy and
18
26
  harmony to terminal interfaces through its sophisticated color management.
19
27
 
20
- Sai empowers developers to create beautiful, colorful CLI applications that maintain visual consistency across different
21
- terminal capabilities. Like its artistic namesake, it combines simplicity and sophistication to bring rich, adaptive
22
- color to your terminal interfaces.
23
-
24
28
  ## Features
25
29
 
26
- * Automatic color mode detection and downgrading
27
- * Support for True Color (24-bit), 256 colors (8-bit), ANSI colors (4-bit), and basic colors (3-bit)
28
- * Rich set of ANSI text styles
29
- * Named color support with bright variants
30
- * RGB and Hex color support
31
- * Foreground and background colors
30
+ * Rich color support (True Color, 256 colors, ANSI, and basic modes)
31
+ * Automatic terminal capability detection and color mode adaptation
32
+ * RGB, Hex, and named color support with bright variants
33
+ * Comprehensive text styling (bold, italic, underline, etc.)
34
+ * Advanced ANSI sequence parsing and manipulation
35
+ * Intelligent color downgrading for compatibility
32
36
  * Respects NO_COLOR environment variable
33
- * Can be used directly or included in classes/modules
34
37
 
35
38
  ## Installation
36
39
 
@@ -42,20 +45,20 @@ gem 'sai'
42
45
 
43
46
  Or install it yourself as:
44
47
 
45
- ```bash
48
+ ```ruby
46
49
  gem install sai
47
50
  ```
48
51
 
49
- ## Usage
50
-
51
- Sai can be used directly or included in your own classes and modules.
52
+ > [!IMPORTANT]
53
+ > If you're upgrading from version 0.2.0, please see our [Migration Guide](docs/migrations/0.2.0-0.3.0.md) for
54
+ > important changes.
52
55
 
53
- ### Direct Usage
56
+ ## Quick Start
54
57
 
55
58
  ```ruby
56
59
  require 'sai'
57
60
 
58
- # Using named colors
61
+ # Basic usage
59
62
  puts Sai.red.decorate('Error!')
60
63
  puts Sai.bright_blue.on_white.decorate('Info')
61
64
 
@@ -63,234 +66,21 @@ puts Sai.bright_blue.on_white.decorate('Info')
63
66
  puts Sai.rgb(255, 128, 0).decorate('Custom color')
64
67
  puts Sai.on_rgb(0, 255, 128).decorate('Custom background')
65
68
 
66
- # Using hex colors
67
- puts Sai.hex('#FF8000').decorate('Hex color')
68
- puts Sai.on_hex('#00FF80').decorate('Hex background')
69
-
70
69
  # Applying styles
71
70
  puts Sai.bold.underline.decorate('Important')
72
71
  puts Sai.red.bold.italic.decorate('Error!')
73
72
 
74
- # Complex combinations
75
- puts Sai.bright_cyan
76
- .on_blue
77
- .bold
78
- .italic
79
- .decorate('Styled text')
80
- ```
81
-
82
- ### Module Inclusion
83
-
84
- ```ruby
85
- class CLI
86
- include Sai
87
-
88
- def error(message)
89
- puts decorator.red.bold.decorate(message)
90
- end
91
-
92
- def info(message)
93
- puts decorator.bright_blue.decorate(message)
94
- end
95
-
96
- def success(message)
97
- puts decorator.with_mode(color_mode.ansi_auto).green.decorate(message)
98
- end
99
- end
100
-
101
- cli = CLI.new
102
- cli.error('Something went wrong!')
103
- cli.info('Processing...')
104
- cli.success('Done!')
73
+ # Working with ANSI sequences
74
+ text = Sai.sequence("\e[31mError:\e[0m Details here")
75
+ puts text.without_color # Remove colors but keep formatting
76
+ puts text.without_style # Remove formatting but keep colors
77
+ puts text.stripped # Get plain text
105
78
  ```
106
79
 
107
- ### Defining Reusable Styles
108
-
109
- Sai decorators can be assigned to constants to create reusable styles throughout your application:
110
-
111
- ```ruby
112
- module Style
113
- ERROR = Sai.bold.bright_white.on_red
114
- WARNING = Sai.black.on_yellow
115
- SUCCESS = Sai.bright_green
116
- INFO = Sai.bright_blue
117
- HEADER = Sai.bold.bright_cyan.underline
118
- end
119
-
120
- # Use your defined styles
121
- puts Style::ERROR.decorate('Something went wrong!')
122
- puts Style::SUCCESS.decorate('Operation completed successfully')
123
-
124
- # Styles can be further customized when needed
125
- puts Style::ERROR.italic.decorate('Critical error!')
126
- ```
80
+ ## Documentation
127
81
 
128
- > [!TIP]
129
- > This pattern is particularly useful for maintaining consistent styling across your application and creating theme
130
- > systems. You can even build on existing styles:
131
- >
132
- > ```ruby
133
- > module Theme
134
- > PRIMARY = Sai.rgb(63, 81, 181)
135
- > SECONDARY = Sai.rgb(255, 87, 34)
136
- >
137
- > BUTTON = PRIMARY.bold
138
- > LINK = SECONDARY.underline
139
- > HEADER = PRIMARY.bold.underline
140
- > end
141
- > ```
142
-
143
- ## Features
144
-
145
- ### Color Support
146
-
147
- Sai supports up to 16.7 million colors (true color/24-bit) depending on your terminal's capabilities. Colors can be
148
- specified in several ways:
149
-
150
- #### RGB Colors
151
-
152
- ```ruby
153
- # Specify any RGB color (0-255 per channel)
154
- Sai.rgb(255, 128, 0).decorate('Orange text')
155
- Sai.on_rgb(0, 255, 128).decorate('Custom green background')
156
- ```
157
-
158
- #### Hex Colors
159
-
160
- ```ruby
161
- # Use any hex color code
162
- Sai.hex('#FF8000').decorate('Orange text')
163
- Sai.on_hex('#00FF80').decorate('Custom green background')
164
- ```
165
-
166
- #### Named Color Shortcuts
167
-
168
- For convenience, Sai provides shortcuts for common ANSI colors:
169
-
170
- Standard colors:
171
-
172
- ```ruby
173
- Sai.red.decorate('Red text')
174
- Sai.blue.decorate('Blue text')
175
- Sai.on_green.decorate('Green background')
176
- ```
177
-
178
- Bright variants:
179
-
180
- ```ruby
181
- Sai.bright_red.decorate('Bright red text')
182
- Sai.bright_blue.decorate('Bright blue text')
183
- Sai.on_bright_green.decorate('Bright green background')
184
- ```
185
-
186
- Available named colors:
187
-
188
- * black/bright_black
189
- * red/bright_red
190
- * green/bright_green
191
- * yellow/bright_yellow
192
- * blue/bright_blue
193
- * magenta/bright_magenta
194
- * cyan/bright_cyan
195
- * white/bright_white
196
-
197
- > [!TIP]
198
- > While named colors provide convenient shortcuts, remember that Sai supports the full RGB color space. Don't feel
199
- > limited to just these predefined colors!
200
-
201
- ### Text Styles
202
-
203
- Available styles:
204
-
205
- * bold
206
- * dim
207
- * italic
208
- * underline
209
- * blink
210
- * rapid_blink
211
- * reverse
212
- * conceal
213
- * strike
214
-
215
- Style removal:
216
-
217
- * no_blink
218
- * no_italic
219
- * no_underline
220
- * no_reverse
221
- * no_conceal
222
- * no_strike
223
- * normal_intensity
224
-
225
- ### Color Mode Detection & Downgrading
226
-
227
- Sai automatically detects your terminal's color capabilities and adapts the output appropriately:
228
-
229
- * True Color terminals (24-bit): Full access to all 16.7 million colors
230
- * 256-color terminals (8-bit): Colors are mapped to the closest available color in the 256-color palette
231
- * ANSI terminals (4-bit): Colors are mapped to the 16 standard ANSI colors
232
- * Basic terminals (3-bit): Colors are mapped to the 8 basic ANSI colors
233
- * NO_COLOR: All color sequences are stripped when the NO_COLOR environment variable is set
234
-
235
- > [!NOTE]
236
- > This automatic downgrading ensures your application looks great across all terminal types without any extra code!
237
-
238
- ### Color Mode Selection
239
-
240
- Sai provides flexible color mode selection through its `mode` interface:
241
-
242
- ```ruby
243
- # Use automatic mode detection (default)
244
- Sai.with_mode(Sai.mode.auto)
245
-
246
- # Force specific color modes
247
- puts Sai.with_mode(Sai.mode.true_color).red.decorate('24-bit color')
248
- puts Sai.with_mode(Sai.mode.advanced).red.decorate('256 colors')
249
- puts Sai.with_mode(Sai.mode.ansi).red.decorate('16 colors')
250
- puts Sai.with_mode(Sai.mode.basic).red.decorate('8 colors')
251
- puts Sai.with_mode(Sai.mode.no_color).red.decorate('No color')
252
-
253
- # Use automatic downgrading
254
- puts Sai.with_mode(Sai.mode.advanced_auto).red.decorate('256 colors or less')
255
- puts Sai.with_mode(Sai.mode.ansi_auto).red.decorate('16 colors or less')
256
- puts Sai.with_mode(Sai.mode.basic_auto).red.decorate('8 colors or less')
257
- ```
258
-
259
- > [!WARNING]
260
- > When using fixed color modes (like `true_color` or `advanced`), Sai will not automatically downgrade colors for
261
- > terminals with lower color support. For automatic color mode adjustment, use modes ending in `_auto`
262
- > (like `advanced_auto` or `ansi_auto`).
263
-
264
- This allows you to:
265
-
266
- * Explicitly set specific color modes
267
- * Use automatic mode detection (default)
268
- * Set maximum color modes with automatic downgrading
269
- * Disable colors entirely
270
-
271
- ### Terminal Support Detection
272
-
273
- You can check the terminal's capabilities:
274
-
275
- ```ruby
276
- # Using directly
277
- Sai.support.true_color? # => true/false
278
- Sai.support.advanced? # => true/false
279
- Sai.support.ansi? # => true/false
280
- Sai.support.basic? # => true/false
281
- Sai.support.color? # => true/false
282
-
283
- # Using included module
284
- class CLI
285
- include Sai
286
-
287
- def check_support
288
- if terminal_color_support.true_color?
289
- puts "Terminal supports true color!"
290
- end
291
- end
292
- end
293
- ```
82
+ * [Complete Usage Guide](docs/USAGE.md) - Comprehensive documentation of all features
83
+ * [API Documentation](https://rubydoc.info/gems/sai/0.3.0) - Detailed API reference
294
84
 
295
85
  ## Contributing
296
86
 
data/docs/USAGE.md ADDED
@@ -0,0 +1,303 @@
1
+ # Sai Usage Guide
2
+
3
+ This guide provides comprehensive documentation for using Sai in your applications.
4
+
5
+ ## Table of Contents
6
+
7
+ * [Basic Usage](#basic-usage)
8
+ * [Color Support](#color-support)
9
+ * [RGB Colors](#rgb-colors)
10
+ * [Hex Colors](#hex-colors)
11
+ * [Named Colors](#named-colors)
12
+ * [Text Styles](#text-styles)
13
+ * [ANSI Sequence Manipulation](#ansi-sequence-manipulation)
14
+ * [Color Mode Management](#color-mode-management)
15
+ * [Terminal Capabilities](#terminal-capabilities)
16
+ * [Integration Patterns](#integration-patterns)
17
+ * [Best Practices](#best-practices)
18
+
19
+ ## Basic Usage
20
+
21
+ Sai can be used directly or included in your own classes and modules:
22
+
23
+ ```ruby
24
+ # Direct usage
25
+ puts Sai.red.decorate('Error!')
26
+ puts Sai.bright_blue.on_white.decorate('Info')
27
+
28
+ # Include in your own classes
29
+ class CLI
30
+ include Sai
31
+
32
+ def error(message)
33
+ puts decorator.red.bold.decorate(message)
34
+ end
35
+
36
+ def info(message)
37
+ puts decorator.bright_blue.decorate(message)
38
+ end
39
+ end
40
+ ```
41
+
42
+ ## Color Support
43
+
44
+ ### RGB Colors
45
+
46
+ Use any RGB color (0-255 per channel):
47
+
48
+ ```ruby
49
+ # Foreground colors
50
+ Sai.rgb(255, 128, 0).decorate('Orange text')
51
+ Sai.rgb(100, 149, 237).decorate('Cornflower blue')
52
+
53
+ # Background colors
54
+ Sai.on_rgb(0, 255, 128).decorate('Custom green background')
55
+ ```
56
+
57
+ ### Hex Colors
58
+
59
+ Use any hex color code:
60
+
61
+ ```ruby
62
+ # Foreground colors
63
+ Sai.hex('#FF8000').decorate('Orange text')
64
+ Sai.hex('#6495ED').decorate('Cornflower blue')
65
+
66
+ # Background colors
67
+ Sai.on_hex('#00FF80').decorate('Custom green background')
68
+ ```
69
+
70
+ ### Named Colors
71
+
72
+ Common ANSI colors have convenient shortcuts:
73
+
74
+ ```ruby
75
+ # Standard colors
76
+ Sai.red.decorate('Red text')
77
+ Sai.blue.decorate('Blue text')
78
+ Sai.on_green.decorate('Green background')
79
+
80
+ # Bright variants
81
+ Sai.bright_red.decorate('Bright red text')
82
+ Sai.bright_blue.decorate('Bright blue text')
83
+ Sai.on_bright_green.decorate('Bright green background')
84
+ ```
85
+
86
+ Available named colors:
87
+ * black/bright_black
88
+ * red/bright_red
89
+ * green/bright_green
90
+ * yellow/bright_yellow
91
+ * blue/bright_blue
92
+ * magenta/bright_magenta
93
+ * cyan/bright_cyan
94
+ * white/bright_white
95
+
96
+ > [!TIP]
97
+ > While named colors provide convenient shortcuts, remember that Sai supports the full RGB color space. Don't feel
98
+ > limited to just these predefined colors!
99
+
100
+ ## Text Styles
101
+
102
+ Sai supports a variety of text styles:
103
+
104
+ ```ruby
105
+ Sai.bold.decorate('Bold text')
106
+ Sai.italic.decorate('Italic text')
107
+ Sai.underline.decorate('Underlined text')
108
+ Sai.strike.decorate('Strikethrough text')
109
+ ```
110
+
111
+ Available styles:
112
+ * bold
113
+ * dim
114
+ * italic
115
+ * underline
116
+ * blink
117
+ * rapid_blink
118
+ * reverse
119
+ * conceal
120
+ * strike
121
+
122
+ Style removal:
123
+ * no_blink
124
+ * no_italic
125
+ * no_underline
126
+ * no_reverse
127
+ * no_conceal
128
+ * no_strike
129
+ * normal_intensity
130
+
131
+ ## ANSI Sequence Manipulation
132
+
133
+ Sai provides powerful tools for working with ANSI-encoded strings:
134
+
135
+ ```ruby
136
+ # Create a SequencedString from decorated text
137
+ text = Sai.red.bold.decorate("Warning!")
138
+
139
+ # Or parse existing ANSI text
140
+ text = Sai.sequence("\e[31mred\e[0m and \e[32mgreen\e[0m")
141
+
142
+ # Get plain text without formatting
143
+ plain = text.stripped # => "red and green"
144
+
145
+ # Remove specific attributes
146
+ text.without_color # Remove all colors but keep styles
147
+ text.without_style # Remove all styles but keep colors
148
+ text.without_style(:bold, :italic) # Remove specific styles
149
+
150
+ # Access individual segments
151
+ text.each do |segment|
152
+ puts "Text: #{segment.text}"
153
+ puts "Foreground: #{segment.foreground}"
154
+ puts "Background: #{segment.background}"
155
+ puts "Styles: #{segment.styles}"
156
+ puts "Position: #{segment.encoded_location.start_position}..#{segment.encoded_location.end_position}"
157
+ end
158
+ ```
159
+
160
+ ## Color Mode Management
161
+
162
+ Sai by default automatically detects your terminal's capabilities and automatically downgrades colors based on those
163
+ capabilities but also allows manual control:
164
+
165
+ ```ruby
166
+ # Use automatic mode detection (default)
167
+ Sai.with_mode(Sai.mode.auto)
168
+
169
+ # Force specific color modes
170
+ puts Sai.with_mode(Sai.mode.true_color).red.decorate('24-bit color')
171
+ puts Sai.with_mode(Sai.mode.advanced).red.decorate('256 colors')
172
+ puts Sai.with_mode(Sai.mode.ansi).red.decorate('16 colors')
173
+ puts Sai.with_mode(Sai.mode.basic).red.decorate('8 colors')
174
+ puts Sai.with_mode(Sai.mode.no_color).red.decorate('No color')
175
+
176
+ # Use automatic downgrading
177
+ puts Sai.with_mode(Sai.mode.advanced_auto).red.decorate('256 colors or less')
178
+ puts Sai.with_mode(Sai.mode.ansi_auto).red.decorate('16 colors or less')
179
+ puts Sai.with_mode(Sai.mode.basic_auto).red.decorate('8 colors or less')
180
+ ```
181
+
182
+ > [!WARNING]
183
+ > When using fixed color modes (like `true_color` or `advanced`), Sai will not automatically downgrade colors for
184
+ > terminals with lower color support. For automatic color mode adjustment, use modes ending in `_auto`
185
+ > (like `advanced_auto` or `ansi_auto`).
186
+
187
+ Color Mode Hierarchy:
188
+
189
+ 1. True Color (24-bit): 16.7 million colors
190
+ 2. Advanced (8-bit): 256 colors
191
+ 3. ANSI (4-bit): 16 colors
192
+ 4. Basic (3-bit): 8 colors
193
+ 5. No Color: All formatting stripped
194
+
195
+ ## Terminal Capabilities
196
+
197
+ Check terminal color support:
198
+
199
+ ```ruby
200
+ # Using directly
201
+ Sai.support.true_color? # => true/false
202
+ Sai.support.advanced? # => true/false
203
+ Sai.support.ansi? # => true/false
204
+ Sai.support.basic? # => true/false
205
+ Sai.support.color? # => true/false
206
+
207
+ # Using included module
208
+ class CLI
209
+ include Sai
210
+
211
+ def check_support
212
+ if terminal_color_support.true_color?
213
+ puts "Terminal supports true color!"
214
+ end
215
+ end
216
+ end
217
+ ```
218
+
219
+ ## Integration Patterns
220
+
221
+ ### Defining Reusable Styles
222
+
223
+ Create consistent styling across your application:
224
+
225
+ ```ruby
226
+ module Style
227
+ ERROR = Sai.bold.bright_white.on_red
228
+ WARNING = Sai.black.on_yellow
229
+ SUCCESS = Sai.bright_green
230
+ INFO = Sai.bright_blue
231
+ HEADER = Sai.bold.bright_cyan.underline
232
+ end
233
+
234
+ # Use your defined styles
235
+ puts Style::ERROR.decorate('Something went wrong!')
236
+ puts Style::SUCCESS.decorate('Operation completed successfully')
237
+
238
+ # Styles can be further customized
239
+ puts Style::ERROR.italic.decorate('Critical error!')
240
+ ```
241
+
242
+ > [!TIP]
243
+ > This pattern is particularly useful for maintaining consistent styling across your application and creating theme
244
+ > systems. You can even build on existing styles:
245
+ >
246
+ > ```ruby
247
+ > module Theme
248
+ > PRIMARY = Sai.rgb(63, 81, 181)
249
+ > SECONDARY = Sai.rgb(255, 87, 34)
250
+ >
251
+ > BUTTON = PRIMARY.bold
252
+ > LINK = SECONDARY.underline
253
+ > HEADER = PRIMARY.bold.underline
254
+ > end
255
+ > ```
256
+
257
+ ### Class Integration
258
+
259
+ Integrate Sai into your classes:
260
+
261
+ ```ruby
262
+ class Logger
263
+ include Sai
264
+
265
+ def error(message)
266
+ puts decorator.red.bold.decorate(message)
267
+ end
268
+
269
+ def warn(message)
270
+ puts decorator.yellow.decorate(message)
271
+ end
272
+
273
+ def info(message)
274
+ puts decorator.with_mode(color_mode.true_color).bright_blue.decorate(message)
275
+ end
276
+ end
277
+ ```
278
+
279
+ ## Best Practices
280
+
281
+ 1. **Automatic Mode Detection**
282
+ * Use `Sai.mode.auto` by default to respect terminal capabilities
283
+ * Only force specific color modes when necessary
284
+
285
+ 2. **Color Usage**
286
+ * Use named colors for standard indicators (red for errors, etc.)
287
+ * Use RGB/Hex for brand colors or specific design requirements
288
+ * Consider color blindness when choosing colors
289
+
290
+ 3. **Style Organization**
291
+ * Create reusable styles for consistency
292
+ * Group related styles in modules
293
+ * Consider creating a theme system for larger applications
294
+
295
+ 4. **Performance**
296
+ * Cache decorator instances when using repeatedly
297
+ * Use `SequencedString` parsing for complex manipulations
298
+ * Consider terminal capabilities when designing output
299
+
300
+ 5. **Accessibility**
301
+ * Don't rely solely on color for important information
302
+ * Use styles (bold, underline) to enhance meaning
303
+ * Respect NO_COLOR environment variable