loading up the forgejo repo on tangled to test page performance

[Port] gitea#29982 Introduce `.secondary-nav` and handle `.page-content` spacing universally

Fixes: https://github.com/go-gitea/gitea/issues/29981. Introduce
`.secondary-nav` as a universal way for styling and margin adjustments
inside `.page-content`.

If the first child of `.page-content` is `.secondary-nav`, we add margin
below it, otherwise we add padding to the first child. Notable changes:

- `--color-header-wrapper` is replaced with `--color-secondary-nav-bg`.
- `navbar` class is removed.

Co-authored-by: Giteabot <teabot@gitea.io>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>

---

Conflict resolution: Trivial conflict & changed selector to reflect new
classes.
Ref: https://codeberg.org/forgejo/forgejo/issues/2776
(cherry picked from commit 3ccda41a539b8ba7841919ee12dc2877ddc03818)

authored by

silverwind
Giteabot
wxiaoguang
and committed by
Gusted
1ee494a0 18d13000

+43 -47
+1 -1
templates/admin/layout_head.tmpl
··· 1 1 {{template "base/head" .ctxData}} 2 2 <div role="main" aria-label="{{.ctxData.Title}}" class="page-content {{.pageClass}}"> 3 - <div class="ui container gt-mb-4"> 3 + <div class="ui container"> 4 4 {{template "base/alert" .ctxData}} 5 5 </div> 6 6 <div class="ui container fluid padded flex-container">
+1 -1
templates/explore/navbar.tmpl
··· 1 - <overflow-menu class="ui secondary pointing tabular top attached borderless menu navbar"> 1 + <overflow-menu class="ui secondary pointing tabular top attached borderless menu secondary-nav"> 2 2 <div class="overflow-menu-items tw-justify-center"> 3 3 <a class="{{if .PageIsExploreRepositories}}active {{end}}item" href="{{AppSubUrl}}/explore/repos"> 4 4 {{svg "octicon-repo"}} {{ctx.Locale.Tr "explore.repos"}}
+2 -2
templates/repo/header.tmpl
··· 1 - <div class="header-wrapper"> 1 + <div class="secondary-nav"> 2 2 {{with .Repository}} 3 3 <div class="ui container"> 4 4 <div class="repo-header"> ··· 81 81 {{if .IsGenerated}}<div class="fork-flag">{{ctx.Locale.Tr "repo.generated_from"}} <a href="{{(.TemplateRepo ctx).Link}}">{{(.TemplateRepo ctx).FullName}}</a></div>{{end}} 82 82 </div> 83 83 {{end}} 84 - <overflow-menu class="ui container secondary pointing tabular top attached borderless menu navbar tw-pt-0 tw-my-0"> 84 + <overflow-menu class="ui container secondary pointing tabular top attached borderless menu tw-pt-0 tw-my-0"> 85 85 {{if not (or .Repository.IsBeingCreated .Repository.IsBroken)}} 86 86 <div class="overflow-menu-items"> 87 87 {{if .Permission.CanRead $.UnitTypeCode}}
+1 -1
templates/user/auth/signin_navbar.tmpl
··· 1 1 {{if or .EnableOpenIDSignIn .EnableSSPI}} 2 - <overflow-menu class="ui secondary pointing tabular top attached borderless menu navbar tw-bg-header-wrapper"> 2 + <overflow-menu class="ui secondary pointing tabular top attached borderless menu navbar secondary-nav"> 3 3 <div class="overflow-menu-items tw-justify-center"> 4 4 <a class="{{if .PageIsLogin}}active {{end}}item" rel="nofollow" href="{{AppSubUrl}}/user/login"> 5 5 {{ctx.Locale.Tr "auth.tab_signin"}}
+1 -1
templates/user/auth/signup_openid_navbar.tmpl
··· 1 - <overflow-menu class="ui secondary pointing tabular top attached borderless menu navbar tw-bg-header-wrapper"> 1 + <overflow-menu class="ui secondary pointing tabular top attached borderless menu secondary-nav"> 2 2 <div class="overflow-menu-items tw-justify-center"> 3 3 <a class="{{if .PageIsOpenIDConnect}}active {{end}}item" href="{{AppSubUrl}}/user/openid/connect"> 4 4 {{ctx.Locale.Tr "auth.openid_connect_title"}}
+1 -2
templates/user/dashboard/navbar.tmpl
··· 1 - <div class="dashboard-navbar"> 1 + <div class="secondary-nav tw-border-b tw-border-b-secondary"> 2 2 <div class="ui secondary stackable menu"> 3 3 <div class="item"> 4 4 <div class="ui floating dropdown jump"> ··· 105 105 {{end}} 106 106 </div> 107 107 </div> 108 - <div class="divider tw-mt-0"></div>
+1 -1
tests/e2e/example.test.e2e.js
··· 23 23 await page.click('form button.ui.primary.button:visible'); 24 24 // Make sure we routed to the home page. Else login failed. 25 25 await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`); 26 - await expect(page.locator('.dashboard-navbar span>img.ui.avatar')).toBeVisible(); 26 + await expect(page.locator('.secondary-nav span>img.ui.avatar')).toBeVisible(); 27 27 await expect(page.locator('.ui.positive.message.flash-success')).toHaveText('Account was successfully created. Welcome!'); 28 28 29 29 save_visual(page);
+1 -1
tests/e2e/utils_e2e.js
··· 52 52 fullPage: true, 53 53 timeout: 20000, 54 54 mask: [ 55 - page.locator('.dashboard-navbar span>img.ui.avatar'), 55 + page.locator('.secondary-nav span>img.ui.avatar'), 56 56 page.locator('.ui.dropdown.jump.item span>img.ui.avatar'), 57 57 ], 58 58 });
+14 -4
web_src/css/base.css
··· 749 749 padding-bottom: 80px; 750 750 } 751 751 752 - .page-content.new:is(.repo,.migrate,.org), 753 - .page-content.profile:is(.user,.organization) { 754 - padding-top: 15px; 752 + /* add margin below .secondary nav when it is the first child */ 753 + .page-content > :first-child.secondary-nav { 754 + margin-bottom: 14px; 755 + } 756 + 757 + /* add padding to all content when there is no .secondary.nav. this uses padding instead of 758 + margin because with the negative margin on .ui.grid we would have to set margin-top: 0, 759 + but that does not work universally for all pages */ 760 + .page-content > :first-child:not(.secondary-nav) { 761 + padding-top: 14px; 755 762 } 756 763 757 764 /* overwrite semantic width of containers inside the main page content div (div with class "page-content") */ ··· 1337 1344 } 1338 1345 1339 1346 overflow-menu { 1340 - margin-bottom: 15px !important; 1341 1347 border-bottom: 1px solid var(--color-secondary) !important; 1342 1348 display: flex; 1343 1349 } ··· 1349 1355 1350 1356 overflow-menu .overflow-menu-items .item { 1351 1357 margin-bottom: 0 !important; /* reset fomantic's margin, because the active menu has special bottom border */ 1358 + } 1359 + 1360 + overflow-menu .ui.label { 1361 + margin-left: 7px !important; /* save some space */ 1352 1362 } 1353 1363 1354 1364 .activity-bar-graph {
+6 -6
web_src/css/dashboard.css
··· 77 77 margin: 0 1px; /* Accommodate for Semantic's 1px hacks on .attached elements */ 78 78 } 79 79 80 - .dashboard .dashboard-navbar { 81 - padding: 4px 12px; 80 + .dashboard .secondary-nav { 81 + padding: 1px 12px; /* match .overflow-menu-items in height */ 82 82 } 83 83 84 - .dashboard .dashboard-navbar .right.menu { 84 + .dashboard .secondary-nav .right.menu { 85 85 gap: .35714286em; 86 86 } 87 87 88 - .dashboard .dashboard-navbar .right.menu div.item { 88 + .dashboard .secondary-nav .right.menu div.item { 89 89 padding-left: 0.5rem; 90 90 } 91 91 92 - .dashboard .dashboard-navbar .org-visibility .label { 92 + .dashboard .secondary-nav .org-visibility .label { 93 93 margin-left: 5px; 94 94 } 95 95 96 - .dashboard .dashboard-navbar .ui.dropdown { 96 + .dashboard .secondary-nav .ui.dropdown { 97 97 max-width: 100%; 98 98 }
+2 -4
web_src/css/explore.css
··· 1 - .explore .navbar { 2 - margin-bottom: 15px !important; 3 - background-color: var(--color-header-wrapper) !important; 1 + .explore .secondary-nav { 4 2 border-width: 1px !important; 5 3 } 6 4 7 - .explore .navbar .svg { 5 + .explore .secondary-nav .svg { 8 6 width: 16px; 9 7 text-align: center; 10 8 margin-right: 5px;
+4
web_src/css/modules/navbar.css
··· 136 136 justify-content: center; 137 137 z-index: 1; /* prevent menu button background from overlaying icon */ 138 138 } 139 + 140 + .secondary-nav { 141 + background: var(--color-secondary-nav-bg) !important; /* important because of .ui.secondary.menu */ 142 + }
-10
web_src/css/repo.css
··· 4 4 user-select: none; 5 5 } 6 6 7 - .repository .navbar { 8 - display: flex; 9 - justify-content: space-between; 10 - } 11 - 12 - .repository .navbar .ui.label { 13 - margin-left: 7px; 14 - padding: 3px 5px; 15 - } 16 - 17 7 .repository .owner.dropdown { 18 8 min-width: 40% !important; 19 9 }
+5 -6
web_src/css/repo/header.css
··· 1 - .header-wrapper .fork-flag { 1 + .repository .secondary-nav { 2 + padding-top: 12px; 3 + } 4 + 5 + .repository .secondary-nav .fork-flag { 2 6 margin-top: 0.5rem; 3 7 font-size: 12px; 4 8 } ··· 63 67 .repo-buttons .ui.labeled.button.disabled > .button { 64 68 pointer-events: none !important; 65 69 } 66 - 67 - .repository .header-wrapper { 68 - padding-top: 12px; 69 - background-color: var(--color-header-wrapper); 70 - }
+1 -1
web_src/css/themes/theme-gitea-dark.css
··· 197 197 --color-input-toggle-background: #2e353b; 198 198 --color-input-border: var(--color-secondary); 199 199 --color-input-border-hover: var(--color-secondary-dark-1); 200 - --color-header-wrapper: #181c20; 201 200 --color-light: #00001728; 202 201 --color-light-mimic-enabled: rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled))); 203 202 --color-light-border: #e8e8ff28; ··· 227 226 --color-nav-bg: #16191c; 228 227 --color-nav-hover-bg: var(--color-secondary-light-1); 229 228 --color-nav-text: var(--color-text); 229 + --color-secondary-nav-bg: #181c20; 230 230 --color-label-text: var(--color-text); 231 231 --color-label-bg: #73828e4b; 232 232 --color-label-hover-bg: #73828ea0;
+1 -1
web_src/css/themes/theme-gitea-light.css
··· 197 197 --color-input-toggle-background: #d0d7de; 198 198 --color-input-border: var(--color-secondary); 199 199 --color-input-border-hover: var(--color-secondary-dark-1); 200 - --color-header-wrapper: #f9fafb; 201 200 --color-light: #00001706; 202 201 --color-light-mimic-enabled: rgba(0, 0, 0, calc(6 / 255 * 222 / 255 / var(--opacity-disabled))); 203 202 --color-light-border: #0000171d; ··· 227 226 --color-nav-bg: #f6f7fa; 228 227 --color-nav-hover-bg: var(--color-secondary-light-1); 229 228 --color-nav-text: var(--color-text); 229 + --color-secondary-nav-bg: #f9fafb; 230 230 --color-label-text: var(--color-text); 231 231 --color-label-bg: #949da64b; 232 232 --color-label-hover-bg: #949da6a0;
-4
web_src/css/user.css
··· 125 125 border: 1px solid var(--color-secondary); 126 126 } 127 127 128 - #notification_div { 129 - padding-top: 15px; 130 - } 131 - 132 128 #notification_table { 133 129 background: var(--color-box-body); 134 130 border: 1px solid var(--color-secondary);