flipper-ui 0.21.0 → 0.23.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/examples/ui/authorization.ru +11 -49
  3. data/examples/ui/basic.ru +10 -10
  4. data/flipper-ui.gemspec +1 -0
  5. data/lib/flipper/ui/action.rb +50 -1
  6. data/lib/flipper/ui/actions/actors_gate.rb +11 -8
  7. data/lib/flipper/ui/actions/features.rb +2 -2
  8. data/lib/flipper/ui/actions/file.rb +1 -1
  9. data/lib/flipper/ui/actions/groups_gate.rb +1 -1
  10. data/lib/flipper/ui/actions/percentage_of_actors_gate.rb +1 -1
  11. data/lib/flipper/ui/actions/percentage_of_time_gate.rb +1 -1
  12. data/lib/flipper/ui/configuration.rb +6 -0
  13. data/lib/flipper/ui/decorators/feature.rb +3 -3
  14. data/lib/flipper/ui/middleware.rb +2 -1
  15. data/lib/flipper/ui/public/css/application.css +7 -0
  16. data/lib/flipper/ui/views/add_actor.erb +1 -1
  17. data/lib/flipper/ui/views/feature.erb +6 -6
  18. data/lib/flipper/ui/views/features.erb +2 -2
  19. data/lib/flipper/ui/views/layout.erb +5 -6
  20. data/lib/flipper/ui.rb +2 -2
  21. data/lib/flipper/version.rb +1 -1
  22. data/spec/flipper/ui/action_spec.rb +0 -2
  23. data/spec/flipper/ui/actions/actors_gate_spec.rb +70 -7
  24. data/spec/flipper/ui/actions/add_feature_spec.rb +0 -2
  25. data/spec/flipper/ui/actions/boolean_gate_spec.rb +18 -2
  26. data/spec/flipper/ui/actions/feature_spec.rb +18 -2
  27. data/spec/flipper/ui/actions/features_spec.rb +16 -5
  28. data/spec/flipper/ui/actions/file_spec.rb +0 -12
  29. data/spec/flipper/ui/actions/groups_gate_spec.rb +20 -5
  30. data/spec/flipper/ui/actions/home_spec.rb +0 -2
  31. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +18 -3
  32. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +18 -3
  33. data/spec/flipper/ui/configuration_spec.rb +0 -2
  34. data/spec/flipper/ui/decorators/feature_spec.rb +0 -2
  35. data/spec/flipper/ui/decorators/gate_spec.rb +0 -1
  36. data/spec/flipper/ui/util_spec.rb +0 -1
  37. data/spec/flipper/ui_spec.rb +0 -15
  38. metadata +19 -18
  39. data/docs/ui/README.md +0 -190
  40. data/docs/ui/images/banner.png +0 -0
  41. data/docs/ui/images/description.png +0 -0
  42. data/docs/ui/images/feature.png +0 -0
  43. data/docs/ui/images/features.png +0 -0
  44. data/lib/flipper/ui/public/octicons/LICENSE.txt +0 -9
  45. data/lib/flipper/ui/public/octicons/README.md +0 -1
  46. data/lib/flipper/ui/public/octicons/octicons-local.ttf +0 -0
  47. data/lib/flipper/ui/public/octicons/octicons.css +0 -236
  48. data/lib/flipper/ui/public/octicons/octicons.eot +0 -0
  49. data/lib/flipper/ui/public/octicons/octicons.svg +0 -200
  50. data/lib/flipper/ui/public/octicons/octicons.ttf +0 -0
  51. data/lib/flipper/ui/public/octicons/octicons.woff +0 -0
data/docs/ui/README.md DELETED
@@ -1,190 +0,0 @@
1
- # Flipper::UI
2
-
3
- UI for the [Flipper](https://github.com/jnunemaker/flipper) gem.
4
-
5
- ## Screenshots
6
-
7
- Viewing list of features:
8
-
9
- ![features](images/features.png)
10
-
11
- Viewing an individual feature:
12
-
13
- ![feature](images/feature.png)
14
-
15
- ## Installation
16
-
17
- Add this line to your application's Gemfile:
18
-
19
- gem 'flipper-ui'
20
-
21
- And then execute:
22
-
23
- $ bundle
24
-
25
- Or install it yourself as:
26
-
27
- $ gem install flipper-ui
28
-
29
- ## Usage
30
-
31
- ### Rails
32
-
33
- Given that you've already initialized `Flipper` as per the [flipper](https://github.com/jnunemaker/flipper) readme, you can mount `Flipper::UI` to a route of your choice:
34
-
35
- ```ruby
36
- # config/routes.rb
37
- YourRailsApp::Application.routes.draw do
38
- mount Flipper::UI.app(Flipper) => '/flipper'
39
- end
40
- ```
41
-
42
- If you'd like to lazy load flipper, you can instead pass a block to initialize it:
43
-
44
- ```ruby
45
- # config/routes.rb
46
- YourRailsApp::Application.routes.draw do
47
- flipper_block = lambda {
48
- # some flipper initialization here, for example:
49
- adapter = Flipper::Adapters::Memory.new
50
- Flipper.new(adapter)
51
- }
52
- mount Flipper::UI.app(flipper_block) => '/flipper'
53
- end
54
- ```
55
-
56
- #### Security
57
-
58
- You almost certainly want to limit access when using Flipper::UI in production.
59
-
60
- ##### Basic Authentication via Rack
61
- The `Flipper::UI.app` method yields a builder instance prior to any predefined middleware. You can insert the `Rack::Auth::Basic` middleware, that'll prompt for a username and password when visiting the defined (i.e., `/flipper`) route.
62
-
63
- ```ruby
64
- # config/routes.rb
65
-
66
- flipper_app = Flipper::UI.app(Flipper.instance) do |builder|
67
- builder.use Rack::Auth::Basic do |username, password|
68
- # Verify credentials
69
- end
70
- end
71
- mount flipper_app, at: '/flipper'
72
- ```
73
-
74
- ##### Route Constraints
75
- It is possible to use [routes constraints](http://guides.rubyonrails.org/routing.html#request-based-constraints) to limit access to routes:
76
-
77
- ```ruby
78
- # config/routes.rb
79
-
80
- flipper_constraint = lambda { |request| request.remote_ip == '127.0.0.1' }
81
- constraints flipper_constraint do
82
- mount Flipper::UI.app(flipper) => '/flipper'
83
- end
84
- ```
85
-
86
- Another example is to use the `current_user` when using a gem-based authentication system (i.e., [warden](https://github.com/hassox/warden) or [devise](https://github.com/plataformatec/devise)):
87
-
88
- ```ruby
89
- # initializers/admin_access.rb
90
-
91
- class CanAccessFlipperUI
92
- def self.matches?(request)
93
- current_user = request.env['warden'].user
94
- current_user.present? && current_user.respond_to?(:admin?) && current_user.admin?
95
- end
96
- end
97
-
98
- # config/routes.rb
99
-
100
- constraints CanAccessFlipperUI do
101
- mount Flipper::UI.app(Flipper) => '/flipper'
102
- end
103
- ```
104
-
105
- ### Standalone
106
-
107
- Minimal example for Rack:
108
-
109
- ```ruby
110
- # config.ru
111
-
112
- require 'flipper/ui'
113
-
114
- adapter = Flipper::Adapters::Memory.new
115
- flipper = Flipper.new(adapter)
116
-
117
- run Flipper::UI.app(flipper) { |builder|
118
- builder.use Rack::Session::Cookie, secret: "something long and random"
119
- }
120
- ```
121
-
122
- The key is that you need to have sessions setup. Rails does this for you, so this step isn't necessary, but for standalone rack, you'll need it. Without sessions setup, you will receive a Runtime error like:
123
-
124
- ```
125
- RuntimeError: you need to set up a session middleware *before* Rack::Protection::RemoteToken.
126
- ```
127
-
128
- See [examples/ui/basic.ru](https://github.com/jnunemaker/flipper/blob/master/examples/ui/basic.ru) for a more full example
129
-
130
- ### Configuration
131
-
132
- Flipper UI can be customized via `configure`, which yields a configuration instance.
133
-
134
- #### Description
135
-
136
- We can associate a `description` for each `feature` by providing a descriptions source:
137
-
138
- ```ruby
139
- Flipper::UI.configure do |config|
140
- config.descriptions_source = ->(keys) do
141
- # descriptions loaded from YAML file or database (postgres, mysql, etc)
142
- # return has to be hash of {String key => String description}
143
- end
144
-
145
- # Defaults to false. Set to true to show feature descriptions on the list
146
- # page as well as the view page.
147
- # config.show_feature_description_in_list = true
148
- end
149
- ```
150
-
151
- Descriptions show up in the UI like so:
152
-
153
- ![description](images/description.png)
154
-
155
- #### Banner
156
-
157
- Flipper UI can display a banner across the top of the page. The `banner_text` and `banner_class` can be configured by using the `Flipper::UI.configure` block as seen below.
158
-
159
- ```ruby
160
- Flipper::UI.configure do |config|
161
- config.banner_text = 'Production Environment'
162
- config.banner_class = 'danger'
163
- end
164
- ```
165
-
166
- By default the `environment` is set to an empty string so no banner will show. If you wish to customize the look of the banner, you can set `banner_class` to one of the bootstrap color classes: `primary`, `secondary`, `success`, `danger`, `warning`, `info`, `light`, or `dark`. The default `banner_class` is `danger`.
167
-
168
- The above configuration results in:
169
-
170
- ![banner](images/banner.png)
171
-
172
- #### Fun mode
173
-
174
- By default, Flipper UI displays a videoclip when there are no flags. The `fun` mode can be configured by using the `Flipper::UI.configure` block as seen below.
175
-
176
- ```ruby
177
- Flipper::UI.configure do |config|
178
- config.fun = false
179
- end
180
- ```
181
-
182
- ## Contributing
183
-
184
- 1. Fork it
185
- 2. Create your feature branch (`git checkout -b my-new-feature`)
186
- 3. **Fire up the app** (`script/server`)
187
- 4. Run the tests `bundle exec rake`
188
- 5. Commit your changes (`git commit -am 'Added some feature'`)
189
- 6. Push to the branch (`git push origin my-new-feature`)
190
- 7. Create new Pull Request
Binary file
Binary file
Binary file
Binary file
@@ -1,9 +0,0 @@
1
- (c) 2012-2015 GitHub
2
-
3
- When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos)
4
-
5
- Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
6
- Applies to all font files
7
-
8
- Code License: MIT (http://choosealicense.com/licenses/mit/)
9
- Applies to all other files
@@ -1 +0,0 @@
1
- If you intend to install Octicons locally, install `octicons-local.ttf`. It should appear as “github-octicons” in your font list. It is specially designed not to conflict with GitHub's web fonts.
@@ -1,236 +0,0 @@
1
- @font-face {
2
- font-family: 'octicons';
3
- src: url('octicons.eot?#iefix') format('embedded-opentype'),
4
- url('octicons.woff') format('woff'),
5
- url('octicons.ttf') format('truetype'),
6
- url('octicons.svg#octicons') format('svg');
7
- font-weight: normal;
8
- font-style: normal;
9
- }
10
-
11
- /*
12
-
13
- .octicon is optimized for 16px.
14
- .mega-octicon is optimized for 32px but can be used larger.
15
-
16
- */
17
- .octicon, .mega-octicon {
18
- font: normal normal normal 16px/1 octicons;
19
- display: inline-block;
20
- text-decoration: none;
21
- text-rendering: auto;
22
- -webkit-font-smoothing: antialiased;
23
- -moz-osx-font-smoothing: grayscale;
24
- -webkit-user-select: none;
25
- -moz-user-select: none;
26
- -ms-user-select: none;
27
- user-select: none;
28
- }
29
- .mega-octicon { font-size: 32px; }
30
-
31
- .octicon-alert:before { content: '\f02d'} /*  */
32
- .octicon-alignment-align:before { content: '\f08a'} /*  */
33
- .octicon-alignment-aligned-to:before { content: '\f08e'} /*  */
34
- .octicon-alignment-unalign:before { content: '\f08b'} /*  */
35
- .octicon-arrow-down:before { content: '\f03f'} /*  */
36
- .octicon-arrow-left:before { content: '\f040'} /*  */
37
- .octicon-arrow-right:before { content: '\f03e'} /*  */
38
- .octicon-arrow-small-down:before { content: '\f0a0'} /*  */
39
- .octicon-arrow-small-left:before { content: '\f0a1'} /*  */
40
- .octicon-arrow-small-right:before { content: '\f071'} /*  */
41
- .octicon-arrow-small-up:before { content: '\f09f'} /*  */
42
- .octicon-arrow-up:before { content: '\f03d'} /*  */
43
- .octicon-beer:before { content: '\f069'} /*  */
44
- .octicon-book:before { content: '\f007'} /*  */
45
- .octicon-bookmark:before { content: '\f07b'} /*  */
46
- .octicon-briefcase:before { content: '\f0d3'} /*  */
47
- .octicon-broadcast:before { content: '\f048'} /*  */
48
- .octicon-browser:before { content: '\f0c5'} /*  */
49
- .octicon-bug:before { content: '\f091'} /*  */
50
- .octicon-calendar:before { content: '\f068'} /*  */
51
- .octicon-check:before { content: '\f03a'} /*  */
52
- .octicon-checklist:before { content: '\f076'} /*  */
53
- .octicon-chevron-down:before { content: '\f0a3'} /*  */
54
- .octicon-chevron-left:before { content: '\f0a4'} /*  */
55
- .octicon-chevron-right:before { content: '\f078'} /*  */
56
- .octicon-chevron-up:before { content: '\f0a2'} /*  */
57
- .octicon-circle-slash:before { content: '\f084'} /*  */
58
- .octicon-circuit-board:before { content: '\f0d6'} /*  */
59
- .octicon-clippy:before { content: '\f035'} /*  */
60
- .octicon-clock:before { content: '\f046'} /*  */
61
- .octicon-cloud-download:before { content: '\f00b'} /*  */
62
- .octicon-cloud-upload:before { content: '\f00c'} /*  */
63
- .octicon-code:before { content: '\f05f'} /*  */
64
- .octicon-color-mode:before { content: '\f065'} /*  */
65
- .octicon-comment-add:before,
66
- .octicon-comment:before { content: '\f02b'} /*  */
67
- .octicon-comment-discussion:before { content: '\f04f'} /*  */
68
- .octicon-credit-card:before { content: '\f045'} /*  */
69
- .octicon-dash:before { content: '\f0ca'} /*  */
70
- .octicon-dashboard:before { content: '\f07d'} /*  */
71
- .octicon-database:before { content: '\f096'} /*  */
72
- .octicon-device-camera:before { content: '\f056'} /*  */
73
- .octicon-device-camera-video:before { content: '\f057'} /*  */
74
- .octicon-device-desktop:before { content: '\f27c'} /*  */
75
- .octicon-device-mobile:before { content: '\f038'} /*  */
76
- .octicon-diff:before { content: '\f04d'} /*  */
77
- .octicon-diff-added:before { content: '\f06b'} /*  */
78
- .octicon-diff-ignored:before { content: '\f099'} /*  */
79
- .octicon-diff-modified:before { content: '\f06d'} /*  */
80
- .octicon-diff-removed:before { content: '\f06c'} /*  */
81
- .octicon-diff-renamed:before { content: '\f06e'} /*  */
82
- .octicon-ellipsis:before { content: '\f09a'} /*  */
83
- .octicon-eye-unwatch:before,
84
- .octicon-eye-watch:before,
85
- .octicon-eye:before { content: '\f04e'} /*  */
86
- .octicon-file-binary:before { content: '\f094'} /*  */
87
- .octicon-file-code:before { content: '\f010'} /*  */
88
- .octicon-file-directory:before { content: '\f016'} /*  */
89
- .octicon-file-media:before { content: '\f012'} /*  */
90
- .octicon-file-pdf:before { content: '\f014'} /*  */
91
- .octicon-file-submodule:before { content: '\f017'} /*  */
92
- .octicon-file-symlink-directory:before { content: '\f0b1'} /*  */
93
- .octicon-file-symlink-file:before { content: '\f0b0'} /*  */
94
- .octicon-file-text:before { content: '\f011'} /*  */
95
- .octicon-file-zip:before { content: '\f013'} /*  */
96
- .octicon-flame:before { content: '\f0d2'} /*  */
97
- .octicon-fold:before { content: '\f0cc'} /*  */
98
- .octicon-gear:before { content: '\f02f'} /*  */
99
- .octicon-gift:before { content: '\f042'} /*  */
100
- .octicon-gist:before { content: '\f00e'} /*  */
101
- .octicon-gist-secret:before { content: '\f08c'} /*  */
102
- .octicon-git-branch-create:before,
103
- .octicon-git-branch-delete:before,
104
- .octicon-git-branch:before { content: '\f020'} /*  */
105
- .octicon-git-commit:before { content: '\f01f'} /*  */
106
- .octicon-git-compare:before { content: '\f0ac'} /*  */
107
- .octicon-git-merge:before { content: '\f023'} /*  */
108
- .octicon-git-pull-request-abandoned:before,
109
- .octicon-git-pull-request:before { content: '\f009'} /*  */
110
- .octicon-globe:before { content: '\f0b6'} /*  */
111
- .octicon-graph:before { content: '\f043'} /*  */
112
- .octicon-heart:before { content: '\2665'} /* ♥ */
113
- .octicon-history:before { content: '\f07e'} /*  */
114
- .octicon-home:before { content: '\f08d'} /*  */
115
- .octicon-horizontal-rule:before { content: '\f070'} /*  */
116
- .octicon-hourglass:before { content: '\f09e'} /*  */
117
- .octicon-hubot:before { content: '\f09d'} /*  */
118
- .octicon-inbox:before { content: '\f0cf'} /*  */
119
- .octicon-info:before { content: '\f059'} /*  */
120
- .octicon-issue-closed:before { content: '\f028'} /*  */
121
- .octicon-issue-opened:before { content: '\f026'} /*  */
122
- .octicon-issue-reopened:before { content: '\f027'} /*  */
123
- .octicon-jersey:before { content: '\f019'} /*  */
124
- .octicon-jump-down:before { content: '\f072'} /*  */
125
- .octicon-jump-left:before { content: '\f0a5'} /*  */
126
- .octicon-jump-right:before { content: '\f0a6'} /*  */
127
- .octicon-jump-up:before { content: '\f073'} /*  */
128
- .octicon-key:before { content: '\f049'} /*  */
129
- .octicon-keyboard:before { content: '\f00d'} /*  */
130
- .octicon-law:before { content: '\f0d8'} /*  */
131
- .octicon-light-bulb:before { content: '\f000'} /*  */
132
- .octicon-link:before { content: '\f05c'} /*  */
133
- .octicon-link-external:before { content: '\f07f'} /*  */
134
- .octicon-list-ordered:before { content: '\f062'} /*  */
135
- .octicon-list-unordered:before { content: '\f061'} /*  */
136
- .octicon-location:before { content: '\f060'} /*  */
137
- .octicon-gist-private:before,
138
- .octicon-mirror-private:before,
139
- .octicon-git-fork-private:before,
140
- .octicon-lock:before { content: '\f06a'} /*  */
141
- .octicon-logo-github:before { content: '\f092'} /*  */
142
- .octicon-mail:before { content: '\f03b'} /*  */
143
- .octicon-mail-read:before { content: '\f03c'} /*  */
144
- .octicon-mail-reply:before { content: '\f051'} /*  */
145
- .octicon-mark-github:before { content: '\f00a'} /*  */
146
- .octicon-markdown:before { content: '\f0c9'} /*  */
147
- .octicon-megaphone:before { content: '\f077'} /*  */
148
- .octicon-mention:before { content: '\f0be'} /*  */
149
- .octicon-microscope:before { content: '\f089'} /*  */
150
- .octicon-milestone:before { content: '\f075'} /*  */
151
- .octicon-mirror-public:before,
152
- .octicon-mirror:before { content: '\f024'} /*  */
153
- .octicon-mortar-board:before { content: '\f0d7'} /*  */
154
- .octicon-move-down:before { content: '\f0a8'} /*  */
155
- .octicon-move-left:before { content: '\f074'} /*  */
156
- .octicon-move-right:before { content: '\f0a9'} /*  */
157
- .octicon-move-up:before { content: '\f0a7'} /*  */
158
- .octicon-mute:before { content: '\f080'} /*  */
159
- .octicon-no-newline:before { content: '\f09c'} /*  */
160
- .octicon-octoface:before { content: '\f008'} /*  */
161
- .octicon-organization:before { content: '\f037'} /*  */
162
- .octicon-package:before { content: '\f0c4'} /*  */
163
- .octicon-paintcan:before { content: '\f0d1'} /*  */
164
- .octicon-pencil:before { content: '\f058'} /*  */
165
- .octicon-person-add:before,
166
- .octicon-person-follow:before,
167
- .octicon-person:before { content: '\f018'} /*  */
168
- .octicon-pin:before { content: '\f041'} /*  */
169
- .octicon-playback-fast-forward:before { content: '\f0bd'} /*  */
170
- .octicon-playback-pause:before { content: '\f0bb'} /*  */
171
- .octicon-playback-play:before { content: '\f0bf'} /*  */
172
- .octicon-playback-rewind:before { content: '\f0bc'} /*  */
173
- .octicon-plug:before { content: '\f0d4'} /*  */
174
- .octicon-repo-create:before,
175
- .octicon-gist-new:before,
176
- .octicon-file-directory-create:before,
177
- .octicon-file-add:before,
178
- .octicon-plus:before { content: '\f05d'} /*  */
179
- .octicon-podium:before { content: '\f0af'} /*  */
180
- .octicon-primitive-dot:before { content: '\f052'} /*  */
181
- .octicon-primitive-square:before { content: '\f053'} /*  */
182
- .octicon-pulse:before { content: '\f085'} /*  */
183
- .octicon-puzzle:before { content: '\f0c0'} /*  */
184
- .octicon-question:before { content: '\f02c'} /*  */
185
- .octicon-quote:before { content: '\f063'} /*  */
186
- .octicon-radio-tower:before { content: '\f030'} /*  */
187
- .octicon-repo-delete:before,
188
- .octicon-repo:before { content: '\f001'} /*  */
189
- .octicon-repo-clone:before { content: '\f04c'} /*  */
190
- .octicon-repo-force-push:before { content: '\f04a'} /*  */
191
- .octicon-gist-fork:before,
192
- .octicon-repo-forked:before { content: '\f002'} /*  */
193
- .octicon-repo-pull:before { content: '\f006'} /*  */
194
- .octicon-repo-push:before { content: '\f005'} /*  */
195
- .octicon-rocket:before { content: '\f033'} /*  */
196
- .octicon-rss:before { content: '\f034'} /*  */
197
- .octicon-ruby:before { content: '\f047'} /*  */
198
- .octicon-screen-full:before { content: '\f066'} /*  */
199
- .octicon-screen-normal:before { content: '\f067'} /*  */
200
- .octicon-search-save:before,
201
- .octicon-search:before { content: '\f02e'} /*  */
202
- .octicon-server:before { content: '\f097'} /*  */
203
- .octicon-settings:before { content: '\f07c'} /*  */
204
- .octicon-log-in:before,
205
- .octicon-sign-in:before { content: '\f036'} /*  */
206
- .octicon-log-out:before,
207
- .octicon-sign-out:before { content: '\f032'} /*  */
208
- .octicon-split:before { content: '\f0c6'} /*  */
209
- .octicon-squirrel:before { content: '\f0b2'} /*  */
210
- .octicon-star-add:before,
211
- .octicon-star-delete:before,
212
- .octicon-star:before { content: '\f02a'} /*  */
213
- .octicon-steps:before { content: '\f0c7'} /*  */
214
- .octicon-stop:before { content: '\f08f'} /*  */
215
- .octicon-repo-sync:before,
216
- .octicon-sync:before { content: '\f087'} /*  */
217
- .octicon-tag-remove:before,
218
- .octicon-tag-add:before,
219
- .octicon-tag:before { content: '\f015'} /*  */
220
- .octicon-telescope:before { content: '\f088'} /*  */
221
- .octicon-terminal:before { content: '\f0c8'} /*  */
222
- .octicon-three-bars:before { content: '\f05e'} /*  */
223
- .octicon-thumbsdown:before { content: '\f0db'} /*  */
224
- .octicon-thumbsup:before { content: '\f0da'} /*  */
225
- .octicon-tools:before { content: '\f031'} /*  */
226
- .octicon-trashcan:before { content: '\f0d0'} /*  */
227
- .octicon-triangle-down:before { content: '\f05b'} /*  */
228
- .octicon-triangle-left:before { content: '\f044'} /*  */
229
- .octicon-triangle-right:before { content: '\f05a'} /*  */
230
- .octicon-triangle-up:before { content: '\f0aa'} /*  */
231
- .octicon-unfold:before { content: '\f039'} /*  */
232
- .octicon-unmute:before { content: '\f0ba'} /*  */
233
- .octicon-versions:before { content: '\f064'} /*  */
234
- .octicon-remove-close:before,
235
- .octicon-x:before { content: '\f081'} /*  */
236
- .octicon-zap:before { content: '\26A1'} /* ⚡ */