apress-documentation 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.drone.yml +28 -0
- data/.gitignore +10 -0
- data/Appraisals +30 -0
- data/CHANGELOG.md +34 -0
- data/Gemfile +4 -0
- data/README.md +101 -0
- data/Rakefile +6 -0
- data/app/assets/javascripts/package/documentation.js +18 -0
- data/app/assets/javascripts/shared/dependency_switcher.js +10 -0
- data/app/assets/javascripts/swagger_binder.js +19 -0
- data/app/assets/javascripts/swagger_ui.js +24 -0
- data/app/assets/javascripts/templates/document.hamlbars +25 -0
- data/app/assets/stylesheets/document/base.scss +112 -0
- data/app/assets/stylesheets/document/document.scss +19 -0
- data/app/assets/stylesheets/document/layout.scss +9 -0
- data/app/assets/stylesheets/document/sidebar.scss +19 -0
- data/app/assets/stylesheets/document/swagger.scss +3 -0
- data/app/assets/stylesheets/document/switch.scss +46 -0
- data/app/assets/stylesheets/document/variables.scss +26 -0
- data/app/assets/stylesheets/package/documentation.css +9 -0
- data/app/assets/stylesheets/package/swagger_print.css +4 -0
- data/app/assets/stylesheets/package/swagger_screen.css +4 -0
- data/app/controllers/apress/documentation/documents_controller.rb +14 -0
- data/app/controllers/apress/documentation/swagger_controller.rb +22 -0
- data/app/controllers/apress/documentation/swagger_ui_controller.rb +11 -0
- data/app/controllers/concerns/apress/documentation/preload_docs.rb +20 -0
- data/app/helpers/apress/documentation/documents_helper.rb +14 -0
- data/app/presenters/apress/documentation/dependency_presenter.rb +75 -0
- data/app/services/apress/documentation/swagger_json_builder.rb +22 -0
- data/app/views/apress/documentation/documents/_document.html.haml +32 -0
- data/app/views/apress/documentation/documents/_swagger.html.haml +10 -0
- data/app/views/apress/documentation/documents/show.html.haml +13 -0
- data/app/views/apress/documentation/presenters/dependency_presenter/_dependencies.html.haml +21 -0
- data/app/views/apress/documentation/presenters/dependency_presenter/_links.html.haml +17 -0
- data/app/views/apress/documentation/swagger_ui/show.html.haml +26 -0
- data/app/views/layouts/apress/documentation/_menu.html.haml +6 -0
- data/app/views/layouts/apress/documentation/_menu_item.html.haml +7 -0
- data/app/views/layouts/apress/documentation/_sidebar.html.haml +2 -0
- data/app/views/layouts/documentation.html.haml +17 -0
- data/apress-documentation.gemspec +35 -0
- data/config/routes.rb +16 -0
- data/dip.yml +48 -0
- data/docker-compose.development.yml +18 -0
- data/docker-compose.drone.yml +7 -0
- data/docker-compose.yml +10 -0
- data/lib/apress/documentation.rb +48 -0
- data/lib/apress/documentation/dsl/compilers/base_compiler.rb +32 -0
- data/lib/apress/documentation/dsl/compilers/document_compiler.rb +111 -0
- data/lib/apress/documentation/dsl/compilers/mixins/dependable.rb +31 -0
- data/lib/apress/documentation/dsl/compilers/mixins/publicity.rb +34 -0
- data/lib/apress/documentation/dsl/compilers/swagger_compiler.rb +25 -0
- data/lib/apress/documentation/dsl/document.rb +14 -0
- data/lib/apress/documentation/dsl/modules.rb +40 -0
- data/lib/apress/documentation/dsl/swagger_document.rb +14 -0
- data/lib/apress/documentation/dsl/utils/swagger_bind_point_extractor.rb +37 -0
- data/lib/apress/documentation/engine.rb +16 -0
- data/lib/apress/documentation/extensions/rgl/adjacency.rb +18 -0
- data/lib/apress/documentation/storage/base_storage.rb +88 -0
- data/lib/apress/documentation/storage/dependency_graph.rb +96 -0
- data/lib/apress/documentation/storage/document.rb +52 -0
- data/lib/apress/documentation/storage/modules.rb +83 -0
- data/lib/apress/documentation/storage/swagger_document.rb +62 -0
- data/lib/apress/documentation/swagger/schema.rb +39 -0
- data/lib/apress/documentation/version.rb +5 -0
- data/spec/app/controllers/documents_controller_spec.rb +42 -0
- data/spec/app/controllers/swagger_controller_spec.rb +46 -0
- data/spec/app/controllers/swagger_ui_controller_spec.rb +11 -0
- data/spec/app/services/swagger_json_builder_spec.rb +41 -0
- data/spec/apress/documentation_spec.rb +342 -0
- data/spec/helpers/apress/documentation/documents_helper_spec.rb +17 -0
- data/spec/internal/app/docs/swagger/root.rb +7 -0
- data/spec/internal/config/database.yml +7 -0
- data/spec/internal/config/environments/test.rb +1 -0
- data/spec/internal/config/hosts.rb +1 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/lib/stub_docs/module.rb +3 -0
- data/spec/internal/lib/stub_docs/module/document/child_document.rb +7 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/presenters/apress/documentation/dependency_presenter_spec.rb +139 -0
- data/spec/spec_helper.rb +27 -0
- metadata +335 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b3884b3865d68ccbb735759200cfc3833e7747c5
|
4
|
+
data.tar.gz: b03241bacd2cd463a790e214d689cebdfc4b2044
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fa018cf839ed6b3d33d78af959ac566b12804560d46f61a2f08cec83477599d1f41def643de73b3a025ff28150bdef6b06567dfbb070ef54a53f78cf4449668a
|
7
|
+
data.tar.gz: 296e6b6572a6325fb1ff9b7650225c69d86cda31d2de703721084f5527b78d2883f44dae2a7cc36ff9cbcb6c49455577373077b4029f6db70f31ef7973c89a20
|
data/.drone.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
build:
|
2
|
+
test:
|
3
|
+
image: abakpress/dind-testing
|
4
|
+
pull: true
|
5
|
+
privileged: true
|
6
|
+
volumes:
|
7
|
+
- /home/data/drone/images:/images
|
8
|
+
- /home/data/drone/gems:/bundle
|
9
|
+
environment:
|
10
|
+
- COMPOSE_FILE_EXT=drone
|
11
|
+
- RUBY_IMAGE_TAG=2.2-latest
|
12
|
+
commands:
|
13
|
+
- wrapdocker docker -v
|
14
|
+
|
15
|
+
- fetch-images --image abakpress/ruby-app:$RUBY_IMAGE_TAG
|
16
|
+
- dip provision
|
17
|
+
- dip rspec
|
18
|
+
|
19
|
+
release:
|
20
|
+
image: abakpress/gem-publication
|
21
|
+
pull: true
|
22
|
+
when:
|
23
|
+
event: push
|
24
|
+
branch: master
|
25
|
+
volumes:
|
26
|
+
- /home/data/drone/rubygems:/root/.gem
|
27
|
+
commands:
|
28
|
+
- release-gem --public
|
data/.gitignore
ADDED
data/Appraisals
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
appraise 'rails3.2' do
|
2
|
+
gem 'rails', '>= 3.2', '< 4.0'
|
3
|
+
end
|
4
|
+
|
5
|
+
appraise 'rails4.0' do
|
6
|
+
gem 'rails', '>= 4.0', '< 4.1'
|
7
|
+
end
|
8
|
+
|
9
|
+
appraise 'rails4.1' do
|
10
|
+
gem 'rails', '>= 4.1', '< 4.2'
|
11
|
+
end
|
12
|
+
|
13
|
+
appraise 'rails4.2' do
|
14
|
+
gem 'rails', '>= 4.2', '< 5.0'
|
15
|
+
end
|
16
|
+
|
17
|
+
appraise 'rails5.0' do
|
18
|
+
gem 'rails', '>= 5.0', '< 5.1'
|
19
|
+
gem 'rails-controller-testing'
|
20
|
+
end
|
21
|
+
|
22
|
+
appraise 'rails5.1' do
|
23
|
+
gem 'rails', '~> 5.1.0'
|
24
|
+
gem 'rails-controller-testing'
|
25
|
+
end
|
26
|
+
|
27
|
+
appraise 'rails5.2' do
|
28
|
+
gem 'rails', '~> 5.2.0'
|
29
|
+
gem 'rails-controller-testing'
|
30
|
+
end
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# v0.4.0
|
2
|
+
|
3
|
+
* 2018-08-22 [2d3b37b](../../commit/2d3b37b) - __(Artem Napolskih)__ chore: Add automatic publication
|
4
|
+
* 2018-08-21 [c419339](../../commit/c419339) - __(Artem Napolskih)__ fix: removes dependence on abak domain system
|
5
|
+
* 2018-08-21 [dddd8ea](../../commit/dddd8ea) - __(Artem Napolskih)__ feature: rails 5.x support added
|
6
|
+
|
7
|
+
# v0.3.0
|
8
|
+
|
9
|
+
* 2018-06-06 [386ff0e](../../commit/386ff0e) - __(Maxim Tretyakov)__ feat: route scope option
|
10
|
+
https://jira.railsc.ru/browse/ORDERS-1786
|
11
|
+
|
12
|
+
# v0.2.1
|
13
|
+
|
14
|
+
* 2017-09-27 [beec36c](../../commit/beec36c) - __(Denis Korobicyn)__ fix: proper cache key
|
15
|
+
|
16
|
+
# v0.2.0
|
17
|
+
|
18
|
+
* 2017-07-31 [ad4e903](../../commit/ad4e903) - __(Denis Korobicyn)__ fix: dependencies for swagger documents
|
19
|
+
https://jira.railsc.ru/browse/PC4-19812
|
20
|
+
|
21
|
+
* 2017-05-19 [6b3e186](../../commit/6b3e186) - __(Denis Korobicyn)__ feature: modules connections
|
22
|
+
https://jira.railsc.ru/browse/PC4-19783
|
23
|
+
|
24
|
+
* 2017-05-12 [9064dc6](../../commit/9064dc6) - __(Denis Korobicyn)__ fix: assets compilation
|
25
|
+
https://jira.railsc.ru/browse/PC4-19468
|
26
|
+
|
27
|
+
* 2017-05-10 [62fe08a](../../commit/62fe08a) - __(Denis Korobicyn)__ chore: add missing load_hook for documents_controller
|
28
|
+
* 2017-05-04 [fd80fa6](../../commit/fd80fa6) - __(Denis Korobicyn)__ chore: add load_docs_for method
|
29
|
+
* 2017-05-03 [87005d6](../../commit/87005d6) - __(Denis Korobicyn)__ fix: repo url in gemspec and repo name in readme
|
30
|
+
|
31
|
+
# v0.1.0
|
32
|
+
|
33
|
+
* 2017-04-21 [3c66be9](../../commit/3c66be9) - __(Denis Korobicyn)__ Initial commit
|
34
|
+
* 2017-04-21 [db97835](../../commit/db97835) - __(Mamedaliev Kirill)__ Initial commit
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# Apress::Documentation
|
2
|
+
|
3
|
+
|
4
|
+
## Установка
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
gem 'apress-documentation'
|
8
|
+
```
|
9
|
+
|
10
|
+
## Использвание
|
11
|
+
|
12
|
+
Описание любого компонена задается с помощью вызова метода build на главном модуле `Apress::Documentation` и передаче ему блока. Например,
|
13
|
+
```
|
14
|
+
Apress::Documentation.build(:module_name, title: 'название модуля') do
|
15
|
+
document(:component, title: 'Название компонента') do
|
16
|
+
description 'test'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
в самом блоке могут быть вызваны методы document, name, description, business_desc, consumers, publicity, tests, swagger_bind.
|
22
|
+
|
23
|
+
#### Описания методов
|
24
|
+
`document` определеяет весь документ, является частью построения меню (на каждый документ создается ссылка), данный метод можно вызвать друг друге, например:
|
25
|
+
```ruby
|
26
|
+
Apress::Documentation.build(:module_name, title: 'название модуля') do
|
27
|
+
document(:component, title: 'Название компонента') do
|
28
|
+
description 'test'
|
29
|
+
|
30
|
+
document(:nested_component, title: 'Вложенный документ') do
|
31
|
+
description 'test here'
|
32
|
+
publicity 'Закрытый'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
также `document` можно вызывать без блока, если нет неообходимости:
|
39
|
+
```ruby
|
40
|
+
Apress::Documentation.build(:module_name, title: 'название модуля') do
|
41
|
+
document(:component, title: 'Простой компонент соящий упоминания')
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
`title` - имя компонента.
|
46
|
+
|
47
|
+
`description` - описание компонента.
|
48
|
+
|
49
|
+
`business_desc` - бизнес-описание компонента, заполняется менеджером.
|
50
|
+
|
51
|
+
`consumers` - перечесление модулей-потребителей.
|
52
|
+
|
53
|
+
`tests` - есть ли тесты на компонент, когда были написаны, в рамках какой задачи.
|
54
|
+
|
55
|
+
`publicity` - публичность компонента, возможность использования его в других местах, рекомендованные значения -
|
56
|
+
"Защищеный", "Публичный".
|
57
|
+
|
58
|
+
`swagger_bind` реализует возможность дополнить swagger-ui.
|
59
|
+
разрешенные методы - business_desc, consumers, tests и publicity.
|
60
|
+
Пример использования:
|
61
|
+
```ruby
|
62
|
+
Apress::Documentation.build(:module_name, title: 'название модуля') do
|
63
|
+
document(:http_api, title: 'HTTP API') do
|
64
|
+
# аргумент id HTML блока в который будет ставлена доп. инфа
|
65
|
+
swagger_bind('module_operationID_content') do
|
66
|
+
description 'Это апи нужно для того-то'
|
67
|
+
|
68
|
+
consumers 'Other module'
|
69
|
+
|
70
|
+
# тут обычное swagger описание
|
71
|
+
swagger_path('some/path/here') do
|
72
|
+
operation :get do
|
73
|
+
# важно чтобы operation_id и tags совпадали в аргументе swagger_bind
|
74
|
+
key :operationId, 'operationID'
|
75
|
+
key :tags, ['module']
|
76
|
+
|
77
|
+
...
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# также аргумент HTML id можно опускать, если operationId и tags заданы
|
83
|
+
swagger_bind do
|
84
|
+
description 'Это апи нужно для того-то'
|
85
|
+
|
86
|
+
consumers 'Other module'
|
87
|
+
|
88
|
+
# тут обычное swagger описание
|
89
|
+
swagger_path('some/path/here') do
|
90
|
+
operation :get do
|
91
|
+
# Автоматически поддянет значения и создат HTML id - module_operationID_content
|
92
|
+
key :operationId, 'operationID'
|
93
|
+
key :tags, ['module']
|
94
|
+
|
95
|
+
...
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
//= require swagger-ui/lib/jquery-1.8.0.min.js
|
2
|
+
//= require swagger-ui/lib/jquery.slideto.min.js
|
3
|
+
//= require swagger-ui/lib/jquery.wiggle.min.js
|
4
|
+
//= require swagger-ui/lib/jquery.ba-bbq.min.js
|
5
|
+
//= require swagger-ui/lib/handlebars-2.0.0.js
|
6
|
+
//= require swagger-ui/lib/underscore-min.js
|
7
|
+
//= require swagger-ui/lib/backbone-min.js
|
8
|
+
//= require swagger-ui/lib/jsoneditor.min.js
|
9
|
+
//= require swagger-ui/lib/highlight.7.3.pack.js
|
10
|
+
//= require swagger-ui/lib/marked.js
|
11
|
+
//= require swagger-ui/lib/swagger-oauth.js
|
12
|
+
//= require swagger-ui/swagger-ui.js
|
13
|
+
//= require swagger_ui.js
|
14
|
+
//= require_tree ../templates
|
15
|
+
//= require shared/dependency_switcher.js
|
16
|
+
//= require swagger_binder.js
|
17
|
+
|
18
|
+
DependencySwitcher.switchBind();
|
@@ -0,0 +1,10 @@
|
|
1
|
+
var DependencySwitcher = (function(self) {
|
2
|
+
self.switchBind = function() {
|
3
|
+
$('.js-dependency-switch', '.js-dependencies-container').change(function() {
|
4
|
+
$('.js-all-dependencies', '.js-dependencies-container').toggle();
|
5
|
+
$('.js-dependencies', '.js-dependencies-container').toggle();
|
6
|
+
});
|
7
|
+
};
|
8
|
+
|
9
|
+
return self;
|
10
|
+
})(DependencySwitcher || {});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
$(function () {
|
2
|
+
Handlebars.registerHelper('fetch', function (value, def) {
|
3
|
+
return value || def;
|
4
|
+
});
|
5
|
+
|
6
|
+
$(document).on('swaggerBind', function(event) {
|
7
|
+
event.preventDefault();
|
8
|
+
|
9
|
+
if(!app.extensions) {
|
10
|
+
return;
|
11
|
+
}
|
12
|
+
|
13
|
+
for(var ext in app.extensions) {
|
14
|
+
$('#' + ext + '_content').prepend(HandlebarsTemplates['document']({document: app.extensions[ext]}));
|
15
|
+
}
|
16
|
+
|
17
|
+
DependencySwitcher.switchBind();
|
18
|
+
});
|
19
|
+
});
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$(function () {
|
2
|
+
if(app.swagger) {
|
3
|
+
window.swaggerUi = new SwaggerUi({
|
4
|
+
url: app.swagger.docsUrl,
|
5
|
+
dom_id: 'swagger-ui-container',
|
6
|
+
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
|
7
|
+
onComplete: function() {
|
8
|
+
$('pre code').each(function(i, e) {
|
9
|
+
hljs.highlightBlock(e);
|
10
|
+
});
|
11
|
+
|
12
|
+
$(document).trigger('swaggerBind');
|
13
|
+
},
|
14
|
+
onFailure: function() {
|
15
|
+
console.log('Unable to Load SwaggerUI');
|
16
|
+
},
|
17
|
+
docExpansion: (app.swagger.docsExpansion || 'none'),
|
18
|
+
jsonEditor: true,
|
19
|
+
defaultModelRendering: 'schema',
|
20
|
+
showRequestHeaders: true
|
21
|
+
});
|
22
|
+
window.swaggerUi.load();
|
23
|
+
}
|
24
|
+
});
|
@@ -0,0 +1,25 @@
|
|
1
|
+
%h4 Бизнесс описание
|
2
|
+
%span
|
3
|
+
{{fetch document.business_desc "Нет данных"}}
|
4
|
+
|
5
|
+
%h4 Публичность
|
6
|
+
%span
|
7
|
+
{{fetch document.publicity "Нет данных"}}
|
8
|
+
|
9
|
+
%h4 Тесты
|
10
|
+
%span
|
11
|
+
{{fetch document.tests "Нет данных"}}
|
12
|
+
|
13
|
+
%h4 Зависимости
|
14
|
+
.js-dependencies-container
|
15
|
+
.switch
|
16
|
+
%input.switch-checkbox.js-dependency-switch{type: "checkbox", id: "doc-switch-{{document.slug}}"}
|
17
|
+
%label.switch-label{for: "doc-switch-{{document.slug}}"}
|
18
|
+
%span.switch-inner
|
19
|
+
%span.switch-switch
|
20
|
+
|
21
|
+
%h5 Зависит от
|
22
|
+
{{{fetch document.depends_on "Нет данных"}}}
|
23
|
+
|
24
|
+
%h5 Используется в
|
25
|
+
{{{fetch document.consumers "Нет данных"}}}
|
@@ -0,0 +1,112 @@
|
|
1
|
+
@import 'variables';
|
2
|
+
|
3
|
+
* {
|
4
|
+
-webkit-font-smoothing: antialiased;
|
5
|
+
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
6
|
+
-moz-osx-font-smoothing: grayscale;
|
7
|
+
box-sizing: border-box;
|
8
|
+
|
9
|
+
&:focus,
|
10
|
+
&:active {
|
11
|
+
outline: none;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
body {
|
16
|
+
background-color: $body-bg;
|
17
|
+
color: $text-color;
|
18
|
+
font-family: $font-family;
|
19
|
+
font-size: $font-size;
|
20
|
+
line-height: $line-height;
|
21
|
+
}
|
22
|
+
|
23
|
+
h1,
|
24
|
+
h2,
|
25
|
+
h3,
|
26
|
+
h4,
|
27
|
+
h5,
|
28
|
+
h6 {
|
29
|
+
font-family: $font-family-headings;
|
30
|
+
font-weight: $headings-font-weight;
|
31
|
+
color: $heading-color;
|
32
|
+
line-height: $heading-line-heading;
|
33
|
+
margin: 1.6em 0 .8em;
|
34
|
+
}
|
35
|
+
|
36
|
+
h1 {
|
37
|
+
font-size: 1.5em;
|
38
|
+
border-bottom: 1px solid lighten($border-accent-color, 1%);
|
39
|
+
padding-bottom: .6em;
|
40
|
+
|
41
|
+
& > a {
|
42
|
+
& > img {
|
43
|
+
vertical-align: middle;
|
44
|
+
position: relative;
|
45
|
+
top: -2px;
|
46
|
+
margin-left: 1px;
|
47
|
+
height: 18px;
|
48
|
+
|
49
|
+
@media(max-width: $screen-sm-max) {
|
50
|
+
display: none;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
&:first-child {
|
55
|
+
& > img {
|
56
|
+
margin-left: 15px;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
h2 { font-size: 1.3em; }
|
63
|
+
h3 { font-size: 1.1em; }
|
64
|
+
h4 { font-size: 1em; }
|
65
|
+
h5 { font-size: .9em; }
|
66
|
+
h6 { font-size: .8em; }
|
67
|
+
|
68
|
+
p {
|
69
|
+
margin: 0 0 .8em;
|
70
|
+
}
|
71
|
+
|
72
|
+
a {
|
73
|
+
color: $link-color;
|
74
|
+
|
75
|
+
&:hover {
|
76
|
+
color: darken($link-color, 10%);
|
77
|
+
}
|
78
|
+
|
79
|
+
&,
|
80
|
+
&:hover {
|
81
|
+
text-decoration: none;
|
82
|
+
}
|
83
|
+
|
84
|
+
&[name] {
|
85
|
+
display: block;
|
86
|
+
padding-top: 15px;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
.content {
|
91
|
+
*:not(a) {
|
92
|
+
& > img:not([class]) {
|
93
|
+
border: 1px solid $border-accent-color;
|
94
|
+
padding: 4px;
|
95
|
+
background-color: #fff;
|
96
|
+
border-radius: 2px;
|
97
|
+
display: block;
|
98
|
+
max-width: 100%;
|
99
|
+
height: auto;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
ul:not([class]) {
|
104
|
+
li {
|
105
|
+
padding-bottom: 5px;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
.hidden {
|
111
|
+
display: none;
|
112
|
+
}
|