Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-06-02 21:10:01 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-06-02 21:10:01 +0300
commite84a2fdfc862ac63fe4be9df2f940c22a0c9aba3 (patch)
tree8a64589231ede24f385d2819b3440fca001e482d
parent1c2ff01b694fd06be15bc20279eef71ee5adf402 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml27
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml11
-rw-r--r--.stylelintrc1
-rw-r--r--app/assets/javascripts/emoji/awards_app/index.js2
-rw-r--r--app/assets/javascripts/emoji/components/picker.vue2
-rw-r--r--app/assets/javascripts/notes/components/note_actions.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/awards_list.vue6
-rw-r--r--app/assets/stylesheets/framework/awards.scss46
-rw-r--r--app/assets/stylesheets/framework/blocks.scss4
-rw-r--r--app/assets/stylesheets/pages/issuable.scss4
-rw-r--r--app/assets/stylesheets/pages/issues.scss8
-rw-r--r--app/assets/stylesheets/pages/login.scss4
-rw-r--r--app/assets/stylesheets/pages/search.scss1
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss1593
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss1241
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss2015
-rw-r--r--app/graphql/mutations/ci/runner/delete.rb44
-rw-r--r--app/graphql/types/mutation_type.rb1
-rw-r--r--app/helpers/groups_helper.rb8
-rw-r--r--app/services/ci/create_downstream_pipeline_service.rb12
-rw-r--r--app/views/groups/settings/ci_cd/_form.html.haml3
-rw-r--r--app/views/layouts/_head.html.haml2
-rw-r--r--app/views/layouts/_startup_css.haml3
-rw-r--r--app/views/layouts/devise.html.haml2
-rw-r--r--app/views/layouts/nav/sidebar/_group.html.haml2
-rw-r--r--app/views/projects/merge_requests/_awards_block.html.haml4
-rw-r--r--app/views/shared/issue_type/_emoji_block.html.haml2
-rw-r--r--app/views/shared/nav/_sidebar_menu.html.haml11
-rw-r--r--app/views/shared/nav/_sidebar_menu_collapsed.html.haml5
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb2
-rw-r--r--config/feature_flags/development/cached_sidebar_merge_requests_count.yml8
-rw-r--r--db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb7
-rw-r--r--db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb17
-rw-r--r--db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb17
-rw-r--r--db/schema_migrations/202105251849001
-rw-r--r--db/schema_migrations/202105261818201
-rw-r--r--db/schema_migrations/202105261818211
-rw-r--r--db/structure.sql8
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt1
-rw-r--r--doc/administration/geo/setup/external_database.md14
-rw-r--r--doc/api/graphql/reference/index.md138
-rw-r--r--doc/api/vulnerability_exports.md14
-rw-r--r--doc/policy/maintenance.md8
-rw-r--r--doc/subscriptions/bronze_starter.md4
-rw-r--r--doc/topics/autodevops/stages.md6
-rw-r--r--doc/user/analytics/value_stream_analytics.md8
-rw-r--r--doc/user/application_security/container_scanning/index.md31
-rw-r--r--doc/user/application_security/terminology/index.md4
-rw-r--r--doc/user/group/import/index.md2
-rw-r--r--doc/user/group/value_stream_analytics/index.md2
-rw-r--r--doc/user/project/merge_requests/reviews/index.md27
-rw-r--r--lib/bulk_imports/groups/pipelines/boards_pipeline.rb15
-rw-r--r--lib/bulk_imports/groups/pipelines/labels_pipeline.rb29
-rw-r--r--lib/bulk_imports/groups/pipelines/milestones_pipeline.rb21
-rw-r--r--lib/bulk_imports/ndjson_pipeline.rb36
-rw-r--r--lib/bulk_imports/pipeline.rb12
-rw-r--r--lib/bulk_imports/stage.rb6
-rw-r--r--lib/gitlab/auth.rb4
-rw-r--r--lib/gitlab/ci/parsers/test/junit.rb2
-rw-r--r--package.json1
-rw-r--r--scripts/frontend/startup_css/constants.js63
-rwxr-xr-xscripts/frontend/startup_css/startup_css_changed.sh36
-rw-r--r--scripts/frontend/startup_css/write_startup_scss.js2
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb10
-rw-r--r--spec/features/merge_request/user_awards_emoji_spec.rb4
-rw-r--r--spec/fixtures/bulk_imports/boards.ndjson1
-rw-r--r--spec/fixtures/bulk_imports/gz/boards.ndjson.gzbin0 -> 432 bytes
-rw-r--r--spec/fixtures/bulk_imports/gz/labels.ndjson.gz (renamed from spec/fixtures/bulk_imports/labels.ndjson.gz)bin202 -> 202 bytes
-rw-r--r--spec/fixtures/bulk_imports/gz/milestones.ndjson.gzbin0 -> 402 bytes
-rw-r--r--spec/fixtures/bulk_imports/labels.ndjson1
-rw-r--r--spec/fixtures/bulk_imports/milestones.ndjson5
-rw-r--r--spec/frontend/fixtures/startup_css.rb14
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap16
-rw-r--r--spec/frontend/vue_shared/components/awards_list_spec.js9
-rw-r--r--spec/graphql/mutations/ci/runner/delete_spec.rb92
-rw-r--r--spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb49
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb15
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb110
-rw-r--r--spec/lib/bulk_imports/ndjson_pipeline_spec.rb75
-rw-r--r--spec/lib/bulk_imports/stage_spec.rb3
-rw-r--r--spec/lib/gitlab/auth_spec.rb22
-rw-r--r--spec/lib/gitlab/ci/parsers/test/junit_spec.rb24
-rw-r--r--spec/lib/gitlab/import_export/command_line_util_spec.rb2
-rw-r--r--spec/models/bulk_imports/export_upload_spec.rb2
-rw-r--r--spec/requests/api/group_export_spec.rb2
-rw-r--r--spec/services/bulk_imports/file_decompression_service_spec.rb2
-rw-r--r--spec/services/bulk_imports/relation_export_service_spec.rb2
-rw-r--r--spec/services/ci/create_downstream_pipeline_service_spec.rb47
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb18
-rw-r--r--spec/workers/bulk_imports/pipeline_worker_spec.rb5
91 files changed, 3815 insertions, 2331 deletions
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index a772c1b847f..33aab8554e7 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -317,30 +317,3 @@ bundle-size-review:
expire_in: 31d
paths:
- bundle-size-review
-
-.startup-css-check-base:
- extends:
- - .frontend-test-base
- script:
- - *yarn-install
- - run_timed_command "yarn generate:startup_css"
- - yarn check:startup_css
-
-startup-css-check:
- extends:
- - .startup-css-check-base
- - .frontend:rules:startup-css-check
- needs:
- - job: "compile-test-assets"
- - job: "rspec frontend_fixture"
- - job: "rspec-ee frontend_fixture"
- optional: true
-
-startup-css-check as-if-foss:
- extends:
- - .startup-css-check-base
- - .as-if-foss
- - .frontend:rules:startup-css-check-as-if-foss
- needs:
- - job: "compile-test-assets as-if-foss"
- - job: "rspec frontend_fixture as-if-foss"
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 0a937f132cd..fbc010f90b5 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -485,17 +485,6 @@
changes: *frontend-build-patterns
allow_failure: true
-.frontend:rules:startup-css-check:
- rules:
- - changes: *code-backstage-qa-patterns
-
-.frontend:rules:startup-css-check-as-if-foss:
- rules:
- - <<: *if-not-ee
- when: never
- - <<: *if-merge-request
- changes: *code-backstage-qa-patterns
-
################
# Memory rules #
################
diff --git a/.stylelintrc b/.stylelintrc
index a4331811eb3..13ec6ea340b 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -3,7 +3,6 @@
"ignoreFiles": [
"app/assets/stylesheets/pages/emojis.scss",
"app/assets/stylesheets/startup/startup-*.scss",
- "ee/app/assets/stylesheets/startup/startup-*.scss",
"app/assets/stylesheets/lazy_bundles/select2.scss",
"app/assets/stylesheets/highlight/themes/*.scss",
"app/assets/stylesheets/lazy_bundles/cropper.css"
diff --git a/app/assets/javascripts/emoji/awards_app/index.js b/app/assets/javascripts/emoji/awards_app/index.js
index 16268910f49..1a084d37762 100644
--- a/app/assets/javascripts/emoji/awards_app/index.js
+++ b/app/assets/javascripts/emoji/awards_app/index.js
@@ -32,7 +32,7 @@ export default (el) => {
canAwardEmoji: this.canAwardEmoji,
currentUserId: this.currentUserId,
defaultAwards: ['thumbsup', 'thumbsdown'],
- selectedClass: 'gl-bg-blue-50! is-active',
+ selectedClass: 'selected',
},
on: {
award: this.toggleAward,
diff --git a/app/assets/javascripts/emoji/components/picker.vue b/app/assets/javascripts/emoji/components/picker.vue
index 35f0a1a3818..78ba2aabcf8 100644
--- a/app/assets/javascripts/emoji/components/picker.vue
+++ b/app/assets/javascripts/emoji/components/picker.vue
@@ -85,7 +85,7 @@ export default {
:boundary="getBoundaryElement()"
:class="dropdownClass"
menu-class="dropdown-extended-height"
- category="tertiary"
+ category="secondary"
no-flip
right
lazy
diff --git a/app/assets/javascripts/notes/components/note_actions.vue b/app/assets/javascripts/notes/components/note_actions.vue
index 0cc818c6d0e..0f72b4f2dba 100644
--- a/app/assets/javascripts/notes/components/note_actions.vue
+++ b/app/assets/javascripts/notes/components/note_actions.vue
@@ -304,7 +304,7 @@ export default {
v-else
v-gl-tooltip
:class="{ 'js-user-authored': isAuthoredByCurrentUser }"
- class="note-action-button note-emoji-button add-reaction-button btn-icon js-add-award js-note-emoji"
+ class="note-action-button note-emoji-button add-reaction-button js-add-award js-note-emoji"
category="tertiary"
variant="default"
:title="$options.i18n.addReactionLabel"
diff --git a/app/assets/javascripts/vue_shared/components/awards_list.vue b/app/assets/javascripts/vue_shared/components/awards_list.vue
index 08d3e163257..e6d9a38d1fb 100644
--- a/app/assets/javascripts/vue_shared/components/awards_list.vue
+++ b/app/assets/javascripts/vue_shared/components/awards_list.vue
@@ -173,7 +173,7 @@ export default {
v-for="awardList in groupedAwards"
:key="awardList.name"
v-gl-tooltip.viewport
- class="gl-mr-3"
+ class="gl-mr-3 gl-my-2"
:class="awardList.classes"
:title="awardList.title"
data-testid="award-button"
@@ -184,10 +184,10 @@ export default {
</template>
<span class="js-counter">{{ awardList.list.length }}</span>
</gl-button>
- <div v-if="canAwardEmoji" class="award-menu-holder">
+ <div v-if="canAwardEmoji" class="award-menu-holder gl-my-2">
<emoji-picker
v-if="glFeatures.improvedEmojiPicker"
- :toggle-class="['add-reaction-button gl-relative!', { 'is-active': isMenuOpen }]"
+ :toggle-class="['add-reaction-button btn-icon gl-relative!', { 'is-active': isMenuOpen }]"
@click="handleAward"
@shown="setIsMenuOpen(true)"
@hidden="setIsMenuOpen(false)"
diff --git a/app/assets/stylesheets/framework/awards.scss b/app/assets/stylesheets/framework/awards.scss
index 412a1e8d6c9..2c72c4b0f65 100644
--- a/app/assets/stylesheets/framework/awards.scss
+++ b/app/assets/stylesheets/framework/awards.scss
@@ -255,27 +255,9 @@
// This forces the height and width of the inner content to match
// other gl-buttons despite all child elements being set to
// `position:absolute`
- &::after {
- content: '\a0';
- display: block !important;
- width: 1em;
- color: transparent;
- }
-
- .reaction-control-icon {
- position: absolute;
- top: 0;
- left: 0;
- height: 100%;
- width: 100%;
-
- // center the icon vertically and horizontally within the button
- display: flex;
- align-items: center;
- justify-content: center;
- @include transition(opacity, transform);
+ .reaction-control-icon {
.gl-icon {
height: $default-icon-size;
width: $default-icon-size;
@@ -283,32 +265,26 @@
}
.reaction-control-icon-neutral {
- opacity: 1;
+ display: flex;
}
.reaction-control-icon-positive,
.reaction-control-icon-super-positive {
- opacity: 0;
+ display: none;
}
&:hover,
&.active,
&:active,
&.is-active {
- // extra specificty added to override another selector
- .reaction-control-icon .gl-icon {
- color: $blue-500;
- transform: scale(1.15);
- }
-
.reaction-control-icon-neutral {
- opacity: 0;
+ display: none;
}
}
&:hover {
.reaction-control-icon-positive {
- opacity: 1;
+ display: flex;
}
}
@@ -316,11 +292,11 @@
&:active,
&.is-active {
.reaction-control-icon-positive {
- opacity: 0;
+ display: none;
}
.reaction-control-icon-super-positive {
- opacity: 1;
+ display: flex;
}
}
@@ -336,17 +312,13 @@
}
.reaction-control-icon-neutral {
- opacity: 1;
+ display: flex;
}
.reaction-control-icon-positive,
.reaction-control-icon-super-positive {
- opacity: 0;
+ display: none;
}
}
}
}
-
-.awards .is-active {
- box-shadow: inset 0 0 0 1px $blue-200;
-}
diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss
index bfa4a640fe2..10481294df5 100644
--- a/app/assets/stylesheets/framework/blocks.scss
+++ b/app/assets/stylesheets/framework/blocks.scss
@@ -72,7 +72,7 @@
}
&.content-component-block {
- padding: 11px 0;
+ padding: 8px 0;
background-color: $body-bg;
}
@@ -253,7 +253,7 @@
}
.content-block-small {
- padding: 10px 0;
+ padding: 4px 0;
}
.landing {
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index 0437fa19752..d238e7764a3 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -67,10 +67,6 @@
.emoji-block {
padding: $gl-padding-4 0;
-
- @include media-breakpoint-down(md) {
- padding: $gl-padding-8 0;
- }
}
}
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index 97c8182bab8..461d6a29b3a 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -130,10 +130,6 @@ ul.related-merge-requests > li {
&:not(:only-child) {
margin-right: $gl-padding-8;
}
-
- @include media-breakpoint-down(md) {
- margin-top: $gl-padding-8;
- }
}
}
@@ -154,10 +150,6 @@ ul.related-merge-requests > li {
.btn-group:not(.hidden) {
display: flex;
-
- @include media-breakpoint-down(md) {
- margin-top: $gl-padding-8;
- }
}
.js-create-merge-request {
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index b537a46a6f2..9d437531e6d 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -106,10 +106,6 @@
width: 100%;
}
}
-
- .omniauth-btn {
- width: 100%;
- }
}
.new-session-tabs {
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index 2ec2df4b817..f83ba89daae 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -45,7 +45,6 @@ input[type='checkbox']:hover {
margin: 0 8px;
form {
- display: block;
margin: 0;
padding: 4px;
width: $search-input-width;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index 65284279019..9f7a8860e4d 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -1,23 +1,4 @@
-// DO NOT EDIT! This is auto-generated from "yarn run generate:startup_css"
-// Please see the feedback issue for more details and help:
-// https://gitlab.com/gitlab-org/gitlab/-/issues/331812
@charset "UTF-8";
-body.gl-dark {
- --gray-50: #303030;
- --gray-100: #404040;
- --gray-200: #525252;
- --gray-950: #fff;
- --green-100: #0d532a;
- --green-400: #108548;
- --green-700: #91d4a8;
- --blue-400: #1f75cb;
- --orange-400: #ab6100;
- --gl-text-color: #fafafa;
- --border-color: #4f4f4f;
-}
-:root {
- --white: #333;
-}
*,
*::before,
*::after {
@@ -27,46 +8,68 @@ html {
font-family: sans-serif;
line-height: 1.15;
}
-aside,
-header,
-nav {
+ header, nav, section {
display: block;
}
body {
margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
- "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #fafafa;
text-align: left;
- background-color: #1f1f1f;
+ background-color: #2e2e2e;
}
-h1 {
+h1, h2, h3 {
margin-top: 0;
margin-bottom: 0.25rem;
}
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
ul {
margin-top: 0;
margin-bottom: 1rem;
}
+
ul ul {
margin-bottom: 0;
}
+
strong {
font-weight: bolder;
}
+sub {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -.25em;
+}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
-a:not([href]):not([class]) {
+a:not([href]) {
color: inherit;
text-decoration: none;
}
+pre,
+code {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ font-size: 1em;
+}
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
img {
vertical-align: middle;
border-style: none;
@@ -75,11 +78,18 @@ svg {
overflow: hidden;
vertical-align: middle;
}
+table {
+ border-collapse: collapse;
+}
+th {
+ text-align: inherit;
+}
button {
border-radius: 0;
}
input,
-button {
+button,
+textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
@@ -92,20 +102,21 @@ input {
button {
text-transform: none;
}
-[role="button"] {
- cursor: pointer;
-}
button:not(:disabled),
[type="button"]:not(:disabled),
-[type="submit"]:not(:disabled) {
+[type="reset"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
+[type="reset"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
[type="search"] {
outline-offset: -2px;
}
@@ -113,24 +124,81 @@ summary {
display: list-item;
cursor: pointer;
}
+template {
+ display: none;
+}
[hidden] {
display: none !important;
}
-h1,
-.h1 {
+h1, h2, h3,
+.h1, .h2, .h3 {
margin-bottom: 0.25rem;
font-weight: 600;
line-height: 1.2;
color: #fafafa;
}
-h1,
-.h1 {
+h1, .h1 {
font-size: 2.1875rem;
}
+h2, .h2 {
+ font-size: 1.75rem;
+}
+h3, .h3 {
+ font-size: 1.53125rem;
+}
.list-unstyled {
padding-left: 0;
list-style: none;
}
+code {
+ font-size: 90%;
+ color: #fff;
+ word-wrap: break-word;
+}
+a > code {
+ color: inherit;
+}
+pre {
+ display: block;
+ font-size: 90%;
+ color: #fafafa;
+}
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+.container {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px;
+ }
+}
.container-fluid {
width: 100%;
padding-right: 15px;
@@ -138,7 +206,48 @@ h1,
margin-right: auto;
margin-left: auto;
}
-.form-control {
+
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px;
+ }
+}
+.row {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+}
+.table {
+ width: 100%;
+ margin-bottom: 0.5rem;
+ color: #fafafa;
+}
+.table th,
+.table td {
+ padding: 0.75rem;
+ vertical-align: top;
+ border-top: 1px solid #4f4f4f;
+}
+ .search form {
display: block;
width: 100%;
height: 34px;
@@ -147,27 +256,24 @@ h1,
font-weight: 400;
line-height: 1.5;
color: #fafafa;
- background-color: #333;
+ background-color: #4f4f4f;
background-clip: padding-box;
- border: 1px solid #404040;
+ border: 1px solid #4f4f4f;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
-.form-control:-moz-focusring {
+ .search form:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #fafafa;
}
-.form-control::-ms-input-placeholder {
- color: #bfbfbf;
+ .search form::placeholder {
+ color: #ccc;
opacity: 1;
}
-.form-control::placeholder {
- color: #bfbfbf;
- opacity: 1;
-}
-.form-control:disabled {
- background-color: #303030;
+ .search form:disabled {
+ background-color: #2e2e2e;
opacity: 1;
}
.form-inline {
@@ -175,8 +281,9 @@ h1,
flex-flow: row wrap;
align-items: center;
}
+
@media (min-width: 576px) {
- .form-inline .form-control {
+ .form-inline .search form, .search .form-inline form {
display: inline-block;
width: auto;
vertical-align: middle;
@@ -188,7 +295,7 @@ h1,
color: #fafafa;
text-align: center;
vertical-align: middle;
- -moz-user-select: none;
+ cursor: pointer;
user-select: none;
background-color: transparent;
border: 1px solid transparent;
@@ -197,24 +304,26 @@ h1,
line-height: 20px;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
-.btn:disabled {
+.btn.disabled, .btn:disabled {
opacity: 0.65;
}
-.btn:not(:disabled):not(.disabled) {
- cursor: pointer;
+a.btn.disabled {
+ pointer-events: none;
}
.collapse:not(.show) {
display: none;
}
+
.dropdown {
position: relative;
}
-.dropdown-menu-toggle {
+ .dropdown-menu-toggle {
white-space: nowrap;
}
-.dropdown-menu-toggle::after {
+ .dropdown-menu-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
@@ -224,7 +333,7 @@ h1,
border-bottom: 0;
border-left: 0.3em solid transparent;
}
-.dropdown-menu-toggle:empty::after {
+ .dropdown-menu-toggle:empty::after {
margin-left: 0;
}
.dropdown-menu {
@@ -246,6 +355,16 @@ h1,
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 0.25rem;
}
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+ .divider {
+ height: 0;
+ margin: 4px 0;
+ overflow: hidden;
+ border-top: 1px solid #4f4f4f;
+}
.dropdown-menu.show {
display: block;
}
@@ -264,6 +383,7 @@ h1,
justify-content: space-between;
padding: 0.25rem 0.5rem;
}
+.navbar .container,
.navbar .container-fluid {
display: flex;
flex-wrap: wrap;
@@ -294,12 +414,15 @@ h1,
border: 1px solid transparent;
border-radius: 0.25rem;
}
+
@media (max-width: 575.98px) {
+ .navbar-expand-sm > .container,
.navbar-expand-sm > .container-fluid {
padding-right: 0;
padding-left: 0;
}
}
+
@media (min-width: 576px) {
.navbar-expand-sm {
flex-flow: row nowrap;
@@ -311,6 +434,7 @@ h1,
.navbar-expand-sm .navbar-nav .dropdown-menu {
position: absolute;
}
+ .navbar-expand-sm > .container,
.navbar-expand-sm > .container-fluid {
flex-wrap: nowrap;
}
@@ -330,7 +454,7 @@ h1,
word-wrap: break-word;
background-color: #333;
background-clip: border-box;
- border: 1px solid #404040;
+ border: 1px solid #4f4f4f;
border-radius: 0.25rem;
}
.badge {
@@ -344,6 +468,7 @@ h1,
vertical-align: baseline;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
.badge:empty {
@@ -358,6 +483,10 @@ h1,
padding-left: 0.6em;
border-radius: 10rem;
}
+.media {
+ display: flex;
+ align-items: flex-start;
+}
.close {
float: right;
font-size: 1.5rem;
@@ -365,15 +494,55 @@ h1,
line-height: 1;
color: #fff;
text-shadow: 0 1px 0 #333;
- opacity: 0.5;
+ opacity: .5;
}
button.close {
padding: 0;
background-color: transparent;
border: 0;
+ appearance: none;
+}
+a.close.disabled {
+ pointer-events: none;
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.5rem;
+ pointer-events: none;
+}
+
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto;
+ }
+}
+.bg-transparent {
+ background-color: transparent !important;
+}
+.border {
+ border: 1px solid #4f4f4f !important;
+}
+.border-top {
+ border-top: 1px solid #4f4f4f !important;
+}
+.border-right {
+ border-right: 1px solid #4f4f4f !important;
+}
+.border-bottom {
+ border-bottom: 1px solid #4f4f4f !important;
+}
+.border-left {
+ border-left: 1px solid #4f4f4f !important;
}
-.rounded-circle {
- border-radius: 50% !important;
+.rounded {
+ border-radius: 0.25rem !important;
+}
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
}
.d-none {
display: none !important;
@@ -384,16 +553,19 @@ button.close {
.d-block {
display: block !important;
}
+
@media (min-width: 576px) {
.d-sm-none {
display: none !important;
}
}
+
@media (min-width: 768px) {
.d-md-block {
display: block !important;
}
}
+
@media (min-width: 992px) {
.d-lg-none {
display: none !important;
@@ -402,11 +574,18 @@ button.close {
display: block !important;
}
}
+
@media (min-width: 1200px) {
.d-xl-block {
display: block !important;
}
}
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+.float-right {
+ float: right !important;
+}
.sr-only {
position: absolute;
width: 1px;
@@ -421,59 +600,72 @@ button.close {
.m-auto {
margin: auto !important;
}
-.gl-button {
- display: inline-flex;
+.text-nowrap {
+ white-space: nowrap !important;
}
-.gl-button:not(.btn-link):active {
- text-decoration: none;
+.visible {
+ visibility: visible !important;
}
-.gl-button.gl-button {
- border-width: 0;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- background-color: transparent;
- line-height: 1rem;
+ .search form.focus {
color: #fafafa;
- fill: currentColor;
- box-shadow: inset 0 0 0 1px #525252;
- justify-content: center;
- align-items: center;
- font-size: 0.875rem;
- border-radius: 0.25rem;
-}
-.gl-button.gl-button.btn-default {
- background-color: #333;
+ background-color: #4f4f4f;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
-.gl-button.gl-button.btn-default:active,
-.gl-button.gl-button.btn-default.active {
- box-shadow: inset 0 0 0 2px #bfbfbf, 0 0 0 1px rgba(51, 51, 51, 0.4),
- 0 0 0 4px rgba(66, 143, 220, 0.48);
+.gl-badge {
+ display: inline-flex;
+ align-items: center;
+ font-size: 0.75rem;
+ font-weight: 400;
+ line-height: 1rem;
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
outline: none;
- background-color: #404040;
}
-body,
-.form-control,
+body, .search form,
.search form {
font-size: 0.875rem;
}
button,
-html [type="button"],
-[type="submit"],
-[role="button"] {
+html [type='button'],
+[type='reset'],
+[role='button'] {
cursor: pointer;
}
h1,
-.h1 {
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
margin-top: 20px;
margin-bottom: 10px;
}
+input[type='file'] {
+ line-height: 1;
+}
+
strong {
font-weight: bold;
}
a {
- color: #63a6e9;
+ color: #418cd8;
+}
+code {
+ padding: 2px 4px;
+ color: #fff;
+ background-color: #2e2e2e;
+ border-radius: 4px;
+}
+.code > code {
+ background-color: inherit;
+ padding: unset;
+}
+table {
+ border-spacing: 0;
}
.hidden {
display: none !important;
@@ -482,7 +674,7 @@ a {
.hide {
display: none;
}
-.dropdown-menu-toggle::after {
+ .dropdown-menu-toggle::after {
display: none;
}
.badge:not(.gl-badge) {
@@ -492,16 +684,13 @@ a {
font-weight: 400;
display: inline-block;
}
-.divider {
- height: 0;
- margin: 4px 0;
- overflow: hidden;
- border-top: 1px solid #404040;
+pre code {
+ white-space: pre-wrap;
}
.toggle-sidebar-button .collapse-text,
.toggle-sidebar-button .icon-chevron-double-lg-left,
.toggle-sidebar-button .icon-chevron-double-lg-right {
- color: #999;
+ color: #bababa;
}
svg {
vertical-align: baseline;
@@ -512,23 +701,42 @@ html {
body {
text-decoration-skip: ink;
}
+.content-wrapper {
+ margin-top: 40px;
+ padding-bottom: 100px;
+}
+.container {
+ padding-top: 0;
+ z-index: 5;
+}
+.container .content {
+ margin: 0;
+}
+
+@media (max-width: 575.98px) {
+ .container .content {
+ margin-top: 20px;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .container .container .title {
+ padding-left: 15px !important;
+ }
+}
.btn {
border-radius: 4px;
font-size: 0.875rem;
font-weight: 400;
padding: 6px 10px;
background-color: #333;
- border-color: #404040;
+ border-color: #4f4f4f;
color: #fafafa;
color: #fafafa;
white-space: nowrap;
}
-.btn:active {
- background-color: #303030;
- box-shadow: none;
-}
-.btn:active,
-.btn.active {
+.btn:active, .btn.active {
+ box-shadow: rgba(0, 0, 0, 0.16);
background-color: #444;
border-color: #fafafa;
color: #fafafa;
@@ -537,19 +745,61 @@ body {
height: 15px;
width: 15px;
}
-.btn svg:not(:last-child) {
+.btn svg:not(:last-child),
+.btn .fa:not(:last-child) {
margin-right: 5px;
}
.badge.badge-pill:not(.gl-badge) {
font-weight: 400;
- background-color: rgba(255, 255, 255, 0.07);
- color: #dbdbdb;
+ background-color: rgba(0, 0, 0, 0.07);
+ color: #dfdfdf;
vertical-align: baseline;
}
+.hint {
+ font-style: italic;
+ color: #707070;
+}
+.bold {
+ font-weight: 600;
+}
+pre.wrap {
+ word-break: break-word;
+ white-space: pre-wrap;
+}
+table a code {
+ position: relative;
+ top: -2px;
+ margin-right: 3px;
+}
+.loading {
+ margin: 20px auto;
+ height: 40px;
+ color: #dfdfdf;
+ font-size: 32px;
+ text-align: center;
+}
+.highlight {
+ text-shadow: none;
+}
.chart {
overflow: hidden;
height: 220px;
}
+.break-word {
+ word-wrap: break-word;
+}
+.center {
+ text-align: center;
+}
+.block {
+ display: block;
+}
+.flex {
+ display: flex;
+}
+.flex-grow {
+ flex-grow: 1;
+}
.dropdown {
position: relative;
}
@@ -560,41 +810,47 @@ body {
max-height: 312px;
overflow-y: auto;
}
+
@media (max-width: 575.98px) {
.show.dropdown .dropdown-menu {
width: 100%;
}
}
-.show.dropdown .dropdown-menu-toggle,
+ .show.dropdown .dropdown-menu-toggle,
.show.dropdown .dropdown-menu-toggle {
border-color: #c4c4c4;
}
-.show.dropdown [data-toggle="dropdown"] {
+.show.dropdown [data-toggle='dropdown'] {
outline: 0;
}
.search-input-container .dropdown-menu {
margin-top: 11px;
}
-.dropdown-menu-toggle {
+ .dropdown-menu-toggle {
padding: 6px 8px 6px 10px;
background-color: #333;
color: #fafafa;
font-size: 14px;
text-align: left;
- border: 1px solid #404040;
+ border: 1px solid #4f4f4f;
border-radius: 0.25rem;
white-space: nowrap;
}
-.no-outline.dropdown-menu-toggle {
+ .no-outline.dropdown-menu-toggle {
outline: 0;
}
-.dropdown-menu-toggle.dropdown-menu-toggle {
- justify-content: flex-start;
- overflow: hidden;
+ .dropdown-menu-toggle .fa {
+ color: #c4c4c4;
+}
+.dropdown-menu-toggle {
padding-right: 25px;
position: relative;
- text-overflow: ellipsis;
width: 160px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.dropdown-menu-toggle .fa {
+ position: absolute;
}
.dropdown-menu {
display: none;
@@ -610,7 +866,7 @@ body {
font-weight: 400;
padding: 8px 0;
background-color: #333;
- border: 1px solid #404040;
+ border: 1px solid #4f4f4f;
border-radius: 0.25rem;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
@@ -641,56 +897,156 @@ body {
text-align: left;
width: 100%;
}
-.dropdown-menu li > a:active,
-.dropdown-menu li button:active {
- background-color: #4f4f4f;
- color: #fafafa;
- outline: 0;
- text-decoration: none;
-}
.dropdown-menu .divider {
height: 1px;
margin: 0.25rem 0;
padding: 0;
- background-color: #404040;
+ background-color: #4f4f4f;
}
.dropdown-menu .badge.badge-pill + span:not(.badge):not(.badge-pill) {
margin-right: 40px;
}
+.dropdown-select {
+ width: 300px;
+}
+
+@media (max-width: 767.98px) {
+ .dropdown-select {
+ width: 100%;
+ }
+}
+.dropdown-content {
+ max-height: 252px;
+ overflow-y: auto;
+}
+.dropdown-loading {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: none;
+ z-index: 9;
+ background-color: rgba(51, 51, 51, 0.6);
+ font-size: 28px;
+}
+.dropdown-loading .fa {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -14px;
+ margin-left: -14px;
+}
+
@media (max-width: 575.98px) {
.navbar-gitlab li.dropdown {
position: static;
}
- .navbar-gitlab li.dropdown.user-counter {
- margin-left: 8px !important;
- }
- .navbar-gitlab li.dropdown.user-counter > a {
- padding: 0 4px !important;
- }
header.navbar-gitlab .dropdown .dropdown-menu {
width: 100%;
min-width: 100%;
}
}
+
@media (max-width: 767.98px) {
.dropdown-menu-toggle {
width: 100%;
}
}
+textarea {
+ resize: vertical;
+}
input {
border-radius: 0.25rem;
color: #fafafa;
- background-color: #333;
+ background-color: #4f4f4f;
}
-.form-control {
+ .search form {
border-radius: 4px;
padding: 6px 10px;
}
-.form-control::-ms-input-placeholder {
- color: #868686;
+ .search form::placeholder {
+ color: #a7a7a7;
+}
+body.ui-indigo .navbar-gitlab {
+ background-color: #292961;
+}
+body.ui-indigo .navbar-gitlab .navbar-collapse {
+ color: #d1d1f0;
}
-.form-control::placeholder {
- color: #868686;
+body.ui-indigo .navbar-gitlab .container-fluid .navbar-toggler {
+ border-left: 1px solid #6868b9;
+}
+body.ui-indigo .navbar-gitlab .container-fluid .navbar-toggler svg {
+ fill: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.active > a,
+body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.active > button, body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.dropdown.show > a,
+body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.dropdown.show > button,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.active > a,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.active > button,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.dropdown.show > a,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.dropdown.show > button {
+ color: #292961;
+ background-color: #333;
+}
+body.ui-indigo .navbar-gitlab .navbar-sub-nav {
+ color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .nav > li {
+ color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .nav > li > a.header-user-dropdown-toggle .header-user-avatar {
+ border-color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .nav > li.active > a,
+body.ui-indigo .navbar-gitlab .nav > li.dropdown.show > a {
+ color: #292961;
+ background-color: #333;
+}
+body.ui-indigo .search form {
+ background-color: rgba(209, 209, 240, 0.2);
+}
+body.ui-indigo .search .search-input::placeholder {
+ color: rgba(209, 209, 240, 0.8);
+}
+body.ui-indigo .search .search-input-wrap .search-icon,
+body.ui-indigo .search .search-input-wrap .clear-icon {
+ fill: rgba(209, 209, 240, 0.8);
+}
+body.ui-indigo .nav-sidebar li.active {
+ box-shadow: inset 4px 0 0 #4b4ba3;
+}
+body.ui-indigo .nav-sidebar li.active > a {
+ color: #393982;
+}
+body.ui-indigo .nav-sidebar li.active .nav-icon-container svg {
+ fill: #393982;
+}
+body.ui-indigo .sidebar-top-level-items > li.active .badge.badge-pill {
+ color: #393982;
+}
+body.gl-dark .logo-text svg {
+ fill: #fafafa;
+}
+body.gl-dark .navbar-gitlab {
+ background-color: #2e2e2e;
+ box-shadow: 0 1px 0 0 var(--gray-100);
+}
+body.gl-dark .navbar-gitlab .navbar-sub-nav li.active > a,
+body.gl-dark .navbar-gitlab .navbar-sub-nav li.active > button,
+body.gl-dark .navbar-gitlab .navbar-sub-nav li.dropdown.show > a,
+body.gl-dark .navbar-gitlab .navbar-sub-nav li.dropdown.show > button,
+body.gl-dark .navbar-gitlab .navbar-nav li.active > a,
+body.gl-dark .navbar-gitlab .navbar-nav li.active > button,
+body.gl-dark .navbar-gitlab .navbar-nav li.dropdown.show > a,
+body.gl-dark .navbar-gitlab .navbar-nav li.dropdown.show > button {
+ color: #fafafa;
+ background-color: #707070;
+}
+body.gl-dark .navbar-gitlab .search form {
+ background-color: #4f4f4f;
+ box-shadow: inset 0 0 0 1px #4f4f4f;
}
.navbar-gitlab {
padding: 0 16px;
@@ -698,6 +1054,7 @@ input {
margin-bottom: 0;
min-height: 40px;
border: 0;
+ border-bottom: 1px solid #4f4f4f;
position: fixed;
top: 0;
left: 0;
@@ -747,6 +1104,9 @@ input {
.navbar-gitlab .header-content .title img + .logo-text {
margin-left: 8px;
}
+.navbar-gitlab .header-content .title.wrap {
+ white-space: normal;
+}
.navbar-gitlab .header-content .title a {
display: flex;
align-items: center;
@@ -754,6 +1114,9 @@ input {
margin: 5px 2px 5px -8px;
border-radius: 4px;
}
+.navbar-gitlab .header-content .dropdown.open > a {
+ border-bottom-color: #333;
+}
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
margin: 0 2px;
}
@@ -762,6 +1125,7 @@ input {
border-top: 0;
padding: 0;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .navbar-collapse {
flex: 1 1 auto;
@@ -770,6 +1134,7 @@ input {
.navbar-gitlab .navbar-collapse .nav {
flex-wrap: nowrap;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .navbar-collapse .nav > li:not(.d-none) a {
margin-left: 0;
@@ -792,10 +1157,7 @@ input {
text-align: center;
color: currentColor;
}
-.navbar-gitlab .container-fluid .navbar-toggler.active {
- color: currentColor;
- background-color: transparent;
-}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid .navbar-nav {
display: flex;
@@ -803,14 +1165,11 @@ input {
flex-direction: row;
}
}
-.navbar-gitlab
- .container-fluid
- .navbar-nav
- li
- .badge.badge-pill:not(.merge-request-badge) {
+.navbar-gitlab .container-fluid .navbar-nav li .badge.badge-pill {
box-shadow: none;
font-weight: 600;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid .nav > li.header-user {
padding-left: 10px;
@@ -822,6 +1181,7 @@ input {
padding: 6px 8px;
height: 32px;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid .nav > li > a {
padding: 0;
@@ -830,12 +1190,7 @@ input {
.navbar-gitlab .container-fluid .nav > li > a.header-user-dropdown-toggle {
margin-left: 2px;
}
-.navbar-gitlab
- .container-fluid
- .nav
- > li
- > a.header-user-dropdown-toggle
- .header-user-avatar {
+.navbar-gitlab .container-fluid .nav > li > a.header-user-dropdown-toggle .header-user-avatar {
margin-right: 0;
}
.navbar-gitlab .container-fluid .nav > li .header-new-dropdown-toggle {
@@ -856,9 +1211,7 @@ input {
height: 32px;
font-weight: 600;
}
-.navbar-sub-nav > li .top-nav-toggle,
.navbar-sub-nav > li > button,
-.navbar-nav > li .top-nav-toggle,
.navbar-nav > li > button {
background: transparent;
border: 0;
@@ -896,25 +1249,31 @@ input {
font-weight: 400;
margin-left: -6px;
font-size: 11px;
- color: var(--gray-950, #333);
+ color: #333;
padding: 0 5px;
line-height: 12px;
border-radius: 7px;
box-shadow: 0 1px 0 rgba(76, 78, 84, 0.2);
}
-.title-container .badge.badge-pill:not(.merge-request-badge).green-badge,
-.navbar-nav .badge.badge-pill:not(.merge-request-badge).green-badge {
- background-color: var(--green-400, #108548);
+.title-container .badge.badge-pill.green-badge,
+.navbar-nav .badge.badge-pill.green-badge {
+ background-color: #1aaa55;
}
-.title-container
- .badge.badge-pill:not(.merge-request-badge).merge-requests-count,
-.navbar-nav .badge.badge-pill:not(.merge-request-badge).merge-requests-count {
- background-color: var(--orange-400, #ab6100);
+.title-container .badge.badge-pill.merge-requests-count,
+.navbar-nav .badge.badge-pill.merge-requests-count {
+ background-color: #fca429;
}
-.title-container .badge.badge-pill:not(.merge-request-badge).todos-count,
-.navbar-nav .badge.badge-pill:not(.merge-request-badge).todos-count {
- background-color: var(--blue-400, #1f75cb);
+.title-container .badge.badge-pill.todos-count,
+.navbar-nav .badge.badge-pill.todos-count {
+ background-color: #1f78d1;
}
+.title-container .canary-badge .badge,
+.navbar-nav .canary-badge .badge {
+ font-size: 12px;
+ line-height: 16px;
+ padding: 0 0.5rem;
+}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid {
font-size: 18px;
@@ -941,7 +1300,7 @@ input {
}
.header-user.show .dropdown-menu {
margin-top: 4px;
- color: var(--gl-text-color, #fafafa);
+ color: #fafafa;
left: auto;
max-height: 445px;
}
@@ -954,32 +1313,30 @@ input {
border-radius: 50%;
border: 1px solid #333;
}
-.notification-dot {
- background-color: #9e5400;
- height: 12px;
- width: 12px;
- margin-top: -15px;
- pointer-events: none;
- visibility: hidden;
+.media {
+ display: flex;
+ align-items: flex-start;
}
-.top-nav-toggle .dropdown-icon {
- margin-right: 0.5rem;
+.card {
+ margin-bottom: 16px;
}
-.tanuki-logo .tanuki-left-ear,
-.tanuki-logo .tanuki-right-ear,
-.tanuki-logo .tanuki-nose {
- fill: #e24329;
+.content-wrapper {
+ width: 100%;
}
-.tanuki-logo .tanuki-left-eye,
-.tanuki-logo .tanuki-right-eye {
- fill: #fc6d26;
+.content-wrapper .container-fluid {
+ padding: 0 16px;
}
-.tanuki-logo .tanuki-left-cheek,
-.tanuki-logo .tanuki-right-cheek {
- fill: #fca326;
+
+@media (min-width: 768px) {
+ .page-with-contextual-sidebar {
+ padding-left: 50px;
+ }
}
-.card {
- margin-bottom: 16px;
+
+@media (min-width: 1200px) {
+ .page-with-contextual-sidebar {
+ padding-left: 220px;
+ }
}
.context-header {
position: relative;
@@ -1006,20 +1363,9 @@ input {
overflow: hidden;
text-overflow: ellipsis;
}
-@media (min-width: 768px) {
- .page-with-contextual-sidebar {
- padding-left: 50px;
- }
-}
-@media (min-width: 1200px) {
- .page-with-contextual-sidebar {
- padding-left: 220px;
- }
-}
-@media (min-width: 768px) {
- .page-with-icon-sidebar {
- padding-left: 50px;
- }
+.context-header .sidebar-context-title.text-secondary {
+ font-weight: normal;
+ font-size: 0.8em;
}
.nav-sidebar {
position: fixed;
@@ -1028,13 +1374,14 @@ input {
top: 40px;
bottom: 0;
left: 0;
- background-color: #303030;
- box-shadow: inset -1px 0 0 #404040;
+ background-color: #2e2e2e;
+ box-shadow: inset -1px 0 0 #4f4f4f;
transform: translate3d(0, 0, 0);
}
+
@media (min-width: 576px) and (max-width: 576px) {
.nav-sidebar:not(.sidebar-collapsed-desktop) {
- box-shadow: inset -1px 0 0 #404040, 2px 1px 3px rgba(0, 0, 0, 0.1);
+ box-shadow: inset -1px 0 0 #4f4f4f, 2px 1px 3px rgba(0, 0, 0, 0.1);
}
}
.nav-sidebar.sidebar-collapsed-desktop {
@@ -1044,6 +1391,7 @@ input {
overflow-x: hidden;
}
.nav-sidebar.sidebar-collapsed-desktop .badge.badge-pill:not(.fly-out-badge),
+.nav-sidebar.sidebar-collapsed-desktop .sidebar-context-title,
.nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
border: 0;
clip: rect(0, 0, 0, 0);
@@ -1064,6 +1412,9 @@ input {
.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
margin: 0 auto;
}
+.nav-sidebar.sidebar-expanded-mobile {
+ left: 0;
+}
.nav-sidebar a {
text-decoration: none;
}
@@ -1078,7 +1429,7 @@ input {
display: flex;
align-items: center;
padding: 12px 16px;
- color: #999;
+ color: #bababa;
}
.nav-sidebar li .nav-item-name {
flex: 1;
@@ -1086,6 +1437,7 @@ input {
.nav-sidebar li.active > a {
font-weight: 600;
}
+
@media (max-width: 767.98px) {
.nav-sidebar {
left: -220px;
@@ -1102,6 +1454,7 @@ input {
height: 16px;
width: 16px;
}
+
@media (min-width: 768px) and (max-width: 1199px) {
.nav-sidebar:not(.sidebar-expanded-mobile) {
width: 50px;
@@ -1109,8 +1462,8 @@ input {
.nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
overflow-x: hidden;
}
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .badge.badge-pill:not(.fly-out-badge),
+ .nav-sidebar:not(.sidebar-expanded-mobile) .badge.badge-pill:not(.fly-out-badge),
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title,
.nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name {
border: 0;
clip: rect(0, 0, 0, 0);
@@ -1138,21 +1491,7 @@ input {
.nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
padding: 10px 4px;
}
- .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li .sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
.nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
@@ -1162,17 +1501,11 @@ input {
padding: 16px;
width: 49px;
}
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .collapse-text,
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .collapse-text,
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .icon-chevron-double-lg-left {
display: none;
}
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .icon-chevron-double-lg-right {
display: block;
margin: 0;
}
@@ -1189,12 +1522,10 @@ input {
.sidebar-sub-level-items > li a {
padding: 8px 16px 8px 40px;
}
-.sidebar-sub-level-items > li.active a {
- background: rgba(255, 255, 255, 0.04);
-}
.sidebar-top-level-items {
margin-bottom: 60px;
}
+
@media (min-width: 576px) {
.sidebar-top-level-items > li > a {
margin-right: 1px;
@@ -1202,7 +1533,7 @@ input {
}
.sidebar-top-level-items > li .badge.badge-pill {
background-color: rgba(255, 255, 255, 0.08);
- color: #999;
+ color: #bababa;
}
.sidebar-top-level-items > li.active {
background: rgba(255, 255, 255, 0.04);
@@ -1214,28 +1545,23 @@ input {
.sidebar-top-level-items > li.active .badge.badge-pill {
font-weight: 600;
}
-.sidebar-top-level-items
- > li.active
- .sidebar-sub-level-items:not(.is-fly-out-only) {
+.sidebar-top-level-items > li.active .sidebar-sub-level-items:not(.is-fly-out-only) {
display: block;
}
.toggle-sidebar-button,
.close-nav-button {
+ width: 219px;
+ position: fixed;
height: 48px;
+ bottom: 0;
padding: 0 16px;
- background-color: #303030;
+ background-color: #2e2e2e;
border: 0;
- color: #999;
+ border-top: 1px solid #4f4f4f;
+ color: #bababa;
display: flex;
align-items: center;
}
-.toggle-sidebar-button,
-.close-nav-button {
- position: fixed;
- bottom: 0;
- width: 219px;
- border-top: 1px solid #404040;
-}
.toggle-sidebar-button svg,
.close-nav-button svg {
margin-right: 8px;
@@ -1255,21 +1581,7 @@ input {
.sidebar-collapsed-desktop .context-header a {
padding: 10px 4px;
}
-.sidebar-collapsed-desktop .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
+.sidebar-collapsed-desktop .sidebar-top-level-items > li .sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
.sidebar-collapsed-desktop .nav-icon-container {
@@ -1283,9 +1595,7 @@ input {
.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
display: none;
}
-.sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
+.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-right {
display: block;
margin: 0;
}
@@ -1301,6 +1611,7 @@ input {
.close-nav-button {
display: none;
}
+
@media (max-width: 767.98px) {
.close-nav-button {
display: flex;
@@ -1309,416 +1620,128 @@ input {
display: none;
}
}
-body.sidebar-refactoring.gl-dark .nav-sidebar li.active {
- box-shadow: none;
-}
-body.sidebar-refactoring.gl-dark .nav-sidebar li a,
-body.sidebar-refactoring .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right {
- color: #c4c4c4;
-}
-body.sidebar-refactoring .nav-sidebar {
- box-shadow: none;
-}
-body.sidebar-refactoring .nav-sidebar li.active {
- background-color: transparent;
- box-shadow: none;
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 50px;
- }
-}
-@media (min-width: 1200px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 220px;
- }
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-icon-sidebar {
- padding-left: 50px;
- }
-}
-body.sidebar-refactoring .nav-sidebar {
- position: fixed;
- z-index: 600;
- width: 220px;
- top: 40px;
- bottom: 0;
- left: 0;
- background-color: #303030;
- transform: translate3d(0, 0, 0);
-}
-@media (min-width: 576px) and (max-width: 576px) {
- body.sidebar-refactoring .nav-sidebar:not(.sidebar-collapsed-desktop) {
- box-shadow: inset -1px 0 0 #404040, 2px 1px 3px rgba(0, 0, 0, 0.1);
- }
-}
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop {
- width: 50px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .badge.badge-pill:not(.fly-out-badge),
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- > a {
- min-height: 45px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .fly-out-top-item {
- display: block;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .avatar-container {
- margin: 0 auto;
+table.table {
+ margin-bottom: 16px;
}
-body.sidebar-refactoring .nav-sidebar a {
+table.table .dropdown-menu a {
text-decoration: none;
- line-height: 1rem;
- color: #2f2a6b;
-}
-body.sidebar-refactoring .nav-sidebar li {
- white-space: nowrap;
-}
-body.sidebar-refactoring .nav-sidebar li .nav-item-name {
- flex: 1;
-}
-body.sidebar-refactoring .nav-sidebar li > a {
- margin-left: 0.25rem;
- margin-right: 0.25rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- display: flex;
- align-items: center;
- border-radius: 0.25rem;
- width: auto;
- margin-bottom: 1px;
-}
-body.sidebar-refactoring .nav-sidebar li.active > a {
- font-weight: 600;
-}
-body.sidebar-refactoring .nav-sidebar li.active > a:not(.has-sub-items) {
- background-color: rgba(41, 41, 97, 0.08);
-}
-body.sidebar-refactoring .nav-sidebar ul {
- padding-left: 0;
- list-style: none;
-}
-@media (max-width: 767.98px) {
- body.sidebar-refactoring .nav-sidebar {
- left: -220px;
- }
-}
-body.sidebar-refactoring .nav-sidebar .nav-icon-container {
- display: flex;
- margin-right: 8px;
-}
-body.sidebar-refactoring .nav-sidebar .fly-out-top-item {
- display: none;
-}
-body.sidebar-refactoring .nav-sidebar svg {
- height: 16px;
- width: 16px;
-}
-@media (min-width: 768px) and (max-width: 1199px) {
- body.sidebar-refactoring .nav-sidebar:not(.sidebar-expanded-mobile) {
- width: 50px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .badge.badge-pill:not(.fly-out-badge),
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-item-name {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- > a {
- min-height: 45px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .fly-out-top-item {
- display: block;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .avatar-container {
- margin: 0 auto;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header {
- height: 60px;
- width: 50px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header
- a {
- padding: 10px 4px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-icon-container {
- margin-right: 0;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button {
- padding: 16px;
- width: 49px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .collapse-text,
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
- display: none;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
- }
-}
-body.sidebar-refactoring .nav-sidebar-inner-scroll {
- height: 100%;
- width: 100%;
- overflow: auto;
-}
-body.sidebar-refactoring .sidebar-top-level-items {
- margin-bottom: 60px;
-}
-body.sidebar-refactoring .sidebar-top-level-items > li .badge.badge-pill {
- border-radius: 0.5rem;
- padding-top: 0.125rem;
- padding-bottom: 0.125rem;
- padding-left: 0.5rem;
- padding-right: 0.5rem;
- background-color: #064787;
- color: #9dc7f1;
-}
-body.sidebar-refactoring
- .sidebar-top-level-items
- > li.active
- .sidebar-sub-level-items:not(.is-fly-out-only) {
- display: block;
-}
-body.sidebar-refactoring
- .sidebar-top-level-items
- > li.active
- .badge.badge-pill {
- font-weight: 400;
- color: #9dc7f1;
-}
-body.sidebar-refactoring .sidebar-sub-level-items {
- padding-bottom: 0;
- display: none;
-}
-body.sidebar-refactoring .sidebar-sub-level-items:not(.fly-out-list) li > a {
- padding-left: 2.25rem;
-}
-body.sidebar-refactoring .toggle-sidebar-button,
-body.sidebar-refactoring .close-nav-button {
- height: 48px;
- padding: 0 16px;
- background-color: #303030;
- border: 0;
- color: #999;
- display: flex;
- align-items: center;
- background-color: #303030;
- color: #2f2a6b;
-}
-body.sidebar-refactoring .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right,
-body.sidebar-refactoring .close-nav-button .collapse-text,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-right {
- color: inherit;
-}
-body.sidebar-refactoring .toggle-sidebar-button,
-body.sidebar-refactoring .close-nav-button {
- position: fixed;
- bottom: 0;
- width: 219px;
- border-top: 1px solid #404040;
-}
-body.sidebar-refactoring .toggle-sidebar-button svg,
-body.sidebar-refactoring .close-nav-button svg {
- margin-right: 8px;
-}
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-right {
- display: none;
-}
-body.sidebar-refactoring .collapse-text {
- white-space: nowrap;
- overflow: hidden;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header {
- height: 60px;
- width: 50px;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header a {
- padding: 10px 4px;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .nav-icon-container {
- margin-right: 0;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .toggle-sidebar-button {
- padding: 16px;
- width: 49px;
+table.table .success,
+table.table .info {
+ color: #333;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .collapse-text,
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
- display: none;
+table.table .success a:not(.btn),
+table.table .info a:not(.btn) {
+ text-decoration: underline;
+ color: #333;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
+pre {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
display: block;
- margin: 0;
-}
-body.sidebar-refactoring .close-nav-button {
- display: none;
+ padding: 8px 12px;
+ margin: 0 0 8px;
+ font-size: 13px;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #fafafa;
+ background-color: #2e2e2e;
+ border: 1px solid #4f4f4f;
+ border-radius: 2px;
}
-@media (max-width: 767.98px) {
- body.sidebar-refactoring .close-nav-button {
- display: flex;
- }
- body.sidebar-refactoring .toggle-sidebar-button {
- display: none;
- }
+.monospace {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
}
-input::-moz-placeholder {
- color: #868686;
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ color: #a7a7a7;
opacity: 1;
}
-input::-ms-input-placeholder {
- color: #868686;
+input::-ms-input-placeholder,
+textarea::-ms-input-placeholder {
+ color: #a7a7a7;
}
-input:-ms-input-placeholder {
- color: #868686;
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+ color: #a7a7a7;
}
svg {
fill: currentColor;
}
+
svg.s12 {
width: 12px;
height: 12px;
}
+
svg.s16 {
width: 16px;
height: 16px;
}
+
svg.s18 {
width: 18px;
height: 18px;
}
+
svg.s12 {
vertical-align: -1px;
}
+
svg.s16 {
vertical-align: -3px;
}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+table.code {
+ width: 100%;
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ border: 0;
+ border-collapse: separate;
+ margin: 0;
+ padding: 0;
+ table-layout: fixed;
+ border-radius: 0 0 4px 4px;
+}
+.frame .badge.badge-pill {
+ position: absolute;
+ background-color: #1b69b6;
+ color: #333;
+ border: #333 1px solid;
+ min-height: 16px;
+ padding: 5px 8px;
+ border-radius: 12px;
+}
+.frame .badge.badge-pill {
+ transform: translate(-50%, -50%);
+}
+.color-label {
+ padding: 0 0.5rem;
+ line-height: 16px;
+ border-radius: 100px;
+ color: #333;
+}
+.label-link {
+ display: inline-flex;
+ vertical-align: text-bottom;
+}
+.milestones {
+ padding: 8px;
+ margin-top: 8px;
+ border-radius: 4px;
+ background-color: #4f4f4f;
+}
.search {
margin: 0 8px;
}
.search form {
- display: block;
margin: 0;
padding: 4px;
width: 200px;
@@ -1727,6 +1750,7 @@ svg.s16 {
border: 0;
border-radius: 4px;
}
+
@media (min-width: 1200px) {
.search form {
width: 320px;
@@ -1770,37 +1794,43 @@ svg.s16 {
max-height: 400px;
overflow: auto;
}
+
@media (min-width: 1200px) {
.search .search-input-wrap .dropdown-menu {
width: 320px;
}
}
-.search .identicon {
- flex-basis: 16px;
- flex-shrink: 0;
- margin-right: 4px;
+.search .search-input-wrap .dropdown-content {
+ max-height: 382px;
}
-.avatar,
-.avatar-container {
+.settings {
+ border-top: 1px solid #4f4f4f;
+}
+.settings:first-of-type {
+ margin-top: 10px;
+ border: 0;
+}
+.settings + div .settings:first-of-type {
+ margin-top: 0;
+ border-top: 1px solid #4f4f4f;
+}
+.avatar, .avatar-container {
float: left;
margin-right: 16px;
border-radius: 50%;
border: 1px solid #333;
}
-.avatar.s16,
-.avatar-container.s16 {
+.s16.avatar, .s16.avatar-container {
width: 16px;
height: 16px;
margin-right: 8px;
}
-.avatar.s18,
-.avatar-container.s18 {
+.s18.avatar, .s18.avatar-container {
width: 18px;
height: 18px;
margin-right: 8px;
}
-.avatar.s40,
-.avatar-container.s40 {
+.s40.avatar, .s40.avatar-container {
width: 40px;
height: 40px;
margin-right: 8px;
@@ -1814,45 +1844,15 @@ svg.s16 {
overflow: hidden;
border-color: rgba(255, 255, 255, 0.1);
}
+.avatar.center {
+ font-size: 14px;
+ line-height: 1.8em;
+ text-align: center;
+}
.avatar.avatar-tile {
border-radius: 0;
border: 0;
}
-.identicon {
- text-align: center;
- vertical-align: top;
- color: #525252;
- background-color: #eee;
-}
-.identicon.s16 {
- font-size: 10px;
- line-height: 16px;
-}
-.identicon.s40 {
- font-size: 16px;
- line-height: 38px;
-}
-.identicon.bg1 {
- background-color: #ffebee;
-}
-.identicon.bg2 {
- background-color: #f3e5f5;
-}
-.identicon.bg3 {
- background-color: #e8eaf6;
-}
-.identicon.bg4 {
- background-color: #e3f2fd;
-}
-.identicon.bg5 {
- background-color: #e0f2f1;
-}
-.identicon.bg6 {
- background-color: #fbe9e7;
-}
-.identicon.bg7 {
- background-color: #eee;
-}
.avatar-container {
overflow: hidden;
display: flex;
@@ -1887,207 +1887,6 @@ svg.s16 {
.rect-avatar.s40 {
border-radius: 4px;
}
-#content-body {
- display: block;
-}
-body.gl-dark .navbar-gitlab {
- background-color: #fafafa;
-}
-body.gl-dark .navbar-gitlab .navbar-collapse {
- color: #fafafa;
-}
-body.gl-dark .navbar-gitlab .container-fluid .navbar-toggler {
- border-left: 1px solid #b3b3b3;
-}
-body.gl-dark .navbar-gitlab .container-fluid .navbar-toggler svg {
- fill: #fafafa;
-}
-body.gl-dark .navbar-gitlab .navbar-sub-nav > li.active > a,
-body.gl-dark .navbar-gitlab .navbar-sub-nav > li.active > button,
-body.gl-dark .navbar-gitlab .navbar-sub-nav > li.dropdown.show > a,
-body.gl-dark .navbar-gitlab .navbar-sub-nav > li.dropdown.show > button,
-body.gl-dark .navbar-gitlab .navbar-nav > li.active > a,
-body.gl-dark .navbar-gitlab .navbar-nav > li.active > button,
-body.gl-dark .navbar-gitlab .navbar-nav > li.dropdown.show > a,
-body.gl-dark .navbar-gitlab .navbar-nav > li.dropdown.show > button {
- color: #fafafa;
- background-color: #333;
-}
-body.gl-dark .navbar-gitlab .navbar-sub-nav {
- color: #fafafa;
-}
-body.gl-dark .navbar-gitlab .nav > li {
- color: #fafafa;
-}
-body.gl-dark .navbar-gitlab .nav > li > a .notification-dot {
- border: 2px solid #fafafa;
-}
-body.gl-dark
- .navbar-gitlab
- .nav
- > li
- > a.header-help-dropdown-toggle
- .notification-dot {
- background-color: #fafafa;
-}
-body.gl-dark
- .navbar-gitlab
- .nav
- > li
- > a.header-user-dropdown-toggle
- .header-user-avatar {
- border-color: #fafafa;
-}
-body.gl-dark .navbar-gitlab .nav > li.active > a,
-body.gl-dark .navbar-gitlab .nav > li.dropdown.show > a {
- color: #fafafa;
- background-color: #333;
-}
-body.gl-dark .navbar-gitlab .nav > li.active > a .notification-dot,
-body.gl-dark .navbar-gitlab .nav > li.dropdown.show > a .notification-dot {
- border-color: #333;
-}
-body.gl-dark
- .navbar-gitlab
- .nav
- > li.active
- > a.header-help-dropdown-toggle
- .notification-dot,
-body.gl-dark
- .navbar-gitlab
- .nav
- > li.dropdown.show
- > a.header-help-dropdown-toggle
- .notification-dot {
- background-color: #fafafa;
-}
-body.gl-dark .search form {
- background-color: rgba(250, 250, 250, 0.2);
-}
-body.gl-dark .search .search-input::-ms-input-placeholder {
- color: rgba(250, 250, 250, 0.8);
-}
-body.gl-dark .search .search-input::placeholder {
- color: rgba(250, 250, 250, 0.8);
-}
-body.gl-dark .search .search-input-wrap .search-icon,
-body.gl-dark .search .search-input-wrap .clear-icon {
- fill: rgba(250, 250, 250, 0.8);
-}
-body.gl-dark .nav-sidebar li.active {
- box-shadow: inset 4px 0 0 #999;
-}
-body.gl-dark .nav-sidebar li.active > a {
- color: #f0f0f0;
-}
-body.gl-dark .nav-sidebar li.active .nav-icon-container svg {
- fill: #f0f0f0;
-}
-body.gl-dark .sidebar-top-level-items > li.active .badge.badge-pill {
- color: #f0f0f0;
-}
-body.gl-dark .logo-text svg {
- fill: var(--gl-text-color);
-}
-body.gl-dark .navbar-gitlab {
- background-color: var(--gray-50);
- box-shadow: 0 1px 0 0 var(--gray-100);
-}
-body.gl-dark .navbar-gitlab .navbar-sub-nav li.active > a,
-body.gl-dark .navbar-gitlab .navbar-sub-nav li.active > button,
-body.gl-dark .navbar-gitlab .navbar-sub-nav li.dropdown.show > a,
-body.gl-dark .navbar-gitlab .navbar-sub-nav li.dropdown.show > button,
-body.gl-dark .navbar-gitlab .navbar-nav li.active > a,
-body.gl-dark .navbar-gitlab .navbar-nav li.active > button,
-body.gl-dark .navbar-gitlab .navbar-nav li.dropdown.show > a,
-body.gl-dark .navbar-gitlab .navbar-nav li.dropdown.show > button {
- color: var(--gl-text-color);
- background-color: var(--gray-200);
-}
-body.gl-dark .navbar-gitlab .search form {
- background-color: var(--gray-100);
- box-shadow: inset 0 0 0 1px var(--border-color);
-}
-body.gl-dark .navbar-gitlab .search form:active {
- background-color: var(--gray-100);
- box-shadow: inset 0 0 0 1px var(--blue-200);
-}
-
-body.gl-dark {
- --gray-10: #1f1f1f;
- --gray-50: #303030;
- --gray-100: #404040;
- --gray-200: #525252;
- --gray-300: #5e5e5e;
- --gray-400: #868686;
- --gray-500: #999;
- --gray-600: #bfbfbf;
- --gray-700: #dbdbdb;
- --gray-800: #f0f0f0;
- --gray-900: #fafafa;
- --gray-950: #fff;
- --green-50: #0a4020;
- --green-100: #0d532a;
- --green-200: #24663b;
- --green-300: #217645;
- --green-400: #108548;
- --green-500: #2da160;
- --green-600: #52b87a;
- --green-700: #91d4a8;
- --green-800: #c3e6cd;
- --green-900: #ecf4ee;
- --green-950: #f1fdf6;
- --blue-50: #033464;
- --blue-100: #064787;
- --blue-200: #0b5cad;
- --blue-300: #1068bf;
- --blue-400: #1f75cb;
- --blue-500: #428fdc;
- --blue-600: #63a6e9;
- --blue-700: #9dc7f1;
- --blue-800: #cbe2f9;
- --blue-900: #e9f3fc;
- --blue-950: #f2f9ff;
- --orange-50: #5c2900;
- --orange-100: #703800;
- --orange-200: #8f4700;
- --orange-300: #9e5400;
- --orange-400: #ab6100;
- --orange-500: #c17d10;
- --orange-600: #d99530;
- --orange-700: #e9be74;
- --orange-800: #f5d9a8;
- --orange-900: #fdf1dd;
- --orange-950: #fff4e1;
- --red-50: #660e00;
- --red-100: #8d1300;
- --red-200: #ae1800;
- --red-300: #c91c00;
- --red-400: #dd2b0e;
- --red-500: #ec5941;
- --red-600: #f57f6c;
- --red-700: #fcb5aa;
- --red-800: #fdd4cd;
- --red-900: #fcf1ef;
- --red-950: #fff4f3;
- --indigo-50: #1a1a40;
- --indigo-100: #292961;
- --indigo-200: #393982;
- --indigo-300: #4b4ba3;
- --indigo-400: #5b5bbd;
- --indigo-500: #6666c4;
- --indigo-600: #7c7ccc;
- --indigo-700: #a6a6de;
- --indigo-800: #d1d1f0;
- --indigo-900: #ebebfa;
- --indigo-950: #f7f7ff;
- --indigo-900-alpha-008: rgba(235, 235, 250, 0.08);
- --gl-text-color: #fafafa;
- --border-color: #4f4f4f;
- --white: #333;
- --black: #fff;
- --svg-status-bg: #333;
-}
.tab-width-8 {
-moz-tab-size: 8;
tab-size: 8;
@@ -2103,16 +1902,12 @@ body.gl-dark {
white-space: nowrap;
width: 1px;
}
-.gl-absolute {
- position: absolute;
-}
.gl-ml-3 {
margin-left: 0.5rem;
}
-.gl-mx-0\! {
- margin-left: 0 !important;
- margin-right: 0 !important;
+.content-wrapper > .alert-wrapper,
+#content-body, .modal-dialog {
+ display: block;
}
-
-@import "startup/cloaking";
+@import 'cloaking';
@include cloak-startup-scss(none);
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index 35b18b25158..44da509481d 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -1,6 +1,3 @@
-// DO NOT EDIT! This is auto-generated from "yarn run generate:startup_css"
-// Please see the feedback issue for more details and help:
-// https://gitlab.com/gitlab-org/gitlab/-/issues/331812
@charset "UTF-8";
*,
*::before,
@@ -11,16 +8,12 @@ html {
font-family: sans-serif;
line-height: 1.15;
}
-aside,
-header,
-nav {
+ header, nav, section {
display: block;
}
body {
margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
- "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
@@ -28,29 +21,55 @@ body {
text-align: left;
background-color: #fff;
}
-h1 {
+h1, h2, h3 {
margin-top: 0;
margin-bottom: 0.25rem;
}
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
ul {
margin-top: 0;
margin-bottom: 1rem;
}
+
ul ul {
margin-bottom: 0;
}
+
strong {
font-weight: bolder;
}
+sub {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -.25em;
+}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
-a:not([href]):not([class]) {
+a:not([href]) {
color: inherit;
text-decoration: none;
}
+pre,
+code {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ font-size: 1em;
+}
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
img {
vertical-align: middle;
border-style: none;
@@ -59,11 +78,18 @@ svg {
overflow: hidden;
vertical-align: middle;
}
+table {
+ border-collapse: collapse;
+}
+th {
+ text-align: inherit;
+}
button {
border-radius: 0;
}
input,
-button {
+button,
+textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
@@ -76,20 +102,21 @@ input {
button {
text-transform: none;
}
-[role="button"] {
- cursor: pointer;
-}
button:not(:disabled),
[type="button"]:not(:disabled),
-[type="submit"]:not(:disabled) {
+[type="reset"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner {
+[type="reset"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
[type="search"] {
outline-offset: -2px;
}
@@ -97,24 +124,81 @@ summary {
display: list-item;
cursor: pointer;
}
+template {
+ display: none;
+}
[hidden] {
display: none !important;
}
-h1,
-.h1 {
+h1, h2, h3,
+.h1, .h2, .h3 {
margin-bottom: 0.25rem;
font-weight: 600;
line-height: 1.2;
color: #303030;
}
-h1,
-.h1 {
+h1, .h1 {
font-size: 2.1875rem;
}
+h2, .h2 {
+ font-size: 1.75rem;
+}
+h3, .h3 {
+ font-size: 1.53125rem;
+}
.list-unstyled {
padding-left: 0;
list-style: none;
}
+code {
+ font-size: 90%;
+ color: #1f1f1f;
+ word-wrap: break-word;
+}
+a > code {
+ color: inherit;
+}
+pre {
+ display: block;
+ font-size: 90%;
+ color: #303030;
+}
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+.container {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px;
+ }
+}
.container-fluid {
width: 100%;
padding-right: 15px;
@@ -122,7 +206,48 @@ h1,
margin-right: auto;
margin-left: auto;
}
-.form-control {
+
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px;
+ }
+}
+.row {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+}
+.table {
+ width: 100%;
+ margin-bottom: 0.5rem;
+ color: #303030;
+}
+.table th,
+.table td {
+ padding: 0.75rem;
+ vertical-align: top;
+ border-top: 1px solid #dbdbdb;
+}
+ .search form {
display: block;
width: 100%;
height: 34px;
@@ -136,21 +261,18 @@ h1,
border: 1px solid #dbdbdb;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
-.form-control:-moz-focusring {
+ .search form:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #303030;
}
-.form-control::-ms-input-placeholder {
- color: #5e5e5e;
- opacity: 1;
-}
-.form-control::placeholder {
+ .search form::placeholder {
color: #5e5e5e;
opacity: 1;
}
-.form-control:disabled {
+ .search form:disabled {
background-color: #fafafa;
opacity: 1;
}
@@ -159,8 +281,9 @@ h1,
flex-flow: row wrap;
align-items: center;
}
+
@media (min-width: 576px) {
- .form-inline .form-control {
+ .form-inline .search form, .search .form-inline form {
display: inline-block;
width: auto;
vertical-align: middle;
@@ -172,7 +295,7 @@ h1,
color: #303030;
text-align: center;
vertical-align: middle;
- -moz-user-select: none;
+ cursor: pointer;
user-select: none;
background-color: transparent;
border: 1px solid transparent;
@@ -181,24 +304,26 @@ h1,
line-height: 20px;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
-.btn:disabled {
+.btn.disabled, .btn:disabled {
opacity: 0.65;
}
-.btn:not(:disabled):not(.disabled) {
- cursor: pointer;
+a.btn.disabled {
+ pointer-events: none;
}
.collapse:not(.show) {
display: none;
}
+
.dropdown {
position: relative;
}
-.dropdown-menu-toggle {
+ .dropdown-menu-toggle {
white-space: nowrap;
}
-.dropdown-menu-toggle::after {
+ .dropdown-menu-toggle::after {
display: inline-block;
margin-left: 0.255em;
vertical-align: 0.255em;
@@ -208,7 +333,7 @@ h1,
border-bottom: 0;
border-left: 0.3em solid transparent;
}
-.dropdown-menu-toggle:empty::after {
+ .dropdown-menu-toggle:empty::after {
margin-left: 0;
}
.dropdown-menu {
@@ -230,6 +355,16 @@ h1,
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.25rem;
}
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+ .divider {
+ height: 0;
+ margin: 4px 0;
+ overflow: hidden;
+ border-top: 1px solid #dbdbdb;
+}
.dropdown-menu.show {
display: block;
}
@@ -248,6 +383,7 @@ h1,
justify-content: space-between;
padding: 0.25rem 0.5rem;
}
+.navbar .container,
.navbar .container-fluid {
display: flex;
flex-wrap: wrap;
@@ -278,12 +414,15 @@ h1,
border: 1px solid transparent;
border-radius: 0.25rem;
}
+
@media (max-width: 575.98px) {
+ .navbar-expand-sm > .container,
.navbar-expand-sm > .container-fluid {
padding-right: 0;
padding-left: 0;
}
}
+
@media (min-width: 576px) {
.navbar-expand-sm {
flex-flow: row nowrap;
@@ -295,6 +434,7 @@ h1,
.navbar-expand-sm .navbar-nav .dropdown-menu {
position: absolute;
}
+ .navbar-expand-sm > .container,
.navbar-expand-sm > .container-fluid {
flex-wrap: nowrap;
}
@@ -328,6 +468,7 @@ h1,
vertical-align: baseline;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
.badge:empty {
@@ -342,6 +483,10 @@ h1,
padding-left: 0.6em;
border-radius: 10rem;
}
+.media {
+ display: flex;
+ align-items: flex-start;
+}
.close {
float: right;
font-size: 1.5rem;
@@ -349,15 +494,55 @@ h1,
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
- opacity: 0.5;
+ opacity: .5;
}
button.close {
padding: 0;
background-color: transparent;
border: 0;
+ appearance: none;
+}
+a.close.disabled {
+ pointer-events: none;
}
-.rounded-circle {
- border-radius: 50% !important;
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.5rem;
+ pointer-events: none;
+}
+
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto;
+ }
+}
+.bg-transparent {
+ background-color: transparent !important;
+}
+.border {
+ border: 1px solid #dbdbdb !important;
+}
+.border-top {
+ border-top: 1px solid #dbdbdb !important;
+}
+.border-right {
+ border-right: 1px solid #dbdbdb !important;
+}
+.border-bottom {
+ border-bottom: 1px solid #dbdbdb !important;
+}
+.border-left {
+ border-left: 1px solid #dbdbdb !important;
+}
+.rounded {
+ border-radius: 0.25rem !important;
+}
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
}
.d-none {
display: none !important;
@@ -368,16 +553,19 @@ button.close {
.d-block {
display: block !important;
}
+
@media (min-width: 576px) {
.d-sm-none {
display: none !important;
}
}
+
@media (min-width: 768px) {
.d-md-block {
display: block !important;
}
}
+
@media (min-width: 992px) {
.d-lg-none {
display: none !important;
@@ -386,11 +574,18 @@ button.close {
display: block !important;
}
}
+
@media (min-width: 1200px) {
.d-xl-block {
display: block !important;
}
}
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+.float-right {
+ float: right !important;
+}
.sr-only {
position: absolute;
width: 1px;
@@ -405,60 +600,73 @@ button.close {
.m-auto {
margin: auto !important;
}
-.gl-button {
- display: inline-flex;
+.text-nowrap {
+ white-space: nowrap !important;
}
-.gl-button:not(.btn-link):active {
- text-decoration: none;
+.visible {
+ visibility: visible !important;
}
-.gl-button.gl-button {
- border-width: 0;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- background-color: transparent;
- line-height: 1rem;
+ .search form.focus {
color: #303030;
- fill: currentColor;
- box-shadow: inset 0 0 0 1px #bfbfbf;
- justify-content: center;
- align-items: center;
- font-size: 0.875rem;
- border-radius: 0.25rem;
-}
-.gl-button.gl-button.btn-default {
background-color: #fff;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
-.gl-button.gl-button.btn-default:active,
-.gl-button.gl-button.btn-default.active {
- box-shadow: inset 0 0 0 2px #5e5e5e, 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
+.gl-badge {
+ display: inline-flex;
+ align-items: center;
+ font-size: 0.75rem;
+ font-weight: 400;
+ line-height: 1rem;
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
outline: none;
- background-color: #dbdbdb;
}
-body,
-.form-control,
+body, .search form,
.search form {
font-size: 0.875rem;
}
button,
-html [type="button"],
-[type="submit"],
-[role="button"] {
+html [type='button'],
+[type='reset'],
+[role='button'] {
cursor: pointer;
}
h1,
-.h1 {
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
margin-top: 20px;
margin-bottom: 10px;
}
+input[type='file'] {
+ line-height: 1;
+}
+
strong {
font-weight: bold;
}
a {
color: #1068bf;
}
+code {
+ padding: 2px 4px;
+ color: #1f1f1f;
+ background-color: #f0f0f0;
+ border-radius: 4px;
+}
+.code > code {
+ background-color: inherit;
+ padding: unset;
+}
+table {
+ border-spacing: 0;
+}
.hidden {
display: none !important;
visibility: hidden !important;
@@ -466,7 +674,7 @@ a {
.hide {
display: none;
}
-.dropdown-menu-toggle::after {
+ .dropdown-menu-toggle::after {
display: none;
}
.badge:not(.gl-badge) {
@@ -476,11 +684,8 @@ a {
font-weight: 400;
display: inline-block;
}
-.divider {
- height: 0;
- margin: 4px 0;
- overflow: hidden;
- border-top: 1px solid #dbdbdb;
+pre code {
+ white-space: pre-wrap;
}
.toggle-sidebar-button .collapse-text,
.toggle-sidebar-button .icon-chevron-double-lg-left,
@@ -496,6 +701,29 @@ html {
body {
text-decoration-skip: ink;
}
+.content-wrapper {
+ margin-top: 40px;
+ padding-bottom: 100px;
+}
+.container {
+ padding-top: 0;
+ z-index: 5;
+}
+.container .content {
+ margin: 0;
+}
+
+@media (max-width: 575.98px) {
+ .container .content {
+ margin-top: 20px;
+ }
+}
+
+@media (max-width: 575.98px) {
+ .container .container .title {
+ padding-left: 15px !important;
+ }
+}
.btn {
border-radius: 4px;
font-size: 0.875rem;
@@ -507,12 +735,7 @@ body {
color: #303030;
white-space: nowrap;
}
-.btn:active {
- background-color: #f0f0f0;
- box-shadow: none;
-}
-.btn:active,
-.btn.active {
+.btn:active, .btn.active {
background-color: #eaeaea;
border-color: #e3e3e3;
color: #303030;
@@ -521,7 +744,8 @@ body {
height: 15px;
width: 15px;
}
-.btn svg:not(:last-child) {
+.btn svg:not(:last-child),
+.btn .fa:not(:last-child) {
margin-right: 5px;
}
.badge.badge-pill:not(.gl-badge) {
@@ -530,10 +754,51 @@ body {
color: #525252;
vertical-align: baseline;
}
+.hint {
+ font-style: italic;
+ color: #bfbfbf;
+}
+.bold {
+ font-weight: 600;
+}
+pre.wrap {
+ word-break: break-word;
+ white-space: pre-wrap;
+}
+table a code {
+ position: relative;
+ top: -2px;
+ margin-right: 3px;
+}
+.loading {
+ margin: 20px auto;
+ height: 40px;
+ color: #525252;
+ font-size: 32px;
+ text-align: center;
+}
+.highlight {
+ text-shadow: none;
+}
.chart {
overflow: hidden;
height: 220px;
}
+.break-word {
+ word-wrap: break-word;
+}
+.center {
+ text-align: center;
+}
+.block {
+ display: block;
+}
+.flex {
+ display: flex;
+}
+.flex-grow {
+ flex-grow: 1;
+}
.dropdown {
position: relative;
}
@@ -544,22 +809,23 @@ body {
max-height: 312px;
overflow-y: auto;
}
+
@media (max-width: 575.98px) {
.show.dropdown .dropdown-menu {
width: 100%;
}
}
-.show.dropdown .dropdown-menu-toggle,
+ .show.dropdown .dropdown-menu-toggle,
.show.dropdown .dropdown-menu-toggle {
border-color: #c4c4c4;
}
-.show.dropdown [data-toggle="dropdown"] {
+.show.dropdown [data-toggle='dropdown'] {
outline: 0;
}
.search-input-container .dropdown-menu {
margin-top: 11px;
}
-.dropdown-menu-toggle {
+ .dropdown-menu-toggle {
padding: 6px 8px 6px 10px;
background-color: #fff;
color: #303030;
@@ -569,16 +835,21 @@ body {
border-radius: 0.25rem;
white-space: nowrap;
}
-.no-outline.dropdown-menu-toggle {
+ .no-outline.dropdown-menu-toggle {
outline: 0;
}
-.dropdown-menu-toggle.dropdown-menu-toggle {
- justify-content: flex-start;
- overflow: hidden;
+ .dropdown-menu-toggle .fa {
+ color: #c4c4c4;
+}
+.dropdown-menu-toggle {
padding-right: 25px;
position: relative;
- text-overflow: ellipsis;
width: 160px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.dropdown-menu-toggle .fa {
+ position: absolute;
}
.dropdown-menu {
display: none;
@@ -625,13 +896,6 @@ body {
text-align: left;
width: 100%;
}
-.dropdown-menu li > a:active,
-.dropdown-menu li button:active {
- background-color: #eee;
- color: #303030;
- outline: 0;
- text-decoration: none;
-}
.dropdown-menu .divider {
height: 1px;
margin: 0.25rem 0;
@@ -641,39 +905,66 @@ body {
.dropdown-menu .badge.badge-pill + span:not(.badge):not(.badge-pill) {
margin-right: 40px;
}
+.dropdown-select {
+ width: 300px;
+}
+
+@media (max-width: 767.98px) {
+ .dropdown-select {
+ width: 100%;
+ }
+}
+.dropdown-content {
+ max-height: 252px;
+ overflow-y: auto;
+}
+.dropdown-loading {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: none;
+ z-index: 9;
+ background-color: rgba(255, 255, 255, 0.6);
+ font-size: 28px;
+}
+.dropdown-loading .fa {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -14px;
+ margin-left: -14px;
+}
+
@media (max-width: 575.98px) {
.navbar-gitlab li.dropdown {
position: static;
}
- .navbar-gitlab li.dropdown.user-counter {
- margin-left: 8px !important;
- }
- .navbar-gitlab li.dropdown.user-counter > a {
- padding: 0 4px !important;
- }
header.navbar-gitlab .dropdown .dropdown-menu {
width: 100%;
min-width: 100%;
}
}
+
@media (max-width: 767.98px) {
.dropdown-menu-toggle {
width: 100%;
}
}
+textarea {
+ resize: vertical;
+}
input {
border-radius: 0.25rem;
color: #303030;
background-color: #fff;
}
-.form-control {
+ .search form {
border-radius: 4px;
padding: 6px 10px;
}
-.form-control::-ms-input-placeholder {
- color: #868686;
-}
-.form-control::placeholder {
+ .search form::placeholder {
color: #868686;
}
.navbar-gitlab {
@@ -682,6 +973,7 @@ input {
margin-bottom: 0;
min-height: 40px;
border: 0;
+ border-bottom: 1px solid #dbdbdb;
position: fixed;
top: 0;
left: 0;
@@ -731,6 +1023,9 @@ input {
.navbar-gitlab .header-content .title img + .logo-text {
margin-left: 8px;
}
+.navbar-gitlab .header-content .title.wrap {
+ white-space: normal;
+}
.navbar-gitlab .header-content .title a {
display: flex;
align-items: center;
@@ -738,6 +1033,9 @@ input {
margin: 5px 2px 5px -8px;
border-radius: 4px;
}
+.navbar-gitlab .header-content .dropdown.open > a {
+ border-bottom-color: #fff;
+}
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
margin: 0 2px;
}
@@ -746,6 +1044,7 @@ input {
border-top: 0;
padding: 0;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .navbar-collapse {
flex: 1 1 auto;
@@ -754,6 +1053,7 @@ input {
.navbar-gitlab .navbar-collapse .nav {
flex-wrap: nowrap;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .navbar-collapse .nav > li:not(.d-none) a {
margin-left: 0;
@@ -776,10 +1076,7 @@ input {
text-align: center;
color: currentColor;
}
-.navbar-gitlab .container-fluid .navbar-toggler.active {
- color: currentColor;
- background-color: transparent;
-}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid .navbar-nav {
display: flex;
@@ -787,14 +1084,11 @@ input {
flex-direction: row;
}
}
-.navbar-gitlab
- .container-fluid
- .navbar-nav
- li
- .badge.badge-pill:not(.merge-request-badge) {
+.navbar-gitlab .container-fluid .navbar-nav li .badge.badge-pill {
box-shadow: none;
font-weight: 600;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid .nav > li.header-user {
padding-left: 10px;
@@ -806,6 +1100,7 @@ input {
padding: 6px 8px;
height: 32px;
}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid .nav > li > a {
padding: 0;
@@ -814,12 +1109,7 @@ input {
.navbar-gitlab .container-fluid .nav > li > a.header-user-dropdown-toggle {
margin-left: 2px;
}
-.navbar-gitlab
- .container-fluid
- .nav
- > li
- > a.header-user-dropdown-toggle
- .header-user-avatar {
+.navbar-gitlab .container-fluid .nav > li > a.header-user-dropdown-toggle .header-user-avatar {
margin-right: 0;
}
.navbar-gitlab .container-fluid .nav > li .header-new-dropdown-toggle {
@@ -840,9 +1130,7 @@ input {
height: 32px;
font-weight: 600;
}
-.navbar-sub-nav > li .top-nav-toggle,
.navbar-sub-nav > li > button,
-.navbar-nav > li .top-nav-toggle,
.navbar-nav > li > button {
background: transparent;
border: 0;
@@ -880,25 +1168,31 @@ input {
font-weight: 400;
margin-left: -6px;
font-size: 11px;
- color: var(--gray-950, #fff);
+ color: #fff;
padding: 0 5px;
line-height: 12px;
border-radius: 7px;
box-shadow: 0 1px 0 rgba(76, 78, 84, 0.2);
}
-.title-container .badge.badge-pill:not(.merge-request-badge).green-badge,
-.navbar-nav .badge.badge-pill:not(.merge-request-badge).green-badge {
- background-color: var(--green-400, #2da160);
+.title-container .badge.badge-pill.green-badge,
+.navbar-nav .badge.badge-pill.green-badge {
+ background-color: #108548;
}
-.title-container
- .badge.badge-pill:not(.merge-request-badge).merge-requests-count,
-.navbar-nav .badge.badge-pill:not(.merge-request-badge).merge-requests-count {
- background-color: var(--orange-400, #c17d10);
+.title-container .badge.badge-pill.merge-requests-count,
+.navbar-nav .badge.badge-pill.merge-requests-count {
+ background-color: #de7e00;
}
-.title-container .badge.badge-pill:not(.merge-request-badge).todos-count,
-.navbar-nav .badge.badge-pill:not(.merge-request-badge).todos-count {
- background-color: var(--blue-400, #428fdc);
+.title-container .badge.badge-pill.todos-count,
+.navbar-nav .badge.badge-pill.todos-count {
+ background-color: #1f75cb;
}
+.title-container .canary-badge .badge,
+.navbar-nav .canary-badge .badge {
+ font-size: 12px;
+ line-height: 16px;
+ padding: 0 0.5rem;
+}
+
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid {
font-size: 18px;
@@ -925,7 +1219,7 @@ input {
}
.header-user.show .dropdown-menu {
margin-top: 4px;
- color: var(--gl-text-color, #303030);
+ color: #303030;
left: auto;
max-height: 445px;
}
@@ -938,32 +1232,30 @@ input {
border-radius: 50%;
border: 1px solid #f5f5f5;
}
-.notification-dot {
- background-color: #d99530;
- height: 12px;
- width: 12px;
- margin-top: -15px;
- pointer-events: none;
- visibility: hidden;
+.media {
+ display: flex;
+ align-items: flex-start;
}
-.top-nav-toggle .dropdown-icon {
- margin-right: 0.5rem;
+.card {
+ margin-bottom: 16px;
}
-.tanuki-logo .tanuki-left-ear,
-.tanuki-logo .tanuki-right-ear,
-.tanuki-logo .tanuki-nose {
- fill: #e24329;
+.content-wrapper {
+ width: 100%;
}
-.tanuki-logo .tanuki-left-eye,
-.tanuki-logo .tanuki-right-eye {
- fill: #fc6d26;
+.content-wrapper .container-fluid {
+ padding: 0 16px;
}
-.tanuki-logo .tanuki-left-cheek,
-.tanuki-logo .tanuki-right-cheek {
- fill: #fca326;
+
+@media (min-width: 768px) {
+ .page-with-contextual-sidebar {
+ padding-left: 50px;
+ }
}
-.card {
- margin-bottom: 16px;
+
+@media (min-width: 1200px) {
+ .page-with-contextual-sidebar {
+ padding-left: 220px;
+ }
}
.context-header {
position: relative;
@@ -990,20 +1282,9 @@ input {
overflow: hidden;
text-overflow: ellipsis;
}
-@media (min-width: 768px) {
- .page-with-contextual-sidebar {
- padding-left: 50px;
- }
-}
-@media (min-width: 1200px) {
- .page-with-contextual-sidebar {
- padding-left: 220px;
- }
-}
-@media (min-width: 768px) {
- .page-with-icon-sidebar {
- padding-left: 50px;
- }
+.context-header .sidebar-context-title.text-secondary {
+ font-weight: normal;
+ font-size: 0.8em;
}
.nav-sidebar {
position: fixed;
@@ -1016,6 +1297,7 @@ input {
box-shadow: inset -1px 0 0 #dbdbdb;
transform: translate3d(0, 0, 0);
}
+
@media (min-width: 576px) and (max-width: 576px) {
.nav-sidebar:not(.sidebar-collapsed-desktop) {
box-shadow: inset -1px 0 0 #dbdbdb, 2px 1px 3px rgba(0, 0, 0, 0.1);
@@ -1028,6 +1310,7 @@ input {
overflow-x: hidden;
}
.nav-sidebar.sidebar-collapsed-desktop .badge.badge-pill:not(.fly-out-badge),
+.nav-sidebar.sidebar-collapsed-desktop .sidebar-context-title,
.nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
border: 0;
clip: rect(0, 0, 0, 0);
@@ -1048,6 +1331,9 @@ input {
.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
margin: 0 auto;
}
+.nav-sidebar.sidebar-expanded-mobile {
+ left: 0;
+}
.nav-sidebar a {
text-decoration: none;
}
@@ -1070,6 +1356,7 @@ input {
.nav-sidebar li.active > a {
font-weight: 600;
}
+
@media (max-width: 767.98px) {
.nav-sidebar {
left: -220px;
@@ -1086,6 +1373,7 @@ input {
height: 16px;
width: 16px;
}
+
@media (min-width: 768px) and (max-width: 1199px) {
.nav-sidebar:not(.sidebar-expanded-mobile) {
width: 50px;
@@ -1093,8 +1381,8 @@ input {
.nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
overflow-x: hidden;
}
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .badge.badge-pill:not(.fly-out-badge),
+ .nav-sidebar:not(.sidebar-expanded-mobile) .badge.badge-pill:not(.fly-out-badge),
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title,
.nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name {
border: 0;
clip: rect(0, 0, 0, 0);
@@ -1122,21 +1410,7 @@ input {
.nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
padding: 10px 4px;
}
- .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li .sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
.nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
@@ -1146,17 +1420,11 @@ input {
padding: 16px;
width: 49px;
}
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .collapse-text,
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .collapse-text,
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .icon-chevron-double-lg-left {
display: none;
}
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .icon-chevron-double-lg-right {
display: block;
margin: 0;
}
@@ -1173,12 +1441,10 @@ input {
.sidebar-sub-level-items > li a {
padding: 8px 16px 8px 40px;
}
-.sidebar-sub-level-items > li.active a {
- background: rgba(0, 0, 0, 0.04);
-}
.sidebar-top-level-items {
margin-bottom: 60px;
}
+
@media (min-width: 576px) {
.sidebar-top-level-items > li > a {
margin-right: 1px;
@@ -1198,28 +1464,23 @@ input {
.sidebar-top-level-items > li.active .badge.badge-pill {
font-weight: 600;
}
-.sidebar-top-level-items
- > li.active
- .sidebar-sub-level-items:not(.is-fly-out-only) {
+.sidebar-top-level-items > li.active .sidebar-sub-level-items:not(.is-fly-out-only) {
display: block;
}
.toggle-sidebar-button,
.close-nav-button {
+ width: 219px;
+ position: fixed;
height: 48px;
+ bottom: 0;
padding: 0 16px;
background-color: #fafafa;
border: 0;
+ border-top: 1px solid #dbdbdb;
color: #666;
display: flex;
align-items: center;
}
-.toggle-sidebar-button,
-.close-nav-button {
- position: fixed;
- bottom: 0;
- width: 219px;
- border-top: 1px solid #dbdbdb;
-}
.toggle-sidebar-button svg,
.close-nav-button svg {
margin-right: 8px;
@@ -1239,21 +1500,7 @@ input {
.sidebar-collapsed-desktop .context-header a {
padding: 10px 4px;
}
-.sidebar-collapsed-desktop .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
+.sidebar-collapsed-desktop .sidebar-top-level-items > li .sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
.sidebar-collapsed-desktop .nav-icon-container {
@@ -1267,9 +1514,7 @@ input {
.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
display: none;
}
-.sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
+.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-right {
display: block;
margin: 0;
}
@@ -1285,6 +1530,7 @@ input {
.close-nav-button {
display: none;
}
+
@media (max-width: 767.98px) {
.close-nav-button {
display: flex;
@@ -1293,412 +1539,128 @@ input {
display: none;
}
}
-body.sidebar-refactoring .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right {
- color: #c4c4c4;
-}
-body.sidebar-refactoring .nav-sidebar {
- box-shadow: none;
-}
-body.sidebar-refactoring .nav-sidebar li.active {
- background-color: transparent;
- box-shadow: none;
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 50px;
- }
-}
-@media (min-width: 1200px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 220px;
- }
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-icon-sidebar {
- padding-left: 50px;
- }
-}
-body.sidebar-refactoring .nav-sidebar {
- position: fixed;
- z-index: 600;
- width: 220px;
- top: 40px;
- bottom: 0;
- left: 0;
- background-color: #f0f0f0;
- transform: translate3d(0, 0, 0);
-}
-@media (min-width: 576px) and (max-width: 576px) {
- body.sidebar-refactoring .nav-sidebar:not(.sidebar-collapsed-desktop) {
- box-shadow: inset -1px 0 0 #dbdbdb, 2px 1px 3px rgba(0, 0, 0, 0.1);
- }
-}
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop {
- width: 50px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .badge.badge-pill:not(.fly-out-badge),
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- > a {
- min-height: 45px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .fly-out-top-item {
- display: block;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .avatar-container {
- margin: 0 auto;
+table.table {
+ margin-bottom: 16px;
}
-body.sidebar-refactoring .nav-sidebar a {
+table.table .dropdown-menu a {
text-decoration: none;
- line-height: 1rem;
- color: #2f2a6b;
-}
-body.sidebar-refactoring .nav-sidebar li {
- white-space: nowrap;
-}
-body.sidebar-refactoring .nav-sidebar li .nav-item-name {
- flex: 1;
-}
-body.sidebar-refactoring .nav-sidebar li > a {
- margin-left: 0.25rem;
- margin-right: 0.25rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- display: flex;
- align-items: center;
- border-radius: 0.25rem;
- width: auto;
- margin-bottom: 1px;
-}
-body.sidebar-refactoring .nav-sidebar li.active > a {
- font-weight: 600;
-}
-body.sidebar-refactoring .nav-sidebar li.active > a:not(.has-sub-items) {
- background-color: rgba(41, 41, 97, 0.08);
-}
-body.sidebar-refactoring .nav-sidebar ul {
- padding-left: 0;
- list-style: none;
}
-@media (max-width: 767.98px) {
- body.sidebar-refactoring .nav-sidebar {
- left: -220px;
- }
-}
-body.sidebar-refactoring .nav-sidebar .nav-icon-container {
- display: flex;
- margin-right: 8px;
-}
-body.sidebar-refactoring .nav-sidebar .fly-out-top-item {
- display: none;
-}
-body.sidebar-refactoring .nav-sidebar svg {
- height: 16px;
- width: 16px;
-}
-@media (min-width: 768px) and (max-width: 1199px) {
- body.sidebar-refactoring .nav-sidebar:not(.sidebar-expanded-mobile) {
- width: 50px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .badge.badge-pill:not(.fly-out-badge),
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-item-name {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- > a {
- min-height: 45px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .fly-out-top-item {
- display: block;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .avatar-container {
- margin: 0 auto;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header {
- height: 60px;
- width: 50px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header
- a {
- padding: 10px 4px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-icon-container {
- margin-right: 0;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button {
- padding: 16px;
- width: 49px;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .collapse-text,
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
- display: none;
- }
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
- }
-}
-body.sidebar-refactoring .nav-sidebar-inner-scroll {
- height: 100%;
- width: 100%;
- overflow: auto;
-}
-body.sidebar-refactoring .sidebar-top-level-items {
- margin-bottom: 60px;
+table.table .success,
+table.table .info {
+ color: #fff;
}
-body.sidebar-refactoring .sidebar-top-level-items > li .badge.badge-pill {
- border-radius: 0.5rem;
- padding-top: 0.125rem;
- padding-bottom: 0.125rem;
- padding-left: 0.5rem;
- padding-right: 0.5rem;
- background-color: #cbe2f9;
- color: #0b5cad;
+table.table .success a:not(.btn),
+table.table .info a:not(.btn) {
+ text-decoration: underline;
+ color: #fff;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- > li.active
- .sidebar-sub-level-items:not(.is-fly-out-only) {
+pre {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
display: block;
-}
-body.sidebar-refactoring
- .sidebar-top-level-items
- > li.active
- .badge.badge-pill {
- font-weight: 400;
- color: #0b5cad;
-}
-body.sidebar-refactoring .sidebar-sub-level-items {
- padding-bottom: 0;
- display: none;
-}
-body.sidebar-refactoring .sidebar-sub-level-items:not(.fly-out-list) li > a {
- padding-left: 2.25rem;
-}
-body.sidebar-refactoring .toggle-sidebar-button,
-body.sidebar-refactoring .close-nav-button {
- height: 48px;
- padding: 0 16px;
+ padding: 8px 12px;
+ margin: 0 0 8px;
+ font-size: 13px;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #303030;
background-color: #fafafa;
- border: 0;
- color: #666;
- display: flex;
- align-items: center;
- background-color: #f0f0f0;
- color: #2f2a6b;
-}
-body.sidebar-refactoring .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right,
-body.sidebar-refactoring .close-nav-button .collapse-text,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-right {
- color: inherit;
-}
-body.sidebar-refactoring .toggle-sidebar-button,
-body.sidebar-refactoring .close-nav-button {
- position: fixed;
- bottom: 0;
- width: 219px;
- border-top: 1px solid #dbdbdb;
-}
-body.sidebar-refactoring .toggle-sidebar-button svg,
-body.sidebar-refactoring .close-nav-button svg {
- margin-right: 8px;
-}
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-right {
- display: none;
-}
-body.sidebar-refactoring .collapse-text {
- white-space: nowrap;
- overflow: hidden;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header {
- height: 60px;
- width: 50px;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header a {
- padding: 10px 4px;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .nav-icon-container {
- margin-right: 0;
-}
-body.sidebar-refactoring .sidebar-collapsed-desktop .toggle-sidebar-button {
- padding: 16px;
- width: 49px;
-}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .collapse-text,
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
- display: none;
-}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
-}
-body.sidebar-refactoring .close-nav-button {
- display: none;
+ border: 1px solid #dbdbdb;
+ border-radius: 2px;
}
-@media (max-width: 767.98px) {
- body.sidebar-refactoring .close-nav-button {
- display: flex;
- }
- body.sidebar-refactoring .toggle-sidebar-button {
- display: none;
- }
+.monospace {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
}
-input::-moz-placeholder {
+input::-moz-placeholder,
+textarea::-moz-placeholder {
color: #868686;
opacity: 1;
}
-input::-ms-input-placeholder {
+input::-ms-input-placeholder,
+textarea::-ms-input-placeholder {
color: #868686;
}
-input:-ms-input-placeholder {
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
color: #868686;
}
svg {
fill: currentColor;
}
+
svg.s12 {
width: 12px;
height: 12px;
}
+
svg.s16 {
width: 16px;
height: 16px;
}
+
svg.s18 {
width: 18px;
height: 18px;
}
+
svg.s12 {
vertical-align: -1px;
}
+
svg.s16 {
vertical-align: -3px;
}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+table.code {
+ width: 100%;
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ border: 0;
+ border-collapse: separate;
+ margin: 0;
+ padding: 0;
+ table-layout: fixed;
+ border-radius: 0 0 4px 4px;
+}
+.frame .badge.badge-pill {
+ position: absolute;
+ background-color: #428fdc;
+ color: #fff;
+ border: #fff 1px solid;
+ min-height: 16px;
+ padding: 5px 8px;
+ border-radius: 12px;
+}
+.frame .badge.badge-pill {
+ transform: translate(-50%, -50%);
+}
+.color-label {
+ padding: 0 0.5rem;
+ line-height: 16px;
+ border-radius: 100px;
+ color: #fff;
+}
+.label-link {
+ display: inline-flex;
+ vertical-align: text-bottom;
+}
+.milestones {
+ padding: 8px;
+ margin-top: 8px;
+ border-radius: 4px;
+ background-color: #dbdbdb;
+}
.search {
margin: 0 8px;
}
.search form {
- display: block;
margin: 0;
padding: 4px;
width: 200px;
@@ -1707,6 +1669,7 @@ svg.s16 {
border: 0;
border-radius: 4px;
}
+
@media (min-width: 1200px) {
.search form {
width: 320px;
@@ -1750,37 +1713,43 @@ svg.s16 {
max-height: 400px;
overflow: auto;
}
+
@media (min-width: 1200px) {
.search .search-input-wrap .dropdown-menu {
width: 320px;
}
}
-.search .identicon {
- flex-basis: 16px;
- flex-shrink: 0;
- margin-right: 4px;
+.search .search-input-wrap .dropdown-content {
+ max-height: 382px;
}
-.avatar,
-.avatar-container {
+.settings {
+ border-top: 1px solid #dbdbdb;
+}
+.settings:first-of-type {
+ margin-top: 10px;
+ border: 0;
+}
+.settings + div .settings:first-of-type {
+ margin-top: 0;
+ border-top: 1px solid #dbdbdb;
+}
+.avatar, .avatar-container {
float: left;
margin-right: 16px;
border-radius: 50%;
border: 1px solid #f5f5f5;
}
-.avatar.s16,
-.avatar-container.s16 {
+.s16.avatar, .s16.avatar-container {
width: 16px;
height: 16px;
margin-right: 8px;
}
-.avatar.s18,
-.avatar-container.s18 {
+.s18.avatar, .s18.avatar-container {
width: 18px;
height: 18px;
margin-right: 8px;
}
-.avatar.s40,
-.avatar-container.s40 {
+.s40.avatar, .s40.avatar-container {
width: 40px;
height: 40px;
margin-right: 8px;
@@ -1794,45 +1763,15 @@ svg.s16 {
overflow: hidden;
border-color: rgba(0, 0, 0, 0.1);
}
+.avatar.center {
+ font-size: 14px;
+ line-height: 1.8em;
+ text-align: center;
+}
.avatar.avatar-tile {
border-radius: 0;
border: 0;
}
-.identicon {
- text-align: center;
- vertical-align: top;
- color: #525252;
- background-color: #eee;
-}
-.identicon.s16 {
- font-size: 10px;
- line-height: 16px;
-}
-.identicon.s40 {
- font-size: 16px;
- line-height: 38px;
-}
-.identicon.bg1 {
- background-color: #ffebee;
-}
-.identicon.bg2 {
- background-color: #f3e5f5;
-}
-.identicon.bg3 {
- background-color: #e8eaf6;
-}
-.identicon.bg4 {
- background-color: #e3f2fd;
-}
-.identicon.bg5 {
- background-color: #e0f2f1;
-}
-.identicon.bg6 {
- background-color: #fbe9e7;
-}
-.identicon.bg7 {
- background-color: #eee;
-}
.avatar-container {
overflow: hidden;
display: flex;
@@ -1867,10 +1806,6 @@ svg.s16 {
.rect-avatar.s40 {
border-radius: 4px;
}
-#content-body {
- display: block;
-}
-
.tab-width-8 {
-moz-tab-size: 8;
tab-size: 8;
@@ -1886,16 +1821,12 @@ svg.s16 {
white-space: nowrap;
width: 1px;
}
-.gl-absolute {
- position: absolute;
-}
.gl-ml-3 {
margin-left: 0.5rem;
}
-.gl-mx-0\! {
- margin-left: 0 !important;
- margin-right: 0 !important;
+.content-wrapper > .alert-wrapper,
+#content-body, .modal-dialog {
+ display: block;
}
-
-@import "startup/cloaking";
+@import 'cloaking';
@include cloak-startup-scss(none);
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index ebb4f32054f..6b78abdb5e0 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -1,6 +1,3 @@
-// DO NOT EDIT! This is auto-generated from "yarn run generate:startup_css"
-// Please see the feedback issue for more details and help:
-// https://gitlab.com/gitlab-org/gitlab/-/issues/331812
@charset "UTF-8";
*,
*::before,
@@ -11,14 +8,12 @@ html {
font-family: sans-serif;
line-height: 1.15;
}
-header {
+ header, nav, section {
display: block;
}
body {
margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
- "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
@@ -31,8 +26,7 @@ hr {
height: 0;
overflow: visible;
}
-h1,
-h3 {
+h1, h2, h3 {
margin-top: 0;
margin-bottom: 0.25rem;
}
@@ -45,20 +39,47 @@ address {
font-style: normal;
line-height: inherit;
}
+
+ul {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ul ul {
+ margin-bottom: 0;
+}
+
+strong {
+ font-weight: bolder;
+}
+sub {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -.25em;
+}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
-a:not([href]):not([class]) {
+a:not([href]) {
color: inherit;
text-decoration: none;
}
+pre,
code {
- font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
- "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
font-size: 1em;
}
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
img {
vertical-align: middle;
border-style: none;
@@ -67,54 +88,89 @@ svg {
overflow: hidden;
vertical-align: middle;
}
+table {
+ border-collapse: collapse;
+}
+th {
+ text-align: inherit;
+}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
-input {
+button {
+ border-radius: 0;
+}
+input,
+button,
+textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
+button,
input {
overflow: visible;
}
+button {
+ text-transform: none;
+}
+button:not(:disabled),
+[type="button"]:not(:disabled),
+[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
+
+input[type="checkbox"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
+[type="search"] {
+ outline-offset: -2px;
+}
summary {
display: list-item;
cursor: pointer;
}
+template {
+ display: none;
+}
[hidden] {
display: none !important;
}
-h1,
-h3,
-.h1,
-.h3 {
+h1, h2, h3,
+.h1, .h2, .h3 {
margin-bottom: 0.25rem;
font-weight: 600;
line-height: 1.2;
color: #303030;
}
-h1,
-.h1 {
+h1, .h1 {
font-size: 2.1875rem;
}
-h3,
-.h3 {
+h2, .h2 {
+ font-size: 1.75rem;
+}
+h3, .h3 {
font-size: 1.53125rem;
}
hr {
@@ -123,6 +179,10 @@ hr {
border: 0;
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
code {
font-size: 90%;
color: #1f1f1f;
@@ -131,6 +191,16 @@ code {
a > code {
color: inherit;
}
+pre {
+ display: block;
+ font-size: 90%;
+ color: #303030;
+}
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
.container {
width: 100%;
padding-right: 15px;
@@ -138,21 +208,56 @@ a > code {
margin-right: auto;
margin-left: auto;
}
+
+@media (min-width: 576px) {
+ .container {
+ max-width: 540px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 720px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ max-width: 960px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ max-width: 1140px;
+ }
+}
+.container-fluid {
+ width: 100%;
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+
@media (min-width: 576px) {
.container {
max-width: 540px;
}
}
+
@media (min-width: 768px) {
.container {
max-width: 720px;
}
}
+
@media (min-width: 992px) {
.container {
max-width: 960px;
}
}
+
@media (min-width: 1200px) {
.container {
max-width: 1140px;
@@ -164,26 +269,19 @@ a > code {
margin-right: -15px;
margin-left: -15px;
}
-.col,
-.col-sm-5,
-.col-sm-7,
-.col-sm-12 {
+ .col-sm-5, .col-sm-7, .col-sm-12 {
position: relative;
width: 100%;
padding-right: 15px;
padding-left: 15px;
}
-.col {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
-}
.order-1 {
order: 1;
}
.order-12 {
order: 12;
}
+
@media (min-width: 576px) {
.col-sm-5 {
flex: 0 0 41.66667%;
@@ -204,7 +302,18 @@ a > code {
order: 12;
}
}
-.form-control {
+.table {
+ width: 100%;
+ margin-bottom: 0.5rem;
+ color: #303030;
+}
+.table th,
+.table td {
+ padding: 0.75rem;
+ vertical-align: top;
+ border-top: 1px solid #dbdbdb;
+}
+.form-control, .search form {
display: block;
width: 100%;
height: 34px;
@@ -218,37 +327,52 @@ a > code {
border: 1px solid #dbdbdb;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
-.form-control:-moz-focusring {
+.form-control:-moz-focusring, .search form:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 #303030;
}
-.form-control::-ms-input-placeholder {
- color: #5e5e5e;
- opacity: 1;
-}
-.form-control::placeholder {
+.form-control::placeholder, .search form::placeholder {
color: #5e5e5e;
opacity: 1;
}
-.form-control:disabled {
+.form-control:disabled, .search form:disabled {
background-color: #fafafa;
opacity: 1;
}
+textarea.form-control {
+ height: auto;
+}
.form-group {
margin-bottom: 1rem;
}
-.form-row {
+.form-inline {
display: flex;
- flex-wrap: wrap;
- margin-right: -5px;
- margin-left: -5px;
+ flex-flow: row wrap;
+ align-items: center;
}
-.form-row > .col,
-.form-row > [class*="col-"] {
- padding-right: 5px;
- padding-left: 5px;
+
+@media (min-width: 576px) {
+ .form-inline label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-group {
+ display: flex;
+ flex: 0 0 auto;
+ flex-flow: row wrap;
+ align-items: center;
+ margin-bottom: 0;
+ }
+ .form-inline .form-control, .form-inline .search form, .search .form-inline form {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
}
.btn {
display: inline-block;
@@ -256,7 +380,7 @@ a > code {
color: #303030;
text-align: center;
vertical-align: middle;
- -moz-user-select: none;
+ cursor: pointer;
user-select: none;
background-color: transparent;
border: 1px solid transparent;
@@ -265,17 +389,148 @@ a > code {
line-height: 20px;
border-radius: 0.25rem;
}
+
@media (prefers-reduced-motion: reduce) {
}
-.btn:disabled {
+.btn.disabled, .btn:disabled {
opacity: 0.65;
}
-.btn:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
+a.btn.disabled,
fieldset:disabled a.btn {
pointer-events: none;
}
+.btn-success {
+ color: #fff;
+ background-color: #108548;
+ border-color: #108548;
+}
+.btn-success.disabled, .btn-success:disabled {
+ color: #fff;
+ background-color: #108548;
+ border-color: #108548;
+}
+.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,
+.show > .btn-success.dropdown-menu-toggle {
+ color: #fff;
+ background-color: #0b572f;
+ border-color: #094c29;
+}
+ .login-page input[type='submit'] {
+ display: block;
+ width: 100%;
+}
+ .login-page input[type='submit'] + input[type='submit'] {
+ margin-top: 0.5rem;
+}
+ .login-page input[type="submit"][type='submit'],
+.login-page input[type="reset"][type='submit'],
+.login-page input[type="button"][type='submit'] {
+ width: 100%;
+}
+.collapse:not(.show) {
+ display: none;
+}
+
+.dropdown {
+ position: relative;
+}
+ .dropdown-menu-toggle {
+ white-space: nowrap;
+}
+ .dropdown-menu-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+ .dropdown-menu-toggle:empty::after {
+ margin-left: 0;
+}
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0.125rem 0 0;
+ font-size: 1rem;
+ color: #303030;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+}
+.dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+ .divider {
+ height: 0;
+ margin: 4px 0;
+ overflow: hidden;
+ border-top: 1px solid #dbdbdb;
+}
+.dropdown-menu.show {
+ display: block;
+}
+.nav {
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
+}
+.nav-link.disabled {
+ color: #5e5e5e;
+ pointer-events: none;
+ cursor: default;
+}
+.nav-tabs {
+ border-bottom: 1px solid #999;
+}
+.nav-tabs .nav-item {
+ margin-bottom: -1px;
+}
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+.nav-tabs .nav-link.disabled {
+ color: #5e5e5e;
+ background-color: transparent;
+ border-color: transparent;
+}
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #525252;
+ background-color: #fff;
+ border-color: #999 #999 #fff;
+}
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
.navbar {
position: relative;
display: flex;
@@ -284,12 +539,77 @@ fieldset:disabled a.btn {
justify-content: space-between;
padding: 0.25rem 0.5rem;
}
-.navbar .container {
+.navbar .container,
+.navbar .container-fluid {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
}
+.navbar-nav {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
+}
+.navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+}
+.navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+.navbar-toggler {
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: 0.25rem;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ flex-wrap: nowrap;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+}
.card {
position: relative;
display: flex;
@@ -305,12 +625,132 @@ fieldset:disabled a.btn {
margin-right: 0;
margin-left: 0;
}
+.badge {
+ display: inline-block;
+ padding: 0.25em 0.4em;
+ font-size: 75%;
+ font-weight: 600;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: 0.25rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+}
+.badge:empty {
+ display: none;
+}
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+.badge-pill {
+ padding-right: 0.6em;
+ padding-left: 0.6em;
+ border-radius: 10rem;
+}
+.media {
+ display: flex;
+ align-items: flex-start;
+}
+.close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 600;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .5;
+}
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ appearance: none;
+}
+a.close.disabled {
+ pointer-events: none;
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 0.5rem;
+ pointer-events: none;
+}
+
+@media (min-width: 576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto;
+ }
+}
+.bg-transparent {
+ background-color: transparent !important;
+}
+.border {
+ border: 1px solid #dbdbdb !important;
+}
+.border-top {
+ border-top: 1px solid #dbdbdb !important;
+}
+.border-right {
+ border-right: 1px solid #dbdbdb !important;
+}
+.border-bottom {
+ border-bottom: 1px solid #dbdbdb !important;
+}
+.border-left {
+ border-left: 1px solid #dbdbdb !important;
+}
+.rounded {
+ border-radius: 0.25rem !important;
+}
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+.d-none {
+ display: none !important;
+}
+.d-inline-block {
+ display: inline-block !important;
+}
.d-block {
display: block !important;
}
.d-flex {
display: flex !important;
}
+
+@media (min-width: 576px) {
+ .d-sm-none {
+ display: none !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .d-md-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .d-xl-block {
+ display: block !important;
+ }
+}
.flex-wrap {
flex-wrap: wrap !important;
}
@@ -320,6 +760,9 @@ fieldset:disabled a.btn {
.align-items-center {
align-items: center !important;
}
+.float-right {
+ float: right !important;
+}
.fixed-top {
position: fixed;
top: 0;
@@ -327,8 +770,16 @@ fieldset:disabled a.btn {
left: 0;
z-index: 1030;
}
-.ml-2 {
- margin-left: 0.5rem !important;
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0;
}
.mt-3 {
margin-top: 1rem !important;
@@ -336,125 +787,81 @@ fieldset:disabled a.btn {
.mb-3 {
margin-bottom: 1rem !important;
}
+.m-auto {
+ margin: auto !important;
+}
+
@media (min-width: 576px) {
.mt-sm-0 {
margin-top: 0 !important;
}
}
-.text-center {
- text-align: center !important;
+.text-nowrap {
+ white-space: nowrap !important;
+}
+.text-left {
+ text-align: left !important;
}
.font-weight-normal {
font-weight: 400 !important;
}
-.gl-form-input,
-.gl-form-input.form-control {
- background-color: #fff;
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
- "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif,
- "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- font-size: 0.875rem;
- line-height: 1rem;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- height: auto;
- color: #303030;
- box-shadow: inset 0 0 0 1px #868686;
- border-style: none;
- appearance: none;
- -moz-appearance: none;
-}
-.gl-form-input:not(.form-control-plaintext):-moz-read-only,
-.gl-form-input.form-control:not(.form-control-plaintext):-moz-read-only {
- background-color: #fafafa;
- color: #868686;
- box-shadow: inset 0 0 0 1px #dbdbdb;
- cursor: not-allowed;
-}
-.gl-form-input:disabled,
-.gl-form-input:not(.form-control-plaintext):read-only,
-.gl-form-input.form-control:disabled,
-.gl-form-input.form-control:not(.form-control-plaintext):read-only {
- background-color: #fafafa;
- color: #868686;
- box-shadow: inset 0 0 0 1px #dbdbdb;
- cursor: not-allowed;
-}
-.gl-form-input::-ms-input-placeholder,
-.gl-form-input.form-control::-ms-input-placeholder {
- color: #868686;
-}
-.gl-form-input::placeholder,
-.gl-form-input.form-control::placeholder {
- color: #868686;
-}
-.gl-button {
- display: inline-flex;
+.visible {
+ visibility: visible !important;
}
-.gl-button:not(.btn-link):active {
- text-decoration: none;
-}
-.gl-button.gl-button {
- border-width: 0;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- background-color: transparent;
- line-height: 1rem;
+.form-control.focus, .search form.focus {
color: #303030;
- fill: currentColor;
- box-shadow: inset 0 0 0 1px #bfbfbf;
- justify-content: center;
- align-items: center;
- font-size: 0.875rem;
- border-radius: 0.25rem;
-}
-.gl-button.gl-button .gl-button-icon {
- height: 1rem;
- width: 1rem;
- flex-shrink: 0;
- margin-right: 0.25rem;
- top: auto;
-}
-.gl-button.gl-button.btn-default {
background-color: #fff;
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
-.gl-button.gl-button.btn-default:active {
- box-shadow: inset 0 0 0 2px #5e5e5e, 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
- outline: none;
- background-color: #dbdbdb;
-}
-.gl-button.gl-button.btn-confirm {
- color: #fff;
+input[type="color"].form-control {
+ height: 34px;
+ padding: 0.125rem 0.25rem;
}
-.gl-button.gl-button.btn-confirm {
- background-color: #1f75cb;
- box-shadow: inset 0 0 0 1px #1068bf;
+input[type="color"].form-control:disabled {
+ background-color: #666;
+ opacity: 0.65;
}
-.gl-button.gl-button.btn-confirm:active {
- box-shadow: inset 0 0 0 2px #033464, 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
+.gl-badge {
+ display: inline-flex;
+ align-items: center;
+ font-size: 0.75rem;
+ font-weight: 400;
+ line-height: 1rem;
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
outline: none;
- background-color: #0b5cad;
}
-body,
-.form-control {
+body, .form-control, .search form,
+.search form {
font-size: 0.875rem;
}
-[type="submit"] {
+button,
+html [type='button'],
+[type='reset'],
+[type='submit'],
+[role='button'] {
cursor: pointer;
}
h1,
.h1,
+h2,
+.h2,
h3,
.h3 {
margin-top: 20px;
margin-bottom: 10px;
}
+input[type='file'] {
+ line-height: 1;
+}
+
+strong {
+ font-weight: bold;
+}
a {
color: #1068bf;
}
@@ -471,6 +878,9 @@ code {
background-color: inherit;
padding: unset;
}
+table {
+ border-spacing: 0;
+}
.hidden {
display: none !important;
visibility: hidden !important;
@@ -478,6 +888,10 @@ code {
.hide {
display: none;
}
+ .dropdown-menu-toggle::after {
+ display: none;
+}
+.badge:not(.gl-badge),
.label {
padding: 4px 5px;
font-size: 12px;
@@ -485,6 +899,28 @@ code {
font-weight: 400;
display: inline-block;
}
+.nav-tabs {
+ border-bottom: 0;
+}
+.nav-tabs .nav-link {
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+}
+.nav-tabs .nav-item {
+ margin-bottom: 0;
+}
+pre code {
+ white-space: pre-wrap;
+}
+input[type="color"].form-control {
+ height: 34px;
+}
+.toggle-sidebar-button .collapse-text,
+.toggle-sidebar-button .icon-chevron-double-lg-left,
+.toggle-sidebar-button .icon-chevron-double-lg-right {
+ color: #666;
+}
svg {
vertical-align: baseline;
}
@@ -497,6 +933,10 @@ body {
body.navless {
background-color: #fff !important;
}
+.content-wrapper {
+ margin-top: 40px;
+ padding-bottom: 100px;
+}
.container {
padding-top: 0;
z-index: 5;
@@ -504,11 +944,13 @@ body.navless {
.container .content {
margin: 0;
}
+
@media (max-width: 575.98px) {
.container .content {
margin-top: 20px;
}
}
+
@media (max-width: 575.98px) {
.container .container .title {
padding-left: 15px !important;
@@ -529,35 +971,259 @@ body.navless {
color: #303030;
white-space: nowrap;
}
-.btn:active {
- background-color: #f0f0f0;
- box-shadow: none;
-}
-.btn:active {
+.btn:active, .btn.active {
+ box-shadow: rgba(0, 0, 0, 0.16);
background-color: #eaeaea;
border-color: #e3e3e3;
color: #303030;
}
+.btn.btn-success {
+ background-color: #108548;
+ border-color: #217645;
+ color: #fff;
+}
+.btn.btn-success:active, .btn.btn-success.active {
+ box-shadow: rgba(0, 0, 0, 0.16);
+ background-color: #24663b;
+ border-color: #0d532a;
+ color: #fff;
+}
.btn svg {
height: 15px;
width: 15px;
}
-.btn svg:not(:last-child) {
+.btn svg:not(:last-child),
+.btn .fa:not(:last-child) {
margin-right: 5px;
}
-.light {
- color: #303030;
+ .login-page input[type='submit'] {
+ width: 100%;
+ margin: 0;
+ margin-bottom: 15px;
+}
+ .login-page input.btn[type='submit'] {
+ padding: 6px 0;
+}
+.badge.badge-pill:not(.gl-badge) {
+ font-weight: 400;
+ background-color: rgba(0, 0, 0, 0.07);
+ color: #525252;
+ vertical-align: baseline;
+}
+.hint {
+ font-style: italic;
+ color: #bfbfbf;
+}
+.bold {
+ font-weight: 600;
+}
+.tab-content {
+ overflow: visible;
+}
+pre.wrap {
+ word-break: break-word;
+ white-space: pre-wrap;
}
hr {
- margin: 1.5rem 0;
+ margin: 24px 0;
border-top: 1px solid #eee;
}
+table a code {
+ position: relative;
+ top: -2px;
+ margin-right: 3px;
+}
+.loading {
+ margin: 20px auto;
+ height: 40px;
+ color: #525252;
+ font-size: 32px;
+ text-align: center;
+}
+.highlight {
+ text-shadow: none;
+}
+.chart {
+ overflow: hidden;
+ height: 220px;
+}
.footer-links {
margin-bottom: 20px;
}
.footer-links a {
margin-right: 15px;
}
+.break-word {
+ word-wrap: break-word;
+}
+.append-bottom-20 {
+ margin-bottom: 20px;
+}
+.center {
+ text-align: center;
+}
+.block {
+ display: block;
+}
+.flex {
+ display: flex;
+}
+.flex-grow {
+ flex-grow: 1;
+}
+.dropdown {
+ position: relative;
+}
+.show.dropdown .dropdown-menu {
+ transform: translateY(0);
+ display: block;
+ min-height: 40px;
+ max-height: 312px;
+ overflow-y: auto;
+}
+
+@media (max-width: 575.98px) {
+ .show.dropdown .dropdown-menu {
+ width: 100%;
+ }
+}
+ .show.dropdown .dropdown-menu-toggle,
+.show.dropdown .dropdown-menu-toggle {
+ border-color: #c4c4c4;
+}
+.show.dropdown [data-toggle='dropdown'] {
+ outline: 0;
+}
+.search-input-container .dropdown-menu {
+ margin-top: 11px;
+}
+ .dropdown-menu-toggle {
+ padding: 6px 8px 6px 10px;
+ background-color: #fff;
+ color: #303030;
+ font-size: 14px;
+ text-align: left;
+ border: 1px solid #dbdbdb;
+ border-radius: 0.25rem;
+ white-space: nowrap;
+}
+ .no-outline.dropdown-menu-toggle {
+ outline: 0;
+}
+ .dropdown-menu-toggle .fa {
+ color: #c4c4c4;
+}
+.dropdown-menu-toggle {
+ padding-right: 25px;
+ position: relative;
+ width: 160px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.dropdown-menu-toggle .fa {
+ position: absolute;
+}
+.dropdown-menu {
+ display: none;
+ position: absolute;
+ width: auto;
+ top: 100%;
+ z-index: 300;
+ min-width: 240px;
+ max-width: 500px;
+ margin-top: 4px;
+ margin-bottom: 24px;
+ font-size: 14px;
+ font-weight: 400;
+ padding: 8px 0;
+ background-color: #fff;
+ border: 1px solid #dbdbdb;
+ border-radius: 0.25rem;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+.dropdown-menu ul {
+ margin: 0;
+ padding: 0;
+}
+.dropdown-menu li {
+ display: block;
+ text-align: left;
+ list-style: none;
+ padding: 0 1px;
+}
+.dropdown-menu li > a,
+.dropdown-menu li button {
+ background: transparent;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none;
+ display: block;
+ font-weight: 400;
+ position: relative;
+ padding: 8px 12px;
+ color: #303030;
+ line-height: 16px;
+ white-space: normal;
+ overflow: hidden;
+ text-align: left;
+ width: 100%;
+}
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 0.25rem 0;
+ padding: 0;
+ background-color: #dbdbdb;
+}
+.dropdown-menu .badge.badge-pill + span:not(.badge):not(.badge-pill) {
+ margin-right: 40px;
+}
+.dropdown-select {
+ width: 300px;
+}
+
+@media (max-width: 767.98px) {
+ .dropdown-select {
+ width: 100%;
+ }
+}
+.dropdown-content {
+ max-height: 252px;
+ overflow-y: auto;
+}
+.dropdown-loading {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: none;
+ z-index: 9;
+ background-color: rgba(255, 255, 255, 0.6);
+ font-size: 28px;
+}
+.dropdown-loading .fa {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -14px;
+ margin-left: -14px;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab li.dropdown {
+ position: static;
+ }
+ header.navbar-gitlab .dropdown .dropdown-menu {
+ width: 100%;
+ min-width: 100%;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .dropdown-menu-toggle {
+ width: 100%;
+ }
+}
.flash-container {
margin: 0;
margin-bottom: 16px;
@@ -566,8 +1232,8 @@ hr {
z-index: 1;
}
.flash-container.sticky {
- position: -webkit-sticky;
position: sticky;
+ position: -webkit-sticky;
top: 48px;
z-index: 251;
}
@@ -577,6 +1243,9 @@ hr {
.flash-container:empty {
margin: 0;
}
+textarea {
+ resize: vertical;
+}
input {
border-radius: 0.25rem;
color: #303030;
@@ -588,61 +1257,809 @@ label {
label.label-bold {
font-weight: 600;
}
-.form-control {
+.form-control, .search form {
border-radius: 4px;
padding: 6px 10px;
}
-.form-control::-ms-input-placeholder {
+.form-control::placeholder, .search form::placeholder {
color: #868686;
}
-.form-control::placeholder {
- color: #868686;
+.gl-field-error {
+ color: #dd2b0e;
+ font-size: 0.875rem;
}
-.gl-show-field-errors .form-control:not(textarea) {
+.gl-show-field-errors .form-control:not(textarea), .gl-show-field-errors .search form:not(textarea), .search .gl-show-field-errors form:not(textarea) {
height: 34px;
}
.gl-show-field-errors .gl-field-hint {
color: #303030;
}
+
+@media (max-width: 575.98px) {
+ .remember-me .remember-me-checkbox {
+ margin-top: 0;
+ }
+}
+body.ui-indigo .navbar-gitlab {
+ background-color: #292961;
+}
+body.ui-indigo .navbar-gitlab .navbar-collapse {
+ color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .container-fluid .navbar-toggler {
+ border-left: 1px solid #6868b9;
+}
+body.ui-indigo .navbar-gitlab .container-fluid .navbar-toggler svg {
+ fill: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.active > a,
+body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.active > button, body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.dropdown.show > a,
+body.ui-indigo .navbar-gitlab .navbar-sub-nav > li.dropdown.show > button,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.active > a,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.active > button,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.dropdown.show > a,
+body.ui-indigo .navbar-gitlab .navbar-nav > li.dropdown.show > button {
+ color: #292961;
+ background-color: #fff;
+}
+body.ui-indigo .navbar-gitlab .navbar-sub-nav {
+ color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .nav > li {
+ color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .nav > li > a.header-user-dropdown-toggle .header-user-avatar {
+ border-color: #d1d1f0;
+}
+body.ui-indigo .navbar-gitlab .nav > li.active > a,
+body.ui-indigo .navbar-gitlab .nav > li.dropdown.show > a {
+ color: #292961;
+ background-color: #fff;
+}
+body.ui-indigo .search form {
+ background-color: rgba(209, 209, 240, 0.2);
+}
+body.ui-indigo .search .search-input::placeholder {
+ color: rgba(209, 209, 240, 0.8);
+}
+body.ui-indigo .search .search-input-wrap .search-icon,
+body.ui-indigo .search .search-input-wrap .clear-icon {
+ fill: rgba(209, 209, 240, 0.8);
+}
+body.ui-indigo .nav-sidebar li.active {
+ box-shadow: inset 4px 0 0 #4b4ba3;
+}
+body.ui-indigo .nav-sidebar li.active > a {
+ color: #393982;
+}
+body.ui-indigo .nav-sidebar li.active .nav-icon-container svg {
+ fill: #393982;
+}
+body.ui-indigo .sidebar-top-level-items > li.active .badge.badge-pill {
+ color: #393982;
+}
+body.ui-indigo .nav-links li.active a,
+body.ui-indigo .nav-links li a.active {
+ border-bottom: 2px solid #6666c4;
+}
+body.ui-indigo .nav-links li.active a .badge.badge-pill,
+body.ui-indigo .nav-links li a.active .badge.badge-pill {
+ font-weight: 600;
+}
+.navbar-gitlab {
+ padding: 0 16px;
+ z-index: 1000;
+ margin-bottom: 0;
+ min-height: 40px;
+ border: 0;
+ border-bottom: 1px solid #dbdbdb;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ border-radius: 0;
+}
+.navbar-gitlab .logo-text {
+ line-height: initial;
+}
+.navbar-gitlab .logo-text svg {
+ width: 55px;
+ height: 14px;
+ margin: 0;
+ fill: #fff;
+}
+.navbar-gitlab .close-icon {
+ display: none;
+}
+.navbar-gitlab .header-content {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ position: relative;
+ min-height: 40px;
+ padding-left: 0;
+}
+.navbar-gitlab .header-content .title-container {
+ display: flex;
+ align-items: stretch;
+ flex: 1 1 auto;
+ padding-top: 0;
+ overflow: visible;
+}
+.navbar-gitlab .header-content .title {
+ padding-right: 0;
+ color: currentColor;
+ display: flex;
+ position: relative;
+ margin: 0;
+ font-size: 18px;
+ vertical-align: top;
+ white-space: nowrap;
+}
+.navbar-gitlab .header-content .title img {
+ height: 28px;
+}
+.navbar-gitlab .header-content .title img + .logo-text {
+ margin-left: 8px;
+}
+.navbar-gitlab .header-content .title.wrap {
+ white-space: normal;
+}
+.navbar-gitlab .header-content .title a {
+ display: flex;
+ align-items: center;
+ padding: 2px 8px;
+ margin: 5px 2px 5px -8px;
+ border-radius: 4px;
+}
+.navbar-gitlab .header-content .dropdown.open > a {
+ border-bottom-color: #fff;
+}
+.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
+ margin: 0 2px;
+}
+.navbar-gitlab .navbar-collapse {
+ flex: 0 0 auto;
+ border-top: 0;
+ padding: 0;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab .navbar-collapse {
+ flex: 1 1 auto;
+ }
+}
+.navbar-gitlab .navbar-collapse .nav {
+ flex-wrap: nowrap;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab .navbar-collapse .nav > li:not(.d-none) a {
+ margin-left: 0;
+ }
+}
+.navbar-gitlab .container-fluid {
+ padding: 0;
+}
+.navbar-gitlab .container-fluid .user-counter svg {
+ margin-right: 3px;
+}
+.navbar-gitlab .container-fluid .navbar-toggler {
+ position: relative;
+ right: -10px;
+ border-radius: 0;
+ min-width: 45px;
+ padding: 0;
+ margin: 8px -7px 8px 0;
+ font-size: 14px;
+ text-align: center;
+ color: currentColor;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab .container-fluid .navbar-nav {
+ display: flex;
+ padding-right: 10px;
+ flex-direction: row;
+ }
+}
+.navbar-gitlab .container-fluid .navbar-nav li .badge.badge-pill {
+ box-shadow: none;
+ font-weight: 600;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab .container-fluid .nav > li.header-user {
+ padding-left: 10px;
+ }
+}
+.navbar-gitlab .container-fluid .nav > li > a {
+ will-change: color;
+ margin: 4px 0;
+ padding: 6px 8px;
+ height: 32px;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab .container-fluid .nav > li > a {
+ padding: 0;
+ }
+}
+.navbar-gitlab .container-fluid .nav > li > a.header-user-dropdown-toggle {
+ margin-left: 2px;
+}
+.navbar-gitlab .container-fluid .nav > li > a.header-user-dropdown-toggle .header-user-avatar {
+ margin-right: 0;
+}
+.navbar-gitlab .container-fluid .nav > li .header-new-dropdown-toggle {
+ margin-right: 0;
+}
+.navbar-sub-nav > li > a,
+.navbar-sub-nav > li > button,
+.navbar-nav > li > a,
+.navbar-nav > li > button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 6px 8px;
+ margin: 4px 2px;
+ font-size: 12px;
+ color: currentColor;
+ border-radius: 4px;
+ height: 32px;
+ font-weight: 600;
+}
+.navbar-sub-nav > li > button,
+.navbar-nav > li > button {
+ background: transparent;
+ border: 0;
+}
+.navbar-sub-nav .dropdown-menu,
+.navbar-nav .dropdown-menu {
+ position: absolute;
+}
+.navbar-sub-nav {
+ display: flex;
+ margin: 0 0 0 6px;
+}
+.caret-down,
+.btn .caret-down {
+ top: 0;
+ height: 11px;
+ width: 11px;
+ margin-left: 4px;
+ fill: currentColor;
+}
+.header-user .dropdown-menu,
+.header-new .dropdown-menu {
+ margin-top: 4px;
+}
+.btn-sign-in {
+ background-color: #ebebfa;
+ color: #292961;
+ font-weight: 600;
+ line-height: 18px;
+ margin: 4px 0 4px 2px;
+}
+.title-container .badge.badge-pill,
+.navbar-nav .badge.badge-pill {
+ position: inherit;
+ font-weight: 400;
+ margin-left: -6px;
+ font-size: 11px;
+ color: #fff;
+ padding: 0 5px;
+ line-height: 12px;
+ border-radius: 7px;
+ box-shadow: 0 1px 0 rgba(76, 78, 84, 0.2);
+}
+.title-container .badge.badge-pill.green-badge,
+.navbar-nav .badge.badge-pill.green-badge {
+ background-color: #108548;
+}
+.title-container .badge.badge-pill.merge-requests-count,
+.navbar-nav .badge.badge-pill.merge-requests-count {
+ background-color: #de7e00;
+}
+.title-container .badge.badge-pill.todos-count,
+.navbar-nav .badge.badge-pill.todos-count {
+ background-color: #1f75cb;
+}
+.title-container .canary-badge .badge,
+.navbar-nav .canary-badge .badge {
+ font-size: 12px;
+ line-height: 16px;
+ padding: 0 0.5rem;
+}
+
+@media (max-width: 575.98px) {
+ .navbar-gitlab .container-fluid {
+ font-size: 18px;
+ }
+ .navbar-gitlab .container-fluid .navbar-nav {
+ table-layout: fixed;
+ width: 100%;
+ margin: 0;
+ text-align: right;
+ }
+ .navbar-gitlab .container-fluid .navbar-collapse {
+ margin-left: -8px;
+ margin-right: -10px;
+ }
+ .navbar-gitlab .container-fluid .navbar-collapse .nav > li:not(.d-none) {
+ flex: 1;
+ }
+ .header-user-dropdown-toggle {
+ text-align: center;
+ }
+ .header-user-avatar {
+ float: none;
+ }
+}
+.header-user.show .dropdown-menu {
+ margin-top: 4px;
+ color: #303030;
+ left: auto;
+ max-height: 445px;
+}
+.header-user.show .dropdown-menu svg {
+ vertical-align: text-top;
+}
+.header-user-avatar {
+ float: left;
+ margin-right: 5px;
+ border-radius: 50%;
+ border: 1px solid #f5f5f5;
+}
.navbar-empty {
justify-content: center;
height: 40px;
background: #fff;
border-bottom: 1px solid #f0f0f0;
}
-.navbar-empty .tanuki-logo,
-.navbar-empty .brand-header-logo {
- max-height: 100%;
-}
-.tanuki-logo .tanuki-left-ear,
-.tanuki-logo .tanuki-right-ear,
-.tanuki-logo .tanuki-nose {
- fill: #e24329;
+
+@media (max-width: 575.98px) {
+ .nav-links > li > a .badge.badge-pill {
+ display: none;
+ }
}
-.tanuki-logo .tanuki-left-eye,
-.tanuki-logo .tanuki-right-eye {
- fill: #fc6d26;
+
+@media (max-width: 575.98px) {
+ .nav-links > li > a {
+ margin-right: 3px;
+ }
}
-.tanuki-logo .tanuki-left-cheek,
-.tanuki-logo .tanuki-right-cheek {
- fill: #fca326;
+.media {
+ display: flex;
+ align-items: flex-start;
}
.card {
margin-bottom: 16px;
}
-input::-moz-placeholder {
+.nav-links:not(.quick-links) {
+ display: flex;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ height: auto;
+ border-bottom: 1px solid #dbdbdb;
+}
+.content-wrapper {
+ width: 100%;
+}
+.content-wrapper .container-fluid {
+ padding: 0 16px;
+}
+
+@media (min-width: 768px) {
+ .page-with-contextual-sidebar {
+ padding-left: 50px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .page-with-contextual-sidebar {
+ padding-left: 220px;
+ }
+}
+.context-header {
+ position: relative;
+ margin-right: 2px;
+ width: 220px;
+}
+.context-header > a,
+.context-header > button {
+ font-weight: 600;
+ display: flex;
+ width: 100%;
+ align-items: center;
+ padding: 10px 16px 10px 10px;
+ color: #303030;
+ background-color: transparent;
+ border: 0;
+ text-align: left;
+}
+.context-header .avatar-container {
+ flex: 0 0 40px;
+ background-color: #fff;
+}
+.context-header .sidebar-context-title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.context-header .sidebar-context-title.text-secondary {
+ font-weight: normal;
+ font-size: 0.8em;
+}
+.nav-sidebar {
+ position: fixed;
+ z-index: 600;
+ width: 220px;
+ top: 40px;
+ bottom: 0;
+ left: 0;
+ background-color: #fafafa;
+ box-shadow: inset -1px 0 0 #dbdbdb;
+ transform: translate3d(0, 0, 0);
+}
+
+@media (min-width: 576px) and (max-width: 576px) {
+ .nav-sidebar:not(.sidebar-collapsed-desktop) {
+ box-shadow: inset -1px 0 0 #dbdbdb, 2px 1px 3px rgba(0, 0, 0, 0.1);
+ }
+}
+.nav-sidebar.sidebar-collapsed-desktop {
+ width: 50px;
+}
+.nav-sidebar.sidebar-collapsed-desktop .nav-sidebar-inner-scroll {
+ overflow-x: hidden;
+}
+.nav-sidebar.sidebar-collapsed-desktop .badge.badge-pill:not(.fly-out-badge),
+.nav-sidebar.sidebar-collapsed-desktop .sidebar-context-title,
+.nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ white-space: nowrap;
+ width: 1px;
+}
+.nav-sidebar.sidebar-collapsed-desktop .sidebar-top-level-items > li > a {
+ min-height: 45px;
+}
+.nav-sidebar.sidebar-collapsed-desktop .fly-out-top-item {
+ display: block;
+}
+.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
+ margin: 0 auto;
+}
+.nav-sidebar.sidebar-expanded-mobile {
+ left: 0;
+}
+.nav-sidebar a {
+ text-decoration: none;
+}
+.nav-sidebar ul {
+ padding-left: 0;
+ list-style: none;
+}
+.nav-sidebar li {
+ white-space: nowrap;
+}
+.nav-sidebar li a {
+ display: flex;
+ align-items: center;
+ padding: 12px 16px;
+ color: #666;
+}
+.nav-sidebar li .nav-item-name {
+ flex: 1;
+}
+.nav-sidebar li.active > a {
+ font-weight: 600;
+}
+
+@media (max-width: 767.98px) {
+ .nav-sidebar {
+ left: -220px;
+ }
+}
+.nav-sidebar .nav-icon-container {
+ display: flex;
+ margin-right: 8px;
+}
+.nav-sidebar .fly-out-top-item {
+ display: none;
+}
+.nav-sidebar svg {
+ height: 16px;
+ width: 16px;
+}
+
+@media (min-width: 768px) and (max-width: 1199px) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) {
+ width: 50px;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
+ overflow-x: hidden;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .badge.badge-pill:not(.fly-out-badge),
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title,
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name {
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ white-space: nowrap;
+ width: 1px;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li > a {
+ min-height: 45px;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .fly-out-top-item {
+ display: block;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .avatar-container {
+ margin: 0 auto;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
+ height: 60px;
+ width: 50px;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
+ padding: 10px 4px;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li .sidebar-sub-level-items:not(.flyout-list) {
+ display: none;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
+ margin-right: 0;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button {
+ padding: 16px;
+ width: 49px;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .collapse-text,
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .icon-chevron-double-lg-left {
+ display: none;
+ }
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button .icon-chevron-double-lg-right {
+ display: block;
+ margin: 0;
+ }
+}
+.nav-sidebar-inner-scroll {
+ height: 100%;
+ width: 100%;
+ overflow: auto;
+}
+.sidebar-sub-level-items {
+ display: none;
+ padding-bottom: 8px;
+}
+.sidebar-sub-level-items > li a {
+ padding: 8px 16px 8px 40px;
+}
+.sidebar-top-level-items {
+ margin-bottom: 60px;
+}
+
+@media (min-width: 576px) {
+ .sidebar-top-level-items > li > a {
+ margin-right: 1px;
+ }
+}
+.sidebar-top-level-items > li .badge.badge-pill {
+ background-color: rgba(0, 0, 0, 0.08);
+ color: #666;
+}
+.sidebar-top-level-items > li.active {
+ background: rgba(0, 0, 0, 0.04);
+}
+.sidebar-top-level-items > li.active > a {
+ margin-left: 4px;
+ padding-left: 12px;
+}
+.sidebar-top-level-items > li.active .badge.badge-pill {
+ font-weight: 600;
+}
+.sidebar-top-level-items > li.active .sidebar-sub-level-items:not(.is-fly-out-only) {
+ display: block;
+}
+.toggle-sidebar-button,
+.close-nav-button {
+ width: 219px;
+ position: fixed;
+ height: 48px;
+ bottom: 0;
+ padding: 0 16px;
+ background-color: #fafafa;
+ border: 0;
+ border-top: 1px solid #dbdbdb;
+ color: #666;
+ display: flex;
+ align-items: center;
+}
+.toggle-sidebar-button svg,
+.close-nav-button svg {
+ margin-right: 8px;
+}
+.toggle-sidebar-button .icon-chevron-double-lg-right,
+.close-nav-button .icon-chevron-double-lg-right {
+ display: none;
+}
+.collapse-text {
+ white-space: nowrap;
+ overflow: hidden;
+}
+.sidebar-collapsed-desktop .context-header {
+ height: 60px;
+ width: 50px;
+}
+.sidebar-collapsed-desktop .context-header a {
+ padding: 10px 4px;
+}
+.sidebar-collapsed-desktop .sidebar-top-level-items > li .sidebar-sub-level-items:not(.flyout-list) {
+ display: none;
+}
+.sidebar-collapsed-desktop .nav-icon-container {
+ margin-right: 0;
+}
+.sidebar-collapsed-desktop .toggle-sidebar-button {
+ padding: 16px;
+ width: 49px;
+}
+.sidebar-collapsed-desktop .toggle-sidebar-button .collapse-text,
+.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
+ display: none;
+}
+.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-right {
+ display: block;
+ margin: 0;
+}
+.fly-out-top-item > a {
+ display: flex;
+}
+.fly-out-top-item .fly-out-badge {
+ margin-left: 8px;
+}
+.fly-out-top-item-name {
+ flex: 1;
+}
+.close-nav-button {
+ display: none;
+}
+
+@media (max-width: 767.98px) {
+ .close-nav-button {
+ display: flex;
+ }
+ .toggle-sidebar-button {
+ display: none;
+ }
+}
+table.table {
+ margin-bottom: 16px;
+}
+table.table .dropdown-menu a {
+ text-decoration: none;
+}
+table.table .success,
+table.table .info {
+ color: #fff;
+}
+table.table .success a:not(.btn),
+table.table .info a:not(.btn) {
+ text-decoration: underline;
+ color: #fff;
+}
+pre {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ display: block;
+ padding: 8px 12px;
+ margin: 0 0 8px;
+ font-size: 13px;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #303030;
+ background-color: #fafafa;
+ border: 1px solid #dbdbdb;
+ border-radius: 2px;
+}
+.monospace {
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+}
+input::-moz-placeholder,
+textarea::-moz-placeholder {
color: #868686;
opacity: 1;
}
-input::-ms-input-placeholder {
+input::-ms-input-placeholder,
+textarea::-ms-input-placeholder {
color: #868686;
}
-input:-ms-input-placeholder {
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
color: #868686;
}
svg {
fill: currentColor;
}
+
+svg.s12 {
+ width: 12px;
+ height: 12px;
+}
+
+svg.s16 {
+ width: 16px;
+ height: 16px;
+}
+
+svg.s18 {
+ width: 18px;
+ height: 18px;
+}
+
+svg.s12 {
+ vertical-align: -1px;
+}
+
+svg.s16 {
+ vertical-align: -3px;
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+table.code {
+ width: 100%;
+ font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
+ border: 0;
+ border-collapse: separate;
+ margin: 0;
+ padding: 0;
+ table-layout: fixed;
+ border-radius: 0 0 4px 4px;
+}
+.frame .badge.badge-pill {
+ position: absolute;
+ background-color: #428fdc;
+ color: #fff;
+ border: #fff 1px solid;
+ min-height: 16px;
+ padding: 5px 8px;
+ border-radius: 12px;
+}
+.frame .badge.badge-pill {
+ transform: translate(-50%, -50%);
+}
+.color-label {
+ padding: 0 0.5rem;
+ line-height: 16px;
+ border-radius: 100px;
+ color: #fff;
+}
+.label-link {
+ display: inline-flex;
+ vertical-align: text-bottom;
+}
+.label-link .label {
+ vertical-align: inherit;
+ font-size: 12px;
+}
.login-page .container {
max-width: 960px;
}
@@ -679,25 +2096,6 @@ svg {
border-radius: 0.25rem;
padding: 15px;
}
-.login-page .login-box .login-heading h3,
-.login-page .omniauth-container .login-heading h3 {
- font-weight: 400;
- line-height: 1.5;
- margin: 0 0 10px;
-}
-.login-page .login-box .login-footer,
-.login-page .omniauth-container .login-footer {
- margin-top: 10px;
-}
-.login-page .login-box .login-footer p:last-child,
-.login-page .omniauth-container .login-footer p:last-child {
- margin-bottom: 0;
-}
-.login-page .login-box a.forgot,
-.login-page .omniauth-container a.forgot {
- float: right;
- padding-top: 6px;
-}
.login-page .login-box .nav .active a,
.login-page .omniauth-container .nav .active a {
background: transparent;
@@ -734,6 +2132,7 @@ svg {
background: none;
margin-bottom: 16px;
}
+
@media (max-width: 991.98px) {
.login-page .omniauth-container form {
width: 100%;
@@ -741,6 +2140,7 @@ svg {
}
.login-page .omniauth-container .omniauth-btn {
width: 100%;
+ padding: 8px;
}
.login-page .new-session-tabs {
display: flex;
@@ -748,19 +2148,6 @@ svg {
border-top-right-radius: 4px;
border-top-left-radius: 4px;
}
-.login-page .new-session-tabs.custom-provider-tabs {
- flex-wrap: wrap;
-}
-.login-page .new-session-tabs.custom-provider-tabs li {
- min-width: 85px;
- flex-basis: auto;
-}
-.login-page .new-session-tabs.custom-provider-tabs li:nth-child(n + 5) {
- border-top: 1px solid #dbdbdb;
-}
-.login-page .new-session-tabs.custom-provider-tabs a {
- font-size: 16px;
-}
.login-page .new-session-tabs li {
flex: 1;
text-align: center;
@@ -783,29 +2170,17 @@ svg {
.login-page .new-session-tabs li.active > a {
cursor: default;
}
-.login-page .form-control:active,
-.login-page .form-control:focus {
- background-color: #fff;
-}
.login-page .submit-container {
margin-top: 16px;
}
-.login-page input[type="submit"] {
+.login-page input[type='submit'] {
margin-bottom: 0;
- display: block;
- width: 100%;
}
.login-page .devise-errors h2 {
margin-top: 0;
font-size: 14px;
color: #ae1800;
}
-@media (max-width: 575.98px) {
- .login-page .col-md-5.float-right {
- float: none !important;
- margin-bottom: 45px;
- }
-}
.devise-layout-html {
margin: 0;
padding: 0;
@@ -838,57 +2213,191 @@ svg {
.devise-layout-html body .navless-container {
padding: 65px 15px;
}
+
@media (max-width: 575.98px) {
.devise-layout-html body .navless-container {
padding: 0 15px 65px;
}
}
+.milestones {
+ padding: 8px;
+ margin-top: 8px;
+ border-radius: 4px;
+ background-color: #dbdbdb;
+}
+.search {
+ margin: 0 8px;
+}
+.search form {
+ margin: 0;
+ padding: 4px;
+ width: 200px;
+ line-height: 24px;
+ height: 32px;
+ border: 0;
+ border-radius: 4px;
+}
-.gl-border-solid {
- border-style: solid;
+@media (min-width: 1200px) {
+ .search form {
+ width: 320px;
+ }
}
-.gl-border-gray-100 {
- border-color: #dbdbdb;
+.search .search-input {
+ border: 0;
+ font-size: 14px;
+ padding: 0 20px 0 0;
+ margin-left: 5px;
+ line-height: 25px;
+ width: 98%;
+ color: #fff;
+ background: none;
}
-.gl-border-1 {
- border-width: 1px;
+.search .search-input-container {
+ display: flex;
+ position: relative;
}
-.gl-rounded-base {
- border-radius: 0.25rem;
+.search .search-input-wrap {
+ width: 100%;
}
-.gl-text-green-600 {
- color: #217645;
+.search .search-input-wrap .search-icon,
+.search .search-input-wrap .clear-icon {
+ position: absolute;
+ right: 5px;
+ top: 4px;
}
-.gl-text-red-500 {
- color: #dd2b0e;
+.search .search-input-wrap .search-icon {
+ -moz-user-select: none;
+ user-select: none;
+}
+.search .search-input-wrap .clear-icon {
+ display: none;
}
-.gl-display-flex {
+.search .search-input-wrap .dropdown {
+ position: static;
+}
+.search .search-input-wrap .dropdown-menu {
+ left: -5px;
+ max-height: 400px;
+ overflow: auto;
+}
+
+@media (min-width: 1200px) {
+ .search .search-input-wrap .dropdown-menu {
+ width: 320px;
+ }
+}
+.search .search-input-wrap .dropdown-content {
+ max-height: 382px;
+}
+.settings {
+ border-top: 1px solid #dbdbdb;
+}
+.settings:first-of-type {
+ margin-top: 10px;
+ border: 0;
+}
+.settings + div .settings:first-of-type {
+ margin-top: 0;
+ border-top: 1px solid #dbdbdb;
+}
+.avatar, .avatar-container {
+ float: left;
+ margin-right: 16px;
+ border-radius: 50%;
+ border: 1px solid #f5f5f5;
+}
+.s16.avatar, .s16.avatar-container {
+ width: 16px;
+ height: 16px;
+ margin-right: 8px;
+}
+.s18.avatar, .s18.avatar-container {
+ width: 18px;
+ height: 18px;
+ margin-right: 8px;
+}
+.s40.avatar, .s40.avatar-container {
+ width: 40px;
+ height: 40px;
+ margin-right: 8px;
+}
+.avatar {
+ transition-property: none;
+ width: 40px;
+ height: 40px;
+ padding: 0;
+ background: #fdfdfd;
+ overflow: hidden;
+ border-color: rgba(0, 0, 0, 0.1);
+}
+.avatar.center {
+ font-size: 14px;
+ line-height: 1.8em;
+ text-align: center;
+}
+.avatar.avatar-tile {
+ border-radius: 0;
+ border: 0;
+}
+.avatar-container {
+ overflow: hidden;
display: flex;
}
-.gl-align-items-center {
- align-items: center;
+.avatar-container a {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ text-decoration: none;
}
-.gl-p-2 {
- padding: 0.25rem;
+.avatar-container .avatar {
+ border-radius: 0;
+ border: 0;
+ height: auto;
+ width: 100%;
+ margin: 0;
+ align-self: center;
}
-.gl-p-4 {
- padding: 0.75rem;
+.avatar-container.s40 {
+ min-width: 40px;
+ min-height: 40px;
}
-.gl-mt-2 {
- margin-top: 0.25rem;
+.rect-avatar {
+ border-radius: 2px;
}
-.gl-mb-2 {
- margin-bottom: 0.25rem;
+.rect-avatar.s16 {
+ border-radius: 2px;
}
-.gl-mb-3 {
- margin-bottom: 0.5rem;
+.rect-avatar.s18 {
+ border-radius: 2px;
}
-.gl-mb-5 {
- margin-bottom: 1rem;
+.rect-avatar.s40 {
+ border-radius: 4px;
}
-.gl-text-left {
- text-align: left;
+.tab-width-8 {
+ -moz-tab-size: 8;
+ tab-size: 8;
}
-
-@import "startup/cloaking";
+.gl-sr-only {
+ border: 0;
+ clip: rect(0, 0, 0, 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ white-space: nowrap;
+ width: 1px;
+}
+.gl-mt-5 {
+ margin-top: 1rem;
+}
+.gl-ml-3 {
+ margin-left: 0.5rem;
+}
+.content-wrapper > .alert-wrapper,
+#content-body, .modal-dialog {
+ display: block;
+}
+@import 'cloaking';
@include cloak-startup-scss(none);
diff --git a/app/graphql/mutations/ci/runner/delete.rb b/app/graphql/mutations/ci/runner/delete.rb
new file mode 100644
index 00000000000..8d9a5f15505
--- /dev/null
+++ b/app/graphql/mutations/ci/runner/delete.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Ci
+ module Runner
+ class Delete < BaseMutation
+ graphql_name 'RunnerDelete'
+
+ authorize :delete_runner
+
+ RunnerID = ::Types::GlobalIDType[::Ci::Runner]
+
+ argument :id, RunnerID,
+ required: true,
+ description: 'ID of the runner to delete.'
+
+ def resolve(id:, **runner_attrs)
+ runner = authorized_find!(id)
+
+ error = authenticate_delete_runner!(runner)
+ return { errors: [error] } if error
+
+ runner.destroy!
+
+ { errors: runner.errors.full_messages }
+ end
+
+ def authenticate_delete_runner!(runner)
+ return if current_user.can_admin_all_resources?
+
+ "Runner #{runner.to_global_id} associated with more than one project" if runner.projects.count > 1
+ end
+
+ def find_object(id)
+ # TODO: remove this line when the compatibility layer is removed
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = RunnerID.coerce_isolated_input(id)
+
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index df0e5484ae7..561cbf24da3 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -100,6 +100,7 @@ module Types
mount_mutation Mutations::Ci::Job::Play
mount_mutation Mutations::Ci::Job::Retry
mount_mutation Mutations::Ci::Runner::Update, feature_flag: :runner_graphql_query
+ mount_mutation Mutations::Ci::Runner::Delete, feature_flag: :runner_graphql_query
mount_mutation Mutations::Namespace::PackageSettings::Update
mount_mutation Mutations::UserCallouts::Create
end
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index 7507d5cb3b6..21f96c01f98 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -88,14 +88,6 @@ module GroupsHelper
.count
end
- def group_open_merge_requests_count(group)
- if Feature.enabled?(:cached_sidebar_merge_requests_count, group, default_enabled: :yaml)
- cached_issuables_count(@group, type: :merge_requests)
- else
- number_with_delimiter(group_merge_requests_count(state: 'opened'))
- end
- end
-
def group_merge_requests_count(state:)
MergeRequestsFinder
.new(current_user, group_id: @group.id, state: state, non_archived: true, include_subgroups: true)
diff --git a/app/services/ci/create_downstream_pipeline_service.rb b/app/services/ci/create_downstream_pipeline_service.rb
index 64a99e404c6..1eff76c2e5d 100644
--- a/app/services/ci/create_downstream_pipeline_service.rb
+++ b/app/services/ci/create_downstream_pipeline_service.rb
@@ -19,13 +19,14 @@ module Ci
DuplicateDownstreamPipelineError.new,
bridge_id: @bridge.id, project_id: @bridge.project_id
)
- return
+
+ return error('Already has a downstream pipeline')
end
pipeline_params = @bridge.downstream_pipeline_params
target_ref = pipeline_params.dig(:target_revision, :ref)
- return unless ensure_preconditions!(target_ref)
+ return error('Pre-conditions not met') unless ensure_preconditions!(target_ref)
service = ::Ci::CreatePipelineService.new(
pipeline_params.fetch(:project),
@@ -119,8 +120,11 @@ module Ci
return false if @bridge.triggers_child_pipeline?
if Feature.enabled?(:ci_drop_cyclical_triggered_pipelines, @bridge.project, default_enabled: :yaml)
- checksums = @bridge.pipeline.base_and_ancestors.map { |pipeline| config_checksum(pipeline) }
- checksums.uniq.length != checksums.length
+ pipeline_checksums = @bridge.pipeline.base_and_ancestors.filter_map do |pipeline|
+ config_checksum(pipeline) unless pipeline.child?
+ end
+
+ pipeline_checksums.uniq.length != pipeline_checksums.length
end
end
diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml
index c5cc3eb693c..b6f70879d17 100644
--- a/app/views/groups/settings/ci_cd/_form.html.haml
+++ b/app/views/groups/settings/ci_cd/_form.html.haml
@@ -8,6 +8,5 @@
= f.number_field :max_artifacts_size, class: 'form-control'
%p.form-text.text-muted
= _("The maximum file size in megabytes for individual job artifacts.")
- = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank'
-
+ = link_to s_('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
= f.submit _('Save changes'), class: "btn gl-button btn-confirm"
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 14d0d73e2b7..b28cd47efcc 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -36,7 +36,7 @@
= favicon_link_tag favicon, id: 'favicon', data: { original_href: favicon }, type: 'image/png'
- = render 'layouts/startup_css', { startup_filename: local_assigns.fetch(:startup_filename, nil) }
+ = render 'layouts/startup_css'
- if user_application_theme == 'gl-dark'
= stylesheet_link_tag_defer "application_dark"
= yield :page_specific_styles
diff --git a/app/views/layouts/_startup_css.haml b/app/views/layouts/_startup_css.haml
index 67c871b95f5..7d3cfe28007 100644
--- a/app/views/layouts/_startup_css.haml
+++ b/app/views/layouts/_startup_css.haml
@@ -1,5 +1,4 @@
-- startup_filename_default = user_application_theme == 'gl-dark' ? 'dark' : 'general'
-- startup_filename = local_assigns.fetch(:startup_filename, nil) || startup_filename_default
+- startup_filename = current_path?("sessions#new") ? 'signin' : user_application_theme == 'gl-dark' ? 'dark' : 'general'
%style
= Rails.application.assets_manifest.find_sources("themes/#{user_application_theme_css_filename}.css").first.to_s.html_safe if user_application_theme_css_filename
diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml
index ae7c160c060..ef61a04c288 100644
--- a/app/views/layouts/devise.html.haml
+++ b/app/views/layouts/devise.html.haml
@@ -1,6 +1,6 @@
!!! 5
%html.devise-layout-html{ class: system_message_class }
- = render "layouts/head", { startup_filename: 'signin' }
+ = render "layouts/head"
%body.ui-indigo.login-page.application.navless{ class: "#{client_class_list}", data: { page: body_data_page, qa_selector: 'login_page' } }
= header_message
= render "layouts/init_client_detection_flags"
diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml
index f31e1b718ff..85a47603b51 100644
--- a/app/views/layouts/nav/sidebar/_group.html.haml
+++ b/app/views/layouts/nav/sidebar/_group.html.haml
@@ -1,5 +1,5 @@
- issues_count = cached_issuables_count(@group, type: :issues)
-- merge_requests_count = group_open_merge_requests_count(@group)
+- merge_requests_count = cached_issuables_count(@group, type: :merge_requests)
- aside_title = @group.subgroup? ? _('Subgroup navigation') : _('Group navigation')
%aside.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(@group), 'aria-label': aside_title }
diff --git a/app/views/projects/merge_requests/_awards_block.html.haml b/app/views/projects/merge_requests/_awards_block.html.haml
index 09466ed2244..80a58053ff7 100644
--- a/app/views/projects/merge_requests/_awards_block.html.haml
+++ b/app/views/projects/merge_requests/_awards_block.html.haml
@@ -1,5 +1,5 @@
-.content-block.content-block-small.emoji-list-container.js-noteable-awards
+.content-block.emoji-block.emoji-list-container.js-noteable-awards
= render 'award_emoji/awards_block', awardable: @merge_request, inline: true, api_awards_path: award_emoji_merge_request_api_path(@merge_request) do
- .ml-auto.mt-auto.mb-auto
+ .ml-auto.gl-my-2
#js-vue-sort-issue-discussions
= render "projects/merge_requests/discussion_filter"
diff --git a/app/views/shared/issue_type/_emoji_block.html.haml b/app/views/shared/issue_type/_emoji_block.html.haml
index ca2749b6bf9..26d30341999 100644
--- a/app/views/shared/issue_type/_emoji_block.html.haml
+++ b/app/views/shared/issue_type/_emoji_block.html.haml
@@ -4,7 +4,7 @@
.row.gl-m-0.gl-justify-content-space-between
.js-noteable-awards
= render 'award_emoji/awards_block', awardable: issuable, inline: true, api_awards_path: api_awards_path
- .new-branch-col
+ .new-branch-col.gl-my-2
= render_if_exists "projects/issues/timeline_toggle", issuable: issuable
#js-vue-sort-issue-discussions
#js-vue-discussion-filter{ data: { default_filter: current_user&.notes_filter_for(issuable), notes_filters: UserPreference.notes_filters.to_json } }
diff --git a/app/views/shared/nav/_sidebar_menu.html.haml b/app/views/shared/nav/_sidebar_menu.html.haml
index 67c775d1a85..2d1d84706fa 100644
--- a/app/views/shared/nav/_sidebar_menu.html.haml
+++ b/app/views/shared/nav/_sidebar_menu.html.haml
@@ -15,12 +15,11 @@
%ul.sidebar-sub-level-items{ class: ('is-fly-out-only' unless sidebar_menu.has_renderable_items?) }
= nav_link(**sidebar_menu.all_active_routes, html_options: { class: 'fly-out-top-item' } ) do
- = link_to sidebar_menu.link, **sidebar_menu.collapsed_container_html_options do
- %strong.fly-out-top-item-name
- = sidebar_menu.title
- - if sidebar_menu.has_pill?
- %span.badge.badge-pill.count.fly-out-badge{ **sidebar_menu.pill_html_options }
- = number_with_delimiter(sidebar_menu.pill_count)
+ - if sidebar_refactor_disabled?
+ = link_to sidebar_menu.link, **sidebar_menu.collapsed_container_html_options do
+ = render 'shared/nav/sidebar_menu_collapsed', sidebar_menu: sidebar_menu
+ - else
+ = render 'shared/nav/sidebar_menu_collapsed', sidebar_menu: sidebar_menu
- if sidebar_menu.has_items?
%li.divider.fly-out-top-item
diff --git a/app/views/shared/nav/_sidebar_menu_collapsed.html.haml b/app/views/shared/nav/_sidebar_menu_collapsed.html.haml
new file mode 100644
index 00000000000..78567a991df
--- /dev/null
+++ b/app/views/shared/nav/_sidebar_menu_collapsed.html.haml
@@ -0,0 +1,5 @@
+%strong.fly-out-top-item-name
+ = sidebar_menu.title
+- if sidebar_menu.has_pill?
+ %span.badge.badge-pill.count.fly-out-badge{ **sidebar_menu.pill_html_options }
+ = number_with_delimiter(sidebar_menu.pill_count)
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index 2547b6bcecb..d3297017714 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -43,7 +43,7 @@ module BulkImports
def run(pipeline_tracker)
if ndjson_pipeline?(pipeline_tracker)
- status = ExportStatus.new(pipeline_tracker, pipeline_tracker.pipeline_class::RELATION)
+ status = ExportStatus.new(pipeline_tracker, pipeline_tracker.pipeline_class.relation)
raise(Pipeline::ExpiredError, 'Pipeline timeout') if job_timeout?(pipeline_tracker)
raise(Pipeline::FailedError, status.error) if status.failed?
diff --git a/config/feature_flags/development/cached_sidebar_merge_requests_count.yml b/config/feature_flags/development/cached_sidebar_merge_requests_count.yml
deleted file mode 100644
index f542ba6323c..00000000000
--- a/config/feature_flags/development/cached_sidebar_merge_requests_count.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: cached_sidebar_merge_requests_count
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55971
-rollout_issue_url:
-milestone: '13.11'
-type: development
-group: group::product planning
-default_enabled: true
diff --git a/db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb b/db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb
new file mode 100644
index 00000000000..508ad92f9e5
--- /dev/null
+++ b/db/migrate/20210525184900_add_latest_pipeline_id_into_vulnerability_statistics_table.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddLatestPipelineIdIntoVulnerabilityStatisticsTable < ActiveRecord::Migration[6.0]
+ def change
+ add_column :vulnerability_statistics, :latest_pipeline_id, :bigint
+ end
+end
diff --git a/db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb b/db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb
new file mode 100644
index 00000000000..dd11b1e6f11
--- /dev/null
+++ b/db/migrate/20210526181820_add_index_to_vulnerability_statistics_on_latest_pipeline_id.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIndexToVulnerabilityStatisticsOnLatestPipelineId < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ INDEX_NAME = 'index_vulnerability_statistics_on_latest_pipeline_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :vulnerability_statistics, :latest_pipeline_id, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_statistics, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb b/db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb
new file mode 100644
index 00000000000..adcac5e2637
--- /dev/null
+++ b/db/migrate/20210526181821_add_foreign_key_for_latest_pipeline_id_to_ci_pipelines.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddForeignKeyForLatestPipelineIdToCiPipelines < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :vulnerability_statistics, :ci_pipelines, column: :latest_pipeline_id, on_delete: :nullify
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :vulnerability_statistics, :ci_pipelines
+ end
+ end
+end
diff --git a/db/schema_migrations/20210525184900 b/db/schema_migrations/20210525184900
new file mode 100644
index 00000000000..5e507e7a363
--- /dev/null
+++ b/db/schema_migrations/20210525184900
@@ -0,0 +1 @@
+ae91ea7481ea21ce29b4c0697f77fd83017c36d913739ed67e5c907a48c56f69 \ No newline at end of file
diff --git a/db/schema_migrations/20210526181820 b/db/schema_migrations/20210526181820
new file mode 100644
index 00000000000..b21e0c66d2a
--- /dev/null
+++ b/db/schema_migrations/20210526181820
@@ -0,0 +1 @@
+e72471e63dc108939473232437eda4c718382630c1173ae20023002d382e5ffa \ No newline at end of file
diff --git a/db/schema_migrations/20210526181821 b/db/schema_migrations/20210526181821
new file mode 100644
index 00000000000..055ae0886b3
--- /dev/null
+++ b/db/schema_migrations/20210526181821
@@ -0,0 +1 @@
+3c53d85bec154ec68a23841d37317d10fa6c7c846bc5f54f5b7876081105ac7b \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index b64f3585342..0d215ee6655 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -19249,7 +19249,8 @@ CREATE TABLE vulnerability_statistics (
low integer DEFAULT 0 NOT NULL,
unknown integer DEFAULT 0 NOT NULL,
info integer DEFAULT 0 NOT NULL,
- letter_grade smallint NOT NULL
+ letter_grade smallint NOT NULL,
+ latest_pipeline_id bigint
);
CREATE SEQUENCE vulnerability_statistics_id_seq
@@ -24869,6 +24870,8 @@ CREATE UNIQUE INDEX index_vulnerability_remediations_on_project_id_and_checksum
CREATE UNIQUE INDEX index_vulnerability_scanners_on_project_id_and_external_id ON vulnerability_scanners USING btree (project_id, external_id);
+CREATE INDEX index_vulnerability_statistics_on_latest_pipeline_id ON vulnerability_statistics USING btree (latest_pipeline_id);
+
CREATE INDEX index_vulnerability_statistics_on_letter_grade ON vulnerability_statistics USING btree (letter_grade);
CREATE UNIQUE INDEX index_vulnerability_statistics_on_unique_project_id ON vulnerability_statistics USING btree (project_id);
@@ -25973,6 +25976,9 @@ ALTER TABLE ONLY sprints
ALTER TABLE ONLY application_settings
ADD CONSTRAINT fk_e8a145f3a7 FOREIGN KEY (instance_administrators_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
+ALTER TABLE ONLY vulnerability_statistics
+ ADD CONSTRAINT fk_e8b13c928f FOREIGN KEY (latest_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY ci_triggers
ADD CONSTRAINT fk_e8e10d1964 FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 3e0bc041e4f..b890306b7d0 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -295,7 +295,6 @@ keytab
keytabs
Kibana
Kinesis
-Klar
Knative
Kramdown
Kroki
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 59156bdb1c2..94d823278a5 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -24,11 +24,19 @@ developed and tested. We aim to be compatible with most external
sudo -i
```
-1. Edit `/etc/gitlab/gitlab.rb` and add a **unique** ID for your node (arbitrary value):
+1. Edit `/etc/gitlab/gitlab.rb` and add:
```ruby
- # The unique identifier for the Geo node.
- gitlab_rails['geo_node_name'] = '<node_name_here>'
+ ##
+ ## Geo Primary role
+ ## - configure dependent flags automatically to enable Geo
+ ##
+ roles ['geo_primary_role']
+
+ ##
+ ## The unique identifier for the Geo site.
+ ##
+ gitlab_rails['geo_node_name'] = '<geo_site_name_here>'
```
1. Reconfigure the **primary** node for the change to take effect:
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 01eb7ef2514..a7116c508bb 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -83,9 +83,9 @@ Fields related to design management.
Returns [`DesignManagement!`](#designmanagement).
-### `Query.devopsAdoptionSegments`
+### `Query.devopsAdoptionEnabledNamespaces`
-Get configured DevOps adoption segments on the instance. **BETA** This endpoint is subject to change without notice.
+Get configured DevOps adoption namespaces. **BETA** This endpoint is subject to change without notice.
Returns [`DevopsAdoptionSegmentConnection`](#devopsadoptionsegmentconnection).
@@ -97,7 +97,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="querydevopsadoptionsegmentsdisplaynamespaceid"></a>`displayNamespaceId` | [`NamespaceID`](#namespaceid) | Filter by display namespace. |
+| <a id="querydevopsadoptionenablednamespacesdisplaynamespaceid"></a>`displayNamespaceId` | [`NamespaceID`](#namespaceid) | Filter by display namespace. |
### `Query.echo`
@@ -758,27 +758,27 @@ Input type: `BoardListUpdateLimitMetricsInput`
| <a id="mutationboardlistupdatelimitmetricserrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationboardlistupdatelimitmetricslist"></a>`list` | [`BoardList`](#boardlist) | The updated list. |
-### `Mutation.bulkFindOrCreateDevopsAdoptionSegments`
+### `Mutation.bulkEnableDevopsAdoptionNamespaces`
**BETA** This endpoint is subject to change without notice.
-Input type: `BulkFindOrCreateDevopsAdoptionSegmentsInput`
+Input type: `BulkEnableDevopsAdoptionNamespacesInput`
#### Arguments
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="mutationbulkfindorcreatedevopsadoptionsegmentsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationbulkfindorcreatedevopsadoptionsegmentsdisplaynamespaceid"></a>`displayNamespaceId` | [`NamespaceID`](#namespaceid) | Display namespace ID. |
-| <a id="mutationbulkfindorcreatedevopsadoptionsegmentsnamespaceids"></a>`namespaceIds` | [`[NamespaceID!]!`](#namespaceid) | List of Namespace IDs for the segments. |
+| <a id="mutationbulkenabledevopsadoptionnamespacesclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationbulkenabledevopsadoptionnamespacesdisplaynamespaceid"></a>`displayNamespaceId` | [`NamespaceID`](#namespaceid) | Display namespace ID. |
+| <a id="mutationbulkenabledevopsadoptionnamespacesnamespaceids"></a>`namespaceIds` | [`[NamespaceID!]!`](#namespaceid) | List of Namespace IDs. |
#### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="mutationbulkfindorcreatedevopsadoptionsegmentsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationbulkfindorcreatedevopsadoptionsegmentserrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationbulkfindorcreatedevopsadoptionsegmentssegments"></a>`segments` | [`[DevopsAdoptionSegment!]`](#devopsadoptionsegment) | Created segments after mutation. |
+| <a id="mutationbulkenabledevopsadoptionnamespacesclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationbulkenabledevopsadoptionnamespacesenablednamespaces"></a>`enabledNamespaces` | [`[DevopsAdoptionSegment!]`](#devopsadoptionsegment) | Enabled namespaces after mutation. |
+| <a id="mutationbulkenabledevopsadoptionnamespaceserrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
### `Mutation.ciCdSettingsUpdate`
@@ -1094,28 +1094,6 @@ Input type: `CreateCustomEmojiInput`
| <a id="mutationcreatecustomemojicustomemoji"></a>`customEmoji` | [`CustomEmoji`](#customemoji) | The new custom emoji. |
| <a id="mutationcreatecustomemojierrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### `Mutation.createDevopsAdoptionSegment`
-
-**BETA** This endpoint is subject to change without notice.
-
-Input type: `CreateDevopsAdoptionSegmentInput`
-
-#### Arguments
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="mutationcreatedevopsadoptionsegmentclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationcreatedevopsadoptionsegmentdisplaynamespaceid"></a>`displayNamespaceId` | [`NamespaceID`](#namespaceid) | Display namespace ID. |
-| <a id="mutationcreatedevopsadoptionsegmentnamespaceid"></a>`namespaceId` | [`NamespaceID!`](#namespaceid) | Namespace ID to set for the segment. |
-
-#### Fields
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="mutationcreatedevopsadoptionsegmentclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationcreatedevopsadoptionsegmenterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-| <a id="mutationcreatedevopsadoptionsegmentsegment"></a>`segment` | [`DevopsAdoptionSegment`](#devopsadoptionsegment) | The segment after mutation. |
-
### `Mutation.createDiffNote`
Input type: `CreateDiffNoteInput`
@@ -1678,26 +1656,6 @@ Input type: `DeleteAnnotationInput`
| <a id="mutationdeleteannotationclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationdeleteannotationerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-### `Mutation.deleteDevopsAdoptionSegment`
-
-**BETA** This endpoint is subject to change without notice.
-
-Input type: `DeleteDevopsAdoptionSegmentInput`
-
-#### Arguments
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="mutationdeletedevopsadoptionsegmentclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationdeletedevopsadoptionsegmentid"></a>`id` | [`[AnalyticsDevopsAdoptionSegmentID!]!`](#analyticsdevopsadoptionsegmentid) | One or many IDs of the segments to delete. |
-
-#### Fields
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="mutationdeletedevopsadoptionsegmentclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationdeletedevopsadoptionsegmenterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-
### `Mutation.designManagementDelete`
Input type: `DesignManagementDeleteInput`
@@ -1914,6 +1872,26 @@ Input type: `DestroySnippetInput`
| <a id="mutationdestroysnippeterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationdestroysnippetsnippet"></a>`snippet` | [`Snippet`](#snippet) | The snippet after mutation. |
+### `Mutation.disableDevopsAdoptionNamespace`
+
+**BETA** This endpoint is subject to change without notice.
+
+Input type: `DisableDevopsAdoptionNamespaceInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationdisabledevopsadoptionnamespaceclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdisabledevopsadoptionnamespaceid"></a>`id` | [`[AnalyticsDevopsAdoptionEnabledNamespaceID!]!`](#analyticsdevopsadoptionenablednamespaceid) | One or many IDs of the enabled namespaces to disable. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationdisabledevopsadoptionnamespaceclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdisabledevopsadoptionnamespaceerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.discussionToggleResolve`
Toggles the resolved state of a discussion.
@@ -1961,6 +1939,28 @@ Input type: `DismissVulnerabilityInput`
| <a id="mutationdismissvulnerabilityerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationdismissvulnerabilityvulnerability"></a>`vulnerability` | [`Vulnerability`](#vulnerability) | The vulnerability after dismissal. |
+### `Mutation.enableDevopsAdoptionNamespace`
+
+**BETA** This endpoint is subject to change without notice.
+
+Input type: `EnableDevopsAdoptionNamespaceInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationenabledevopsadoptionnamespaceclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationenabledevopsadoptionnamespacedisplaynamespaceid"></a>`displayNamespaceId` | [`NamespaceID`](#namespaceid) | Display namespace ID. |
+| <a id="mutationenabledevopsadoptionnamespacenamespaceid"></a>`namespaceId` | [`NamespaceID!`](#namespaceid) | Namespace ID. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationenabledevopsadoptionnamespaceclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationenabledevopsadoptionnamespaceenablednamespace"></a>`enabledNamespace` | [`DevopsAdoptionSegment`](#devopsadoptionsegment) | Enabled namespace after mutation. |
+| <a id="mutationenabledevopsadoptionnamespaceerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.environmentsCanaryIngressUpdate`
Input type: `EnvironmentsCanaryIngressUpdateInput`
@@ -3569,6 +3569,26 @@ Input type: `RunDASTScanInput`
| <a id="mutationrundastscanerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationrundastscanpipelineurl"></a>`pipelineUrl` | [`String`](#string) | URL of the pipeline that was created. |
+### `Mutation.runnerDelete`
+
+Available only when feature flag `runner_graphql_query` is enabled.
+
+Input type: `RunnerDeleteInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationrunnerdeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationrunnerdeleteid"></a>`id` | [`CiRunnerID!`](#cirunnerid) | ID of the runner to delete. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationrunnerdeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationrunnerdeleteerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.runnerUpdate`
Available only when feature flag `runner_graphql_query` is enabled.
@@ -8271,15 +8291,15 @@ four standard [pagination arguments](#connection-pagination-arguments):
### `DevopsAdoptionSegment`
-Segment.
+Enabled namespace for DevopsAdoption.
#### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="devopsadoptionsegmentdisplaynamespace"></a>`displayNamespace` | [`Namespace`](#namespace) | Namespace where data should be displayed. |
-| <a id="devopsadoptionsegmentid"></a>`id` | [`ID!`](#id) | ID of the segment. |
-| <a id="devopsadoptionsegmentlatestsnapshot"></a>`latestSnapshot` | [`DevopsAdoptionSnapshot`](#devopsadoptionsnapshot) | The latest adoption metrics for the segment. |
+| <a id="devopsadoptionsegmentid"></a>`id` | [`ID!`](#id) | ID of the enabled namespace. |
+| <a id="devopsadoptionsegmentlatestsnapshot"></a>`latestSnapshot` | [`DevopsAdoptionSnapshot`](#devopsadoptionsnapshot) | The latest adoption metrics for the enabled namespace. |
| <a id="devopsadoptionsegmentnamespace"></a>`namespace` | [`Namespace`](#namespace) | Namespace which should be calculated. |
### `DevopsAdoptionSnapshot`
@@ -15010,11 +15030,11 @@ A `AlertManagementHttpIntegrationID` is a global ID. It is encoded as a string.
An example `AlertManagementHttpIntegrationID` is: `"gid://gitlab/AlertManagement::HttpIntegration/1"`.
-### `AnalyticsDevopsAdoptionSegmentID`
+### `AnalyticsDevopsAdoptionEnabledNamespaceID`
-A `AnalyticsDevopsAdoptionSegmentID` is a global ID. It is encoded as a string.
+A `AnalyticsDevopsAdoptionEnabledNamespaceID` is a global ID. It is encoded as a string.
-An example `AnalyticsDevopsAdoptionSegmentID` is: `"gid://gitlab/Analytics::DevopsAdoption::Segment/1"`.
+An example `AnalyticsDevopsAdoptionEnabledNamespaceID` is: `"gid://gitlab/Analytics::DevopsAdoption::EnabledNamespace/1"`.
### `AwardableID`
diff --git a/doc/api/vulnerability_exports.md b/doc/api/vulnerability_exports.md
index f70662c7c61..6d01d7e7d96 100644
--- a/doc/api/vulnerability_exports.md
+++ b/doc/api/vulnerability_exports.md
@@ -199,13 +199,13 @@ Example response:
```csv
Group Name,Project Name,Scanner Type,Scanner Name,Status,Vulnerability,Details,Additional Info,Severity,CVE,CWE,Other Identifiers
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2017-16997 in glibc,,CVE-2017-16997 in glibc,critical,CVE-2017-16997
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2017-18269 in glibc,,CVE-2017-18269 in glibc,critical,CVE-2017-18269
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2018-1000001 in glibc,,CVE-2018-1000001 in glibc,high,CVE-2018-1000001
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2016-10228 in glibc,,CVE-2016-10228 in glibc,medium,CVE-2016-10228
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2010-4052 in glibc,,CVE-2010-4052 in glibc,low,CVE-2010-4052
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2018-18520 in elfutils,,CVE-2018-18520 in elfutils,low,CVE-2018-18520
-Gitlab.org,Defend,container_scanning,Clair,detected,CVE-2018-16869 in nettle,,CVE-2018-16869 in nettle,unknown,CVE-2018-16869,CWE-1
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2017-16997 in glibc,,CVE-2017-16997 in glibc,critical,CVE-2017-16997
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2017-18269 in glibc,,CVE-2017-18269 in glibc,critical,CVE-2017-18269
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2018-1000001 in glibc,,CVE-2018-1000001 in glibc,high,CVE-2018-1000001
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2016-10228 in glibc,,CVE-2016-10228 in glibc,medium,CVE-2016-10228
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2010-4052 in glibc,,CVE-2010-4052 in glibc,low,CVE-2010-4052
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2018-18520 in elfutils,,CVE-2018-18520 in elfutils,low,CVE-2018-18520
+Gitlab.org,Defend,container_scanning,Trivy,detected,CVE-2018-16869 in nettle,,CVE-2018-16869 in nettle,unknown,CVE-2018-16869,CWE-1
Gitlab.org,Defend,dependency_scanning,Gemnasium,detected,Regular Expression Denial of Service in debug,,Regular Expression Denial of Service in debug,unknown,CVE-2021-1234,CWE-2,"""yarn.lock:debug:gemnasium:37283ed4-0380-40d7-ada7-2d994afcc62a"""
Gitlab.org,Defend,dependency_scanning,Gemnasium,detected,Authentication bypass via incorrect DOM traversal and canonicalization in saml2-js,,Authentication bypass via incorrect DOM traversal and canonicalization in saml2-js,unknown,,,"""yarn.lock:saml2-js:gemnasium:9952e574-7b5b-46fa-a270-aeb694198a98"""
Gitlab.org,Defend,sast,Find Security Bugs,detected,Predictable pseudorandom number generator,,Predictable pseudorandom number generator,medium,,,"""818bf5dacb291e15d9e6dc3c5ac32178:PREDICTABLE_RANDOM:src/main/java/com/gitlab/security_products/tests/App.java:47"""
diff --git a/doc/policy/maintenance.md b/doc/policy/maintenance.md
index 217618c1771..3a5cd4cd3b3 100644
--- a/doc/policy/maintenance.md
+++ b/doc/policy/maintenance.md
@@ -149,6 +149,8 @@ This decision is made on a case-by-case basis.
## More information
-More information about the release procedures can be found in our
-[release documentation](https://gitlab.com/gitlab-org/release/docs). You may also want to read our
-[Responsible Disclosure Policy](https://about.gitlab.com/security/disclosure/).
+You may also want to read our:
+
+- [Release documentation](https://gitlab.com/gitlab-org/release/docs) describing release procedures
+- [Deprecation guidelines](../development/deprecation_guidelines/index.md)
+- [Responsible Disclosure Policy](https://about.gitlab.com/security/disclosure/)
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index a705306f3aa..66ab61e48b8 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -10,7 +10,9 @@ Although GitLab has discontinued selling the Bronze and Starter tiers, GitLab
continues to honor the entitlements of existing Bronze and Starter tier GitLab
customers for the duration of their contracts at that level.
-These features remain available to Bronze and Starter customers, even though
+New paid features will not be released in Bronze and Starter tiers after GitLab 13.9.
+
+The following features remain available to Bronze and Starter customers, even though
the tiers are no longer mentioned in GitLab documentation:
- [Activate GitLab EE with a license](../user/admin_area/license.md)
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index 66b37f30bbc..68889dab588 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -208,9 +208,9 @@ documentation.
## Auto Container Scanning **(ULTIMATE)**
-Vulnerability Static Analysis for containers uses either [Clair](https://github.com/quay/clair)
-or [Trivy](https://aquasecurity.github.io/trivy/latest/) to check for potential security issues in
-Docker images. The Auto Container Scanning stage is skipped on licenses other than [Ultimate](https://about.gitlab.com/pricing/).
+Vulnerability static analysis for containers uses [Trivy](https://aquasecurity.github.io/trivy/latest/)
+to check for potential security issues in Docker images. The Auto Container Scanning stage is
+skipped on licenses other than [Ultimate](https://about.gitlab.com/pricing/).
After creating the report, it's uploaded as an artifact which you can later download and
check out. The merge request displays any detected security issues.
diff --git a/doc/user/analytics/value_stream_analytics.md b/doc/user/analytics/value_stream_analytics.md
index c311317b909..c3b3fcba52e 100644
--- a/doc/user/analytics/value_stream_analytics.md
+++ b/doc/user/analytics/value_stream_analytics.md
@@ -45,11 +45,9 @@ The stages tracked by Value Stream Analytics by default represent the [GitLab fl
### Date ranges
-To filter analytics results based on a date range, select one of these options:
-
-- **Last 7 days**
-- **Last 30 days** (default)
-- **Last 90 days**
+To filter analytics results based on a date range,
+select different **From** and **To** days
+from the date picker (default: last 30 days).
## How Time metrics are measured
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 2246a66a683..dcaefd39dde 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -46,12 +46,7 @@ To enable container scanning in your pipeline, you need the following:
or [`kubernetes`](https://docs.gitlab.com/runner/install/kubernetes.html) executor.
- Docker `18.09.03` or higher installed on the same computer as the runner. If you're using the
shared runners on GitLab.com, then this is already the case.
-- An image matching the following supported distributions (depending on the scanner being used):
-
- | Scanning Engine | Supported distributions |
- | --- | --- |
- | [Trivy](https://github.com/aquasecurity/trivy) | Supported [operating systems](https://aquasecurity.github.io/trivy/latest/vuln-detection/os/) and [languages](https://aquasecurity.github.io/trivy/latest/vuln-detection/library/) |
-
+- An image matching the [supported distributions](https://aquasecurity.github.io/trivy/latest/vuln-detection/os/)).
- [Build and push](../../packages/container_registry/index.md#build-and-push-by-using-gitlab-cicd)
your Docker image to your project's container registry. The name of the Docker image should use
the following [predefined CI/CD variables](../../../ci/variables/predefined_variables.md):
@@ -98,14 +93,16 @@ How you enable container scanning depends on your GitLab version:
variable.
- GitLab 13.9 [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322656) integration with
[Trivy](https://github.com/aquasecurity/trivy) by upgrading `CS_MAJOR_VERSION` from `3` to `4`.
-- GitLab 14.0 makes Trivy the default scanner.
+- GitLab 14.0 [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61850)
+ integration with [Trivy](https://github.com/aquasecurity/trivy)
+ as the default for container scanning.
To include the `Container-Scanning.gitlab-ci.yml` template (GitLab 11.9 and later), add the
following to your `.gitlab-ci.yml` file:
```yaml
include:
- - template: Container-Scanning.gitlab-ci.yml
+ - template: Security/Container-Scanning.gitlab-ci.yml
```
The included template:
@@ -144,7 +141,7 @@ build:
- docker push $IMAGE
include:
- - template: Container-Scanning.gitlab-ci.yml
+ - template: Security/Container-Scanning.gitlab-ci.yml
```
### Customizing the container scanning settings
@@ -161,7 +158,7 @@ enables verbose output for the analyzer:
```yaml
include:
- - template: Container-Scanning.gitlab-ci.yml
+ - template: Security/Container-Scanning.gitlab-ci.yml
variables:
SECURE_LOG_LEVEL: 'debug'
@@ -169,7 +166,7 @@ variables:
#### Available CI/CD variables
-You can [configure](#customizing-the-container-scanning-settings) both analyzers by using the following CI/CD variables:
+You can [configure](#customizing-the-container-scanning-settings) analyzers by using the following CI/CD variables:
| CI/CD Variable | Default | Description | Scanner |
| ------------------------------ | ------------- | ----------- | ------------ |
@@ -195,7 +192,7 @@ This example sets `GIT_STRATEGY` to `fetch`:
```yaml
include:
- - template: Container-Scanning.gitlab-ci.yml
+ - template: Security/Container-Scanning.gitlab-ci.yml
container_scanning:
variables:
@@ -224,7 +221,7 @@ your CI file:
offline environment, see
[Running container scanning in an offline environment](#running-container-scanning-in-an-offline-environment).
-1. If present, remove the `.cs_common` configuration section.
+1. If present, remove the `.cs_common` and `container_scanning_new` configuration sections.
1. If the `container_scanning` section is present, it's safer to create one from scratch based on
the new version of the [`Container-Scanning.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml).
@@ -408,7 +405,7 @@ For details on saving and transporting Docker images as a file, see Docker's doc
```yaml
include:
- - template: Container-Scanning.gitlab-ci.yml
+ - template: Security/Container-Scanning.gitlab-ci.yml
container_scanning:
image: $CI_REGISTRY/namespace/gitlab-container-scanning
@@ -432,7 +429,7 @@ variables:
image: docker:stable
-update-vulnerabilities-db:
+update-scanner-image:
services:
- docker:19-dind
script:
@@ -574,8 +571,8 @@ the security vulnerabilities in your groups, projects and pipelines.
## Vulnerabilities database update
-If you're using Klar and want more information about the vulnerabilities database update, see the
-[maintenance table](../vulnerabilities/index.md#vulnerability-scanner-maintenance).
+If you use container scanning and want more information about the vulnerabilities database update,
+see the [maintenance table](../vulnerabilities/index.md#vulnerability-scanner-maintenance).
## Interacting with the vulnerabilities
diff --git a/doc/user/application_security/terminology/index.md b/doc/user/application_security/terminology/index.md
index bc1334db78b..ce30accfb4d 100644
--- a/doc/user/application_security/terminology/index.md
+++ b/doc/user/application_security/terminology/index.md
@@ -101,7 +101,7 @@ of the finding's [first identifier](https://gitlab.com/gitlab-org/security-produ
combine to create the value.
Examples of primary identifiers include `PluginID` for OWASP Zed Attack Proxy (ZAP), or `CVE` for
-Klar. Note that the identifier must be stable. Subsequent scans must return the same value for the
+Trivy. Note that the identifier must be stable. Subsequent scans must return the same value for the
same finding, even if the location has slightly changed.
### Report finding
@@ -122,7 +122,7 @@ The type of scan. This must be one of the following:
### Scanner
Software that can scan for vulnerabilities. The resulting scan report is typically not in the
-[Secure report format](#secure-report-format). Examples include ESLint, Klar, and ZAP.
+[Secure report format](#secure-report-format). Examples include ESLint, Trivy, and ZAP.
### Secure product
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 42fa52df555..c63d43983a1 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -69,6 +69,8 @@ The following resources are migrated to the target instance:
- name
- link URL
- image URL
+- Boards
+- Board Lists
Any other items are **not** migrated.
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 4b473c9217d..01c6c3dcf37 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -104,7 +104,7 @@ Each stage of Value Stream Analytics is further described in the table below.
| **Stage** | **Description** |
| --------- | --------------- |
-| Issue | Measures the median time between creating an issue and taking action to solve it, by either labeling it or adding it to a milestone, whatever comes first. The label will be tracked only if it already has an [Issue Board list](../../project/issue_board.md) created for it. |
+| Issue | Measures the median time between creating an issue and taking action to solve it, by either labeling it or adding it to a milestone, whatever comes first. The label is tracked only if it already has an [Issue Board list](../../project/issue_board.md) created for it. |
| Plan | Measures the median time between the action you took for the previous stage, and pushing the first commit to the branch. The very first commit of the branch is the one that triggers the separation between **Plan** and **Code**, and at least one of the commits in the branch needs to contain the related issue number (e.g., `#42`). If none of the commits in the branch mention the related issue number, it is not considered to the measurement time of the stage. |
| Code | Measures the median time between pushing a first commit (previous stage) and creating a merge request (MR) related to that commit. The key to keep the process tracked is to include the [issue closing pattern](../../project/issues/managing_issues.md#closing-issues-automatically) to the description of the merge request (for example, `Closes #xxx`, where `xxx` is the number of the issue related to this merge request). If the closing pattern is not present, then the calculation takes the creation time of the first commit in the merge request as the start time. |
| Test | Measures the median time to run the entire pipeline for that project. It's related to the time GitLab CI/CD takes to run every job for the commits pushed to that merge request defined in the previous stage. It is basically the start->finish time for all pipelines. |
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index 6f79796ff26..317202e9303 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -360,32 +360,7 @@ All the above can be done with the [`git-mr`](https://gitlab.com/glensc/git-mr)
## Cached merge request count
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299542) in GitLab 13.11.
-> - It's [deployed behind a feature flag](../../../feature_flags.md), enabled by default.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-cached-merge-request-count).
-
-WARNING:
-This feature might not be available to you. Refer to the previous **version history** note for details.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/327319) in GitLab 14.0.
In a group, the sidebar displays the total count of open merge requests. This value is cached if it's greater than
than 1000. The cached value is rounded to thousands (or millions) and updated every 24 hours.
-
-### Enable or disable cached merge request count **(FREE SELF)**
-
-Cached merge request count in the left sidebar is under development but ready for production use. It is
-deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../../administration/feature_flags.md)
-can disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:cached_sidebar_merge_requests_count)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:cached_sidebar_merge_requests_count)
-```
diff --git a/lib/bulk_imports/groups/pipelines/boards_pipeline.rb b/lib/bulk_imports/groups/pipelines/boards_pipeline.rb
new file mode 100644
index 00000000000..08a0a4abc9f
--- /dev/null
+++ b/lib/bulk_imports/groups/pipelines/boards_pipeline.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Groups
+ module Pipelines
+ class BoardsPipeline
+ include NdjsonPipeline
+
+ relation_name 'boards'
+
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
index 806db68e5d1..1dd74c10b65 100644
--- a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
@@ -6,34 +6,9 @@ module BulkImports
class LabelsPipeline
include NdjsonPipeline
- RELATION = 'labels'
+ relation_name 'labels'
- extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: RELATION
-
- def transform(context, data)
- relation_hash = data.first
- relation_index = data.last
- relation_definition = import_export_config.top_relation_tree(RELATION)
-
- deep_transform_relation!(relation_hash, RELATION, relation_definition) do |key, hash|
- Gitlab::ImportExport::Group::RelationFactory.create(
- relation_index: relation_index,
- relation_sym: key.to_sym,
- relation_hash: hash,
- importable: context.portable,
- members_mapper: nil,
- object_builder: object_builder,
- user: context.current_user,
- excluded_keys: import_export_config.relation_excluded_keys(key)
- )
- end
- end
-
- def load(_, label)
- return unless label
-
- label.save! unless label.persisted?
- end
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
end
end
end
diff --git a/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb b/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb
index 9b2be30735c..b2bd14952e7 100644
--- a/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/milestones_pipeline.rb
@@ -4,26 +4,11 @@ module BulkImports
module Groups
module Pipelines
class MilestonesPipeline
- include Pipeline
+ include NdjsonPipeline
- extractor BulkImports::Common::Extractors::GraphqlExtractor,
- query: BulkImports::Groups::Graphql::GetMilestonesQuery
+ relation_name 'milestones'
- transformer Common::Transformers::ProhibitedAttributesTransformer
-
- def load(context, data)
- return unless data
-
- raise ::BulkImports::Pipeline::NotAllowedError unless authorized?
-
- context.group.milestones.create!(data)
- end
-
- private
-
- def authorized?
- context.current_user.can?(:admin_milestone, context.group)
- end
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
end
end
end
diff --git a/lib/bulk_imports/ndjson_pipeline.rb b/lib/bulk_imports/ndjson_pipeline.rb
index 4f5f94c30b8..2de06bbcb88 100644
--- a/lib/bulk_imports/ndjson_pipeline.rb
+++ b/lib/bulk_imports/ndjson_pipeline.rb
@@ -9,6 +9,30 @@ module BulkImports
included do
ndjson_pipeline!
+ def transform(context, data)
+ relation_hash, relation_index = data
+ relation_definition = import_export_config.top_relation_tree(relation)
+
+ deep_transform_relation!(relation_hash, relation, relation_definition) do |key, hash|
+ Gitlab::ImportExport::Group::RelationFactory.create(
+ relation_index: relation_index,
+ relation_sym: key.to_sym,
+ relation_hash: hash,
+ importable: context.portable,
+ members_mapper: members_mapper,
+ object_builder: object_builder,
+ user: context.current_user,
+ excluded_keys: import_export_config.relation_excluded_keys(key)
+ )
+ end
+ end
+
+ def load(_, object)
+ return unless object
+
+ object.save! unless object.persisted?
+ end
+
def deep_transform_relation!(relation_hash, relation_key, relation_definition, &block)
relation_key = relation_key_override(relation_key)
@@ -58,6 +82,18 @@ module BulkImports
def object_builder
"Gitlab::ImportExport::#{portable.class}::ObjectBuilder".constantize
end
+
+ def relation
+ self.class.relation
+ end
+
+ def members_mapper
+ @members_mapper ||= Gitlab::ImportExport::MembersMapper.new(
+ exported_members: [],
+ user: current_user,
+ importable: portable
+ )
+ end
end
end
end
diff --git a/lib/bulk_imports/pipeline.rb b/lib/bulk_imports/pipeline.rb
index 24aa7482974..f27818dae18 100644
--- a/lib/bulk_imports/pipeline.rb
+++ b/lib/bulk_imports/pipeline.rb
@@ -30,6 +30,10 @@ module BulkImports
@import_export_config ||= context.import_export_config
end
+ def current_user
+ @current_user ||= context.current_user
+ end
+
included do
private
@@ -174,6 +178,14 @@ module BulkImports
class_attributes[:ndjson_pipeline]
end
+ def relation_name(name)
+ class_attributes[:relation_name] = name
+ end
+
+ def relation
+ class_attributes[:relation_name]
+ end
+
private
def add_attribute(sym, klass, options)
diff --git a/lib/bulk_imports/stage.rb b/lib/bulk_imports/stage.rb
index 35b77240ea7..bc7fc14b5a0 100644
--- a/lib/bulk_imports/stage.rb
+++ b/lib/bulk_imports/stage.rb
@@ -29,9 +29,13 @@ module BulkImports
pipeline: BulkImports::Groups::Pipelines::BadgesPipeline,
stage: 1
},
+ boards: {
+ pipeline: BulkImports::Groups::Pipelines::BoardsPipeline,
+ stage: 2
+ },
finisher: {
pipeline: BulkImports::Groups::Pipelines::EntityFinisher,
- stage: 2
+ stage: 3
}
}.freeze
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb
index 4489fc9f3b2..d2261148b21 100644
--- a/lib/gitlab/auth.rb
+++ b/lib/gitlab/auth.rb
@@ -371,7 +371,9 @@ module Gitlab
end
def find_build_by_token(token)
- ::Ci::AuthJobFinder.new(token: token).execute
+ ::Gitlab::Database::LoadBalancing::Session.current.use_primary do
+ ::Ci::AuthJobFinder.new(token: token).execute
+ end
end
def user_auth_attempt!(user, success:)
diff --git a/lib/gitlab/ci/parsers/test/junit.rb b/lib/gitlab/ci/parsers/test/junit.rb
index 200e58ffc50..a5cea386b34 100644
--- a/lib/gitlab/ci/parsers/test/junit.rb
+++ b/lib/gitlab/ci/parsers/test/junit.rb
@@ -70,6 +70,8 @@ module Gitlab
elsif data.key?('error')
status = ::Gitlab::Ci::Reports::TestCase::STATUS_ERROR
system_output = data['error']
+ attachment = attachment_path(data['system_out'])
+ attachment = remove_project_prefix(attachment, job)
elsif data.key?('skipped')
status = ::Gitlab::Ci::Reports::TestCase::STATUS_SKIPPED
system_output = data['skipped']
diff --git a/package.json b/package.json
index ef4b3dcb4ab..25ff42eae2e 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,6 @@
"scripts": {
"check-dependencies": "scripts/frontend/check_dependencies.sh",
"block-dependencies": "node scripts/frontend/block_dependencies.js",
- "check:startup_css": "scripts/frontend/startup_css/startup_css_changed.sh",
"clean": "rm -rf public/assets tmp/cache/*-loader",
"dev-server": "NODE_OPTIONS=\"--max-old-space-size=3584\" node scripts/frontend/webpack_dev_server.js",
"file-coverage": "scripts/frontend/file_test_coverage.js",
diff --git a/scripts/frontend/startup_css/constants.js b/scripts/frontend/startup_css/constants.js
index a76092f8b45..9b9dc522a8f 100644
--- a/scripts/frontend/startup_css/constants.js
+++ b/scripts/frontend/startup_css/constants.js
@@ -27,6 +27,7 @@ const CSS_TO_REMOVE = [
/\.commit/,
/\.md/,
/\.with-performance-bar/,
+ /\.identicon/,
];
const APPLICATION_CSS_PREFIX = 'application';
const APPLICATION_DARK_CSS_PREFIX = 'application_dark';
@@ -35,55 +36,49 @@ const UTILITIES_DARK_CSS_PREFIX = 'application_utilities_dark';
// paths -----------------------------------------------------------------------
const ROOT = path.resolve(__dirname, '../../..');
-const ROOT_RAILS = IS_EE ? path.join(ROOT, 'ee') : ROOT;
const FIXTURES_FOLDER_NAME = IS_EE ? 'fixtures-ee' : 'fixtures';
const FIXTURES_ROOT = path.join(ROOT, 'tmp/tests/frontend', FIXTURES_FOLDER_NAME);
const PATH_SIGNIN_HTML = path.join(FIXTURES_ROOT, 'startup_css/sign-in.html');
const PATH_ASSETS = path.join(ROOT, 'tmp/startup_css_assets');
-const PATH_STARTUP_SCSS = path.join(ROOT_RAILS, 'app/assets/stylesheets/startup');
-
-// helpers ---------------------------------------------------------------------
-const createMainOutput = ({ outFile, cssKeys, type }) => ({
- outFile,
- htmlPaths: [
- path.join(FIXTURES_ROOT, `startup_css/project-${type}.html`),
- path.join(FIXTURES_ROOT, `startup_css/project-${type}-legacy-menu.html`),
- path.join(FIXTURES_ROOT, `startup_css/project-${type}-legacy-sidebar.html`),
- path.join(FIXTURES_ROOT, `startup_css/project-${type}-signed-out.html`),
- ],
- cssKeys,
- purgeOptions: {
- safelist: {
- standard: [
- 'page-with-icon-sidebar',
- 'sidebar-collapsed-desktop',
- // We want to include the root dropdown-menu style since it should be hidden by default
- 'dropdown-menu',
- ],
- // We want to include the identicon backgrounds
- greedy: [/^bg[0-9]$/],
- },
- },
-});
-
+const PATH_STARTUP_SCSS = path.join(ROOT, 'app/assets/stylesheets/startup');
const OUTPUTS = [
- createMainOutput({
- type: 'general',
+ {
outFile: 'startup-general',
+ htmlPaths: [
+ path.join(FIXTURES_ROOT, 'startup_css/project-general.html'),
+ path.join(FIXTURES_ROOT, 'startup_css/project-general-legacy-menu.html'),
+ path.join(FIXTURES_ROOT, 'startup_css/project-general-signed-out.html'),
+ ],
cssKeys: [APPLICATION_CSS_PREFIX, UTILITIES_CSS_PREFIX],
- }),
- createMainOutput({
- type: 'dark',
+ // We want to include the root dropdown-menu style since it should be hidden by default
+ purgeOptions: {
+ safelist: {
+ standard: ['dropdown-menu'],
+ },
+ },
+ },
+ {
outFile: 'startup-dark',
+ htmlPaths: [
+ path.join(FIXTURES_ROOT, 'startup_css/project-dark.html'),
+ path.join(FIXTURES_ROOT, 'startup_css/project-dark-legacy-menu.html'),
+ path.join(FIXTURES_ROOT, 'startup_css/project-dark-signed-out.html'),
+ ],
cssKeys: [APPLICATION_DARK_CSS_PREFIX, UTILITIES_DARK_CSS_PREFIX],
- }),
+ // We want to include the root dropdown-menu styles since it should be hidden by default
+ purgeOptions: {
+ safelist: {
+ standard: ['dropdown-menu'],
+ },
+ },
+ },
{
outFile: 'startup-signin',
htmlPaths: [PATH_SIGNIN_HTML],
cssKeys: [APPLICATION_CSS_PREFIX, UTILITIES_CSS_PREFIX],
purgeOptions: {
safelist: {
- standard: ['fieldset', 'hidden'],
+ standard: ['fieldset'],
deep: [/login-page$/],
},
},
diff --git a/scripts/frontend/startup_css/startup_css_changed.sh b/scripts/frontend/startup_css/startup_css_changed.sh
deleted file mode 100755
index b1df97f2f42..00000000000
--- a/scripts/frontend/startup_css/startup_css_changed.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-
-echo "-----------------------------------------------------------"
-echo "If you are run into any issues with Startup CSS generation,"
-echo "please check out the feedback issue:"
-echo ""
-echo "https://gitlab.com/gitlab-org/gitlab/-/issues/331812"
-echo "-----------------------------------------------------------"
-
-startup_glob="*stylesheets/startup*"
-
-echo "Staging changes to '${startup_glob}' so we can check for untracked files..."
-git add ${startup_glob}
-
-if [ -n "$(git diff HEAD --name-only -- ${startup_glob})" ]; then
- diff=$(git diff HEAD -- ${startup_glob})
- cat <<EOF
-
-Startup CSS changes detected!
-
-It looks like there have been recent changes which require
-regenerating the Startup CSS files.
-
-Consider one of the following options:
-
- 1. Regenerating locally with "yarn run generate:startup_css".
- 2. Copy and apply the following diff:
-
------ start diff -----
-$diff
-
------ end diff -------
-EOF
-
- exit 1
-fi
diff --git a/scripts/frontend/startup_css/write_startup_scss.js b/scripts/frontend/startup_css/write_startup_scss.js
index 245681bada3..3754b95cefd 100644
--- a/scripts/frontend/startup_css/write_startup_scss.js
+++ b/scripts/frontend/startup_css/write_startup_scss.js
@@ -9,7 +9,7 @@ const buildFinalContent = (raw) => {
// https://gitlab.com/gitlab-org/gitlab/-/issues/331812
@charset "UTF-8";
${raw}
-@import 'startup/cloaking';
+@import 'cloaking';
@include cloak-startup-scss(none);
`;
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
index bbb7e8a028d..2921eea7641 100644
--- a/spec/features/issues/user_interacts_with_awards_spec.rb
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -62,11 +62,11 @@ RSpec.describe 'User interacts with awards' do
page.within('.awards') do
expect(page).to have_selector('[data-testid="award-button"]')
- expect(page.find('[data-testid="award-button"].is-active .js-counter')).to have_content('1')
- expect(page).to have_css('[data-testid="award-button"].is-active[title="You"]')
+ expect(page.find('[data-testid="award-button"].selected .js-counter')).to have_content('1')
+ expect(page).to have_css('[data-testid="award-button"].selected[title="You"]')
expect do
- page.find('[data-testid="award-button"].is-active').click
+ page.find('[data-testid="award-button"].selected').click
wait_for_requests
end.to change { page.all('[data-testid="award-button"]').size }.from(3).to(2)
end
@@ -205,7 +205,7 @@ RSpec.describe 'User interacts with awards' do
it 'adds award to issue' do
first('[data-testid="award-button"]').click
- expect(page).to have_selector('[data-testid="award-button"].is-active')
+ expect(page).to have_selector('[data-testid="award-button"].selected')
expect(first('[data-testid="award-button"]')).to have_content '1'
visit project_issue_path(project, issue)
@@ -215,7 +215,7 @@ RSpec.describe 'User interacts with awards' do
it 'removes award from issue' do
first('[data-testid="award-button"]').click
- find('[data-testid="award-button"].is-active').click
+ find('[data-testid="award-button"].selected').click
expect(first('[data-testid="award-button"]')).to have_content '0'
diff --git a/spec/features/merge_request/user_awards_emoji_spec.rb b/spec/features/merge_request/user_awards_emoji_spec.rb
index 6f46cc20cba..240b8f996c8 100644
--- a/spec/features/merge_request/user_awards_emoji_spec.rb
+++ b/spec/features/merge_request/user_awards_emoji_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'Merge request > User awards emoji', :js do
it 'adds award to merge request' do
first('[data-testid="award-button"]').click
- expect(page).to have_selector('[data-testid="award-button"].is-active')
+ expect(page).to have_selector('[data-testid="award-button"].selected')
expect(first('[data-testid="award-button"]')).to have_content '1'
visit project_merge_request_path(project, merge_request)
@@ -27,7 +27,7 @@ RSpec.describe 'Merge request > User awards emoji', :js do
it 'removes award from merge request' do
first('[data-testid="award-button"]').click
- find('[data-testid="award-button"].is-active').click
+ find('[data-testid="award-button"].selected').click
expect(first('[data-testid="award-button"]')).to have_content '0'
visit project_merge_request_path(project, merge_request)
diff --git a/spec/fixtures/bulk_imports/boards.ndjson b/spec/fixtures/bulk_imports/boards.ndjson
new file mode 100644
index 00000000000..a3e28584ff5
--- /dev/null
+++ b/spec/fixtures/bulk_imports/boards.ndjson
@@ -0,0 +1 @@
+{"id":173,"project_id":null,"created_at":"2020-02-11T14:35:51.561Z","updated_at":"2020-02-11T14:35:51.561Z","name":"first board","milestone_id":null,"group_id":4351,"weight":null,"lists":[{"id":189,"board_id":173,"label_id":271,"list_type":"label","position":0,"created_at":"2020-02-11T14:35:57.131Z","updated_at":"2020-02-11T14:35:57.131Z","user_id":null,"milestone_id":null,"max_issue_count":0,"max_issue_weight":0,"label":{"id":271,"title":"TSL","color":"#58796f","project_id":null,"created_at":"2019-11-20T17:02:20.541Z","updated_at":"2020-02-06T15:44:52.048Z","template":false,"description":null,"group_id":4351,"type":"GroupLabel","priorities":[]},"board":{"id":173,"project_id":null,"created_at":"2020-02-11T14:35:51.561Z","updated_at":"2020-02-11T14:35:51.561Z","name":"hi","milestone_id":null,"group_id":4351,"weight":null}},{"id":190,"board_id":173,"label_id":272,"list_type":"label","position":1,"created_at":"2020-02-11T14:35:57.868Z","updated_at":"2020-02-11T14:35:57.868Z","user_id":null,"milestone_id":null,"max_issue_count":0,"max_issue_weight":0,"label":{"id":272,"title":"Sosync","color":"#110320","project_id":null,"created_at":"2019-11-20T17:02:20.532Z","updated_at":"2020-02-06T15:44:52.057Z","template":false,"description":null,"group_id":4351,"type":"GroupLabel","priorities":[]},"board":{"id":173,"project_id":null,"created_at":"2020-02-11T14:35:51.561Z","updated_at":"2020-02-11T14:35:51.561Z","name":"hi","milestone_id":null,"group_id":4351,"weight":null}},{"id":188,"board_id":173,"label_id":null,"list_type":"closed","position":null,"created_at":"2020-02-11T14:35:51.593Z","updated_at":"2020-02-11T14:35:51.593Z","user_id":null,"milestone_id":null,"max_issue_count":0,"max_issue_weight":0}],"labels":[]}
diff --git a/spec/fixtures/bulk_imports/gz/boards.ndjson.gz b/spec/fixtures/bulk_imports/gz/boards.ndjson.gz
new file mode 100644
index 00000000000..294ef04db88
--- /dev/null
+++ b/spec/fixtures/bulk_imports/gz/boards.ndjson.gz
Binary files differ
diff --git a/spec/fixtures/bulk_imports/labels.ndjson.gz b/spec/fixtures/bulk_imports/gz/labels.ndjson.gz
index 6bb10a53346..6bb10a53346 100644
--- a/spec/fixtures/bulk_imports/labels.ndjson.gz
+++ b/spec/fixtures/bulk_imports/gz/labels.ndjson.gz
Binary files differ
diff --git a/spec/fixtures/bulk_imports/gz/milestones.ndjson.gz b/spec/fixtures/bulk_imports/gz/milestones.ndjson.gz
new file mode 100644
index 00000000000..f959cd7a0bd
--- /dev/null
+++ b/spec/fixtures/bulk_imports/gz/milestones.ndjson.gz
Binary files differ
diff --git a/spec/fixtures/bulk_imports/labels.ndjson b/spec/fixtures/bulk_imports/labels.ndjson
new file mode 100644
index 00000000000..c7d31d7cbbe
--- /dev/null
+++ b/spec/fixtures/bulk_imports/labels.ndjson
@@ -0,0 +1 @@
+{"id":111,"title":"Label 1","color":"#6699cc","project_id":null,"created_at":"2021-04-15T07:15:08.063Z","updated_at":"2021-04-15T07:15:08.063Z","template":false,"description":"Label 1","group_id":107,"type":"GroupLabel","priorities":[],"textColor":"#FFFFFF"}
diff --git a/spec/fixtures/bulk_imports/milestones.ndjson b/spec/fixtures/bulk_imports/milestones.ndjson
new file mode 100644
index 00000000000..40523f276e7
--- /dev/null
+++ b/spec/fixtures/bulk_imports/milestones.ndjson
@@ -0,0 +1,5 @@
+{"id":7642,"title":"v4.0","project_id":null,"description":"Et laudantium enim omnis ea reprehenderit iure.","due_date":null,"created_at":"2019-11-20T17:02:14.336Z","updated_at":"2019-11-20T17:02:14.336Z","state":"closed","iid":5,"start_date":null,"group_id":4351}
+{"id":7641,"title":"v3.0","project_id":null,"description":"Et repellat culpa nemo consequatur ut reprehenderit.","due_date":null,"created_at":"2019-11-20T17:02:14.323Z","updated_at":"2019-11-20T17:02:14.323Z","state":"active","iid":4,"start_date":null,"group_id":4351}
+{"id":7640,"title":"v2.0","project_id":null,"description":"Velit cupiditate est neque voluptates iste rem sunt.","due_date":null,"created_at":"2019-11-20T17:02:14.309Z","updated_at":"2019-11-20T17:02:14.309Z","state":"active","iid":3,"start_date":null,"group_id":4351}
+{"id":7639,"title":"v1.0","project_id":null,"description":"Amet velit repellat ut rerum aut cum.","due_date":null,"created_at":"2019-11-20T17:02:14.296Z","updated_at":"2019-11-20T17:02:14.296Z","state":"active","iid":2,"start_date":null,"group_id":4351}
+{"id":7638,"title":"v0.0","project_id":null,"description":"Ea quia asperiores ut modi dolorem sunt non numquam.","due_date":null,"created_at":"2019-11-20T17:02:14.282Z","updated_at":"2019-11-20T17:02:14.282Z","state":"active","iid":1,"start_date":null,"group_id":4351}
diff --git a/spec/frontend/fixtures/startup_css.rb b/spec/frontend/fixtures/startup_css.rb
index 003f7b768dd..134d29d3106 100644
--- a/spec/frontend/fixtures/startup_css.rb
+++ b/spec/frontend/fixtures/startup_css.rb
@@ -11,13 +11,12 @@ RSpec.describe 'Startup CSS fixtures', type: :controller do
before(:all) do
stub_feature_flags(combined_menu: true)
- stub_feature_flags(sidebar_refactor: true)
clean_frontend_fixtures('startup_css/')
end
shared_examples 'startup css project fixtures' do |type|
let(:user) { create(:user, :admin) }
- let(:project) { create(:project, :public, :repository, description: 'Code and stuff', creator: user) }
+ let(:project) { create(:project, :public, :repository, description: 'Code and stuff', avatar: fixture_file_upload('spec/fixtures/dk.png', 'image/png'), creator: user) }
before do
sign_in(user)
@@ -43,17 +42,6 @@ RSpec.describe 'Startup CSS fixtures', type: :controller do
expect(response).to be_successful
end
- it "startup_css/project-#{type}-legacy-sidebar.html" do
- stub_feature_flags(sidebar_refactor: false)
-
- get :show, params: {
- namespace_id: project.namespace.to_param,
- id: project
- }
-
- expect(response).to be_successful
- end
-
it "startup_css/project-#{type}-signed-out.html" do
sign_out(user)
diff --git a/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
index d64f845d2fa..3f91591f5cd 100644
--- a/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
+++ b/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
@@ -5,7 +5,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
class="awards js-awards-block"
>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button"
data-testid="award-button"
title="Ada, Leonardo, and Marie"
type="button"
@@ -35,7 +35,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</span>
</button>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button selected"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
title="You, Ada, and Marie"
type="button"
@@ -65,7 +65,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</span>
</button>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button"
data-testid="award-button"
title="Ada and Jane"
type="button"
@@ -95,7 +95,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</span>
</button>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button selected"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
title="You, Ada, Jane, and Leonardo"
type="button"
@@ -125,7 +125,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</span>
</button>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button selected"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
title="You"
type="button"
@@ -155,7 +155,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</span>
</button>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button"
data-testid="award-button"
title="Marie"
type="button"
@@ -185,7 +185,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</span>
</button>
<button
- class="btn gl-mr-3 btn-default btn-md gl-button selected"
+ class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
title="You"
type="button"
@@ -216,7 +216,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
</button>
<div
- class="award-menu-holder"
+ class="award-menu-holder gl-my-2"
>
<button
aria-label="Add reaction"
diff --git a/spec/frontend/vue_shared/components/awards_list_spec.js b/spec/frontend/vue_shared/components/awards_list_spec.js
index 550ac4a9d38..55f9eedc169 100644
--- a/spec/frontend/vue_shared/components/awards_list_spec.js
+++ b/spec/frontend/vue_shared/components/awards_list_spec.js
@@ -41,7 +41,14 @@ const TEST_AWARDS = [
];
const TEST_ADD_BUTTON_CLASS = 'js-test-add-button-class';
-const REACTION_CONTROL_CLASSES = ['btn', 'gl-mr-3', 'btn-default', 'btn-md', 'gl-button'];
+const REACTION_CONTROL_CLASSES = [
+ 'btn',
+ 'gl-mr-3',
+ 'gl-my-2',
+ 'btn-default',
+ 'btn-md',
+ 'gl-button',
+];
describe('vue_shared/components/awards_list', () => {
let wrapper;
diff --git a/spec/graphql/mutations/ci/runner/delete_spec.rb b/spec/graphql/mutations/ci/runner/delete_spec.rb
new file mode 100644
index 00000000000..82873c96c3e
--- /dev/null
+++ b/spec/graphql/mutations/ci/runner/delete_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Ci::Runner::Delete do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:runner) { create(:ci_runner) }
+
+ let(:current_ctx) { { current_user: user } }
+
+ let(:mutation_params) do
+ {
+ id: runner.to_global_id
+ }
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:delete_runner) }
+
+ describe '#resolve' do
+ subject do
+ sync(resolve(described_class, args: mutation_params, ctx: current_ctx))
+ end
+
+ context 'when the user cannot admin the runner' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'with invalid params' do
+ it 'raises an error' do
+ mutation_params[:id] = "invalid-id"
+
+ expect { subject }.to raise_error(::GraphQL::CoercionError)
+ end
+ end
+
+ context 'when required arguments are missing' do
+ let(:mutation_params) { {} }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ArgumentError, "missing keyword: :id")
+ end
+ end
+
+ context 'when user can delete owned runner' do
+ let_it_be(:project) { create(:project, creator_id: user.id) }
+ let_it_be(:project_runner, reload: true) { create(:ci_runner, :project, description: 'Project runner', projects: [project]) }
+
+ before_all do
+ project.add_maintainer(user)
+ end
+
+ context 'with one associated project' do
+ it 'deletes runner' do
+ mutation_params[:id] = project_runner.to_global_id
+
+ expect { subject }.to change { Ci::Runner.count }.by(-1)
+ expect(subject[:errors]).to be_empty
+ end
+ end
+
+ context 'with more than one associated project' do
+ let_it_be(:project2) { create(:project, creator_id: user.id) }
+ let_it_be(:two_projects_runner) { create(:ci_runner, :project, description: 'Two projects runner', projects: [project, project2]) }
+
+ before_all do
+ project2.add_maintainer(user)
+ end
+
+ it 'does not delete project runner' do
+ mutation_params[:id] = two_projects_runner.to_global_id
+
+ expect { subject }.not_to change { Ci::Runner.count }
+ expect(subject[:errors]).to contain_exactly("Runner #{two_projects_runner.to_global_id} associated with more than one project")
+ end
+ end
+ end
+
+ context 'when admin can delete runner', :enable_admin_mode do
+ let(:admin_user) { create(:user, :admin) }
+ let(:current_ctx) { { current_user: admin_user } }
+
+ it 'deletes runner' do
+ expect { subject }.to change { Ci::Runner.count }.by(-1)
+ expect(subject[:errors]).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb b/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
index 55468b10114..bd306233de8 100644
--- a/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
+++ b/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe BulkImports::Common::Extractors::NdjsonExtractor do
let_it_be(:tmpdir) { Dir.mktmpdir }
- let_it_be(:filepath) { 'spec/fixtures/bulk_imports/labels.ndjson.gz' }
+ let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/labels.ndjson.gz' }
let_it_be(:import) { create(:bulk_import) }
let_it_be(:config) { create(:bulk_import_configuration, bulk_import: import) }
let_it_be(:entity) { create(:bulk_import_entity, bulk_import: import) }
diff --git a/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb
new file mode 100644
index 00000000000..8b2f03ca15f
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::BoardsPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/boards.ndjson.gz' }
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ group: group,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Group',
+ destination_namespace: group.full_path
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:tmpdir) { Dir.mktmpdir }
+
+ before do
+ FileUtils.copy_file(filepath, File.join(tmpdir, 'boards.ndjson.gz'))
+ group.add_owner(user)
+ end
+
+ subject { described_class.new(context) }
+
+ describe '#run' do
+ it 'imports group boards into destination group and removes tmpdir' do
+ allow(Dir).to receive(:mktmpdir).and_return(tmpdir)
+ allow_next_instance_of(BulkImports::FileDownloadService) do |service|
+ allow(service).to receive(:execute)
+ end
+
+ expect { subject.run }.to change(Board, :count).by(1)
+
+ lists = group.boards.find_by(name: 'first board').lists
+
+ expect(lists.count).to eq(3)
+ expect(lists.first.label.title).to eq('TSL')
+ expect(lists.second.label.title).to eq('Sosync')
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
index 2cefeec29a2..6344dae0fb7 100644
--- a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:bulk_import) { create(:bulk_import, user: user) }
- let_it_be(:filepath) { 'spec/fixtures/bulk_imports/labels.ndjson.gz' }
+ let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/labels.ndjson.gz' }
let_it_be(:entity) do
create(
:bulk_import_entity,
@@ -75,17 +75,4 @@ RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
end
end
end
-
- describe 'pipeline parts' do
- it { expect(described_class).to include_module(BulkImports::NdjsonPipeline) }
- it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
-
- it 'has extractor' do
- expect(described_class.get_extractor)
- .to eq(
- klass: BulkImports::Common::Extractors::NdjsonExtractor,
- options: { relation: described_class::RELATION }
- )
- end
- end
end
diff --git a/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb
index e5cf75c566b..a8354e62459 100644
--- a/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/milestones_pipeline_spec.rb
@@ -5,119 +5,69 @@ require 'spec_helper'
RSpec.describe BulkImports::Groups::Pipelines::MilestonesPipeline do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
- let_it_be(:timestamp) { Time.new(2020, 01, 01).utc }
let_it_be(:bulk_import) { create(:bulk_import, user: user) }
-
+ let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/milestones.ndjson.gz' }
let_it_be(:entity) do
create(
:bulk_import_entity,
+ group: group,
bulk_import: bulk_import,
source_full_path: 'source/full/path',
destination_name: 'My Destination Group',
- destination_namespace: group.full_path,
- group: group
+ destination_namespace: group.full_path
)
end
let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
- subject { described_class.new(context) }
+ let(:tmpdir) { Dir.mktmpdir }
before do
+ FileUtils.copy_file(filepath, File.join(tmpdir, 'milestones.ndjson.gz'))
group.add_owner(user)
end
- describe '#run' do
- it 'imports group milestones' do
- first_page = extracted_data(title: 'milestone1', iid: 1, has_next_page: true)
- last_page = extracted_data(title: 'milestone2', iid: 2)
+ subject { described_class.new(context) }
- allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor|
- allow(extractor)
- .to receive(:extract)
- .and_return(first_page, last_page)
+ describe '#run' do
+ it 'imports group milestones into destination group and removes tmpdir' do
+ allow(Dir).to receive(:mktmpdir).and_return(tmpdir)
+ allow_next_instance_of(BulkImports::FileDownloadService) do |service|
+ allow(service).to receive(:execute)
end
- expect { subject.run }.to change(Milestone, :count).by(2)
-
- expect(group.milestones.pluck(:title)).to contain_exactly('milestone1', 'milestone2')
-
- milestone = group.milestones.last
-
- expect(milestone.description).to eq('desc')
- expect(milestone.state).to eq('closed')
- expect(milestone.start_date.to_s).to eq('2020-10-21')
- expect(milestone.due_date.to_s).to eq('2020-10-22')
- expect(milestone.created_at).to eq(timestamp)
- expect(milestone.updated_at).to eq(timestamp)
+ expect { subject.run }.to change(Milestone, :count).by(5)
+ expect(group.milestones.pluck(:title)).to contain_exactly('v4.0', 'v3.0', 'v2.0', 'v1.0', 'v0.0')
+ expect(File.directory?(tmpdir)).to eq(false)
end
end
describe '#load' do
- it 'creates the milestone' do
- data = milestone_data('milestone')
-
- expect { subject.load(context, data) }.to change(Milestone, :count).by(1)
- end
-
- context 'when user is not authorized to create the milestone' do
- before do
- allow(user).to receive(:can?).with(:admin_milestone, group).and_return(false)
- end
+ context 'when milestone is not persisted' do
+ it 'saves the milestone' do
+ milestone = build(:milestone, group: group)
- it 'raises NotAllowedError' do
- data = extracted_data(title: 'milestone')
+ expect(milestone).to receive(:save!)
- expect { subject.load(context, data) }.to raise_error(::BulkImports::Pipeline::NotAllowedError)
+ subject.load(context, milestone)
end
end
- end
- describe 'pipeline parts' do
- it { expect(described_class).to include_module(BulkImports::Pipeline) }
- it { expect(described_class).to include_module(BulkImports::Pipeline::Runner) }
+ context 'when milestone is persisted' do
+ it 'does not save milestone' do
+ milestone = create(:milestone, group: group)
- it 'has extractors' do
- expect(described_class.get_extractor)
- .to eq(
- klass: BulkImports::Common::Extractors::GraphqlExtractor,
- options: {
- query: BulkImports::Groups::Graphql::GetMilestonesQuery
- }
- )
- end
+ expect(milestone).not_to receive(:save!)
- it 'has transformers' do
- expect(described_class.transformers)
- .to contain_exactly(
- { klass: BulkImports::Common::Transformers::ProhibitedAttributesTransformer, options: nil }
- )
+ subject.load(context, milestone)
+ end
end
- end
- def milestone_data(title, iid: 1)
- {
- 'title' => title,
- 'description' => 'desc',
- 'iid' => iid,
- 'state' => 'closed',
- 'start_date' => '2020-10-21',
- 'due_date' => '2020-10-22',
- 'created_at' => timestamp.to_s,
- 'updated_at' => timestamp.to_s
- }
- end
-
- def extracted_data(title:, iid: 1, has_next_page: false)
- page_info = {
- 'has_next_page' => has_next_page,
- 'next_page' => has_next_page ? 'cursor' : nil
- }
-
- BulkImports::Pipeline::ExtractedData.new(
- data: milestone_data(title, iid: iid),
- page_info: page_info
- )
+ context 'when milestone is missing' do
+ it 'returns' do
+ expect(subject.load(context, nil)).to be_nil
+ end
+ end
end
end
diff --git a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
index 37e9dc2d9f8..a5d1a5f7fbb 100644
--- a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
@@ -5,22 +5,31 @@ require 'spec_helper'
RSpec.describe BulkImports::NdjsonPipeline do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project) }
- let_it_be(:klass) do
+ let_it_be(:user) { create(:user) }
+
+ let(:klass) do
Class.new do
include BulkImports::NdjsonPipeline
- attr_reader :portable
+ relation_name 'test'
+
+ attr_reader :portable, :current_user
- def initialize(portable)
+ def initialize(portable, user)
@portable = portable
+ @current_user = user
end
end
end
- subject { klass.new(group) }
+ before do
+ stub_const('NdjsonPipelineClass', klass)
+ end
+
+ subject { NdjsonPipelineClass.new(group, user) }
it 'marks pipeline as ndjson' do
- expect(klass.ndjson_pipeline?).to eq(true)
+ expect(NdjsonPipelineClass.ndjson_pipeline?).to eq(true)
end
describe '#deep_transform_relation!' do
@@ -91,6 +100,60 @@ RSpec.describe BulkImports::NdjsonPipeline do
end
end
+ describe '#transform' do
+ it 'calls relation factory' do
+ hash = { key: :value }
+ data = [hash, 1]
+ user = double
+ config = double(relation_excluded_keys: nil, top_relation_tree: [])
+ context = double(portable: group, current_user: user, import_export_config: config)
+ allow(subject).to receive(:import_export_config).and_return(config)
+
+ expect(Gitlab::ImportExport::Group::RelationFactory)
+ .to receive(:create)
+ .with(
+ relation_index: 1,
+ relation_sym: :test,
+ relation_hash: hash,
+ importable: group,
+ members_mapper: instance_of(Gitlab::ImportExport::MembersMapper),
+ object_builder: Gitlab::ImportExport::Group::ObjectBuilder,
+ user: user,
+ excluded_keys: nil
+ )
+
+ subject.transform(context, data)
+ end
+ end
+
+ describe '#load' do
+ context 'when object is not persisted' do
+ it 'saves the object' do
+ object = double(persisted?: false)
+
+ expect(object).to receive(:save!)
+
+ subject.load(nil, object)
+ end
+ end
+
+ context 'when object is persisted' do
+ it 'does not save the object' do
+ object = double(persisted?: true)
+
+ expect(object).not_to receive(:save!)
+
+ subject.load(nil, object)
+ end
+ end
+
+ context 'when object is missing' do
+ it 'returns' do
+ expect(subject.load(nil, nil)).to be_nil
+ end
+ end
+ end
+
describe '#relation_class' do
context 'when relation name is pluralized' do
it 'returns constantized class' do
@@ -113,7 +176,7 @@ RSpec.describe BulkImports::NdjsonPipeline do
end
context 'when portable is project' do
- subject { klass.new(project) }
+ subject { NdjsonPipelineClass.new(project, user) }
it 'returns group relation name override' do
expect(subject.relation_key_override('labels')).to eq('project_labels')
diff --git a/spec/lib/bulk_imports/stage_spec.rb b/spec/lib/bulk_imports/stage_spec.rb
index 713cd3f22ab..d082faa90bc 100644
--- a/spec/lib/bulk_imports/stage_spec.rb
+++ b/spec/lib/bulk_imports/stage_spec.rb
@@ -10,7 +10,8 @@ RSpec.describe BulkImports::Stage do
[1, BulkImports::Groups::Pipelines::MembersPipeline],
[1, BulkImports::Groups::Pipelines::LabelsPipeline],
[1, BulkImports::Groups::Pipelines::MilestonesPipeline],
- [1, BulkImports::Groups::Pipelines::BadgesPipeline]
+ [1, BulkImports::Groups::Pipelines::BadgesPipeline],
+ [2, BulkImports::Groups::Pipelines::BoardsPipeline]
]
end
diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb
index 7f06e66ad50..de61402b6d3 100644
--- a/spec/lib/gitlab/auth_spec.rb
+++ b/spec/lib/gitlab/auth_spec.rb
@@ -683,6 +683,28 @@ RSpec.describe Gitlab::Auth, :use_clean_rails_memory_store_caching do
end
end
+ describe '#build_access_token_check' do
+ subject { gl_auth.find_for_git_client('gitlab-ci-token', build.token, project: build.project, ip: '1.2.3.4') }
+
+ let_it_be(:user) { create(:user) }
+
+ context 'for running build' do
+ let!(:build) { create(:ci_build, :running, user: user) }
+
+ it 'executes query using primary database' do
+ expect(Ci::Build).to receive(:find_by_token).with(build.token).and_wrap_original do |m, *args|
+ expect(::Gitlab::Database::LoadBalancing::Session.current.use_primary?).to eq(true)
+ m.call(*args)
+ end
+
+ expect(subject).to be_a(Gitlab::Auth::Result)
+ expect(subject.actor).to eq(user)
+ expect(subject.project).to eq(build.project)
+ expect(subject.type).to eq(:build)
+ end
+ end
+ end
+
describe 'find_with_user_password' do
let!(:user) do
create(:user,
diff --git a/spec/lib/gitlab/ci/parsers/test/junit_spec.rb b/spec/lib/gitlab/ci/parsers/test/junit_spec.rb
index 644379d7289..303d3811096 100644
--- a/spec/lib/gitlab/ci/parsers/test/junit_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/test/junit_spec.rb
@@ -444,6 +444,30 @@ RSpec.describe Gitlab::Ci::Parsers::Test::Junit do
end
end
+ context 'when attachment is specified in test case with error' do
+ let(:junit) do
+ <<~EOF
+ <testsuites>
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'>
+ <error>Some error</error>
+ <system-out>[[ATTACHMENT|some/path.png]]</system-out>
+ </testcase>
+ </testsuite>
+ </testsuites>
+ EOF
+ end
+
+ it 'assigns correct attributes to the test case' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].has_attachment?).to be_truthy
+ expect(test_cases[0].attachment).to eq("some/path.png")
+
+ expect(test_cases[0].job).to eq(job)
+ end
+ end
+
private
def flattened_test_cases(test_suite)
diff --git a/spec/lib/gitlab/import_export/command_line_util_spec.rb b/spec/lib/gitlab/import_export/command_line_util_spec.rb
index 59d505b6cbf..39a10f87083 100644
--- a/spec/lib/gitlab/import_export/command_line_util_spec.rb
+++ b/spec/lib/gitlab/import_export/command_line_util_spec.rb
@@ -57,7 +57,7 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
it 'decompresses specified file' do
tmpdir = Dir.mktmpdir
filename = 'labels.ndjson.gz'
- gz_filepath = "spec/fixtures/bulk_imports/#{filename}"
+ gz_filepath = "spec/fixtures/bulk_imports/gz/#{filename}"
FileUtils.copy_file(gz_filepath, File.join(tmpdir, filename))
subject.gunzip(dir: tmpdir, filename: filename)
diff --git a/spec/models/bulk_imports/export_upload_spec.rb b/spec/models/bulk_imports/export_upload_spec.rb
index 641fa4a1b6c..d9ae41af0db 100644
--- a/spec/models/bulk_imports/export_upload_spec.rb
+++ b/spec/models/bulk_imports/export_upload_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe BulkImports::ExportUpload do
method = 'export_file'
filename = 'labels.ndjson.gz'
- subject.public_send("#{method}=", fixture_file_upload("spec/fixtures/bulk_imports/#{filename}"))
+ subject.public_send("#{method}=", fixture_file_upload("spec/fixtures/bulk_imports/gz/#{filename}"))
subject.save!
url = "/uploads/-/system/bulk_imports/export_upload/export_file/#{subject.id}/#{filename}"
diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb
index 8309e2ba7c1..ee88d1eb1e9 100644
--- a/spec/requests/api/group_export_spec.rb
+++ b/spec/requests/api/group_export_spec.rb
@@ -215,7 +215,7 @@ RSpec.describe API::GroupExport do
context 'when export file exists' do
it 'downloads exported group archive' do
- upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/labels.ndjson.gz'))
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
get api(download_path, user)
diff --git a/spec/services/bulk_imports/file_decompression_service_spec.rb b/spec/services/bulk_imports/file_decompression_service_spec.rb
index 25e15023e0f..4e8f78c8243 100644
--- a/spec/services/bulk_imports/file_decompression_service_spec.rb
+++ b/spec/services/bulk_imports/file_decompression_service_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe BulkImports::FileDecompressionService do
let_it_be(:ndjson_filename) { 'labels.ndjson' }
let_it_be(:ndjson_filepath) { File.join(tmpdir, ndjson_filename) }
let_it_be(:gz_filename) { "#{ndjson_filename}.gz" }
- let_it_be(:gz_filepath) { "spec/fixtures/bulk_imports/#{gz_filename}" }
+ let_it_be(:gz_filepath) { "spec/fixtures/bulk_imports/gz/#{gz_filename}" }
before do
FileUtils.copy_file(gz_filepath, File.join(tmpdir, gz_filename))
diff --git a/spec/services/bulk_imports/relation_export_service_spec.rb b/spec/services/bulk_imports/relation_export_service_spec.rb
index bf286998df2..333cd9201d8 100644
--- a/spec/services/bulk_imports/relation_export_service_spec.rb
+++ b/spec/services/bulk_imports/relation_export_service_spec.rb
@@ -62,7 +62,7 @@ RSpec.describe BulkImports::RelationExportService do
let(:upload) { create(:bulk_import_export_upload, export: export) }
it 'removes existing export before exporting' do
- upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/labels.ndjson.gz'))
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
expect_any_instance_of(BulkImports::ExportUpload) do |upload|
expect(upload).to receive(:remove_export_file!)
diff --git a/spec/services/ci/create_downstream_pipeline_service_spec.rb b/spec/services/ci/create_downstream_pipeline_service_spec.rb
index 8bab7856375..18bd59a17f0 100644
--- a/spec/services/ci/create_downstream_pipeline_service_spec.rb
+++ b/spec/services/ci/create_downstream_pipeline_service_spec.rb
@@ -136,7 +136,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
bridge_id: bridge.id, project_id: bridge.project.id)
.and_call_original
expect(Ci::CreatePipelineService).not_to receive(:new)
- expect(service.execute(bridge)).to be_nil
+ expect(service.execute(bridge)).to eq({ message: "Already has a downstream pipeline", status: :error })
end
end
@@ -393,6 +393,51 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
end
end
+
+ context 'when multi-project pipeline runs from child pipelines bridge job' do
+ before do
+ stub_ci_pipeline_yaml_file(YAML.dump(rspec: { script: 'rspec' }))
+ end
+
+ # instantiate new service, to clear memoized values from child pipeline run
+ subject(:execute_with_trigger_project_bridge) do
+ described_class.new(upstream_project, user).execute(trigger_project_bridge)
+ end
+
+ let!(:child_pipeline) do
+ service.execute(bridge)
+ bridge.downstream_pipeline
+ end
+
+ let!(:trigger_downstream_project) do
+ {
+ trigger: {
+ project: downstream_project.full_path,
+ branch: 'feature'
+ }
+ }
+ end
+
+ let!(:trigger_project_bridge) do
+ create(
+ :ci_bridge, status: :pending,
+ user: user,
+ options: trigger_downstream_project,
+ pipeline: child_pipeline
+ )
+ end
+
+ it 'creates a new pipeline' do
+ expect { execute_with_trigger_project_bridge }
+ .to change { Ci::Pipeline.count }.by(1)
+
+ new_pipeline = trigger_project_bridge.downstream_pipeline
+
+ expect(new_pipeline.child?).to eq(false)
+ expect(new_pipeline.triggered_by_pipeline).to eq child_pipeline
+ expect(trigger_project_bridge.reload).not_to be_failed
+ end
+ end
end
end
diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
index 9b6d98a12a8..60c0009a4aa 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -1338,4 +1338,22 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
it_behaves_like 'sidebar includes snowplow attributes', 'render', 'projects_side_navigation', 'projects_side_navigation'
+
+ describe 'Collapsed menu items' do
+ it 'does not render the collapsed top menu as a link' do
+ render
+
+ expect(rendered).not_to have_selector('.sidebar-sub-level-items > li.fly-out-top-item > a')
+ end
+
+ context 'when feature flag :sidebar_refactor is disabled' do
+ it 'renders the collapsed top menu as a link' do
+ stub_feature_flags(sidebar_refactor: false)
+
+ render
+
+ expect(rendered).to have_selector('.sidebar-sub-level-items > li.fly-out-top-item > a')
+ end
+ end
+ end
end
diff --git a/spec/workers/bulk_imports/pipeline_worker_spec.rb b/spec/workers/bulk_imports/pipeline_worker_spec.rb
index 44c31714d09..972a4158194 100644
--- a/spec/workers/bulk_imports/pipeline_worker_spec.rb
+++ b/spec/workers/bulk_imports/pipeline_worker_spec.rb
@@ -140,6 +140,10 @@ RSpec.describe BulkImports::PipelineWorker do
def self.ndjson_pipeline?
true
end
+
+ def self.relation
+ 'test'
+ end
end
end
@@ -153,7 +157,6 @@ RSpec.describe BulkImports::PipelineWorker do
before do
stub_const('NdjsonPipeline', ndjson_pipeline)
- stub_const('NdjsonPipeline::RELATION', 'test')
allow(BulkImports::Stage)
.to receive(:pipeline_exists?)
.with('NdjsonPipeline')