flipper-ui 0.21.0.rc1 → 0.22.1

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/docs/ui/README.md +1 -1
  3. data/examples/ui/authorization.ru +12 -50
  4. data/examples/ui/basic.ru +12 -23
  5. data/lib/flipper/ui/action.rb +48 -1
  6. data/lib/flipper/ui/actions/actors_gate.rb +1 -1
  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/decorators/feature.rb +3 -3
  13. data/lib/flipper/ui/middleware.rb +2 -1
  14. data/lib/flipper/ui/public/css/application.css +7 -0
  15. data/lib/flipper/ui/views/feature.erb +3 -3
  16. data/lib/flipper/ui/views/features.erb +1 -1
  17. data/lib/flipper/ui/views/layout.erb +4 -5
  18. data/lib/flipper/ui.rb +2 -2
  19. data/lib/flipper/version.rb +1 -1
  20. data/spec/flipper/ui/actions/actors_gate_spec.rb +19 -2
  21. data/spec/flipper/ui/actions/boolean_gate_spec.rb +18 -0
  22. data/spec/flipper/ui/actions/feature_spec.rb +18 -0
  23. data/spec/flipper/ui/actions/features_spec.rb +16 -3
  24. data/spec/flipper/ui/actions/file_spec.rb +0 -10
  25. data/spec/flipper/ui/actions/groups_gate_spec.rb +20 -3
  26. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +18 -1
  27. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +18 -1
  28. data/spec/flipper/ui_spec.rb +0 -13
  29. metadata +6 -14
  30. data/lib/flipper/ui/public/octicons/LICENSE.txt +0 -9
  31. data/lib/flipper/ui/public/octicons/README.md +0 -1
  32. data/lib/flipper/ui/public/octicons/octicons-local.ttf +0 -0
  33. data/lib/flipper/ui/public/octicons/octicons.css +0 -236
  34. data/lib/flipper/ui/public/octicons/octicons.eot +0 -0
  35. data/lib/flipper/ui/public/octicons/octicons.svg +0 -200
  36. data/lib/flipper/ui/public/octicons/octicons.ttf +0 -0
  37. data/lib/flipper/ui/public/octicons/octicons.woff +0 -0
@@ -31,6 +31,24 @@ RSpec.describe Flipper::UI::Actions::BooleanGate do
31
31
  end
32
32
  end
33
33
 
34
+ context "with space in feature name" do
35
+ before do
36
+ flipper.disable :search
37
+ post 'features/sp%20ace/boolean',
38
+ { 'action' => 'Enable', 'authenticity_token' => token },
39
+ 'rack.session' => session
40
+ end
41
+
42
+ it 'updates feature' do
43
+ expect(flipper.enabled?("sp ace")).to be(true)
44
+ end
45
+
46
+ it 'redirects back to feature' do
47
+ expect(last_response.status).to be(302)
48
+ expect(last_response.headers['Location']).to eq('/features/sp%20ace')
49
+ end
50
+ end
51
+
34
52
  context 'with disable' do
35
53
  before do
36
54
  flipper.enable :search
@@ -29,6 +29,24 @@ RSpec.describe Flipper::UI::Actions::Feature do
29
29
  expect(last_response.headers['Location']).to eq('/features')
30
30
  end
31
31
 
32
+ context "with space in feature name" do
33
+ before do
34
+ flipper.enable "sp ace"
35
+ delete '/features/sp%20ace',
36
+ { 'authenticity_token' => token },
37
+ 'rack.session' => session
38
+ end
39
+
40
+ it 'removes feature' do
41
+ expect(flipper.features.map(&:key)).not_to include('sp ace')
42
+ end
43
+
44
+ it 'redirects to features' do
45
+ expect(last_response.status).to be(302)
46
+ expect(last_response.headers['Location']).to eq('/features')
47
+ end
48
+ end
49
+
32
50
  context 'when feature_removal_enabled is set to false' do
33
51
  around do |example|
34
52
  begin
@@ -95,7 +95,7 @@ RSpec.describe Flipper::UI::Actions::Features do
95
95
  expect(last_response.headers['Location']).to eq('/features/notifications_next')
96
96
  end
97
97
 
98
- context 'feature name contains whitespace' do
98
+ context 'feature name has whitespace at beginning and end' do
99
99
  let(:feature_name) { ' notifications_next ' }
100
100
 
101
101
  it 'adds feature without whitespace' do
@@ -103,6 +103,19 @@ RSpec.describe Flipper::UI::Actions::Features do
103
103
  end
104
104
  end
105
105
 
106
+ context 'feature name contains space' do
107
+ let(:feature_name) { 'notifications next' }
108
+
109
+ it 'adds feature with space' do
110
+ expect(flipper.features.map(&:key)).to include('notifications next')
111
+ end
112
+
113
+ it 'redirects to feature' do
114
+ expect(last_response.status).to be(302)
115
+ expect(last_response.headers['Location']).to eq('/features/notifications%20next')
116
+ end
117
+ end
118
+
106
119
  context 'for an invalid feature name' do
107
120
  context 'empty feature name' do
108
121
  let(:feature_name) { '' }
@@ -113,7 +126,7 @@ RSpec.describe Flipper::UI::Actions::Features do
113
126
 
114
127
  it 'redirects back to feature' do
115
128
  expect(last_response.status).to be(302)
116
- expect(last_response.headers['Location']).to eq('/features/new?error=%22%22+is+not+a+valid+feature+name.')
129
+ expect(last_response.headers['Location']).to eq('/features/new?error=%22%22%20is%20not%20a%20valid%20feature%20name.')
117
130
  end
118
131
  end
119
132
 
@@ -126,7 +139,7 @@ RSpec.describe Flipper::UI::Actions::Features do
126
139
 
127
140
  it 'redirects back to feature' do
128
141
  expect(last_response.status).to be(302)
129
- expect(last_response.headers['Location']).to eq('/features/new?error=%22%22+is+not+a+valid+feature+name.')
142
+ expect(last_response.headers['Location']).to eq('/features/new?error=%22%22%20is%20not%20a%20valid%20feature%20name.')
130
143
  end
131
144
  end
132
145
  end
@@ -20,14 +20,4 @@ RSpec.describe Flipper::UI::Actions::File do
20
20
  expect(last_response.status).to be(200)
21
21
  end
22
22
  end
23
-
24
- describe 'GET /octicons/octicons.eot' do
25
- before do
26
- get '/octicons/octicons.eot'
27
- end
28
-
29
- it 'responds with 200' do
30
- expect(last_response.status).to be(200)
31
- end
32
- end
33
23
  end
@@ -60,6 +60,23 @@ RSpec.describe Flipper::UI::Actions::GroupsGate do
60
60
  expect(last_response.headers['Location']).to eq('/features/search')
61
61
  end
62
62
 
63
+ context 'feature name contains space' do
64
+ before do
65
+ post 'features/sp%20ace/groups',
66
+ { 'value' => group_name, 'operation' => 'enable', 'authenticity_token' => token },
67
+ 'rack.session' => session
68
+ end
69
+
70
+ it 'adds item to members' do
71
+ expect(flipper["sp ace"].groups_value).to include('admins')
72
+ end
73
+
74
+ it 'redirects back to feature' do
75
+ expect(last_response.status).to be(302)
76
+ expect(last_response.headers['Location']).to eq('/features/sp%20ace')
77
+ end
78
+ end
79
+
63
80
  context 'group name contains whitespace' do
64
81
  let(:group_name) { ' admins ' }
65
82
 
@@ -74,7 +91,7 @@ RSpec.describe Flipper::UI::Actions::GroupsGate do
74
91
 
75
92
  it 'redirects back to feature' do
76
93
  expect(last_response.status).to be(302)
77
- expect(last_response.headers['Location']).to eq('/features/search/groups?error=The+group+named+%22not_here%22+has+not+been+registered.')
94
+ expect(last_response.headers['Location']).to eq('/features/search/groups?error=The%20group%20named%20%22not_here%22%20has%20not%20been%20registered.')
78
95
  end
79
96
  end
80
97
 
@@ -83,7 +100,7 @@ RSpec.describe Flipper::UI::Actions::GroupsGate do
83
100
 
84
101
  it 'redirects back to feature' do
85
102
  expect(last_response.status).to be(302)
86
- expect(last_response.headers['Location']).to eq('/features/search/groups?error=The+group+named+%22%22+has+not+been+registered.')
103
+ expect(last_response.headers['Location']).to eq('/features/search/groups?error=The%20group%20named%20%22%22%20has%20not%20been%20registered.')
87
104
  end
88
105
  end
89
106
 
@@ -92,7 +109,7 @@ RSpec.describe Flipper::UI::Actions::GroupsGate do
92
109
 
93
110
  it 'redirects back to feature' do
94
111
  expect(last_response.status).to be(302)
95
- expect(last_response.headers['Location']).to eq('/features/search/groups?error=The+group+named+%22%22+has+not+been+registered.')
112
+ expect(last_response.headers['Location']).to eq('/features/search/groups?error=The%20group%20named%20%22%22%20has%20not%20been%20registered.')
96
113
  end
97
114
  end
98
115
  end
@@ -30,6 +30,23 @@ RSpec.describe Flipper::UI::Actions::PercentageOfActorsGate do
30
30
  end
31
31
  end
32
32
 
33
+ context 'with space in feature name' do
34
+ before do
35
+ post 'features/sp%20ace/percentage_of_actors',
36
+ { 'value' => '24', 'authenticity_token' => token },
37
+ 'rack.session' => session
38
+ end
39
+
40
+ it 'enables the feature' do
41
+ expect(flipper["sp ace"].percentage_of_actors_value).to be(24)
42
+ end
43
+
44
+ it 'redirects back to feature' do
45
+ expect(last_response.status).to be(302)
46
+ expect(last_response.headers['Location']).to eq('/features/sp%20ace')
47
+ end
48
+ end
49
+
33
50
  context 'with invalid value' do
34
51
  before do
35
52
  post 'features/search/percentage_of_actors',
@@ -43,7 +60,7 @@ RSpec.describe Flipper::UI::Actions::PercentageOfActorsGate do
43
60
 
44
61
  it 'redirects back to feature' do
45
62
  expect(last_response.status).to be(302)
46
- expect(last_response.headers['Location']).to eq('/features/search?error=Invalid+percentage+of+actors+value%3A+value+must+be+a+positive+number+less+than+or+equal+to+100%2C+but+was+555')
63
+ expect(last_response.headers['Location']).to eq('/features/search?error=Invalid%20percentage%20of%20actors%20value:%20value%20must%20be%20a%20positive%20number%20less%20than%20or%20equal%20to%20100,%20but%20was%20555')
47
64
  end
48
65
  end
49
66
  end
@@ -30,6 +30,23 @@ RSpec.describe Flipper::UI::Actions::PercentageOfTimeGate do
30
30
  end
31
31
  end
32
32
 
33
+ context 'with space in feature name' do
34
+ before do
35
+ post 'features/sp%20ace/percentage_of_time',
36
+ { 'value' => '24', 'authenticity_token' => token },
37
+ 'rack.session' => session
38
+ end
39
+
40
+ it 'enables the feature' do
41
+ expect(flipper["sp ace"].percentage_of_time_value).to be(24)
42
+ end
43
+
44
+ it 'redirects back to feature' do
45
+ expect(last_response.status).to be(302)
46
+ expect(last_response.headers['Location']).to eq('/features/sp%20ace')
47
+ end
48
+ end
49
+
33
50
  context 'with invalid value' do
34
51
  before do
35
52
  post 'features/search/percentage_of_time',
@@ -43,7 +60,7 @@ RSpec.describe Flipper::UI::Actions::PercentageOfTimeGate do
43
60
 
44
61
  it 'redirects back to feature' do
45
62
  expect(last_response.status).to be(302)
46
- expect(last_response.headers['Location']).to eq('/features/search?error=Invalid+percentage+of+time+value%3A+value+must+be+a+positive+number+less+than+or+equal+to+100%2C+but+was+555')
63
+ expect(last_response.headers['Location']).to eq('/features/search?error=Invalid%20percentage%20of%20time%20value:%20value%20must%20be%20a%20positive%20number%20less%20than%20or%20equal%20to%20100,%20but%20was%20555')
47
64
  end
48
65
  end
49
66
  end
@@ -24,19 +24,6 @@ RSpec.describe Flipper::UI do
24
24
  end
25
25
  end
26
26
 
27
- describe 'Initializing middleware lazily with a block' do
28
- let(:app) do
29
- build_app(-> { flipper })
30
- end
31
-
32
- it 'works' do
33
- flipper.enable :some_great_feature
34
- get '/features'
35
- expect(last_response.status).to be(200)
36
- expect(last_response.body).to include('some_great_feature')
37
- end
38
- end
39
-
40
27
  describe 'Request method unsupported by action' do
41
28
  it 'raises error' do
42
29
  expect do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper-ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0.rc1
4
+ version: 0.22.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-01 00:00:00.000000000 Z
11
+ date: 2021-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -56,14 +56,14 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 0.21.0.rc1
59
+ version: 0.22.1
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: 0.21.0.rc1
66
+ version: 0.22.1
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: erubi
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -123,14 +123,6 @@ files:
123
123
  - lib/flipper/ui/public/css/application.css
124
124
  - lib/flipper/ui/public/images/logo.png
125
125
  - lib/flipper/ui/public/js/application.js
126
- - lib/flipper/ui/public/octicons/LICENSE.txt
127
- - lib/flipper/ui/public/octicons/README.md
128
- - lib/flipper/ui/public/octicons/octicons-local.ttf
129
- - lib/flipper/ui/public/octicons/octicons.css
130
- - lib/flipper/ui/public/octicons/octicons.eot
131
- - lib/flipper/ui/public/octicons/octicons.svg
132
- - lib/flipper/ui/public/octicons/octicons.ttf
133
- - lib/flipper/ui/public/octicons/octicons.woff
134
126
  - lib/flipper/ui/util.rb
135
127
  - lib/flipper/ui/views/add_actor.erb
136
128
  - lib/flipper/ui/views/add_feature.erb
@@ -173,9 +165,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
173
165
  version: '0'
174
166
  required_rubygems_version: !ruby/object:Gem::Requirement
175
167
  requirements:
176
- - - ">"
168
+ - - ">="
177
169
  - !ruby/object:Gem::Version
178
- version: 1.3.1
170
+ version: '0'
179
171
  requirements: []
180
172
  rubygems_version: 3.0.3
181
173
  signing_key:
@@ -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'} /* ⚡ */