natty-ui 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +28 -0
- data/README.md +122 -0
- data/examples/basic.rb +61 -0
- data/examples/colors.rb +5 -0
- data/examples/illustration.svg +1 -0
- data/examples/progress.rb +84 -0
- data/examples/query.rb +32 -0
- data/lib/natty-ui/ansi.rb +430 -0
- data/lib/natty-ui/ansi_wrapper.rb +207 -0
- data/lib/natty-ui/version.rb +6 -0
- data/lib/natty-ui/wrapper/ask.rb +76 -0
- data/lib/natty-ui/wrapper/element.rb +77 -0
- data/lib/natty-ui/wrapper/features.rb +24 -0
- data/lib/natty-ui/wrapper/framed.rb +54 -0
- data/lib/natty-ui/wrapper/heading.rb +87 -0
- data/lib/natty-ui/wrapper/message.rb +116 -0
- data/lib/natty-ui/wrapper/mixins.rb +67 -0
- data/lib/natty-ui/wrapper/progress.rb +60 -0
- data/lib/natty-ui/wrapper/query.rb +85 -0
- data/lib/natty-ui/wrapper/section.rb +102 -0
- data/lib/natty-ui/wrapper/task.rb +58 -0
- data/lib/natty-ui/wrapper.rb +168 -0
- data/lib/natty-ui.rb +159 -0
- metadata +91 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a4e46711be1871e4ad647f6fec2312d81473cd52d660c3a157120a6884144936
|
4
|
+
data.tar.gz: a58d2ffef5ff47034d3c1582e18a6e469ac39784d10a30292ac85c4134444ea6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9b1640b52328b2d55ba8568dfe99bca63fba659300bcd11fcc0f05e46dadfa5096cd2d01d97d8f2cd33330e67eca311722587441d60da38ac75db97ddfd32d8d
|
7
|
+
data.tar.gz: 2ba0659ba2823d47c2d8b33f09ec5d0be967c0bcef7354cea2e79d9c7bd68795d0995c8faeb9c762079739332b5835c89703f360290a712120aac67afd05a097
|
data/LICENSE
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
BSD 3-Clause License
|
2
|
+
|
3
|
+
Copyright (c) 2017-2021, Mike Blumtritt. All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
list of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
13
|
+
and/or other materials provided with the distribution.
|
14
|
+
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
16
|
+
contributors may be used to endorse or promote products derived from
|
17
|
+
this software without specific prior written permission.
|
18
|
+
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
# NattyUI
|
2
|
+
|
3
|
+
This is the beautiful, nice, nifty, fancy, neat, pretty, cool, lovely, natty user interface you like to have for your command line interfaces (CLI).
|
4
|
+
|
5
|
+
<!-- TODO:  -->
|
6
|
+
|
7
|
+
<!-- TODO:
|
8
|
+
- Gem: [rubygems.org](https://rubygems.org/gems/natty-ui)
|
9
|
+
- Source: [github.com](https://github.com/mblumtritt/natty-ui)
|
10
|
+
- Help: [rubydoc.info](https://rubydoc.info/gems/natty-ui/NattyUI)
|
11
|
+
-->
|
12
|
+
|
13
|
+
## Description
|
14
|
+
|
15
|
+
Here you find elegant, simple and beautiful tools that enhance your command line application functionally and look.
|
16
|
+
|
17
|
+
You can simply decorate your text with named ANSI attributes and colors
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
UI = NattyUI::StdOut
|
21
|
+
|
22
|
+
UI.puts "[[bold]]Hello [[ff7bfd]]World[[/]]!"
|
23
|
+
```
|
24
|
+
|
25
|
+
or use different types of messages
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
UI.info 'NattyUI installed'
|
29
|
+
UI.warning 'Nice gem found!'
|
30
|
+
```
|
31
|
+
|
32
|
+
and headings
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
UI.h1 'The Main Title (TMT)'
|
36
|
+
UI.h2 'A Subtitle'
|
37
|
+
```
|
38
|
+
|
39
|
+
and framed sections
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
UI.framed 'Text Below In Frame' do |framed|
|
43
|
+
framed.puts 'This is the text'
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
or use progression displays like progress bars and much much more!
|
48
|
+
|
49
|
+

|
50
|
+
|
51
|
+
### But there is more!
|
52
|
+
|
53
|
+
Have a look at the [examples](./examples/) directory to get an impression of the current feature set.
|
54
|
+
|
55
|
+
```sh
|
56
|
+
ruby ./examples/basic.rb
|
57
|
+
```
|
58
|
+
|
59
|
+
or see the non-ANSI version
|
60
|
+
|
61
|
+
```sh
|
62
|
+
NO_COLOR=1 ruby ./examples/basic.rb
|
63
|
+
```
|
64
|
+
|
65
|
+
<!-- TODO:
|
66
|
+
link to NattyUI Features for more features!
|
67
|
+
-->
|
68
|
+
|
69
|
+
### NO_COLOR Convention
|
70
|
+
|
71
|
+
NattyUI follows the [NO_COLOR convention](https://no-color.org).
|
72
|
+
|
73
|
+
## Installation
|
74
|
+
|
75
|
+
You can install the gem in your system with
|
76
|
+
|
77
|
+
```shell
|
78
|
+
gem install natty-ui
|
79
|
+
```
|
80
|
+
|
81
|
+
or you can use [Bundler](http://gembundler.com/) to add NattyUI to your own project:
|
82
|
+
|
83
|
+
```shell
|
84
|
+
bundle add 'natty-ui'
|
85
|
+
```
|
86
|
+
|
87
|
+
After that you only need one line of code to have everything together
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
require 'natty-ui'
|
91
|
+
```
|
92
|
+
|
93
|
+
## Unicode Support
|
94
|
+
|
95
|
+
Unicode is generally supported. This means that for the calculation of screen outputs the different width of characters is considered. For this the wonderful Gem [unicode/display_width](https://github.com/janlelis/unicode-display_width) is used.
|
96
|
+
|
97
|
+
To be able to use Unicode characters that consist of multiple combinations (like some emoji), you have to explicitly load the Gem unicode/emoji _before_ NattyUI. It is not included automatically, because in most cases it is not needed (and we can save the overhead most of the time).
|
98
|
+
|
99
|
+
If you need the full beauty of Unicode just load it in that order:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
require 'unicode/emoji'
|
103
|
+
require 'natty-ui'
|
104
|
+
```
|
105
|
+
|
106
|
+
**Hint**: The compromise of not automatically supporting emojis results from the fact that not all terminals can output all emojis correctly. You can easily check this yourself by
|
107
|
+
|
108
|
+
```sh
|
109
|
+
echo "👨👩👦 👩❤️👨"
|
110
|
+
```
|
111
|
+
|
112
|
+
in your terminal window.
|
113
|
+
|
114
|
+
## TODO
|
115
|
+
|
116
|
+
Since I did not complete the tests and not all my ideas are already implemented I have this Todo list:
|
117
|
+
|
118
|
+
- add samples to README
|
119
|
+
- add more samples to help
|
120
|
+
- add more tests
|
121
|
+
- simple prompt
|
122
|
+
- password prompt
|
data/examples/basic.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'natty-ui'
|
4
|
+
require_relative '../lib/natty-ui'
|
5
|
+
|
6
|
+
UI = NattyUI::StdOut
|
7
|
+
|
8
|
+
UI.h1 'NattyUI Basic Feature Demo', <<~TEXT
|
9
|
+
|
10
|
+
This is a short demo of the basic features of [[i117 bold]]NattyUI[[/]].
|
11
|
+
|
12
|
+
TEXT
|
13
|
+
|
14
|
+
UI.h2 'Feature: ANSI Colors and Attributes', <<~TEXT
|
15
|
+
|
16
|
+
Like you might noticed you can [[i87]]color [[i215]]text[[/]] for terminals supporting this
|
17
|
+
feature. You can enforece the non-ANSI version by setting the environment
|
18
|
+
variable [[i117 italic]]NO_COLOR[[/]] to '[[i117]]1[[/]]'. (see also [[underline]]https://no-color.org[[/]])
|
19
|
+
|
20
|
+
You can not only color your text but also [[italic]]modify[[/]], [[underline]]decorate[[/]] and [[strike]]manipulate[[/]]
|
21
|
+
it. The attributes are direct embedded into the text like '[[/bold red]]'
|
22
|
+
and can be resetted with '[[//]]' or at the line end.
|
23
|
+
|
24
|
+
TEXT
|
25
|
+
|
26
|
+
UI.h2 'Feature: Sections' do |sec|
|
27
|
+
sec.puts <<~TEXT
|
28
|
+
|
29
|
+
Sections group text lines together and/or define their style. There are
|
30
|
+
several section types which all can be stacked.
|
31
|
+
|
32
|
+
Have a look at the different types of sections:
|
33
|
+
|
34
|
+
TEXT
|
35
|
+
sec.message 'Generic Message'
|
36
|
+
sec.information 'Informational Message'
|
37
|
+
sec.warning 'Warning Message'
|
38
|
+
sec.error 'Error Message'
|
39
|
+
sec.completed 'Completion Message'
|
40
|
+
sec.failed 'Failure Message'
|
41
|
+
sec.msg '[[i213]]Customized Message', symbol: '◉'
|
42
|
+
sec.space
|
43
|
+
|
44
|
+
sec.puts 'You can stack all kinds of sections together:'
|
45
|
+
sec.space
|
46
|
+
sec.framed('Simple Framed Section', type: :simple) do |f1|
|
47
|
+
f1.framed('Heavy Framed Section', type: :heavy) do |f2|
|
48
|
+
f2.framed('Semi Framed Section', type: :semi) do |f3|
|
49
|
+
f3.framed('Double Framed Section', type: :double) do |f4|
|
50
|
+
f4.message(
|
51
|
+
'[[fff400]]Frames are nice',
|
52
|
+
"Just to show you that all sections\ncan be stacked...",
|
53
|
+
symbol: '💛'
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
UI.space
|
data/examples/colors.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 688"><style>text{dominant-baseline:text-before-edge;white-space:pre;font:13px Courier,monospace;fill:#bbb}.u{text-decoration:underline}.c1{fill:#0080d5}.f{fill:#fff}.c2{fill:#a5faff}.c3{fill:#ff50a5}.c4{fill:#50d0ff}.c5{fill:#2ad5d5}.c6{fill:#fffa50}.c7{fill:#ff5050}.c8{fill:#50ff50}.c9{fill:#ffa5ff}.ca{fill:#ffff50}.cb{fill:#55aad5}.cc{fill:#d5802a}</style><rect width="100%" height="100%" style="fill:#000;shape-rendering:crispEdges"/><text class="c1">═</text><text x="8" class="c1">═</text><text x="16" class="c1">═</text><text x="24" class="c1">═</text><text x="32" class="c1">═</text><text x="40" class="c1">═</text><text x="48" class="c1">═</text><text x="64" class="f">N</text><text x="72" class="f">a</text><text x="80" class="f">t</text><text x="88" class="f">t</text><text x="96" class="f">y</text><text x="104" class="f">U</text><text x="112" class="f">I</text><text x="128" class="f">B</text><text x="136" class="f">a</text><text x="144" class="f">s</text><text x="152" class="f">i</text><text x="160" class="f">c</text><text x="176" class="f">F</text><text x="184" class="f">e</text><text x="192" class="f">a</text><text x="200" class="f">t</text><text x="208" class="f">u</text><text x="216" class="f">r</text><text x="224" class="f">e</text><text x="240" class="f">D</text><text x="248" class="f">e</text><text x="256" class="f">m</text><text x="264" class="f">o</text><text x="280" class="c4">═</text><text x="288" class="c4">═</text><text x="296" class="c4">═</text><text x="304" class="c4">═</text><text x="312" class="c4">═</text><text x="320" class="c4">═</text><text x="328" class="c4">═</text><text y="32">T</text><text x="8" y="32">h</text><text x="16" y="32">i</text><text x="24" y="32">s</text><text x="40" y="32">i</text><text x="48" y="32">s</text><text x="64" y="32">a</text><text x="80" y="32">s</text><text x="88" y="32">h</text><text x="96" y="32">o</text><text x="104" y="32">r</text><text x="112" y="32">t</text><text x="128" y="32">d</text><text x="136" y="32">e</text><text x="144" y="32">m</text><text x="152" y="32">o</text><text x="168" y="32">o</text><text x="176" y="32">f</text><text x="192" y="32">t</text><text x="200" y="32">h</text><text x="208" y="32">e</text><text x="224" y="32">b</text><text x="232" y="32">a</text><text x="240" y="32">s</text><text x="248" y="32">i</text><text x="256" y="32">c</text><text x="272" y="32">f</text><text x="280" y="32">e</text><text x="288" y="32">a</text><text x="296" y="32">t</text><text x="304" y="32">u</text><text x="312" y="32">r</text><text x="320" y="32">e</text><text x="328" y="32">s</text><text x="344" y="32">o</text><text x="352" y="32">f</text><text x="368" y="32" class="c2">N</text><text x="376" y="32" class="c2">a</text><text x="384" y="32" class="c2">t</text><text x="392" y="32" class="c2">t</text><text x="400" y="32" class="c2">y</text><text x="408" y="32" class="c2">U</text><text x="416" y="32" class="c2">I</text><text x="424" y="32">.</text><text y="64" class="c1">━</text><text x="8" y="64" class="c1">━</text><text x="16" y="64" class="c1">━</text><text x="24" y="64" class="c1">━</text><text x="32" y="64" class="c1">━</text><text x="48" y="64" class="f">F</text><text x="56" y="64" class="f">e</text><text x="64" y="64" class="f">a</text><text x="72" y="64" class="f">t</text><text x="80" y="64" class="f">u</text><text x="88" y="64" class="f">r</text><text x="96" y="64" class="f">e</text><text x="104" y="64" class="f">:</text><text x="120" y="64" class="f">A</text><text x="128" y="64" class="f">N</text><text x="136" y="64" class="f">S</text><text x="144" y="64" class="f">I</text><text x="160" y="64" class="f">C</text><text x="168" y="64" class="f">o</text><text x="176" y="64" class="f">l</text><text x="184" y="64" class="f">o</text><text x="192" y="64" class="f">r</text><text x="200" y="64" class="f">s</text><text x="216" y="64" class="f">a</text><text x="224" y="64" class="f">n</text><text x="232" y="64" class="f">d</text><text x="248" y="64" class="f">A</text><text x="256" y="64" class="f">t</text><text x="264" y="64" class="f">t</text><text x="272" y="64" class="f">r</text><text x="280" y="64" class="f">i</text><text x="288" y="64" class="f">b</text><text x="296" y="64" class="f">u</text><text x="304" y="64" class="f">t</text><text x="312" y="64" class="f">e</text><text x="320" y="64" class="f">s</text><text x="336" y="64" class="c4">━</text><text x="344" y="64" class="c4">━</text><text x="352" y="64" class="c4">━</text><text x="360" y="64" class="c4">━</text><text x="368" y="64" class="c4">━</text><text y="96">L</text><text x="8" y="96">i</text><text x="16" y="96">k</text><text x="24" y="96">e</text><text x="40" y="96">y</text><text x="48" y="96">o</text><text x="56" y="96">u</text><text x="72" y="96">m</text><text x="80" y="96">i</text><text x="88" y="96">g</text><text x="96" y="96">h</text><text x="104" y="96">t</text><text x="120" y="96">n</text><text x="128" y="96">o</text><text x="136" y="96">t</text><text x="144" y="96">i</text><text x="152" y="96">c</text><text x="160" y="96">e</text><text x="168" y="96">d</text><text x="184" y="96">y</text><text x="192" y="96">o</text><text x="200" y="96">u</text><text x="216" y="96">c</text><text x="224" y="96">a</text><text x="232" y="96">n</text><text x="248" y="96" class="c5">c</text><text x="256" y="96" class="c5">o</text><text x="264" y="96" class="c5">l</text><text x="272" y="96" class="c5">o</text><text x="280" y="96" class="c5">r</text><text x="296" y="96" class="cc">t</text><text x="304" y="96" class="cc">e</text><text x="312" y="96" class="cc">x</text><text x="320" y="96" class="cc">t</text><text x="336" y="96">f</text><text x="344" y="96">o</text><text x="352" y="96">r</text><text x="368" y="96">t</text><text x="376" y="96">e</text><text x="384" y="96">r</text><text x="392" y="96">m</text><text x="400" y="96">i</text><text x="408" y="96">n</text><text x="416" y="96">a</text><text x="424" y="96">l</text><text x="432" y="96">s</text><text x="448" y="96">s</text><text x="456" y="96">u</text><text x="464" y="96">p</text><text x="472" y="96">p</text><text x="480" y="96">o</text><text x="488" y="96">r</text><text x="496" y="96">t</text><text x="504" y="96">i</text><text x="512" y="96">n</text><text x="520" y="96">g</text><text x="536" y="96">t</text><text x="544" y="96">h</text><text x="552" y="96">i</text><text x="560" y="96">s</text><text y="112">f</text><text x="8" y="112">e</text><text x="16" y="112">a</text><text x="24" y="112">t</text><text x="32" y="112">u</text><text x="40" y="112">r</text><text x="48" y="112">e</text><text x="56" y="112">.</text><text x="72" y="112">Y</text><text x="80" y="112">o</text><text x="88" y="112">u</text><text x="104" y="112">c</text><text x="112" y="112">a</text><text x="120" y="112">n</text><text x="136" y="112">e</text><text x="144" y="112">n</text><text x="152" y="112">f</text><text x="160" y="112">o</text><text x="168" y="112">r</text><text x="176" y="112">e</text><text x="184" y="112">c</text><text x="192" y="112">e</text><text x="208" y="112">t</text><text x="216" y="112">h</text><text x="224" y="112">e</text><text x="240" y="112">n</text><text x="248" y="112">o</text><text x="256" y="112">n</text><text x="264" y="112">-</text><text x="272" y="112">A</text><text x="280" y="112">N</text><text x="288" y="112">S</text><text x="296" y="112">I</text><text x="312" y="112">v</text><text x="320" y="112">e</text><text x="328" y="112">r</text><text x="336" y="112">s</text><text x="344" y="112">i</text><text x="352" y="112">o</text><text x="360" y="112">n</text><text x="376" y="112">b</text><text x="384" y="112">y</text><text x="400" y="112">s</text><text x="408" y="112">e</text><text x="416" y="112">t</text><text x="424" y="112">t</text><text x="432" y="112">i</text><text x="440" y="112">n</text><text x="448" y="112">g</text><text x="464" y="112">t</text><text x="472" y="112">h</text><text x="480" y="112">e</text><text x="496" y="112">e</text><text x="504" y="112">n</text><text x="512" y="112">v</text><text x="520" y="112">i</text><text x="528" y="112">r</text><text x="536" y="112">o</text><text x="544" y="112">n</text><text x="552" y="112">m</text><text x="560" y="112">e</text><text x="568" y="112">n</text><text x="576" y="112">t</text><text y="128">v</text><text x="8" y="128">a</text><text x="16" y="128">r</text><text x="24" y="128">i</text><text x="32" y="128">a</text><text x="40" y="128">b</text><text x="48" y="128">l</text><text x="56" y="128">e</text><text x="72" y="128" class="cb">N</text><text x="80" y="128" class="cb">O</text><text x="88" y="128" class="cb">_</text><text x="96" y="128" class="cb">C</text><text x="104" y="128" class="cb">O</text><text x="112" y="128" class="cb">L</text><text x="120" y="128" class="cb">O</text><text x="128" y="128" class="cb">R</text><text x="144" y="128">t</text><text x="152" y="128">o</text><text x="168" y="128">'</text><text x="176" y="128" class="cb">1</text><text x="184" y="128">'</text><text x="192" y="128">.</text><text x="208" y="128">(</text><text x="216" y="128">s</text><text x="224" y="128">e</text><text x="232" y="128">e</text><text x="248" y="128">a</text><text x="256" y="128">l</text><text x="264" y="128">s</text><text x="272" y="128">o</text><text x="288" y="128" class="u">h</text><text x="296" y="128" class="u">t</text><text x="304" y="128" class="u">t</text><text x="312" y="128" class="u">p</text><text x="320" y="128" class="u">s</text><text x="328" y="128" class="u">:</text><text x="336" y="128" class="u">/</text><text x="344" y="128" class="u">/</text><text x="352" y="128" class="u">n</text><text x="360" y="128" class="u">o</text><text x="368" y="128" class="u">-</text><text x="376" y="128" class="u">c</text><text x="384" y="128" class="u">o</text><text x="392" y="128" class="u">l</text><text x="400" y="128" class="u">o</text><text x="408" y="128" class="u">r</text><text x="416" y="128" class="u">.</text><text x="424" y="128" class="u">o</text><text x="432" y="128" class="u">r</text><text x="440" y="128" class="u">g</text><text x="448" y="128">)</text><text y="160">Y</text><text x="8" y="160">o</text><text x="16" y="160">u</text><text x="32" y="160">c</text><text x="40" y="160">a</text><text x="48" y="160">n</text><text x="64" y="160">n</text><text x="72" y="160">o</text><text x="80" y="160">t</text><text x="96" y="160">o</text><text x="104" y="160">n</text><text x="112" y="160">l</text><text x="120" y="160">y</text><text x="136" y="160">c</text><text x="144" y="160">o</text><text x="152" y="160">l</text><text x="160" y="160">o</text><text x="168" y="160">r</text><text x="184" y="160">y</text><text x="192" y="160">o</text><text x="200" y="160">u</text><text x="208" y="160">r</text><text x="224" y="160">t</text><text x="232" y="160">e</text><text x="240" y="160">x</text><text x="248" y="160">t</text><text x="264" y="160">b</text><text x="272" y="160">u</text><text x="280" y="160">t</text><text x="296" y="160">a</text><text x="304" y="160">l</text><text x="312" y="160">s</text><text x="320" y="160">o</text><text x="336" y="160">m</text><text x="344" y="160">o</text><text x="352" y="160">d</text><text x="360" y="160">i</text><text x="368" y="160">f</text><text x="376" y="160">y</text><text x="384" y="160">,</text><text x="400" y="160" class="u">d</text><text x="408" y="160" class="u">e</text><text x="416" y="160" class="u">c</text><text x="424" y="160" class="u">o</text><text x="432" y="160" class="u">r</text><text x="440" y="160" class="u">a</text><text x="448" y="160" class="u">t</text><text x="456" y="160" class="u">e</text><text x="472" y="160">a</text><text x="480" y="160">n</text><text x="488" y="160">d</text><text x="504" y="160">m</text><text x="512" y="160">a</text><text x="520" y="160">n</text><text x="528" y="160">i</text><text x="536" y="160">p</text><text x="544" y="160">u</text><text x="552" y="160">l</text><text x="560" y="160">a</text><text x="568" y="160">t</text><text x="576" y="160">e</text><text y="176">i</text><text x="8" y="176">t</text><text x="16" y="176">.</text><text x="32" y="176">T</text><text x="40" y="176">h</text><text x="48" y="176">e</text><text x="64" y="176">a</text><text x="72" y="176">t</text><text x="80" y="176">t</text><text x="88" y="176">r</text><text x="96" y="176">i</text><text x="104" y="176">b</text><text x="112" y="176">u</text><text x="120" y="176">t</text><text x="128" y="176">e</text><text x="136" y="176">s</text><text x="152" y="176">a</text><text x="160" y="176">r</text><text x="168" y="176">e</text><text x="184" y="176">d</text><text x="192" y="176">i</text><text x="200" y="176">r</text><text x="208" y="176">e</text><text x="216" y="176">c</text><text x="224" y="176">t</text><text x="240" y="176">e</text><text x="248" y="176">m</text><text x="256" y="176">b</text><text x="264" y="176">e</text><text x="272" y="176">d</text><text x="280" y="176">d</text><text x="288" y="176">e</text><text x="296" y="176">d</text><text x="312" y="176">i</text><text x="320" y="176">n</text><text x="328" y="176">t</text><text x="336" y="176">o</text><text x="352" y="176">t</text><text x="360" y="176">h</text><text x="368" y="176">e</text><text x="384" y="176">t</text><text x="392" y="176">e</text><text x="400" y="176">x</text><text x="408" y="176">t</text><text x="424" y="176">l</text><text x="432" y="176">i</text><text x="440" y="176">k</text><text x="448" y="176">e</text><text x="464" y="176">'</text><text x="472" y="176">[</text><text x="480" y="176">[</text><text x="488" y="176">b</text><text x="496" y="176">o</text><text x="504" y="176">l</text><text x="512" y="176">d</text><text x="528" y="176">r</text><text x="536" y="176">e</text><text x="544" y="176">d</text><text x="552" y="176">]</text><text x="560" y="176">]</text><text x="568" y="176">'</text><text y="192">a</text><text x="8" y="192">n</text><text x="16" y="192">d</text><text x="32" y="192">c</text><text x="40" y="192">a</text><text x="48" y="192">n</text><text x="64" y="192">b</text><text x="72" y="192">e</text><text x="88" y="192">r</text><text x="96" y="192">e</text><text x="104" y="192">s</text><text x="112" y="192">e</text><text x="120" y="192">t</text><text x="128" y="192">t</text><text x="136" y="192">e</text><text x="144" y="192">d</text><text x="160" y="192">w</text><text x="168" y="192">i</text><text x="176" y="192">t</text><text x="184" y="192">h</text><text x="200" y="192">'</text><text x="208" y="192">[</text><text x="216" y="192">[</text><text x="224" y="192">/</text><text x="232" y="192">]</text><text x="240" y="192">]</text><text x="248" y="192">'</text><text x="264" y="192">o</text><text x="272" y="192">r</text><text x="288" y="192">a</text><text x="296" y="192">t</text><text x="312" y="192">t</text><text x="320" y="192">h</text><text x="328" y="192">e</text><text x="344" y="192">l</text><text x="352" y="192">i</text><text x="360" y="192">n</text><text x="368" y="192">e</text><text x="384" y="192">e</text><text x="392" y="192">n</text><text x="400" y="192">d</text><text x="408" y="192">.</text><text y="224" class="c1">━</text><text x="8" y="224" class="c1">━</text><text x="16" y="224" class="c1">━</text><text x="24" y="224" class="c1">━</text><text x="32" y="224" class="c1">━</text><text x="48" y="224" class="f">F</text><text x="56" y="224" class="f">e</text><text x="64" y="224" class="f">a</text><text x="72" y="224" class="f">t</text><text x="80" y="224" class="f">u</text><text x="88" y="224" class="f">r</text><text x="96" y="224" class="f">e</text><text x="104" y="224" class="f">:</text><text x="120" y="224" class="f">S</text><text x="128" y="224" class="f">e</text><text x="136" y="224" class="f">c</text><text x="144" y="224" class="f">t</text><text x="152" y="224" class="f">i</text><text x="160" y="224" class="f">o</text><text x="168" y="224" class="f">n</text><text x="176" y="224" class="f">s</text><text x="192" y="224" class="c4">━</text><text x="200" y="224" class="c4">━</text><text x="208" y="224" class="c4">━</text><text x="216" y="224" class="c4">━</text><text x="224" y="224" class="c4">━</text><text y="256">S</text><text x="8" y="256">e</text><text x="16" y="256">c</text><text x="24" y="256">t</text><text x="32" y="256">i</text><text x="40" y="256">o</text><text x="48" y="256">n</text><text x="56" y="256">s</text><text x="72" y="256">g</text><text x="80" y="256">r</text><text x="88" y="256">o</text><text x="96" y="256">u</text><text x="104" y="256">p</text><text x="120" y="256">t</text><text x="128" y="256">e</text><text x="136" y="256">x</text><text x="144" y="256">t</text><text x="160" y="256">l</text><text x="168" y="256">i</text><text x="176" y="256">n</text><text x="184" y="256">e</text><text x="192" y="256">s</text><text x="208" y="256">t</text><text x="216" y="256">o</text><text x="224" y="256">g</text><text x="232" y="256">e</text><text x="240" y="256">t</text><text x="248" y="256">h</text><text x="256" y="256">e</text><text x="264" y="256">r</text><text x="280" y="256">a</text><text x="288" y="256">n</text><text x="296" y="256">d</text><text x="304" y="256">/</text><text x="312" y="256">o</text><text x="320" y="256">r</text><text x="336" y="256">d</text><text x="344" y="256">e</text><text x="352" y="256">f</text><text x="360" y="256">i</text><text x="368" y="256">n</text><text x="376" y="256">e</text><text x="392" y="256">t</text><text x="400" y="256">h</text><text x="408" y="256">e</text><text x="416" y="256">i</text><text x="424" y="256">r</text><text x="440" y="256">s</text><text x="448" y="256">t</text><text x="456" y="256">y</text><text x="464" y="256">l</text><text x="472" y="256">e</text><text x="480" y="256">.</text><text x="496" y="256">T</text><text x="504" y="256">h</text><text x="512" y="256">e</text><text x="520" y="256">r</text><text x="528" y="256">e</text><text x="544" y="256">a</text><text x="552" y="256">r</text><text x="560" y="256">e</text><text y="272">s</text><text x="8" y="272">e</text><text x="16" y="272">v</text><text x="24" y="272">e</text><text x="32" y="272">r</text><text x="40" y="272">a</text><text x="48" y="272">l</text><text x="64" y="272">s</text><text x="72" y="272">e</text><text x="80" y="272">c</text><text x="88" y="272">t</text><text x="96" y="272">i</text><text x="104" y="272">o</text><text x="112" y="272">n</text><text x="128" y="272">t</text><text x="136" y="272">y</text><text x="144" y="272">p</text><text x="152" y="272">e</text><text x="160" y="272">s</text><text x="176" y="272">w</text><text x="184" y="272">h</text><text x="192" y="272">i</text><text x="200" y="272">c</text><text x="208" y="272">h</text><text x="224" y="272">a</text><text x="232" y="272">l</text><text x="240" y="272">l</text><text x="256" y="272">c</text><text x="264" y="272">a</text><text x="272" y="272">n</text><text x="288" y="272">b</text><text x="296" y="272">e</text><text x="312" y="272">s</text><text x="320" y="272">t</text><text x="328" y="272">a</text><text x="336" y="272">c</text><text x="344" y="272">k</text><text x="352" y="272">e</text><text x="360" y="272">d</text><text x="368" y="272">.</text><text y="304">H</text><text x="8" y="304">a</text><text x="16" y="304">v</text><text x="24" y="304">e</text><text x="40" y="304">a</text><text x="56" y="304">l</text><text x="64" y="304">o</text><text x="72" y="304">o</text><text x="80" y="304">k</text><text x="96" y="304">a</text><text x="104" y="304">t</text><text x="120" y="304">t</text><text x="128" y="304">h</text><text x="136" y="304">e</text><text x="152" y="304">d</text><text x="160" y="304">i</text><text x="168" y="304">f</text><text x="176" y="304">f</text><text x="184" y="304">e</text><text x="192" y="304">r</text><text x="200" y="304">e</text><text x="208" y="304">n</text><text x="216" y="304">t</text><text x="232" y="304">t</text><text x="240" y="304">y</text><text x="248" y="304">p</text><text x="256" y="304">e</text><text x="264" y="304">s</text><text x="280" y="304">o</text><text x="288" y="304">f</text><text x="304" y="304">s</text><text x="312" y="304">e</text><text x="320" y="304">c</text><text x="328" y="304">t</text><text x="336" y="304">i</text><text x="344" y="304">o</text><text x="352" y="304">n</text><text x="360" y="304">s</text><text x="368" y="304">:</text><text y="336" class="f">•</text><text x="16" y="336" class="f">G</text><text x="24" y="336" class="f">e</text><text x="32" y="336" class="f">n</text><text x="40" y="336" class="f">e</text><text x="48" y="336" class="f">r</text><text x="56" y="336" class="f">i</text><text x="64" y="336" class="f">c</text><text x="80" y="336" class="f">M</text><text x="88" y="336" class="f">e</text><text x="96" y="336" class="f">s</text><text x="104" y="336" class="f">s</text><text x="112" y="336" class="f">a</text><text x="120" y="336" class="f">g</text><text x="128" y="336" class="f">e</text><text y="352" class="c2">i</text><text x="16" y="352" class="c2">I</text><text x="24" y="352" class="c2">n</text><text x="32" y="352" class="c2">f</text><text x="40" y="352" class="c2">o</text><text x="48" y="352" class="c2">r</text><text x="56" y="352" class="c2">m</text><text x="64" y="352" class="c2">a</text><text x="72" y="352" class="c2">t</text><text x="80" y="352" class="c2">i</text><text x="88" y="352" class="c2">o</text><text x="96" y="352" class="c2">n</text><text x="104" y="352" class="c2">a</text><text x="112" y="352" class="c2">l</text><text x="128" y="352" class="c2">M</text><text x="136" y="352" class="c2">e</text><text x="144" y="352" class="c2">s</text><text x="152" y="352" class="c2">s</text><text x="160" y="352" class="c2">a</text><text x="168" y="352" class="c2">g</text><text x="176" y="352" class="c2">e</text><text y="368" class="c6">!</text><text x="16" y="368" class="c6">W</text><text x="24" y="368" class="c6">a</text><text x="32" y="368" class="c6">r</text><text x="40" y="368" class="c6">n</text><text x="48" y="368" class="c6">i</text><text x="56" y="368" class="c6">n</text><text x="64" y="368" class="c6">g</text><text x="80" y="368" class="c6">M</text><text x="88" y="368" class="c6">e</text><text x="96" y="368" class="c6">s</text><text x="104" y="368" class="c6">s</text><text x="112" y="368" class="c6">a</text><text x="120" y="368" class="c6">g</text><text x="128" y="368" class="c6">e</text><text y="384" class="c7">X</text><text x="16" y="384" class="c7">E</text><text x="24" y="384" class="c7">r</text><text x="32" y="384" class="c7">r</text><text x="40" y="384" class="c7">o</text><text x="48" y="384" class="c7">r</text><text x="64" y="384" class="c7">M</text><text x="72" y="384" class="c7">e</text><text x="80" y="384" class="c7">s</text><text x="88" y="384" class="c7">s</text><text x="96" y="384" class="c7">a</text><text x="104" y="384" class="c7">g</text><text x="112" y="384" class="c7">e</text><text y="400" class="c8">✓</text><text x="16" y="400" class="c8">C</text><text x="24" y="400" class="c8">o</text><text x="32" y="400" class="c8">m</text><text x="40" y="400" class="c8">p</text><text x="48" y="400" class="c8">l</text><text x="56" y="400" class="c8">e</text><text x="64" y="400" class="c8">t</text><text x="72" y="400" class="c8">i</text><text x="80" y="400" class="c8">o</text><text x="88" y="400" class="c8">n</text><text x="104" y="400" class="c8">M</text><text x="112" y="400" class="c8">e</text><text x="120" y="400" class="c8">s</text><text x="128" y="400" class="c8">s</text><text x="136" y="400" class="c8">a</text><text x="144" y="400" class="c8">g</text><text x="152" y="400" class="c8">e</text><text y="416" class="c3">F</text><text x="16" y="416" class="c3">F</text><text x="24" y="416" class="c3">a</text><text x="32" y="416" class="c3">i</text><text x="40" y="416" class="c3">l</text><text x="48" y="416" class="c3">u</text><text x="56" y="416" class="c3">r</text><text x="64" y="416" class="c3">e</text><text x="80" y="416" class="c3">M</text><text x="88" y="416" class="c3">e</text><text x="96" y="416" class="c3">s</text><text x="104" y="416" class="c3">s</text><text x="112" y="416" class="c3">a</text><text x="120" y="416" class="c3">g</text><text x="128" y="416" class="c3">e</text><text y="432" class="f">◉</text><text x="16" y="432" class="c9">C</text><text x="24" y="432" class="c9">u</text><text x="32" y="432" class="c9">s</text><text x="40" y="432" class="c9">t</text><text x="48" y="432" class="c9">o</text><text x="56" y="432" class="c9">m</text><text x="64" y="432" class="c9">i</text><text x="72" y="432" class="c9">z</text><text x="80" y="432" class="c9">e</text><text x="88" y="432" class="c9">d</text><text x="104" y="432" class="c9">M</text><text x="112" y="432" class="c9">e</text><text x="120" y="432" class="c9">s</text><text x="128" y="432" class="c9">s</text><text x="136" y="432" class="c9">a</text><text x="144" y="432" class="c9">g</text><text x="152" y="432" class="c9">e</text><text y="464">Y</text><text x="8" y="464">o</text><text x="16" y="464">u</text><text x="32" y="464">c</text><text x="40" y="464">a</text><text x="48" y="464">n</text><text x="64" y="464">s</text><text x="72" y="464">t</text><text x="80" y="464">a</text><text x="88" y="464">c</text><text x="96" y="464">k</text><text x="112" y="464">a</text><text x="120" y="464">l</text><text x="128" y="464">l</text><text x="144" y="464">k</text><text x="152" y="464">i</text><text x="160" y="464">n</text><text x="168" y="464">d</text><text x="176" y="464">s</text><text x="192" y="464">o</text><text x="200" y="464">f</text><text x="216" y="464">s</text><text x="224" y="464">e</text><text x="232" y="464">c</text><text x="240" y="464">t</text><text x="248" y="464">i</text><text x="256" y="464">o</text><text x="264" y="464">n</text><text x="272" y="464">s</text><text x="288" y="464">t</text><text x="296" y="464">o</text><text x="304" y="464">g</text><text x="312" y="464">e</text><text x="320" y="464">t</text><text x="328" y="464">h</text><text x="336" y="464">e</text><text x="344" y="464">r</text><text x="352" y="464">:</text><text y="496" class="c1">┌</text><text x="8" y="496" class="c1">─</text><text x="16" y="496" class="c1">─</text><text x="32" y="496" class="f">S</text><text x="40" y="496" class="f">i</text><text x="48" y="496" class="f">m</text><text x="56" y="496" class="f">p</text><text x="64" y="496" class="f">l</text><text x="72" y="496" class="f">e</text><text x="88" y="496" class="f">F</text><text x="96" y="496" class="f">r</text><text x="104" y="496" class="f">a</text><text x="112" y="496" class="f">m</text><text x="120" y="496" class="f">e</text><text x="128" y="496" class="f">d</text><text x="144" y="496" class="f">S</text><text x="152" y="496" class="f">e</text><text x="160" y="496" class="f">c</text><text x="168" y="496" class="f">t</text><text x="176" y="496" class="f">i</text><text x="184" y="496" class="f">o</text><text x="192" y="496" class="f">n</text><text x="208" y="496" class="c1">─</text><text x="216" y="496" class="c1">─</text><text x="224" y="496" class="c1">─</text><text x="232" y="496" class="c1">─</text><text x="240" y="496" class="c1">─</text><text y="512" class="c1">│</text><text x="16" y="512" class="c1">┏</text><text x="24" y="512" class="c1">━</text><text x="32" y="512" class="c1">━</text><text x="48" y="512" class="f">H</text><text x="56" y="512" class="f">e</text><text x="64" y="512" class="f">a</text><text x="72" y="512" class="f">v</text><text x="80" y="512" class="f">y</text><text x="96" y="512" class="f">F</text><text x="104" y="512" class="f">r</text><text x="112" y="512" class="f">a</text><text x="120" y="512" class="f">m</text><text x="128" y="512" class="f">e</text><text x="136" y="512" class="f">d</text><text x="152" y="512" class="f">S</text><text x="160" y="512" class="f">e</text><text x="168" y="512" class="f">c</text><text x="176" y="512" class="f">t</text><text x="184" y="512" class="f">i</text><text x="192" y="512" class="f">o</text><text x="200" y="512" class="f">n</text><text x="216" y="512" class="c1">━</text><text x="224" y="512" class="c1">━</text><text x="232" y="512" class="c1">━</text><text x="240" y="512" class="c1">━</text><text x="248" y="512" class="c1">━</text><text y="528" class="c1">│</text><text x="16" y="528" class="c1">┃</text><text x="32" y="528" class="c1">┍</text><text x="40" y="528" class="c1">━</text><text x="48" y="528" class="c1">━</text><text x="64" y="528" class="f">S</text><text x="72" y="528" class="f">e</text><text x="80" y="528" class="f">m</text><text x="88" y="528" class="f">i</text><text x="104" y="528" class="f">F</text><text x="112" y="528" class="f">r</text><text x="120" y="528" class="f">a</text><text x="128" y="528" class="f">m</text><text x="136" y="528" class="f">e</text><text x="144" y="528" class="f">d</text><text x="160" y="528" class="f">S</text><text x="168" y="528" class="f">e</text><text x="176" y="528" class="f">c</text><text x="184" y="528" class="f">t</text><text x="192" y="528" class="f">i</text><text x="200" y="528" class="f">o</text><text x="208" y="528" class="f">n</text><text x="224" y="528" class="c1">━</text><text x="232" y="528" class="c1">━</text><text x="240" y="528" class="c1">━</text><text x="248" y="528" class="c1">━</text><text x="256" y="528" class="c1">━</text><text y="544" class="c1">│</text><text x="16" y="544" class="c1">┃</text><text x="32" y="544" class="c1">│</text><text x="48" y="544" class="c1">╔</text><text x="56" y="544" class="c1">═</text><text x="64" y="544" class="c1">═</text><text x="80" y="544" class="f">D</text><text x="88" y="544" class="f">o</text><text x="96" y="544" class="f">u</text><text x="104" y="544" class="f">b</text><text x="112" y="544" class="f">l</text><text x="120" y="544" class="f">e</text><text x="136" y="544" class="f">F</text><text x="144" y="544" class="f">r</text><text x="152" y="544" class="f">a</text><text x="160" y="544" class="f">m</text><text x="168" y="544" class="f">e</text><text x="176" y="544" class="f">d</text><text x="192" y="544" class="f">S</text><text x="200" y="544" class="f">e</text><text x="208" y="544" class="f">c</text><text x="216" y="544" class="f">t</text><text x="224" y="544" class="f">i</text><text x="232" y="544" class="f">o</text><text x="240" y="544" class="f">n</text><text x="256" y="544" class="c1">═</text><text x="264" y="544" class="c1">═</text><text x="272" y="544" class="c1">═</text><text x="280" y="544" class="c1">═</text><text x="288" y="544" class="c1">═</text><text y="560" class="c1">│</text><text x="16" y="560" class="c1">┃</text><text x="32" y="560" class="c1">│</text><text x="48" y="560" class="c1">║</text><text x="64" y="560" class="f">💛</text><text x="80" y="560" class="ca">F</text><text x="88" y="560" class="ca">r</text><text x="96" y="560" class="ca">a</text><text x="104" y="560" class="ca">m</text><text x="112" y="560" class="ca">e</text><text x="120" y="560" class="ca">s</text><text x="136" y="560" class="ca">a</text><text x="144" y="560" class="ca">r</text><text x="152" y="560" class="ca">e</text><text x="168" y="560" class="ca">n</text><text x="176" y="560" class="ca">i</text><text x="184" y="560" class="ca">c</text><text x="192" y="560" class="ca">e</text><text y="576" class="c1">│</text><text x="16" y="576" class="c1">┃</text><text x="32" y="576" class="c1">│</text><text x="48" y="576" class="c1">║</text><text x="88" y="576">J</text><text x="96" y="576">u</text><text x="104" y="576">s</text><text x="112" y="576">t</text><text x="128" y="576">t</text><text x="136" y="576">o</text><text x="152" y="576">s</text><text x="160" y="576">h</text><text x="168" y="576">o</text><text x="176" y="576">w</text><text x="192" y="576">y</text><text x="200" y="576">o</text><text x="208" y="576">u</text><text x="224" y="576">t</text><text x="232" y="576">h</text><text x="240" y="576">a</text><text x="248" y="576">t</text><text x="264" y="576">a</text><text x="272" y="576">l</text><text x="280" y="576">l</text><text x="296" y="576">s</text><text x="304" y="576">e</text><text x="312" y="576">c</text><text x="320" y="576">t</text><text x="328" y="576">i</text><text x="336" y="576">o</text><text x="344" y="576">n</text><text x="352" y="576">s</text><text y="592" class="c1">│</text><text x="16" y="592" class="c1">┃</text><text x="32" y="592" class="c1">│</text><text x="48" y="592" class="c1">║</text><text x="88" y="592">c</text><text x="96" y="592">a</text><text x="104" y="592">n</text><text x="120" y="592">b</text><text x="128" y="592">e</text><text x="144" y="592">s</text><text x="152" y="592">t</text><text x="160" y="592">a</text><text x="168" y="592">c</text><text x="176" y="592">k</text><text x="184" y="592">e</text><text x="192" y="592">d</text><text x="200" y="592">.</text><text x="208" y="592">.</text><text x="216" y="592">.</text><text y="608" class="c1">│</text><text x="16" y="608" class="c1">┃</text><text x="32" y="608" class="c1">│</text><text x="48" y="608" class="c1">╚</text><text x="56" y="608" class="c1">═</text><text x="64" y="608" class="c1">═</text><text x="72" y="608" class="c1">═</text><text x="80" y="608" class="c1">═</text><text x="88" y="608" class="c1">═</text><text x="96" y="608" class="c1">═</text><text x="104" y="608" class="c1">═</text><text x="112" y="608" class="c1">═</text><text x="120" y="608" class="c1">═</text><text x="128" y="608" class="c1">═</text><text y="624" class="c1">│</text><text x="16" y="624" class="c1">┃</text><text x="32" y="624" class="c1">┕</text><text x="40" y="624" class="c1">━</text><text x="48" y="624" class="c1">━</text><text x="56" y="624" class="c1">━</text><text x="64" y="624" class="c1">━</text><text x="72" y="624" class="c1">━</text><text x="80" y="624" class="c1">━</text><text x="88" y="624" class="c1">━</text><text x="96" y="624" class="c1">━</text><text x="104" y="624" class="c1">━</text><text x="112" y="624" class="c1">━</text><text y="640" class="c1">│</text><text x="16" y="640" class="c1">┗</text><text x="24" y="640" class="c1">━</text><text x="32" y="640" class="c1">━</text><text x="40" y="640" class="c1">━</text><text x="48" y="640" class="c1">━</text><text x="56" y="640" class="c1">━</text><text x="64" y="640" class="c1">━</text><text x="72" y="640" class="c1">━</text><text x="80" y="640" class="c1">━</text><text x="88" y="640" class="c1">━</text><text x="96" y="640" class="c1">━</text><text y="656" class="c1">└</text><text x="8" y="656" class="c1">─</text><text x="16" y="656" class="c1">─</text><text x="24" y="656" class="c1">─</text><text x="32" y="656" class="c1">─</text><text x="40" y="656" class="c1">─</text><text x="48" y="656" class="c1">─</text><text x="56" y="656" class="c1">─</text><text x="64" y="656" class="c1">─</text><text x="72" y="656" class="c1">─</text><text x="80" y="656" class="c1">─</text></svg>
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'natty-ui'
|
4
|
+
require_relative '../lib/natty-ui'
|
5
|
+
|
6
|
+
UI = NattyUI::StdOut
|
7
|
+
|
8
|
+
UI.space
|
9
|
+
UI.h1 'NattyUI Progress Indication Demo'
|
10
|
+
UI.space
|
11
|
+
|
12
|
+
# just simulate some work
|
13
|
+
def something = sleep(0.4)
|
14
|
+
def some = sleep(0.15)
|
15
|
+
|
16
|
+
UI.framed('Pogress Indicators') do |sec|
|
17
|
+
progress = sec.progress('Progress with max_value', max_value: 11)
|
18
|
+
11.times do
|
19
|
+
progress.step
|
20
|
+
something
|
21
|
+
end
|
22
|
+
progress.done 'Progress ok'
|
23
|
+
|
24
|
+
progress = sec.progress('Simple progress')
|
25
|
+
20.times do
|
26
|
+
progress.step
|
27
|
+
some
|
28
|
+
end
|
29
|
+
progress.done 'All fine'
|
30
|
+
end
|
31
|
+
|
32
|
+
# simulate assembling task steps
|
33
|
+
def assemble(task)
|
34
|
+
task.msg 'Collect files...'
|
35
|
+
something
|
36
|
+
task.task 'Compile files...' do |subtask|
|
37
|
+
%w[readme.txt main.css main.html sub.html].each do |name|
|
38
|
+
subtask.msg "Compile file [[bright_yellow]]./source/#{name}[[/]]..."
|
39
|
+
something
|
40
|
+
end
|
41
|
+
subtask.done 'Files compiled.'
|
42
|
+
end
|
43
|
+
something
|
44
|
+
task.msg 'Compressing...'
|
45
|
+
something
|
46
|
+
task.msg 'Signing...'
|
47
|
+
something
|
48
|
+
task.msg 'Store assembled results...'
|
49
|
+
something
|
50
|
+
end
|
51
|
+
|
52
|
+
UI.framed('Tasks') do |sec|
|
53
|
+
sec.puts 'Tasks are sections to visualize step by step processing.'
|
54
|
+
sec.task('Assemble assets') { |task| assemble(task) }
|
55
|
+
sec.space
|
56
|
+
|
57
|
+
sec.puts 'If such a task failed the logged messages are kept:'
|
58
|
+
assembling = sec.task('Assemble assets')
|
59
|
+
assemble(assembling)
|
60
|
+
assembling.failed
|
61
|
+
sec.space
|
62
|
+
|
63
|
+
sec.puts 'You can add some more description when failed:'
|
64
|
+
sec.task('Assemble assets') do |task|
|
65
|
+
assemble(task)
|
66
|
+
task.failed('Unable to store results', <<~ERROR)
|
67
|
+
Server reported Invalid credentials
|
68
|
+
Check your credentials and try again...
|
69
|
+
ERROR
|
70
|
+
|
71
|
+
This code here is never reached!
|
72
|
+
end
|
73
|
+
sec.space
|
74
|
+
|
75
|
+
sec.puts 'You can also add a description when all was fine:'
|
76
|
+
sec.task('Assemble assets') do |task|
|
77
|
+
assemble(task)
|
78
|
+
task.done('Assets assembled', <<~INFO)
|
79
|
+
Your assets are ready on server now.
|
80
|
+
INFO
|
81
|
+
|
82
|
+
This code here is never reached!
|
83
|
+
end
|
84
|
+
end
|
data/examples/query.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# require 'natty-ui'
|
4
|
+
require_relative '../lib/natty-ui'
|
5
|
+
|
6
|
+
UI = NattyUI::StdOut
|
7
|
+
|
8
|
+
UI.space
|
9
|
+
|
10
|
+
UI.framed('NattyUI Query Demo') do |sec|
|
11
|
+
unless sec.ask('Do you like to continute? (Y|n)')
|
12
|
+
sec.failed('aborted')
|
13
|
+
sec.close
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
choice =
|
18
|
+
sec.query(
|
19
|
+
'Which fruits do you prefer?',
|
20
|
+
'Apples',
|
21
|
+
'Bananas',
|
22
|
+
'Cherries',
|
23
|
+
x: 'No fruits',
|
24
|
+
result: :choice
|
25
|
+
)
|
26
|
+
unless choice
|
27
|
+
sec.failed('aborted')
|
28
|
+
sec.close
|
29
|
+
exit(false)
|
30
|
+
end
|
31
|
+
sec.info("Your choice: #{choice}")
|
32
|
+
end
|