flipper-ui 0.21.0.rc1 → 0.22.1

Sign up to get free protection for your applications and to get access to all the features.
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'} /* ⚡ */