summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorFilipa Lacerda <filipa@gitlab.com>2017-02-28 20:12:40 +0000
committerFilipa Lacerda <filipa@gitlab.com>2017-02-28 20:12:40 +0000
commit936215433dec7b1e5d67b980098b97a012219bae (patch)
treebac299b1b3bd2c5da5bf243b7332329c03c1ad80 /app
parent6862e788e8b32196d750152c4657ea95d431e04f (diff)
parent05c8ec6cb85a3943b53cbd5757e7baea300dac68 (diff)
downloadgitlab-ce-936215433dec7b1e5d67b980098b97a012219bae.tar.gz
Merge branch 'master' into add-svg-loader
* master: (21 commits) Move `Group -> Members` to top-level, fix missing sub-nav for Subgroups Left align logo; increase max width of title Add newline to end of frontend.md. Clone nested objects from default data. Checks if key is present before accessing it Update CHANGELOG.md for 8.17.1 Document use of AirBnb js styleguide and eslint. Don't allow a project to be shared with an ancestor of the group it is in Fix access to projects shared with a nested group Ignore builds dir when run rubocop check Remove hidden-xs classes from last columns in environments and pipelines table. Transform pipelines table css to match structure of pipelines table Make environments table overflow Use exceptions for MergeService error handling Clarify when to create EE compatibility MR in code review process New runner API returns 204 Backport new behavior to CI API Backport API to V3 Update documentation Return 204 for delete endpoints API project create: Make name or path required Only create unmergeable todos once Put back the new project button ...
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/cycle_analytics/cycle_analytics_store.js.es67
-rw-r--r--app/assets/javascripts/environments/components/environment.js.es612
-rw-r--r--app/assets/javascripts/environments/components/environment_item.js.es64
-rw-r--r--app/assets/javascripts/environments/components/environments_table.js.es64
-rw-r--r--app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es62
-rw-r--r--app/assets/javascripts/vue_shared/components/pipelines_table.js.es62
-rw-r--r--app/assets/stylesheets/framework/header.scss33
-rw-r--r--app/assets/stylesheets/pages/environments.scss187
-rw-r--r--app/assets/stylesheets/pages/pipelines.scss1
-rw-r--r--app/models/merge_request.rb4
-rw-r--r--app/models/project_group_link.rb11
-rw-r--r--app/models/user.rb2
-rw-r--r--app/services/merge_requests/merge_service.rb20
-rw-r--r--app/services/merge_requests/merge_when_pipeline_succeeds_service.rb6
-rw-r--r--app/services/users/refresh_authorized_projects_service.rb16
-rw-r--r--app/views/groups/_head.html.haml7
-rw-r--r--app/views/groups/group_members/index.html.haml1
-rw-r--r--app/views/groups/subgroups.html.haml1
-rw-r--r--app/views/layouts/header/_default.html.haml8
-rw-r--r--app/views/layouts/nav/_group.html.haml6
-rw-r--r--app/views/projects/tags/index.html.haml2
21 files changed, 166 insertions, 170 deletions
diff --git a/app/assets/javascripts/cycle_analytics/cycle_analytics_store.js.es6 b/app/assets/javascripts/cycle_analytics/cycle_analytics_store.js.es6
index 3efeb141008..7ae9de7297c 100644
--- a/app/assets/javascripts/cycle_analytics/cycle_analytics_store.js.es6
+++ b/app/assets/javascripts/cycle_analytics/cycle_analytics_store.js.es6
@@ -75,8 +75,11 @@ const DEFAULT_EVENT_OBJECTS = require('./default_event_objects');
const eventItem = Object.assign({}, DEFAULT_EVENT_OBJECTS[stage.slug], item);
eventItem.totalTime = eventItem.total_time;
- eventItem.author.webUrl = eventItem.author.web_url;
- eventItem.author.avatarUrl = eventItem.author.avatar_url;
+
+ if (eventItem.author) {
+ eventItem.author.webUrl = eventItem.author.web_url;
+ eventItem.author.avatarUrl = eventItem.author.avatar_url;
+ }
if (eventItem.created_at) eventItem.createdAt = eventItem.created_at;
if (eventItem.short_sha) eventItem.shortSha = eventItem.short_sha;
diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6
index 204934b673d..2fca61fdae0 100644
--- a/app/assets/javascripts/environments/components/environment.js.es6
+++ b/app/assets/javascripts/environments/components/environment.js.es6
@@ -142,7 +142,7 @@ module.exports = Vue.component('environment-component', {
</div>
</div>
- <div class="environments-container">
+ <div class="content-list environments-container">
<div class="environments-list-loading text-center" v-if="isLoading">
<i class="fa fa-spinner fa-spin"></i>
</div>
@@ -174,12 +174,12 @@ module.exports = Vue.component('environment-component', {
:environments="state.environments"
:can-create-deployment="canCreateDeploymentParsed"
:can-read-environment="canReadEnvironmentParsed"/>
-
- <table-pagination v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
- :change="changePage"
- :pageInfo="state.paginationInformation">
- </table-pagination>
</div>
+
+ <table-pagination v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
+ :change="changePage"
+ :pageInfo="state.paginationInformation">
+ </table-pagination>
</div>
</div>
`,
diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6
index 08579d0e826..7f4e070b229 100644
--- a/app/assets/javascripts/environments/components/environment_item.js.es6
+++ b/app/assets/javascripts/environments/components/environment_item.js.es6
@@ -486,8 +486,8 @@ module.exports = Vue.component('environment-item', {
</span>
</td>
- <td class="hidden-xs environments-actions">
- <div v-if="!model.isFolder" class="btn-group" role="group">
+ <td class="environments-actions">
+ <div v-if="!model.isFolder" class="btn-group pull-right" role="group">
<actions-component v-if="hasManualActions && canCreateDeployment"
:actions="manualActions"/>
diff --git a/app/assets/javascripts/environments/components/environments_table.js.es6 b/app/assets/javascripts/environments/components/environments_table.js.es6
index 4df4e33b7a1..4088d63be80 100644
--- a/app/assets/javascripts/environments/components/environments_table.js.es6
+++ b/app/assets/javascripts/environments/components/environments_table.js.es6
@@ -31,7 +31,7 @@ module.exports = Vue.component('environment-table-component', {
},
template: `
- <table class="table ci-table environments">
+ <table class="table ci-table">
<thead>
<tr>
<th class="environments-name">Environment</th>
@@ -39,7 +39,7 @@ module.exports = Vue.component('environment-table-component', {
<th class="environments-build">Job</th>
<th class="environments-commit">Commit</th>
<th class="environments-date">Updated</th>
- <th class="hidden-xs environments-actions"></th>
+ <th class="environments-actions"></th>
</tr>
</thead>
<tbody>
diff --git a/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6 b/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6
index f643213ee54..891f1f17fb3 100644
--- a/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6
+++ b/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6
@@ -38,7 +38,7 @@ const playIconSvg = require('icons/_icon_play.svg');
},
template: `
- <td class="pipeline-actions hidden-xs">
+ <td class="pipeline-actions">
<div class="pull-right">
<div class="btn-group">
<div class="btn-group" v-if="actions">
diff --git a/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6 b/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6
index 1c41f8b437d..0d8f85db965 100644
--- a/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6
+++ b/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6
@@ -36,7 +36,7 @@ require('./pipelines_table_row');
<th class="js-pipeline-commit pipeline-commit">Commit</th>
<th class="js-pipeline-stages pipeline-stages">Stages</th>
<th class="js-pipeline-date pipeline-date"></th>
- <th class="js-pipeline-actions pipeline-actions hidden-xs"></th>
+ <th class="js-pipeline-actions pipeline-actions"></th>
</tr>
</thead>
<tbody>
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 3945a789c82..685a4847731 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -148,16 +148,11 @@ header {
}
.header-logo {
- position: absolute;
- left: 50%;
+ display: inline-block;
+ margin: 0 8px 0 3px;
+ position: relative;
top: 7px;
transition-duration: .3s;
- z-index: 999;
-
- #logo {
- position: relative;
- left: -50%;
- }
svg,
img {
@@ -167,15 +162,6 @@ header {
&:hover {
cursor: pointer;
}
-
- @media (max-width: $screen-xs-max) {
- right: 20px;
- left: auto;
-
- #logo {
- left: auto;
- }
- }
}
.title {
@@ -183,7 +169,6 @@ header {
padding-right: 20px;
margin: 0;
font-size: 18px;
- max-width: 385px;
display: inline-block;
line-height: $header-height;
font-weight: normal;
@@ -193,14 +178,18 @@ header {
vertical-align: top;
white-space: nowrap;
- @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- max-width: 300px;
- }
-
@media (max-width: $screen-xs-max) {
max-width: 190px;
}
+ @media (min-width: $screen-sm-min) and (max-width: $screen-md-max) {
+ max-width: 428px;
+ }
+
+ @media (min-width: $screen-lg-min) {
+ max-width: 685px;
+ }
+
a {
color: $gl-text-color;
diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss
index f789ae1ccd3..77e09e66340 100644
--- a/app/assets/stylesheets/pages/environments.scss
+++ b/app/assets/stylesheets/pages/environments.scss
@@ -15,112 +15,97 @@
padding-top: 20px;
}
-@media (max-width: $screen-xs-max) {
- .environments-container {
+.environments-container {
+ .table-holder {
width: 100%;
overflow: auto;
}
-}
-
-.environments {
- table-layout: fixed;
-
- .environments-commit,
- .environments-actions,
- .environments-deploy,
- .environments-build,
- .environments-date {
- position: static;
- float: none;
- display: table-cell;
- }
-
- .environments-commit,
- .environments-actions {
- width: 20%;
- }
-
- .environments-date {
- width: 10%;
- }
- .environments-name,
- .environments-deploy,
- .environments-build {
- width: 15%;
- }
-
- .environment-name,
- .environments-build-cell,
- .deployment-column {
- word-break: break-all;
- }
-
- .deployment-column {
- .avatar {
- float: none;
+ .table.ci-table {
+ .environments-actions {
+ min-width: 200px;
}
- }
- .btn-group {
+ .environments-commit,
+ .environments-actions {
+ width: 20%;
+ }
- > a {
- color: $gl-text-color-secondary;
+ .environments-date {
+ width: 10%;
}
- svg path {
- fill: $gl-text-color-secondary;
+ .environments-name,
+ .environments-deploy,
+ .environments-build {
+ width: 15%;
}
- .dropdown {
- outline: none;
+ .deployment-column {
+ > span {
+ word-break: break-all;
+ }
+
+ .avatar {
+ float: none;
+ }
}
- }
+ .btn-group {
- .commit-title {
- margin: 0;
- }
+ > a {
+ color: $gl-text-color-secondary;
+ }
- .avatar-image-container {
- text-decoration: none;
- }
+ svg path {
+ fill: $gl-text-color-secondary;
+ }
- .icon-play {
- height: 13px;
- width: 12px;
- }
+ .dropdown {
+ outline: none;
+ }
+ }
- .external-url,
- .dropdown-new {
- color: $gl-text-color-secondary;
- }
+ .commit-title {
+ margin: 0;
+ }
- .dropdown-menu {
+ .avatar-image-container {
+ text-decoration: none;
+ }
- .fa {
- margin-right: 6px;
- color: $gl-text-color-secondary;
+ .icon-play {
+ height: 13px;
+ width: 12px;
}
- }
- .build-link,
- .branch-name {
- color: $gl-text-color;
- }
+ .external-url,
+ .dropdown-new {
+ color: $gl-text-color-secondary;
+ }
- .stop-env-link,
- .external-url {
- color: $gl-text-color-secondary;
+ .dropdown-menu {
+ .fa {
+ margin-right: 6px;
+ color: $gl-text-color-secondary;
+ }
+ }
- .stop-env-icon {
- font-size: 14px;
+ .build-link,
+ .branch-name {
+ color: $gl-text-color;
}
- }
- .deployment {
- .build-column {
+ .stop-env-link,
+ .external-url {
+ color: $gl-text-color-secondary;
+
+ .stop-env-icon {
+ font-size: 14px;
+ }
+ }
+ .deployment .build-column {
.build-link {
color: $gl-text-color;
}
@@ -129,34 +114,32 @@
float: none;
}
}
- }
-
- .folder-icon {
- margin-right: 3px;
- color: $gl-text-color-secondary;
- display: inline-block;
- .fa:nth-child(1) {
+ .folder-icon {
margin-right: 3px;
+ color: $gl-text-color-secondary;
+ display: inline-block;
+
+ .fa:nth-child(1) {
+ margin-right: 3px;
+ }
}
- }
- .folder-name {
- cursor: pointer;
- color: $gl-text-color-secondary;
- display: inline-block;
- }
-}
+ .folder-name {
+ cursor: pointer;
+ color: $gl-text-color-secondary;
+ display: inline-block;
+ }
-.table.ci-table.environments {
- .icon-container {
- width: 20px;
- text-align: center;
- }
+ .icon-container {
+ width: 20px;
+ text-align: center;
+ }
- .branch-commit {
- .commit-id {
- margin-right: 0;
+ .branch-commit {
+ .commit-id {
+ margin-right: 0;
+ }
}
}
}
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index f4707f71208..69eea1b2217 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -105,6 +105,7 @@
@media (max-width: $screen-md-max) {
.content-list {
&.pipelines,
+ &.environments-container,
&.builds-content-list {
width: 100%;
overflow: auto;
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 7eb875f1ef5..d6e7ed87555 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -91,10 +91,6 @@ class MergeRequest < ActiveRecord::Base
around_transition do |merge_request, transition, block|
Gitlab::Timeless.timeless(merge_request, &block)
end
-
- after_transition unchecked: :cannot_be_merged do |merge_request, transition|
- TodoService.new.merge_request_became_unmergeable(merge_request)
- end
end
validates :source_project, presence: true, unless: [:allow_broken, :importing?, :closed_without_fork?]
diff --git a/app/models/project_group_link.rb b/app/models/project_group_link.rb
index 5cb6b0c527d..ac1e9ab2b0b 100644
--- a/app/models/project_group_link.rb
+++ b/app/models/project_group_link.rb
@@ -33,8 +33,15 @@ class ProjectGroupLink < ActiveRecord::Base
private
def different_group
- if self.group && self.project && self.project.group == self.group
- errors.add(:base, "Project cannot be shared with the project it is in.")
+ return unless self.group && self.project
+
+ project_group = self.project.group
+ return unless project_group
+
+ group_ids = project_group.ancestors.map(&:id).push(project_group.id)
+
+ if group_ids.include?(self.group.id)
+ errors.add(:base, "Project cannot be shared with the group it is in or one of its ancestors.")
end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 40264401b53..6fb5ac4a4ef 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -474,7 +474,7 @@ class User < ActiveRecord::Base
Group.member_descendants(id)
end
- def nested_projects
+ def nested_groups_projects
Project.joins(:namespace).where('namespaces.parent_id IS NOT NULL').
member_descendants(id)
end
diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb
index 3da1b657a41..fac3ac7a4c7 100644
--- a/app/services/merge_requests/merge_service.rb
+++ b/app/services/merge_requests/merge_service.rb
@@ -6,6 +6,8 @@ module MergeRequests
# Executed when you do merge via GitLab UI
#
class MergeService < MergeRequests::BaseService
+ MergeError = Class.new(StandardError)
+
attr_reader :merge_request, :source
def execute(merge_request)
@@ -27,6 +29,8 @@ module MergeRequests
success
end
end
+ rescue MergeError => e
+ log_merge_error(e.message, save_message_on_model: true)
end
private
@@ -42,19 +46,13 @@ module MergeRequests
commit_id = repository.merge(current_user, source, merge_request, options)
- if commit_id
- merge_request.update(merge_commit_sha: commit_id)
- else
- log_merge_error('Conflicts detected during merge', save_message_on_model: true)
- false
- end
+ raise MergeError, 'Conflicts detected during merge' unless commit_id
+
+ merge_request.update(merge_commit_sha: commit_id)
rescue GitHooksService::PreReceiveError => e
- log_merge_error(e.message, save_message_on_model: true)
- false
+ raise MergeError, e.message
rescue StandardError => e
- merge_request.update(merge_error: "Something went wrong during merge: #{e.message}")
- log_merge_error(e.message)
- false
+ raise MergeError, "Something went wrong during merge: #{e.message}"
ensure
merge_request.update(in_progress_merge_commit_sha: nil)
end
diff --git a/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb b/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb
index 5616edf8b4a..5081dd5a0c4 100644
--- a/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb
+++ b/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb
@@ -24,7 +24,11 @@ module MergeRequests
pipeline_merge_requests(pipeline) do |merge_request|
next unless merge_request.merge_when_build_succeeds?
- next unless merge_request.mergeable?
+
+ unless merge_request.mergeable?
+ todo_service.merge_request_became_unmergeable(merge_request)
+ next
+ end
MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params)
end
diff --git a/app/services/users/refresh_authorized_projects_service.rb b/app/services/users/refresh_authorized_projects_service.rb
index fad741531ea..d9370bbb598 100644
--- a/app/services/users/refresh_authorized_projects_service.rb
+++ b/app/services/users/refresh_authorized_projects_service.rb
@@ -115,11 +115,23 @@ module Users
# Returns a union query of projects that the user is authorized to access
def project_authorizations_union
relations = [
+ # Personal projects
user.personal_projects.select("#{user.id} AS user_id, projects.id AS project_id, #{Gitlab::Access::MASTER} AS access_level"),
- user.groups_projects.select_for_project_authorization,
+
+ # Projects the user is a member of
user.projects.select_for_project_authorization,
+
+ # Projects of groups the user is a member of
+ user.groups_projects.select_for_project_authorization,
+
+ # Projects of subgroups of groups the user is a member of
+ user.nested_groups_projects.select_for_project_authorization,
+
+ # Projects shared with groups the user is a member of
user.groups.joins(:shared_projects).select_for_project_authorization,
- user.nested_projects.select_for_project_authorization
+
+ # Projects shared with subgroups of groups the user is a member of
+ user.nested_groups.joins(:shared_projects).select_for_project_authorization
]
Gitlab::SQL::Union.new(relations)
diff --git a/app/views/groups/_head.html.haml b/app/views/groups/_head.html.haml
index 6b296ea8dea..873504099d4 100644
--- a/app/views/groups/_head.html.haml
+++ b/app/views/groups/_head.html.haml
@@ -3,7 +3,7 @@
= render 'shared/nav_scroll'
.nav-links.sub-nav.scrolling-tabs
%ul{ class: container_class }
- = nav_link(path: 'groups#show', html_options: { class: 'home' }) do
+ = nav_link(path: ['groups#show', 'groups#subgroups'], html_options: { class: 'home' }) do
= link_to group_path(@group), title: 'Group Home' do
%span
Home
@@ -12,8 +12,3 @@
= link_to activity_group_path(@group), title: 'Activity' do
%span
Activity
-
- = nav_link(path: 'group_members#index') do
- = link_to group_group_members_path(@group), title: 'Members' do
- %span
- Members
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index 8cb56443191..2e4e4511bb6 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -1,5 +1,4 @@
- page_title "Members"
-= render 'groups/head'
.project-members-page.prepend-top-default
%h4
diff --git a/app/views/groups/subgroups.html.haml b/app/views/groups/subgroups.html.haml
index 8610ae7e0ef..be809083139 100644
--- a/app/views/groups/subgroups.html.haml
+++ b/app/views/groups/subgroups.html.haml
@@ -1,5 +1,6 @@
- @no_container = true
+= render 'head'
= render 'groups/home_panel'
.groups-header{ class: container_class }
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 0b8388cbff3..c28661c2351 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -36,6 +36,10 @@
= icon('bell fw')
%span.badge.todos-pending-count{ class: ("hidden" if todos_pending_count == 0) }
= todos_count_format(todos_pending_count)
+ - if current_user.can_create_project?
+ %li
+ = link_to new_project_path, title: 'New project', aria: { label: "New project" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = icon('plus fw')
- if Gitlab::Sherlock.enabled?
%li
= link_to sherlock_transactions_path, title: 'Sherlock Transactions',
@@ -61,12 +65,12 @@
%div
= link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success'
- %h1.title= title
-
.header-logo
= link_to root_path, class: 'home', title: 'Dashboard', id: 'logo' do
= brand_header_logo
+ %h1.title= title
+
= yield :header_content
= render 'shared/outdated_browser'
diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml
index e0742d70fac..a6e96942021 100644
--- a/app/views/layouts/nav/_group.html.haml
+++ b/app/views/layouts/nav/_group.html.haml
@@ -5,7 +5,7 @@
.fade-right
= icon('angle-right')
%ul.nav-links.scrolling-tabs
- = nav_link(path: ['groups#show', 'groups#activity', 'group_members#index'], html_options: { class: 'home' }) do
+ = nav_link(path: ['groups#show', 'groups#activity', 'groups#subgroups'], html_options: { class: 'home' }) do
= link_to group_path(@group), title: 'Home' do
%span
Group
@@ -21,3 +21,7 @@
Merge Requests
- merge_requests = MergeRequestsFinder.new(current_user, group_id: @group.id, state: 'opened', non_archived: true).execute
%span.badge.count= number_with_delimiter(merge_requests.count)
+ = nav_link(path: 'group_members#index') do
+ = link_to group_group_members_path(@group), title: 'Members' do
+ %span
+ Members
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index e2f132f7742..7f9a44e565f 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -3,7 +3,7 @@
= render "projects/commits/head"
.flex-list{ class: container_class }
- .top-area.flex-row
+ .top-area.adjust
.nav-text.row-main-content
Tags give the ability to mark specific points in history as being important