Sfoglia il codice sorgente

Merge pull request #19472 from overleaf/rd-stylelint-ci

[web] Add Stylelint formatting to the CI

GitOrigin-RevId: f31139f9f6f70aa96214b59db37ad1f79cd1e733
Rebeka Dekany 2 anni fa
parent
commit
6cb956b1ff
25 ha cambiato i file con 67 aggiunte e 63 eliminazioni
  1. 7 1
      services/web/.stylelintrc.json
  2. 4 0
      services/web/Makefile
  3. 1 1
      services/web/app/views/layout/language-picker-bootstrap-5.pug
  4. 1 1
      services/web/app/views/layout/language-picker.pug
  5. 1 1
      services/web/frontend/js/features/settings/components/emails-section.tsx
  6. 1 1
      services/web/frontend/js/features/settings/components/emails/add-email/country-input.tsx
  7. 1 1
      services/web/frontend/js/features/settings/components/emails/add-email/layout.tsx
  8. 1 1
      services/web/frontend/js/features/settings/components/emails/downshift-input.tsx
  9. 1 1
      services/web/frontend/stylesheets/app/account-settings.less
  10. 2 0
      services/web/frontend/stylesheets/bootstrap-5/abstracts/mixins.scss
  11. 1 18
      services/web/frontend/stylesheets/bootstrap-5/abstracts/variable-overrides.scss
  12. 2 1
      services/web/frontend/stylesheets/bootstrap-5/components/badge.scss
  13. 7 1
      services/web/frontend/stylesheets/bootstrap-5/components/button.scss
  14. 1 1
      services/web/frontend/stylesheets/bootstrap-5/components/dropdown-menu.scss
  15. 7 5
      services/web/frontend/stylesheets/bootstrap-5/components/footer.scss
  16. 5 8
      services/web/frontend/stylesheets/bootstrap-5/components/form.scss
  17. 8 5
      services/web/frontend/stylesheets/bootstrap-5/components/modal.scss
  18. 1 5
      services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
  19. 2 6
      services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
  20. 1 1
      services/web/frontend/stylesheets/bootstrap-5/helpers/visually-hidden.scss
  21. 6 1
      services/web/frontend/stylesheets/bootstrap-5/pages/account-settings.scss
  22. 1 0
      services/web/frontend/stylesheets/bootstrap-5/pages/project-list.scss
  23. 2 0
      services/web/frontend/stylesheets/bootstrap-5/pages/sidebar-v2-dash-pane.scss
  24. 1 1
      services/web/frontend/stylesheets/components/footer.less
  25. 2 2
      services/web/package.json

+ 7 - 1
services/web/.stylelintrc.json

@@ -1,3 +1,9 @@
 {
 {
-  "extends": ["stylelint-config-standard-scss"]
+  "extends": ["stylelint-config-standard-scss"],
+  "rules": {
+    "function-url-quotes": null,
+    "no-descending-specificity": null,
+    "scss/at-extend-no-missing-placeholder": null,
+    "scss/operator-no-newline-after": null
+  }
 }
 }

+ 4 - 0
services/web/Makefile

@@ -397,6 +397,10 @@ lint: lint_eslint
 lint_eslint:
 lint_eslint:
 	npm run lint
 	npm run lint
 
 
+lint: lint_stylelint
+lint_stylelint:
+	npm run lint:styles
+
 lint: lint_pug
 lint: lint_pug
 lint_pug:
 lint_pug:
 	bin/lint_pug_templates
 	bin/lint_pug_templates

+ 1 - 1
services/web/app/views/layout/language-picker-bootstrap-5.pug

@@ -20,7 +20,7 @@ li.dropdown.dropup.subdued(dropdown).language-picker
 		each subdomainDetails, subdomain in settings.i18n.subdomainLang
 		each subdomainDetails, subdomain in settings.i18n.subdomainLang
 			if !subdomainDetails.hide
 			if !subdomainDetails.hide
 				- let isActive = subdomainDetails.lngCode === currentLngCode
 				- let isActive = subdomainDetails.lngCode === currentLngCode
-				li.lngOption
+				li.lng-option
 					a.menu-indent(href=subdomainDetails.url+currentUrlWithQueryParams, role="menuitem", class=isActive ? 'dropdown-item active' : 'dropdown-item', aria-selected=isActive ? 'true' : 'false')
 					a.menu-indent(href=subdomainDetails.url+currentUrlWithQueryParams, role="menuitem", class=isActive ? 'dropdown-item active' : 'dropdown-item', aria-selected=isActive ? 'true' : 'false')
 						| #{settings.translatedLanguages[subdomainDetails.lngCode]}
 						| #{settings.translatedLanguages[subdomainDetails.lngCode]}
 						if subdomainDetails.lngCode === currentLngCode
 						if subdomainDetails.lngCode === currentLngCode

+ 1 - 1
services/web/app/views/layout/language-picker.pug

@@ -19,6 +19,6 @@ li.dropdown.dropup.subdued(dropdown).language-picker
 		li.dropdown-header #{translate("language")}
 		li.dropdown-header #{translate("language")}
 		each subdomainDetails, subdomain in settings.i18n.subdomainLang
 		each subdomainDetails, subdomain in settings.i18n.subdomainLang
 			if !subdomainDetails.hide
 			if !subdomainDetails.hide
-				li.lngOption
+				li.lng-option
 					a.menu-indent(href=subdomainDetails.url+currentUrlWithQueryParams role="menuitem")
 					a.menu-indent(href=subdomainDetails.url+currentUrlWithQueryParams role="menuitem")
 						| #{settings.translatedLanguages[subdomainDetails.lngCode]}
 						| #{settings.translatedLanguages[subdomainDetails.lngCode]}

+ 1 - 1
services/web/frontend/js/features/settings/components/emails-section.tsx

@@ -46,7 +46,7 @@ function EmailsSectionContent() {
       <>
       <>
         <EmailsHeader />
         <EmailsHeader />
         {isInitializing ? (
         {isInitializing ? (
-          <div className="affiliations-table-row--highlighted">
+          <div className="affiliations-table-row-highlighted">
             <div className="affiliations-table-cell text-center">
             <div className="affiliations-table-cell text-center">
               <Icon type="refresh" fw spin /> {t('loading')}...
               <Icon type="refresh" fw spin /> {t('loading')}...
             </div>
             </div>

+ 1 - 1
services/web/frontend/js/features/settings/components/emails/add-email/country-input.tsx

@@ -127,7 +127,7 @@ function Downshift({ setValue, inputRef }: CountryInputProps) {
                   role={undefined}
                   role={undefined}
                   className={classnames({
                   className={classnames({
                     active: selectedItem?.name === item.name,
                     active: selectedItem?.name === item.name,
-                    'dropdown-item--highlighted': highlightedIndex === index,
+                    'dropdown-item-highlighted': highlightedIndex === index,
                   })}
                   })}
                   trailingIcon={
                   trailingIcon={
                     selectedItem?.name === item.name ? 'check' : undefined
                     selectedItem?.name === item.name ? 'check' : undefined

+ 1 - 1
services/web/frontend/js/features/settings/components/emails/add-email/layout.tsx

@@ -12,7 +12,7 @@ type LayoutProps = {
 
 
 function Layout({ isError, error, children }: LayoutProps) {
 function Layout({ isError, error, children }: LayoutProps) {
   return (
   return (
-    <div className="affiliations-table-row--highlighted">
+    <div className="affiliations-table-row-highlighted">
       <OLRow>{children}</OLRow>
       <OLRow>{children}</OLRow>
       {isError && (
       {isError && (
         <OLNotification
         <OLNotification

+ 1 - 1
services/web/frontend/js/features/settings/components/emails/downshift-input.tsx

@@ -171,7 +171,7 @@ function Downshift({
                   role={undefined}
                   role={undefined}
                   className={classnames({
                   className={classnames({
                     active: selectedItem === item,
                     active: selectedItem === item,
-                    'dropdown-item--highlighted': highlightedIndex === index,
+                    'dropdown-item-highlighted': highlightedIndex === index,
                   })}
                   })}
                   trailingIcon={selectedItem === item ? 'check' : undefined}
                   trailingIcon={selectedItem === item ? 'check' : undefined}
                 >
                 >

+ 1 - 1
services/web/frontend/stylesheets/app/account-settings.less

@@ -32,7 +32,7 @@
   padding-left: @margin-sm;
   padding-left: @margin-sm;
   border-left: 2px solid @table-border-color; // don't migrate this line of style
   border-left: 2px solid @table-border-color; // don't migrate this line of style
 }
 }
-.affiliations-table-row--highlighted {
+.affiliations-table-row-highlighted {
   background-color: tint(@content-alt-bg-color, 6%);
   background-color: tint(@content-alt-bg-color, 6%);
 }
 }
 .affiliations-table-email {
 .affiliations-table-email {

+ 2 - 0
services/web/frontend/stylesheets/bootstrap-5/abstracts/mixins.scss

@@ -56,9 +56,11 @@
 @mixin modal-lg {
 @mixin modal-lg {
   max-width: 960px;
   max-width: 960px;
 }
 }
+
 @mixin modal-md {
 @mixin modal-md {
   max-width: 640px;
   max-width: 640px;
 }
 }
+
 @mixin modal-sm {
 @mixin modal-sm {
   max-width: 480px;
   max-width: 480px;
 }
 }

+ 1 - 18
services/web/frontend/stylesheets/bootstrap-5/abstracts/variable-overrides.scss

@@ -3,7 +3,6 @@
 $prefix: bs-;
 $prefix: bs-;
 
 
 // Options
 // Options
-//
 // Quickly modify global styling by enabling or disabling optional features.
 // Quickly modify global styling by enabling or disabling optional features.
 
 
 $enable-validation-icons: false;
 $enable-validation-icons: false;
@@ -17,7 +16,6 @@ $font-size-sm: var(--font-size-02);
 $line-height-base: 1.5;
 $line-height-base: 1.5;
 
 
 // Components
 // Components
-//
 // Define common padding and border radius sizes and more.
 // Define common padding and border radius sizes and more.
 
 
 $focus-ring-width: 2px;
 $focus-ring-width: 2px;
@@ -40,25 +38,17 @@ $table-cell-padding-y: $spacing-04;
 $table-cell-padding-x: $spacing-04;
 $table-cell-padding-x: $spacing-04;
 $table-cell-padding-y-sm: $spacing-02;
 $table-cell-padding-y-sm: $spacing-02;
 $table-cell-padding-x-sm: $spacing-02;
 $table-cell-padding-x-sm: $spacing-02;
-
 $table-color: var(--content-secondary);
 $table-color: var(--content-secondary);
 $table-bg: var(--bg-light-primary);
 $table-bg: var(--bg-light-primary);
-
 $table-th-font-weight: 600;
 $table-th-font-weight: 600;
-
 $table-striped-color: $table-color;
 $table-striped-color: $table-color;
 $table-striped-bg: var(--bg-light-secondary);
 $table-striped-bg: var(--bg-light-secondary);
-
 $table-active-color: $table-color;
 $table-active-color: $table-color;
 $table-active-bg: $bg-accent-03;
 $table-active-bg: $bg-accent-03;
-
 $table-hover-color: $table-color;
 $table-hover-color: $table-color;
 $table-hover-bg: var(--bg-light-tertiary);
 $table-hover-bg: var(--bg-light-tertiary);
-
 $table-border-color: $border-divider;
 $table-border-color: $border-divider;
-
 $table-striped-order: even;
 $table-striped-order: even;
-
 $table-caption-color: var(--content-secondary);
 $table-caption-color: var(--content-secondary);
 
 
 // Forms
 // Forms
@@ -88,25 +78,19 @@ $input-line-height-sm: 1.25; // equivalent of var(--line-height-02) - BS expects
 $input-padding-y-lg: $spacing-05;
 $input-padding-y-lg: $spacing-05;
 $input-padding-x-lg: $spacing-05;
 $input-padding-x-lg: $spacing-05;
 $input-font-size-lg: var(--font-size-03);
 $input-font-size-lg: var(--font-size-03);
-
 $input-bg: $bg-light-primary;
 $input-bg: $bg-light-primary;
 $input-disabled-color: var(--content-disabled);
 $input-disabled-color: var(--content-disabled);
 $input-disabled-bg: $bg-light-disabled;
 $input-disabled-bg: $bg-light-disabled;
 $input-disabled-border-color: var(--border-disabled);
 $input-disabled-border-color: var(--border-disabled);
-
 $input-color: $content-primary;
 $input-color: $content-primary;
 $input-border-color: $neutral-60;
 $input-border-color: $neutral-60;
 $input-border-width: var(--bs-border-width);
 $input-border-width: var(--bs-border-width);
-
 $input-border-radius: $border-radius-base;
 $input-border-radius: $border-radius-base;
 $input-border-radius-sm: $border-radius-base;
 $input-border-radius-sm: $border-radius-base;
 $input-border-radius-lg: $border-radius-base;
 $input-border-radius-lg: $border-radius-base;
-
 $input-focus-border-color: var(--border-active);
 $input-focus-border-color: var(--border-active);
-
 $input-placeholder-color: var(--content-placeholder);
 $input-placeholder-color: var(--content-placeholder);
 $input-plaintext-color: $content-primary;
 $input-plaintext-color: $content-primary;
-
 $input-height-border: calc(
 $input-height-border: calc(
   #{$input-border-width} * 2
   #{$input-border-width} * 2
 ); // stylelint-disable-line function-disallowed-list
 ); // stylelint-disable-line function-disallowed-list
@@ -126,11 +110,9 @@ $input-height-lg: add(
 
 
 // form-check-variables
 // form-check-variables
 $form-check-label-color: var(--content-primary);
 $form-check-label-color: var(--content-primary);
-
 $form-check-input-border: var(--bs-border-width) solid var(--border-primary);
 $form-check-input-border: var(--bs-border-width) solid var(--border-primary);
 $form-check-input-border-radius: $border-radius-base;
 $form-check-input-border-radius: $border-radius-base;
 $form-check-input-focus-border: var(--border-primary);
 $form-check-input-focus-border: var(--border-primary);
-
 $form-check-input-disabled-opacity: 1;
 $form-check-input-disabled-opacity: 1;
 
 
 // Form validation
 // Form validation
@@ -155,6 +137,7 @@ $form-validation-states: (
     'border-color': var(--#{$prefix}form-invalid-border-color),
     'border-color': var(--#{$prefix}form-invalid-border-color),
   ),
   ),
 );
 );
+
 // Close buttons
 // Close buttons
 $btn-close-color: $content-primary;
 $btn-close-color: $content-primary;
 $btn-close-opacity: 1;
 $btn-close-opacity: 1;

+ 2 - 1
services/web/frontend/stylesheets/bootstrap-5/components/badge.scss

@@ -20,7 +20,6 @@
   align-items: center;
   align-items: center;
   justify-content: center;
   justify-content: center;
   flex-shrink: 0;
   flex-shrink: 0;
-
   padding: 0 $spacing-02;
   padding: 0 $spacing-02;
   margin: 0 (-$spacing-02) 0 $spacing-02;
   margin: 0 (-$spacing-02) 0 $spacing-02;
   border-top-right-radius: inherit;
   border-top-right-radius: inherit;
@@ -39,11 +38,13 @@
 
 
 .badge-content {
 .badge-content {
   @include text-truncate;
   @include text-truncate;
+
   padding: var(--bs-badge-padding-y) 0;
   padding: var(--bs-badge-padding-y) 0;
 }
 }
 
 
 .badge-tag {
 .badge-tag {
   @include body-sm;
   @include body-sm;
+
   color: $dark;
   color: $dark;
 
 
   &:hover {
   &:hover {

+ 7 - 1
services/web/frontend/stylesheets/bootstrap-5/components/button.scss

@@ -86,6 +86,7 @@
 
 
     background: var(--premium-gradient);
     background: var(--premium-gradient);
     transition: none;
     transition: none;
+
     &:hover {
     &:hover {
       background: var(--blue-70);
       background: var(--blue-70);
     }
     }
@@ -109,8 +110,10 @@
   &[disabled],
   &[disabled],
   fieldset[disabled] & {
   fieldset[disabled] & {
     background-color: transparent;
     background-color: transparent;
+
     @include box-shadow(none);
     @include box-shadow(none);
   }
   }
+
   &:hover,
   &:hover,
   &:focus {
   &:focus {
     color: var(--link-ui-hover);
     color: var(--link-ui-hover);
@@ -120,11 +123,13 @@
 
 
   &.btn-danger {
   &.btn-danger {
     color: var(--content-danger);
     color: var(--content-danger);
-    //since it's a link, override the button states
+
+    // since it's a link, override the button states
     &:active {
     &:active {
       color: var(--content-danger);
       color: var(--content-danger);
       background-color: transparent;
       background-color: transparent;
     }
     }
+
     &:focus-visible {
     &:focus-visible {
       background-color: transparent;
       background-color: transparent;
       outline: -webkit-focus-ring-color auto 1px;
       outline: -webkit-focus-ring-color auto 1px;
@@ -134,6 +139,7 @@
 
 
 .btn-inline-link {
 .btn-inline-link {
   @extend .btn-link;
   @extend .btn-link;
+
   font-size: inherit;
   font-size: inherit;
   padding: 0;
   padding: 0;
   vertical-align: inherit;
   vertical-align: inherit;

+ 1 - 1
services/web/frontend/stylesheets/bootstrap-5/components/dropdown-menu.scss

@@ -147,6 +147,6 @@
   overflow-x: hidden;
   overflow-x: hidden;
 }
 }
 
 
-.dropdown-item--highlighted {
+.dropdown-item-highlighted {
   background-color: var(--bg-light-secondary);
   background-color: var(--bg-light-secondary);
 }
 }

+ 7 - 5
services/web/frontend/stylesheets/bootstrap-5/components/footer.scss

@@ -1,3 +1,5 @@
+@use 'sass:map';
+
 footer.site-footer {
 footer.site-footer {
   background-color: var(--bg-light-primary);
   background-color: var(--bg-light-primary);
   border-top: 1px solid var(--border-primary-dark);
   border-top: 1px solid var(--border-primary-dark);
@@ -23,7 +25,7 @@ footer.site-footer {
     }
     }
   }
   }
 
 
-  li.lngOption {
+  li.lng-option {
     text-align: left;
     text-align: left;
     display: list-item;
     display: list-item;
 
 
@@ -224,7 +226,7 @@ footer.site-footer {
 
 
   @include media-breakpoint-up(md) {
   @include media-breakpoint-up(md) {
     .fat-footer-container {
     .fat-footer-container {
-      width: (map-get($grid-breakpoints, 'md') - ($spacing-04 * 2));
+      width: (map.get($grid-breakpoints, 'md') - ($spacing-04 * 2));
     }
     }
 
 
     #footer-brand {
     #footer-brand {
@@ -270,7 +272,7 @@ footer.site-footer {
 
 
   @include media-breakpoint-up(lg) {
   @include media-breakpoint-up(lg) {
     .fat-footer-container {
     .fat-footer-container {
-      width: (map-get($grid-breakpoints, 'lg') - $spacing-07);
+      width: (map.get($grid-breakpoints, 'lg') - $spacing-07);
     }
     }
 
 
     .fat-footer-sections {
     .fat-footer-sections {
@@ -280,7 +282,7 @@ footer.site-footer {
 
 
   @include media-breakpoint-up(xl) {
   @include media-breakpoint-up(xl) {
     .fat-footer-container {
     .fat-footer-container {
-      width: (map-get($grid-breakpoints, 'xl') - $spacing-09);
+      width: (map.get($grid-breakpoints, 'xl') - $spacing-09);
     }
     }
 
 
     .fat-footer-sections {
     .fat-footer-sections {
@@ -305,7 +307,7 @@ footer.site-footer {
   z-index: 100;
   z-index: 100;
   color: var(--content-secondary);
   color: var(--content-secondary);
   background: var(--bg-light-secondary);
   background: var(--bg-light-secondary);
-  box-shadow: 0px -5px 8px 0px #0000001a;
+  box-shadow: 0 -5px 8px 0 #0000001a;
 
 
   .cookie-banner-actions {
   .cookie-banner-actions {
     padding-top: var(--spacing-04);
     padding-top: var(--spacing-04);

+ 5 - 8
services/web/frontend/stylesheets/bootstrap-5/components/form.scss

@@ -2,9 +2,11 @@
   @function form-check-box-svg($color) {
   @function form-check-box-svg($color) {
     @return url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>");
     @return url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>");
   }
   }
+
   @function form-check-radio-svg($color) {
   @function form-check-radio-svg($color) {
     @return url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$color}'/></svg>");
     @return url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$color}'/></svg>");
   }
   }
+
   @function form-check-indeterminate-svg($color) {
   @function form-check-indeterminate-svg($color) {
     @return url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>");
     @return url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>");
   }
   }
@@ -115,9 +117,12 @@
 
 
   .form-control-start-icon {
   .form-control-start-icon {
     left: 0;
     left: 0;
+    padding-left: calc(var(--form-control-padding-x) + var(--bs-border-width));
   }
   }
+
   .form-control-end-icon {
   .form-control-end-icon {
     right: 0;
     right: 0;
+    padding-right: calc(var(--form-control-padding-x) + var(--bs-border-width));
   }
   }
 
 
   --icon-width: 20px;
   --icon-width: 20px;
@@ -134,14 +139,6 @@
     --form-control-icon-offset-y: var(--spacing-05);
     --form-control-icon-offset-y: var(--spacing-05);
   }
   }
 
 
-  .form-control-start-icon {
-    padding-left: calc(var(--form-control-padding-x) + var(--bs-border-width));
-  }
-
-  .form-control-end-icon {
-    padding-right: calc(var(--form-control-padding-x) + var(--bs-border-width));
-  }
-
   .form-control-offset-start {
   .form-control-offset-start {
     padding-left: calc(
     padding-left: calc(
       var(--form-control-padding-x) + var(--form-control-icon-offset-y) +
       var(--form-control-padding-x) + var(--form-control-icon-offset-y) +

+ 8 - 5
services/web/frontend/stylesheets/bootstrap-5/components/modal.scss

@@ -4,28 +4,29 @@
 
 
 @include media-breakpoint-up(sm) {
 @include media-breakpoint-up(sm) {
   .modal-dialog {
   .modal-dialog {
-    @include modal-md();
+    @include modal-md;
   }
   }
 
 
   .modal-sm {
   .modal-sm {
-    @include modal-sm();
+    @include modal-sm;
   }
   }
 }
 }
 
 
 @include media-breakpoint-up(md) {
 @include media-breakpoint-up(md) {
   .modal-md {
   .modal-md {
-    @include modal-md();
+    @include modal-md;
   }
   }
 }
 }
 
 
 @include media-breakpoint-up(lg) {
 @include media-breakpoint-up(lg) {
   .modal-lg {
   .modal-lg {
-    @include modal-lg();
+    @include modal-lg;
   }
   }
 }
 }
 
 
 .modal-content {
 .modal-content {
-  @include shadow-lg();
+  @include shadow-lg;
+
   border-radius: var(--border-radius-base);
   border-radius: var(--border-radius-base);
 
 
   .modal-header {
   .modal-header {
@@ -34,6 +35,7 @@
 
 
       line-height: 35px;
       line-height: 35px;
     }
     }
+
     .btn-close {
     .btn-close {
       margin-right: 0;
       margin-right: 0;
     }
     }
@@ -42,6 +44,7 @@
   .modal-footer {
   .modal-footer {
     padding: var(--spacing-06);
     padding: var(--spacing-06);
     gap: var(--spacing-04);
     gap: var(--spacing-04);
+
     > * {
     > * {
       margin: 0;
       margin: 0;
     }
     }

+ 1 - 5
services/web/frontend/stylesheets/bootstrap-5/components/nav.scss

@@ -3,15 +3,12 @@
 :root {
 :root {
   // Basics
   // Basics
   --navbar-item-spacing-horizontal: var(--spacing-06);
   --navbar-item-spacing-horizontal: var(--spacing-06);
-
   --navbar-bg: var(--bg-dark-primary);
   --navbar-bg: var(--bg-dark-primary);
   --navbar-border: transparent;
   --navbar-border: transparent;
-
   --navbar-padding-h: var(--spacing-05);
   --navbar-padding-h: var(--spacing-05);
   --navbar-padding: 0 var(--navbar-padding-h);
   --navbar-padding: 0 var(--navbar-padding-h);
-
   --navbar-brand-width: 130px;
   --navbar-brand-width: 130px;
-  --navbar-brand-image-url: url(../../../../public/img/ol-brand/overleaf-white.svg);
+  --navbar-brand-image-url: url('../../../../public/img/ol-brand/overleaf-white.svg');
 
 
   // Title, when used instead of a logo
   // Title, when used instead of a logo
   --navbar-title-font-size: var(--font-size-05);
   --navbar-title-font-size: var(--font-size-05);
@@ -39,7 +36,6 @@
   // Links
   // Links
   --navbar-link-color: var(--white);
   --navbar-link-color: var(--white);
   --navbar-link-border-color: var(--navbar-link-color);
   --navbar-link-border-color: var(--navbar-link-color);
-
   --navbar-link-hover-color: var(--white);
   --navbar-link-hover-color: var(--white);
   --navbar-link-hover-bg: var(--green-50);
   --navbar-link-hover-bg: var(--green-50);
   --navbar-link-hover-border-color: var(--navbar-link-hover-bg);
   --navbar-link-hover-border-color: var(--navbar-link-hover-bg);

+ 2 - 6
services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss

@@ -139,8 +139,8 @@
         // Dropdowns get custom display when collapsed
         // Dropdowns get custom display when collapsed
         .dropdown-menu.show {
         .dropdown-menu.show {
           --bs-dropdown-spacer: 0;
           --bs-dropdown-spacer: 0;
-          box-shadow: none;
 
 
+          box-shadow: none;
           background-color: var(--navbar-hamburger-submenu-bg);
           background-color: var(--navbar-hamburger-submenu-bg);
           width: auto;
           width: auto;
 
 
@@ -191,19 +191,15 @@
 .website-redesign-navbar {
 .website-redesign-navbar {
   --navbar-title-color: var(--content-primary);
   --navbar-title-color: var(--content-primary);
   --navbar-title-color-hover: var(--content-secondary);
   --navbar-title-color-hover: var(--content-secondary);
-
-  --navbar-brand-image-url: url(../../../../public/img/ol-brand/overleaf-black.svg);
-
+  --navbar-brand-image-url: url('../../../../public/img/ol-brand/overleaf-black.svg');
   --navbar-subdued-color: var(--content-primary);
   --navbar-subdued-color: var(--content-primary);
   --navbar-subdued-hover-bg: var(--bg-dark-primary);
   --navbar-subdued-hover-bg: var(--bg-dark-primary);
   --navbar-subdued-hover-color: var(--content-primary-dark);
   --navbar-subdued-hover-color: var(--content-primary-dark);
-
   --navbar-bg: var(--bg-light-primary);
   --navbar-bg: var(--bg-light-primary);
 
 
   // Navbar links
   // Navbar links
   --navbar-link-color: var(--content-primary);
   --navbar-link-color: var(--content-primary);
   --navbar-link-border-color: var(--border-primary);
   --navbar-link-border-color: var(--border-primary);
-
   --navbar-link-hover-color: var(--navbar-link-color);
   --navbar-link-hover-color: var(--navbar-link-color);
   --navbar-link-hover-bg: var(--bg-light-tertiary);
   --navbar-link-hover-bg: var(--bg-light-tertiary);
   --navbar-link-hover-border-color: var(--navbar-link-border-color);
   --navbar-link-hover-border-color: var(--navbar-link-border-color);

+ 1 - 1
services/web/frontend/stylesheets/bootstrap-5/helpers/visually-hidden.scss

@@ -1,5 +1,5 @@
 .visually-hidden-max-md {
 .visually-hidden-max-md {
   @include media-breakpoint-down(md) {
   @include media-breakpoint-down(md) {
-    @include visually-hidden();
+    @include visually-hidden;
   }
   }
 }
 }

+ 6 - 1
services/web/frontend/stylesheets/bootstrap-5/pages/account-settings.scss

@@ -12,7 +12,7 @@
   padding-left: var(--spacing-04);
   padding-left: var(--spacing-04);
 }
 }
 
 
-.affiliations-table-row--highlighted {
+.affiliations-table-row-highlighted {
   background-color: var(--bg-light-secondary);
   background-color: var(--bg-light-secondary);
 }
 }
 
 
@@ -38,17 +38,21 @@
   font-size: 1.3em;
   font-size: 1.3em;
   line-height: 1.3em;
   line-height: 1.3em;
   vertical-align: top;
   vertical-align: top;
+
   &.status-error,
   &.status-error,
   &.dropbox-sync-icon-error {
   &.dropbox-sync-icon-error {
     color: var(--bg-danger-01);
     color: var(--bg-danger-01);
   }
   }
+
   &.status-success,
   &.status-success,
   &.dropbox-sync-icon-success {
   &.dropbox-sync-icon-success {
     color: var(--content-positive);
     color: var(--content-positive);
   }
   }
+
   &.status-pending,
   &.status-pending,
   &.dropbox-sync-icon-updating {
   &.dropbox-sync-icon-updating {
     color: var(--bg-info-01);
     color: var(--bg-info-01);
+
     &::after {
     &::after {
       content: '\f021';
       content: '\f021';
       position: absolute;
       position: absolute;
@@ -175,6 +179,7 @@
 
 
   .status-label {
   .status-label {
     @include body-sm;
     @include body-sm;
+
     border-radius: var(--border-radius-base);
     border-radius: var(--border-radius-base);
     padding: var(--spacing-01) var(--spacing-02);
     padding: var(--spacing-01) var(--spacing-02);
     margin-top: var(--spacing-02);
     margin-top: var(--spacing-02);

+ 1 - 0
services/web/frontend/stylesheets/bootstrap-5/pages/project-list.scss

@@ -589,6 +589,7 @@
   }
   }
 }
 }
 
 
+/* stylelint-disable selector-class-pattern */
 .project-list-upload-project-modal-uppy-dashboard .uppy-Root {
 .project-list-upload-project-modal-uppy-dashboard .uppy-Root {
   .uppy-Dashboard-AddFiles-title {
   .uppy-Dashboard-AddFiles-title {
     display: flex;
     display: flex;

+ 2 - 0
services/web/frontend/stylesheets/bootstrap-5/pages/sidebar-v2-dash-pane.scss

@@ -1,5 +1,6 @@
 .project-list-sidebar-survey-link {
 .project-list-sidebar-survey-link {
   @extend .text-white;
   @extend .text-white;
+
   font-weight: bold;
   font-weight: bold;
 }
 }
 
 
@@ -7,6 +8,7 @@
   &:hover {
   &:hover {
     background-color: transparent !important;
     background-color: transparent !important;
   }
   }
+
   &:focus {
   &:focus {
     background-color: transparent !important;
     background-color: transparent !important;
   }
   }

+ 1 - 1
services/web/frontend/stylesheets/components/footer.less

@@ -19,7 +19,7 @@ footer.site-footer {
       font-size: 1.2rem;
       font-size: 1.2rem;
     }
     }
   }
   }
-  li.lngOption {
+  li.lng-option {
     text-align: left;
     text-align: left;
     display: list-item;
     display: list-item;
 
 

+ 2 - 2
services/web/package.json

@@ -26,8 +26,8 @@
     "format:styles:fix": "prettier --write $PWD/'**/*.{css,less,scss}'",
     "format:styles:fix": "prettier --write $PWD/'**/*.{css,less,scss}'",
     "lint": "eslint --max-warnings 0 --format unix --ext .js,.jsx,.mjs,.ts,.tsx .",
     "lint": "eslint --max-warnings 0 --format unix --ext .js,.jsx,.mjs,.ts,.tsx .",
     "lint:fix": "eslint --fix --ext .js,.jsx,.mjs,.ts,.tsx .",
     "lint:fix": "eslint --fix --ext .js,.jsx,.mjs,.ts,.tsx .",
-    "stylelint": "stylelint '**/*.scss'",
-    "stylelint:fix": "stylelint '**/*.scss' --fix",
+    "lint:styles": "stylelint '**/*.scss'",
+    "lint:styles:fix": "stylelint '**/*.scss' --fix",
     "type-check": "tsc --noEmit",
     "type-check": "tsc --noEmit",
     "extract-translations": "i18next-scanner",
     "extract-translations": "i18next-scanner",
     "migrations": "MONGO_SOCKET_TIMEOUT=0 east",
     "migrations": "MONGO_SOCKET_TIMEOUT=0 east",