]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-16725 [891882] An icon lacks 3 to 1 contrast ratio
authorWouter Admiraal <wouter.admiraal@sonarsource.com>
Wed, 24 Aug 2022 15:40:37 +0000 (17:40 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 29 Aug 2022 20:02:53 +0000 (20:02 +0000)
57 files changed:
server/sonar-web/src/main/js/app/components/nav/component/Breadcrumb.tsx
server/sonar-web/src/main/js/app/components/nav/component/ComponentNav.tsx
server/sonar-web/src/main/js/app/components/nav/component/Header.tsx
server/sonar-web/src/main/js/app/components/nav/component/HeaderMeta.css
server/sonar-web/src/main/js/app/components/nav/component/__tests__/Breadcrumb-test.tsx
server/sonar-web/src/main/js/app/components/nav/component/__tests__/__snapshots__/Header-test.tsx.snap
server/sonar-web/src/main/js/app/components/nav/component/branch-like/BranchLikeNavigation.css
server/sonar-web/src/main/js/app/components/nav/component/branch-like/BranchLikeNavigation.tsx
server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLike.tsx
server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/BranchLikeNavigation-test.tsx
server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/__snapshots__/BranchLikeNavigation-test.tsx.snap
server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/__snapshots__/CurrentBranchLike-test.tsx.snap
server/sonar-web/src/main/js/app/components/nav/component/projectInformation/meta/MetaLink.tsx
server/sonar-web/src/main/js/app/components/nav/component/projectInformation/meta/__tests__/__snapshots__/MetaLink-test.tsx.snap
server/sonar-web/src/main/js/app/components/nav/settings/SettingsNav.tsx
server/sonar-web/src/main/js/app/components/nav/settings/__tests__/__snapshots__/SettingsNav-test.tsx.snap
server/sonar-web/src/main/js/app/styles/init/links.css
server/sonar-web/src/main/js/app/theme.js
server/sonar-web/src/main/js/apps/code/code.css
server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx
server/sonar-web/src/main/js/apps/code/components/__tests__/__snapshots__/ComponentName-test.tsx.snap
server/sonar-web/src/main/js/apps/coding-rules/components/RuleDetailsProfiles.tsx
server/sonar-web/src/main/js/apps/create/project/AzurePersonalAccessTokenForm.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx
server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/AzurePersonalAccessTokenForm-test.tsx.snap
server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectAccordion-test.tsx.snap
server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/IssueSourceViewerHeader.tsx
server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/IssueSourceViewerHeader-test.tsx.snap
server/sonar-web/src/main/js/apps/permission-templates/components/TemplateHeader.tsx
server/sonar-web/src/main/js/apps/projectsManagement/ProjectRow.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/ProjectRow-test.tsx.snap
server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileNotFound.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfileHeader.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfileProjects.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfileRulesRowOfType.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfileRulesRowTotal.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfileHeader-test.tsx.snap
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfileProjects-test.tsx.snap
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfileRulesRowOfType-test.tsx.snap
server/sonar-web/src/main/js/apps/quality-profiles/details/__tests__/__snapshots__/ProfileRulesRowTotal-test.tsx.snap
server/sonar-web/src/main/js/apps/quality-profiles/home/EvolutionDeprecated.tsx
server/sonar-web/src/main/js/apps/quality-profiles/home/__tests__/__snapshots__/EvolutionDeprecated-test.tsx.snap
server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx
server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap
server/sonar-web/src/main/js/components/SourceViewer/SourceViewerHeader.tsx
server/sonar-web/src/main/js/components/SourceViewer/__tests__/__snapshots__/SourceViewerHeader-test.tsx.snap
server/sonar-web/src/main/js/components/common/AnalysisWarningsModal.tsx
server/sonar-web/src/main/js/components/common/DocumentationTooltip.tsx
server/sonar-web/src/main/js/components/common/__tests__/AnalysisWarningsModal-test.tsx
server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/AnalysisWarningsModal-test.tsx.snap
server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/DocumentationTooltip-test.tsx.snap
server/sonar-web/src/main/js/components/facet/ListStyleFacetFooter.tsx
server/sonar-web/src/main/js/components/facet/__tests__/ListStyleFacetFooter-test.tsx
server/sonar-web/src/main/js/components/facet/__tests__/__snapshots__/ListStyleFacetFooter-test.tsx.snap
server/sonar-web/src/main/js/components/icons/BranchIcon.tsx
server/sonar-web/src/main/js/components/icons/PullRequestIcon.tsx
server/sonar-web/src/main/js/components/icons/QualifierIcon.tsx

index d00315089d1fad3a022eb00bf3fba65f0677a444..c9cc789ec0544c671943d218c143e2deaa416bd9 100644 (file)
@@ -25,6 +25,7 @@ import { isMainBranch } from '../../../../helpers/branch-like';
 import { getComponentOverviewUrl } from '../../../../helpers/urls';
 import { BranchLike } from '../../../../types/branch-like';
 import { Component } from '../../../../types/types';
+import { colors } from '../../../theme';
 
 export interface BreadcrumbProps {
   component: Component;
@@ -37,32 +38,62 @@ export function Breadcrumb(props: BreadcrumbProps) {
     currentBranchLike
   } = props;
   const lastBreadcrumbElement = last(breadcrumbs);
-  const isNoMainBranch = currentBranchLike && !isMainBranch(currentBranchLike);
+  const isNotMainBranch = currentBranchLike && !isMainBranch(currentBranchLike);
 
   return (
     <div className="big flex-shrink display-flex-center">
       {breadcrumbs.map((breadcrumbElement, i) => {
         const isFirst = i === 0;
         const isNotLast = i < breadcrumbs.length - 1;
+        const isLast = !isNotLast;
+        const showQualifierIcon = isFirst && lastBreadcrumbElement;
+
+        const name =
+          isNotMainBranch || isNotLast ? (
+            <>
+              {showQualifierIcon && !isNotMainBranch && (
+                <QualifierIcon
+                  className="spacer-right"
+                  qualifier={lastBreadcrumbElement.qualifier}
+                  fill={colors.neutral800}
+                />
+              )}
+              <Link
+                className="link-no-underline"
+                to={getComponentOverviewUrl(breadcrumbElement.key, breadcrumbElement.qualifier)}>
+                {showQualifierIcon && isNotMainBranch && (
+                  <QualifierIcon
+                    className="spacer-right"
+                    qualifier={lastBreadcrumbElement.qualifier}
+                    fill={colors.primary}
+                  />
+                )}
+                {breadcrumbElement.name}
+              </Link>
+            </>
+          ) : (
+            <>
+              {showQualifierIcon && (
+                <QualifierIcon
+                  className="spacer-right"
+                  qualifier={lastBreadcrumbElement.qualifier}
+                  fill={colors.neutral800}
+                />
+              )}
+              {breadcrumbElement.name}
+            </>
+          );
 
         return (
           <span className="flex-shrink display-flex-center" key={breadcrumbElement.key}>
-            {isFirst && lastBreadcrumbElement && (
-              <QualifierIcon className="spacer-right" qualifier={lastBreadcrumbElement.qualifier} />
-            )}
-            {isNoMainBranch || isNotLast ? (
-              <h1>
-                <Link
-                  className="link-no-underline text-ellipsis"
-                  title={breadcrumbElement.name}
-                  to={getComponentOverviewUrl(breadcrumbElement.key, breadcrumbElement.qualifier)}>
-                  {breadcrumbElement.name}
-                </Link>
-              </h1>
-            ) : (
+            {isLast ? (
               <h1 className="text-ellipsis" title={breadcrumbElement.name}>
-                {breadcrumbElement.name}
+                {name}
               </h1>
+            ) : (
+              <span className="text-ellipsis" title={breadcrumbElement.name}>
+                {name}
+              </span>
             )}
             {isNotLast && <span className="slash-separator" />}
           </span>
index f57d6b934a7af74892feb2db07d66effe71d9da0..5e8149cae12d2cf1b2af777a278fdf62aafa04e3 100644 (file)
@@ -54,6 +54,7 @@ export interface ComponentNavProps {
 }
 
 const ALERT_HEIGHT = 30;
+const BRANCHLIKE_TOGGLE_ADDED_HEIGHT = 6;
 
 export default function ComponentNav(props: ComponentNavProps) {
   const {
@@ -109,6 +110,10 @@ export default function ComponentNav(props: ComponentNavProps) {
     contextNavHeight += ALERT_HEIGHT;
   }
 
+  if (branchLikes.length) {
+    contextNavHeight += BRANCHLIKE_TOGGLE_ADDED_HEIGHT;
+  }
+
   return (
     <ContextNavBar
       height={contextNavHeight}
@@ -149,7 +154,7 @@ export default function ComponentNav(props: ComponentNavProps) {
       <InfoDrawer
         displayed={displayProjectInfo}
         onClose={() => setDisplayProjectInfo(false)}
-        top={globalNavHeightRaw + contextNavHeightRaw}>
+        top={globalNavHeightRaw + contextNavHeight}>
         <ProjectInformation
           branchLike={currentBranchLike}
           component={component}
index f17925c709b68195e401d3e59eddccd0b289ca2e..a27c75c4f8bdcb42d3ffe53f6612354549501431 100644 (file)
@@ -43,7 +43,7 @@ export function Header(props: HeaderProps) {
   return (
     <>
       <Helmet title={component.name} />
-      <header className="display-flex-center flex-shrink">
+      <div className="display-flex-center flex-shrink">
         <Breadcrumb component={component} currentBranchLike={currentBranchLike} />
         {isLoggedIn(currentUser) && (
           <Favorite
@@ -64,7 +64,7 @@ export function Header(props: HeaderProps) {
             <CurrentBranchLikeMergeInformation currentBranchLike={currentBranchLike} />
           </>
         )}
-      </header>
+      </div>
     </>
   );
 }
index 0e5e2a46fda768501ceba0acc0d4d7d6f197e4b2..d129c91bdeab2a13cacf9d78c68e9e3f5abab4ca 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 .header-meta-warnings .alert {
-  margin-bottom: 0;
+  margin-bottom: 5px;
 }
 
 .header-meta-warnings .alert-content {
index 4d67b48719c3f17fc93150d801dc34486bfea528..58372411efbf75d68fe80ff857bc50847197eb90 100644 (file)
@@ -32,8 +32,21 @@ it('should render correctly', () => {
 });
 
 it('should render correctly when not on a main branch', () => {
-  renderBreadcrumb({ currentBranchLike: mockBranch() });
-  expect(screen.getByRole('link', { name: 'Child portfolio' })).toBeInTheDocument();
+  renderBreadcrumb({
+    component: mockComponent({
+      breadcrumbs: [
+        {
+          key: 'project',
+          name: 'My Project',
+          qualifier: ComponentQualifier.Project
+        }
+      ]
+    }),
+    currentBranchLike: mockBranch()
+  });
+  expect(
+    screen.getByRole('link', { name: `qualifier.${ComponentQualifier.Project} My Project` })
+  ).toBeInTheDocument();
 });
 
 function renderBreadcrumb(props: Partial<BreadcrumbProps> = {}) {
index c3f9e27795d526ab7025b505fa61cb1f908b9602..b64a5de49641445d9939cac2d044ec73f081a84f 100644 (file)
@@ -8,7 +8,7 @@ exports[`should render correctly 1`] = `
     prioritizeSeoTags={false}
     title="MyProject"
   />
-  <header
+  <div
     className="display-flex-center flex-shrink"
   >
     <Breadcrumb
@@ -156,6 +156,6 @@ exports[`should render correctly 1`] = `
         }
       }
     />
-  </header>
+  </div>
 </Fragment>
 `;
index 26307f605d1420de28f6b50f568e82799e099f06..d70e4bb83dba169130561fff0db2a66e1d8fb178 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+.branch-like-navigation-toggler {
+  padding: 4px 8px;
+  border: 1px solid transparent;
+  border-radius: 2px;
+}
+
+.branch-like-navigation-toggler:hover {
+  border-color: var(--black38);
+  color: inherit !important;
+}
+
+.branch-like-navigation-toggler:active,
+.branch-like-navigation-toggler.open {
+  border-color: var(--primary);
+}
+
+.branch-like-navigation-toggler-container {
+  height: 26px;
+}
+
 .branch-like-navigation-toggler-container .popup {
   min-width: 430px;
   max-width: 650px;
index 3688efac0b2906289eb95ff21af1a7b44b6d81d3..d0bee5e91f1b938250b4a0b257f2b42908309344 100644 (file)
@@ -19,6 +19,7 @@
  */
 import classNames from 'classnames';
 import * as React from 'react';
+import { ButtonPlain } from '../../../../../components/controls/buttons';
 import Toggler from '../../../../../components/controls/Toggler';
 import { ProjectAlmBindingResponse } from '../../../../../types/alm-settings';
 import { AppState } from '../../../../../types/appstate';
@@ -65,9 +66,12 @@ export function BranchLikeNavigation(props: BranchLikeNavigationProps) {
 
   return (
     <span
-      className={classNames('big-spacer-left flex-0 branch-like-navigation-toggler-container', {
-        dropdown: isMenuEnabled
-      })}>
+      className={classNames(
+        'big-spacer-left flex-0 branch-like-navigation-toggler-container display-flex-center',
+        {
+          dropdown: isMenuEnabled
+        }
+      )}>
       {isMenuEnabled ? (
         <Toggler
           onRequestClose={() => setIsMenuOpen(false)}
@@ -81,12 +85,13 @@ export function BranchLikeNavigation(props: BranchLikeNavigationProps) {
               onClose={() => setIsMenuOpen(false)}
             />
           }>
-          <a
-            className="link-base-color link-no-underline"
-            href="#"
-            onClick={() => setIsMenuOpen(!isMenuOpen)}>
+          <ButtonPlain
+            className={classNames('branch-like-navigation-toggler', { open: isMenuOpen })}
+            onClick={() => setIsMenuOpen(!isMenuOpen)}
+            aria-expanded={isMenuOpen}
+            aria-haspopup="menu">
             {currentBranchLikeElement}
-          </a>
+          </ButtonPlain>
         </Toggler>
       ) : (
         currentBranchLikeElement
index 32ec2231bf3d4972d1e546d8aa8ea421dcfc9591..79a6ec109dfdd9c54185370e45336a6d1414cbc4 100644 (file)
@@ -57,12 +57,12 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) {
   const isGitLab = projectBinding !== undefined && projectBinding.alm === AlmKeys.GitLab;
 
   const additionalIcon = () => {
-    const plusIcon = <PlusCircleIcon fill={colors.blue} size={12} />;
-
     if (branchesEnabled && hasManyBranches) {
       return <DropdownIcon />;
     }
 
+    const plusIcon = <PlusCircleIcon fill={colors.info500} size={12} />;
+
     if (isApplication) {
       if (!hasManyBranches && canAdminComponent) {
         return (
@@ -144,7 +144,7 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) {
 
   return (
     <span className="display-flex-center flex-shrink text-ellipsis">
-      <BranchLikeIcon branchLike={currentBranchLike} />
+      <BranchLikeIcon branchLike={currentBranchLike} fill={colors.info500} />
       <span
         className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
         title={displayName}>
index c98569e90a8dcdef765c935feba06cad8f92a8ca..4be90c8c544f2b81e9215d0b2f95ed2c264d7703 100644 (file)
@@ -19,6 +19,7 @@
  */
 import { shallow } from 'enzyme';
 import * as React from 'react';
+import { ButtonPlain } from '../../../../../../components/controls/buttons';
 import Toggler from '../../../../../../components/controls/Toggler';
 import { mockSetOfBranchAndPullRequest } from '../../../../../../helpers/mocks/branch-like';
 import { mockComponent } from '../../../../../../helpers/mocks/component';
@@ -40,10 +41,10 @@ it('should properly toggle menu opening when clicking the anchor', () => {
   const wrapper = shallowRender({ appState: mockAppState({ branchesEnabled: true }) });
   expect(wrapper.find(Toggler).props().open).toBe(false);
 
-  click(wrapper.find('a'));
+  click(wrapper.find(ButtonPlain));
   expect(wrapper.find(Toggler).props().open).toBe(true);
 
-  click(wrapper.find('a'));
+  click(wrapper.find(ButtonPlain));
   expect(wrapper.find(Toggler).props().open).toBe(false);
 });
 
@@ -51,7 +52,7 @@ it('should properly close menu when toggler asks for', () => {
   const wrapper = shallowRender({ appState: mockAppState({ branchesEnabled: true }) });
   expect(wrapper.find(Toggler).props().open).toBe(false);
 
-  click(wrapper.find('a'));
+  click(wrapper.find(ButtonPlain));
   expect(wrapper.find(Toggler).props().open).toBe(true);
 
   wrapper
index 9a956e3303cec7b161d2a8161df95d61463d6edd..d70c3604f569f3d249b54564f313f5e6910fe345 100644 (file)
@@ -2,7 +2,7 @@
 
 exports[`should render correctly 1`] = `
 <span
-  className="big-spacer-left flex-0 branch-like-navigation-toggler-container"
+  className="big-spacer-left flex-0 branch-like-navigation-toggler-container display-flex-center"
 >
   <Memo(CurrentBranchLike)
     branchesEnabled={false}
@@ -43,7 +43,7 @@ exports[`should render correctly 1`] = `
 
 exports[`should render the menu trigger if branches are enabled 1`] = `
 <span
-  className="big-spacer-left flex-0 branch-like-navigation-toggler-container dropdown"
+  className="big-spacer-left flex-0 branch-like-navigation-toggler-container display-flex-center dropdown"
 >
   <Toggler
     onRequestClose={[Function]}
@@ -149,9 +149,10 @@ exports[`should render the menu trigger if branches are enabled 1`] = `
       />
     }
   >
-    <a
-      className="link-base-color link-no-underline"
-      href="#"
+    <ButtonPlain
+      aria-expanded={false}
+      aria-haspopup="menu"
+      className="branch-like-navigation-toggler"
       onClick={[Function]}
     >
       <Memo(CurrentBranchLike)
@@ -188,7 +189,7 @@ exports[`should render the menu trigger if branches are enabled 1`] = `
         }
         hasManyBranches={true}
       />
-    </a>
+    </ButtonPlain>
   </Toggler>
 </span>
 `;
index e45e2c250b4cf2f99ad470a4164b6b46af8ba90c..03c55f4adfc5cd6026a5032b90f1eb20937fdd99 100644 (file)
@@ -13,6 +13,7 @@ exports[`applications should render correctly when there are many branchlikes 1`
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -37,6 +38,7 @@ exports[`applications should render correctly when there is only one branch and
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -60,6 +62,7 @@ exports[`applications should render correctly when there is only one branch and
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -90,7 +93,7 @@ exports[`applications should render correctly when there is only one branch and
     }
   >
     <PlusCircleIcon
-      fill="#4b9fd5"
+      fill="#0271B9"
       size={12}
     />
   </HelpTooltip>
@@ -110,6 +113,7 @@ exports[`projects should render correctly when branches support is disabled: alm
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -131,7 +135,7 @@ exports[`projects should render correctly when branches support is disabled: alm
     title="branch_like_navigation.no_branch_support.title.mr"
   >
     <PlusCircleIcon
-      fill="#4b9fd5"
+      fill="#0271B9"
       size={12}
     />
   </DocumentationTooltip>
@@ -151,6 +155,7 @@ exports[`projects should render correctly when branches support is disabled: alm
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -172,7 +177,7 @@ exports[`projects should render correctly when branches support is disabled: alm
     title="branch_like_navigation.no_branch_support.title.pr"
   >
     <PlusCircleIcon
-      fill="#4b9fd5"
+      fill="#0271B9"
       size={12}
     />
   </DocumentationTooltip>
@@ -192,6 +197,7 @@ exports[`projects should render correctly when branches support is disabled: def
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -213,7 +219,7 @@ exports[`projects should render correctly when branches support is disabled: def
     title="branch_like_navigation.no_branch_support.title"
   >
     <PlusCircleIcon
-      fill="#4b9fd5"
+      fill="#0271B9"
       size={12}
     />
   </DocumentationTooltip>
@@ -233,6 +239,7 @@ exports[`projects should render correctly when there are many branchlikes 1`] =
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -257,6 +264,7 @@ exports[`projects should render correctly when there is only one branchlike 1`]
         "name": "master",
       }
     }
+    fill="#0271B9"
   />
   <span
     className="spacer-left spacer-right flex-shrink text-ellipsis js-branch-like-name"
@@ -287,7 +295,7 @@ exports[`projects should render correctly when there is only one branchlike 1`]
     title="branch_like_navigation.only_one_branch.title"
   >
     <PlusCircleIcon
-      fill="#4b9fd5"
+      fill="#0271B9"
       size={12}
     />
   </DocumentationTooltip>
index 389d2d72beac771c228cd2b247d3b19e79febed9..651a748a5e29b45ff6eb237c2fc9258abd94c65f 100644 (file)
@@ -56,7 +56,7 @@ export default class MetaLink extends React.PureComponent<Props, State> {
     return (
       <li>
         <a
-          className="link-with-icon"
+          className="link-no-underline"
           href={isValid ? link.url : undefined}
           onClick={isValid ? undefined : this.handleClick}
           rel="nofollow noreferrer noopener"
index 31c9deade9bc64758af1598a90935531876c125d..222cc78c4a42f24acb5d600076e68965bfd54075 100644 (file)
@@ -3,7 +3,7 @@
 exports[`should match snapshot: dangerous link, collapsed 1`] = `
 <li>
   <a
-    className="link-with-icon"
+    className="link-no-underline"
     onClick={[Function]}
     rel="nofollow noreferrer noopener"
     target="_blank"
@@ -21,7 +21,7 @@ exports[`should match snapshot: dangerous link, collapsed 1`] = `
 exports[`should match snapshot: dangerous link, expanded 1`] = `
 <li>
   <a
-    className="link-with-icon"
+    className="link-no-underline"
     onClick={[Function]}
     rel="nofollow noreferrer noopener"
     target="_blank"
@@ -54,7 +54,7 @@ exports[`should match snapshot: dangerous link, expanded 1`] = `
 exports[`should match snapshot: default 1`] = `
 <li>
   <a
-    className="link-with-icon"
+    className="link-no-underline"
     href="http://example.com"
     rel="nofollow noreferrer noopener"
     target="_blank"
@@ -72,7 +72,7 @@ exports[`should match snapshot: default 1`] = `
 exports[`should match snapshot: icon only 1`] = `
 <li>
   <a
-    className="link-with-icon"
+    className="link-no-underline"
     href="http://example.com"
     rel="nofollow noreferrer noopener"
     target="_blank"
index 3a1381823d3698b53514547df0e0e079ed01dc43..e84059e86294098ea4b0171114bb81c82f8a93de 100644 (file)
@@ -43,6 +43,8 @@ interface Props {
   systemStatus: SysStatus;
 }
 
+const ALERT_HEIGHT = 30;
+
 export class SettingsNav extends React.PureComponent<Props> {
   static defaultProps = {
     extensions: []
@@ -249,12 +251,12 @@ export class SettingsNav extends React.PureComponent<Props> {
 
     return (
       <ContextNavBar
-        height={notifComponent ? contextNavHeight + 30 : contextNavHeight}
+        height={notifComponent ? contextNavHeight + ALERT_HEIGHT : contextNavHeight}
         id="context-navigation"
         notif={notifComponent}>
-        <header className="navbar-context-header">
+        <div className="navbar-context-header">
           <h1>{translate('layout.settings')}</h1>
-        </header>
+        </div>
 
         <NavBarTabs>
           {this.renderConfigurationTab()}
index 029675a85cbf7c13dbd401c2dd033be2ffdedfab..383948b261d871d34b3377a3d89aa581d0cc22ea 100644 (file)
@@ -29,13 +29,13 @@ exports[`should render correctly when governance is active 1`] = `
   height={72}
   id="context-navigation"
 >
-  <header
+  <div
     className="navbar-context-header"
   >
     <h1>
       layout.settings
     </h1>
-  </header>
+  </div>
   <NavBarTabs>
     <Dropdown
       overlay={
@@ -182,13 +182,13 @@ exports[`should work with extensions 1`] = `
   height={72}
   id="context-navigation"
 >
-  <header
+  <div
     className="navbar-context-header"
   >
     <h1>
       layout.settings
     </h1>
-  </header>
+  </div>
   <NavBarTabs>
     <Dropdown
       overlay={
index ef363db8f11b5f42e56f4640906af396e3fb164a..9d7995d0d8fc7a0eae3cb08a566164835dfa472b 100644 (file)
@@ -18,8 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 a {
-  border-bottom: 1px solid var(--lightBlue);
-  color: var(--darkBlue);
+  border-bottom: 1px solid var(--primary40);
+  color: var(--primary);
   cursor: pointer;
   outline: none;
   text-decoration: none;
@@ -29,91 +29,13 @@ a {
 a:hover,
 a:active,
 a:focus {
-  color: var(--blue);
-}
-
-.link-base-color {
-  border-bottom: 1px solid #d0d0d0 !important;
-  color: var(--baseFontColor) !important;
-}
-
-.link-base-color:hover,
-.link-base-color:active,
-.link-base-color:focus {
-  color: var(--blue) !important;
-}
-
-.link-base-color:hover {
-  border-bottom-color: var(--lightBlue) !important;
-}
-
-.link-base-color:active,
-.link-base-color:focus {
-  border-bottom-color: var(--lightBlue) !important;
+  border-bottom-color: var(--primary);
 }
 
 .link-no-underline {
-  border-bottom: none !important;
-}
-
-.link-underline {
-  border-bottom: 1px solid var(--lightBlue) !important;
-}
-
-.link-with-icon {
-  border-bottom: none;
-}
-
-.link-with-icon > span:last-child {
-  border-bottom: 1px solid var(--lightBlue);
-}
-
-.link-checkbox {
-  color: inherit;
-  border-bottom: none;
-}
-
-.link-checkbox.disabled,
-.link-checkbox.disabled:hover,
-.link-checkbox.disabled label {
-  color: var(--secondFontColor);
-  cursor: not-allowed;
-}
-
-.link-checkbox:hover,
-.link-checkbox:active,
-.link-checkbox:focus {
-  color: inherit;
-}
-
-.link-checkbox-control {
-  display: inline-block;
-  padding: 4px 0 5px;
-  line-height: 16px;
-}
-
-a.active-link,
-.link-active {
-  border-bottom: none;
-  cursor: default;
-}
-
-a.text-muted {
-  border-bottom: 1px solid #dddddd;
-  color: var(--secondFontColor);
-}
-
-a.text-muted:hover,
-a.text-muted:active,
-a.text-muted:focus {
-  color: #5e5e5e;
-}
-
-a.text-muted:focus {
-  outline: 1px dotted var(--blue);
+  border-bottom-color: transparent !important;
 }
 
-a.set-homepage-link:focus,
-a.favorite-link:focus {
-  outline: 1px dotted var(--blue);
+.link-no-underline:hover {
+  border-bottom-color: var(--primary) !important;
 }
index 2dd5ec2747e883053bd91d0c987f41f0206c4ca5..9a73cecbd3bd52efec8574a62c156e43a6196e6a 100644 (file)
@@ -136,10 +136,23 @@ module.exports = {
     codeAdded: '#dff0d8',
     codeRemoved: '#f2dede',
 
-    //promotion
+    // promotion
     darkBackground: '#292929',
     darkBackgroundSeparator: '#413b3b',
-    darkBackgroundFontColor: '#f6f8fa'
+    darkBackgroundFontColor: '#f6f8fa',
+
+    // new color palette
+    // some of these colors duplicate what we have above, but this will make it
+    // easier to align with the UX designers on what colors to use where.
+    primary: '#236a97',
+    primary40: 'rgba(35, 107, 151, 0.4)',
+
+    info500: '#0271B9',
+
+    neutral600: '#666666',
+    neutral800: '#333333',
+
+    black38: 'rgba(0, 0, 0, 0.38)'
   },
 
   sizes: {
index 7588b745ab244ef5c5eb7c2f46a9c893b1833df5..739ec197e884c3e436d779666cf25ae10fc4fa52 100644 (file)
@@ -36,6 +36,7 @@
 
 .code-breadcrumbs > li {
   padding: 5px 5px 3px;
+  display: flex;
 }
 
 .code-breadcrumbs > li:first-child {
@@ -44,7 +45,7 @@
 
 .code-breadcrumbs > li::after {
   position: relative;
-  top: -1px;
+  top: 1px;
   padding-left: 10px;
   color: var(--secondFontColor);
   font-size: 11px;
index 6c96b8a34cff7e610506d4687a5c2b6326df7077..a22e7b7989a75f049c1e093b045697c51b820659 100644 (file)
@@ -132,16 +132,19 @@ function renderNameWithIcon(
       : undefined;
     return (
       <Link
-        className="link-with-icon"
+        className="display-inline-flex-center link-no-underline"
         to={getComponentOverviewUrl(
           component.refKey || component.key,
           component.qualifier,
-          {
-            branch
-          },
+          { branch },
           codeType
         )}>
-        <QualifierIcon qualifier={component.qualifier} /> <span>{name}</span>
+        <QualifierIcon
+          className="little-spacer-right"
+          qualifier={component.qualifier}
+          fill={colors.primary}
+        />
+        <span>{name}</span>
       </Link>
     );
   } else if (canBrowse) {
@@ -150,14 +153,27 @@ function renderNameWithIcon(
       Object.assign(query, { selected: component.key });
     }
     return (
-      <Link className="link-with-icon" to={{ pathname: '/code', search: queryToSearch(query) }}>
-        <QualifierIcon qualifier={component.qualifier} /> <span>{name}</span>
+      <Link
+        className="display-inline-flex-center link-no-underline"
+        to={{ pathname: '/code', search: queryToSearch(query) }}>
+        <QualifierIcon
+          className="little-spacer-right"
+          qualifier={component.qualifier}
+          fill={colors.primary}
+        />
+        <span>{name}</span>
       </Link>
     );
   }
   return (
     <span>
-      <QualifierIcon qualifier={component.qualifier} /> {name}
+      <QualifierIcon
+        qualifier={component.qualifier}
+        fill={
+          component.qualifier === ComponentQualifier.Directory ? colors.orange : colors.neutral800
+        }
+      />{' '}
+      {name}
     </span>
   );
 }
index e54bcc69a923ee83fc3d3a073aeebcd2bc1d54be..0160ee7d4497e17a5599552daaf6b0215ad4125a 100644 (file)
@@ -10,6 +10,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="APP"
     />
      
@@ -28,6 +29,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="SVW"
     />
      
@@ -46,6 +48,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="TRK"
     />
      
@@ -64,6 +67,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="TRK"
     />
      
@@ -82,6 +86,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="VW"
     />
      
@@ -99,6 +104,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#ed7d20"
       qualifier="DIR"
     />
      
@@ -129,6 +135,7 @@ foo"
 >
   <span>
     <QualifierIcon
+      fill="#ed7d20"
       qualifier="DIR"
     />
      
@@ -146,6 +153,7 @@ foo:src/index.tsx"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="FIL"
     />
      
@@ -162,7 +170,7 @@ exports[`#ComponentName should render correctly for files 2`] = `
 foo:src/index.tsx"
 >
   <Link
-    className="link-with-icon"
+    className="display-inline-flex-center link-no-underline"
     to={
       Object {
         "pathname": "/code",
@@ -171,9 +179,10 @@ foo:src/index.tsx"
     }
   >
     <QualifierIcon
+      className="little-spacer-right"
+      fill="#236a97"
       qualifier="FIL"
     />
-     
     <span>
       index.tsx
     </span>
@@ -190,6 +199,7 @@ foo:src/index.tsx"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="FIL"
     />
      
@@ -207,6 +217,7 @@ foo:src/index.tsx"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="FIL"
     />
      
@@ -224,6 +235,7 @@ foo:src/index.tsx"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="FIL"
     />
      
@@ -241,6 +253,7 @@ foo:src/index.tsx"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="FIL"
     />
      
@@ -258,6 +271,7 @@ foo:src/index.tsx"
 >
   <span>
     <QualifierIcon
+      fill="#333333"
       qualifier="FIL"
     />
      
@@ -276,7 +290,7 @@ foo
 foo"
 >
   <Link
-    className="link-with-icon"
+    className="display-inline-flex-center link-no-underline"
     to={
       Object {
         "pathname": "/dashboard",
@@ -285,9 +299,10 @@ foo"
     }
   >
     <QualifierIcon
+      className="little-spacer-right"
+      fill="#236a97"
       qualifier="TRK"
     />
-     
     <span>
       Foo
     </span>
@@ -308,7 +323,7 @@ foo
 foo"
   >
     <Link
-      className="link-with-icon"
+      className="display-inline-flex-center link-no-underline"
       to={
         Object {
           "pathname": "/dashboard",
@@ -317,9 +332,10 @@ foo"
       }
     >
       <QualifierIcon
+        className="little-spacer-right"
+        fill="#236a97"
         qualifier="TRK"
       />
-       
       <span>
         Foo
       </span>
@@ -351,7 +367,7 @@ exports[`#ComponentName should render correctly for refs 3`] = `
 foo"
   >
     <Link
-      className="link-with-icon"
+      className="display-inline-flex-center link-no-underline"
       to={
         Object {
           "pathname": "/dashboard",
@@ -360,9 +376,10 @@ foo"
       }
     >
       <QualifierIcon
+        className="little-spacer-right"
+        fill="#236a97"
         qualifier="TRK"
       />
-       
       <span>
         Foo
       </span>
index e0ed6fe21465b409eeb5a8662706e6d7a7f49000..5d8a86d738a794c8e4d0c5d05b3d73ff71609d89 100644 (file)
@@ -73,7 +73,7 @@ export default class RuleDetailsProfiles extends React.PureComponent<Props> {
         {(activation.inherit === 'OVERRIDES' || activation.inherit === 'INHERITED') && (
           <>
             <RuleInheritanceIcon className="text-middle" inheritance={activation.inherit} />
-            <Link className="link-base-color little-spacer-left text-middle" to={profilePath}>
+            <Link className="little-spacer-left text-middle" to={profilePath}>
               {profile.parentName}
             </Link>
           </>
index a6350387a22b24dce8c62f74eb8e57c44a01fc5f..67ba28ef4aa1c717b3bda0689e3c28b0f836ed27 100644 (file)
@@ -73,7 +73,7 @@ export default function AzurePersonalAccessTokenForm(props: AzurePersonalAccessT
             values={{
               link: url ? (
                 <a
-                  className="link-with-icon"
+                  className="link-no-underline"
                   href={getAzurePatUrl(url)}
                   rel="noopener noreferrer"
                   target="_blank">
index b1c05705ec81dcbc964bf81d8e2ba31eb7b52c04..4bd638587d0747517d4181f69242386bfb4352c0 100644 (file)
@@ -119,9 +119,7 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi
                   className={classNames(
                     'display-flex-start spacer-right spacer-bottom create-project-import-bbs-repo overflow-hidden',
                     {
-                      disabled: disableRepositories,
-                      'text-muted': disableRepositories,
-                      'link-no-underline': disableRepositories
+                      disabled: disableRepositories
                     }
                   )}
                   key={repo.id}
index c8399e96c85146b42a881962679fbb845b89a214..685eb640c7e5604f1f9e71316657decf2f18f702 100644 (file)
@@ -19,7 +19,7 @@ exports[`should render correctly: default 1`] = `
         values={
           Object {
             "link": <a
-              className="link-with-icon"
+              className="link-no-underline"
               href="http://www.example.com/_usersSettings/tokens"
               rel="noopener noreferrer"
               target="_blank"
@@ -95,7 +95,7 @@ exports[`should render correctly: submitting 1`] = `
         values={
           Object {
             "link": <a
-              className="link-with-icon"
+              className="link-no-underline"
               href="http://www.example.com/_usersSettings/tokens"
               rel="noopener noreferrer"
               target="_blank"
@@ -171,7 +171,7 @@ exports[`should render correctly: validation failed 1`] = `
         values={
           Object {
             "link": <a
-              className="link-with-icon"
+              className="link-no-underline"
               href="http://www.example.com/_usersSettings/tokens"
               rel="noopener noreferrer"
               target="_blank"
index 4afde710ce4b9d1d87a46d3ba450aa931c1a6880..bbcf7b5ecbe1bcdaf6bdbd6684f26a69584e1312 100644 (file)
@@ -96,7 +96,7 @@ exports[`should render correctly: disable options 1`] = `
   >
     <Radio
       checked={false}
-      className="display-flex-start spacer-right spacer-bottom create-project-import-bbs-repo overflow-hidden disabled text-muted link-no-underline"
+      className="display-flex-start spacer-right spacer-bottom create-project-import-bbs-repo overflow-hidden disabled"
       key="1"
       onCheck={[Function]}
       value="1"
index cd74907855523ae7ff5ca06aa7251897c80e9d29..166722771085f8cd482f68b74bb886b88e4f72e3 100644 (file)
@@ -74,7 +74,7 @@ export default function IssueSourceViewerHeader(props: Props) {
           <div className="spacer-right">
             {linkToProject ? (
               <a
-                className="link-with-icon"
+                className="link-no-underline"
                 href={getPathUrlAsString(getBranchLikeUrl(project, branchLike))}>
                 {projectNameLabel}
               </a>
index e571d0d0e36ffd710e9023596e1f0a5d9e94173f..db4633e96073ec40dd2bb14ac83a1f1c8238ee7b 100644 (file)
@@ -13,7 +13,7 @@ exports[`should render correctly 1`] = `
       className="spacer-right"
     >
       <a
-        className="link-with-icon"
+        className="link-no-underline"
         href="/dashboard?id=my-project"
       >
         <QualifierIcon
@@ -241,7 +241,7 @@ exports[`should render correctly: project root 1`] = `
       className="spacer-right"
     >
       <a
-        className="link-with-icon"
+        className="link-no-underline"
         href="/dashboard?id=my-project"
       >
         <QualifierIcon
index 4a4addbb9ae34e049d4eb2ba79a2dbfd1be2ff2c..09eca7b0f1cfb9cb005d747aa256ca1d373161ae 100644 (file)
@@ -36,9 +36,7 @@ export default function TemplateHeader(props: Props) {
   return (
     <header className="page-header" id="project-permissions-header">
       <div className="note spacer-bottom">
-        <Link className="text-muted" to={PERMISSION_TEMPLATES_PATH}>
-          {translate('permission_templates.page')}
-        </Link>
+        <Link to={PERMISSION_TEMPLATES_PATH}>{translate('permission_templates.page')}</Link>
       </div>
 
       <h1 className="page-title">{template.name}</h1>
index 1cb7d26e0bae768a2fa107079e3993633ca2bd5d..5178b23c91906cd38a79d9b28e6fcf15b2e16594 100644 (file)
@@ -53,7 +53,7 @@ export default class ProjectRow extends React.PureComponent<Props> {
 
         <td className="nowrap hide-overflow project-row-text-cell">
           <Link
-            className="link-with-icon"
+            className="link-no-underline"
             to={getComponentOverviewUrl(project.key, project.qualifier)}>
             <QualifierIcon className="little-spacer-right" qualifier={project.qualifier} />
 
index 69db1456cc3cafd91921fe36b4a0305079378fb5..19273a75709f6041f21b49223d4787d8b194e678 100644 (file)
@@ -17,7 +17,7 @@ exports[`renders 1`] = `
     className="nowrap hide-overflow project-row-text-cell"
   >
     <Link
-      className="link-with-icon"
+      className="link-no-underline"
       to={
         Object {
           "pathname": "/dashboard",
@@ -109,7 +109,7 @@ exports[`renders: portfolio 1`] = `
     className="nowrap hide-overflow project-row-text-cell"
   >
     <Link
-      className="link-with-icon"
+      className="link-no-underline"
       to={
         Object {
           "pathname": "/portfolio",
@@ -201,7 +201,7 @@ exports[`renders: with lastAnalysisDate 1`] = `
     className="nowrap hide-overflow project-row-text-cell"
   >
     <Link
-      className="link-with-icon"
+      className="link-no-underline"
       to={
         Object {
           "pathname": "/dashboard",
index 8c4e6f2c318bebab0cb966b95c4cf3ac2fbf8235..02665f130c16af9c8e7071646a890b19971db56e 100644 (file)
@@ -26,7 +26,7 @@ export default function ProfileNotFound() {
   return (
     <div className="quality-profile-not-found">
       <div className="note spacer-bottom">
-        <NavLink end={true} className="text-muted" to={PROFILE_PATH}>
+        <NavLink end={true} to={PROFILE_PATH}>
           {translate('quality_profiles.page')}
         </NavLink>
       </div>
index 1d4b6ed5d4b58e12599dbcea1f2714d4095cdb24..5e147feec6b63bbbba77230ae474110a46a8d04f 100644 (file)
@@ -38,19 +38,17 @@ export default class ProfileHeader extends React.PureComponent<Props> {
     const { profile } = this.props;
 
     return (
-      <header className="page-header quality-profile-header">
+      <div className="page-header quality-profile-header">
         <div className="note spacer-bottom">
-          <NavLink end={true} className="text-muted" to={PROFILE_PATH}>
+          <NavLink end={true} to={PROFILE_PATH}>
             {translate('quality_profiles.page')}
           </NavLink>
           {' / '}
-          <Link className="text-muted" to={getProfilesForLanguagePath(profile.language)}>
-            {profile.languageName}
-          </Link>
+          <Link to={getProfilesForLanguagePath(profile.language)}>{profile.languageName}</Link>
         </div>
 
         <h1 className="page-title">
-          <ProfileLink className="link-base-color" language={profile.language} name={profile.name}>
+          <ProfileLink language={profile.language} name={profile.name}>
             <span>{profile.name}</span>
           </ProfileLink>
           {profile.isDefault && (
@@ -91,7 +89,7 @@ export default class ProfileHeader extends React.PureComponent<Props> {
             {translate('quality_profiles.built_in.description')}
           </div>
         )}
-      </header>
+      </div>
     );
   }
 }
index 0dcc970ab0130fa16fabe28d270e31cb678727eb..a5ad08c1fb64014d0bdadf71548a47d23258f0ba 100644 (file)
@@ -147,7 +147,7 @@ export default class ProfileProjects extends React.PureComponent<Props, State> {
         <ul>
           {projects.map(project => (
             <li className="spacer-top js-profile-project" data-key={project.key} key={project.key}>
-              <Link className="link-with-icon" to={getProjectUrl(project.key)}>
+              <Link to={getProjectUrl(project.key)}>
                 <QualifierIcon qualifier="TRK" /> <span>{project.name}</span>
               </Link>
             </li>
index 2243f339ffef28c2f2bbbc5b6071199a236998eb..3f813408c04f426107ff7f70921d1cfabd3a7318 100644 (file)
@@ -63,11 +63,11 @@ export default function ProfileRulesRowOfType(props: Props) {
       <td className="thin nowrap text-right">
         {inactiveCount != null &&
           (inactiveCount > 0 ? (
-            <Link className="small text-muted" to={inactiveRulesUrl}>
+            <Link className="small" to={inactiveRulesUrl}>
               {formatMeasure(inactiveCount, 'SHORT_INT', null)}
             </Link>
           ) : (
-            <span className="note text-muted">0</span>
+            <span className="note">0</span>
           ))}
       </td>
     </tr>
index 45bd13b3f6c30e76026f61be13b020aa37a580b9..621566422379134da40003a7037def02d60cb4d1 100644 (file)
@@ -52,11 +52,11 @@ export default function ProfileRulesRowTotal(props: Props) {
       <td className="thin nowrap text-right">
         {inactiveCount != null &&
           (inactiveCount > 0 ? (
-            <Link className="small text-muted" to={inactiveRulesUrl}>
+            <Link className="small" to={inactiveRulesUrl}>
               <strong>{formatMeasure(inactiveCount, 'SHORT_INT', null)}</strong>
             </Link>
           ) : (
-            <span className="note text-muted">0</span>
+            <span className="note">0</span>
           ))}
       </td>
     </tr>
index db6386f4230ab77553460ad39b3d4b5ef752ee9f..8b99596ac3852d1f3d86707153580f603af065eb 100644 (file)
@@ -1,14 +1,13 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`should render correctly 1`] = `
-<header
+<div
   className="page-header quality-profile-header"
 >
   <div
     className="note spacer-bottom"
   >
     <NavLink
-      className="text-muted"
       end={true}
       to="/profiles"
     >
@@ -16,7 +15,6 @@ exports[`should render correctly 1`] = `
     </NavLink>
      / 
     <Link
-      className="text-muted"
       to={
         Object {
           "pathname": "/profiles",
@@ -31,7 +29,6 @@ exports[`should render correctly 1`] = `
     className="page-title"
   >
     <ProfileLink
-      className="link-base-color"
       language="js"
       name="name"
     >
@@ -102,18 +99,17 @@ exports[`should render correctly 1`] = `
       </li>
     </ul>
   </div>
-</header>
+</div>
 `;
 
 exports[`should render correctly: for default profile 1`] = `
-<header
+<div
   className="page-header quality-profile-header"
 >
   <div
     className="note spacer-bottom"
   >
     <NavLink
-      className="text-muted"
       end={true}
       to="/profiles"
     >
@@ -121,7 +117,6 @@ exports[`should render correctly: for default profile 1`] = `
     </NavLink>
      / 
     <Link
-      className="text-muted"
       to={
         Object {
           "pathname": "/profiles",
@@ -136,7 +131,6 @@ exports[`should render correctly: for default profile 1`] = `
     className="page-title"
   >
     <ProfileLink
-      className="link-base-color"
       language="js"
       name="name"
     >
@@ -216,5 +210,5 @@ exports[`should render correctly: for default profile 1`] = `
       </li>
     </ul>
   </div>
-</header>
+</div>
 `;
index f7310b990755148b9a1ea22e1f5b0c427a192a2a..cfb7b753c4699dcc299846cd2004715ff232cc09 100644 (file)
@@ -36,7 +36,6 @@ exports[`should render correctly: default 1`] = `
         key="org.sonarsource.xml:xml"
       >
         <Link
-          className="link-with-icon"
           to={
             Object {
               "pathname": "/dashboard",
@@ -136,7 +135,6 @@ exports[`should render correctly: no active rules, but associated projects 1`] =
         key="org.sonarsource.xml:xml"
       >
         <Link
-          className="link-with-icon"
           to={
             Object {
               "pathname": "/dashboard",
@@ -221,7 +219,6 @@ exports[`should render correctly: no rights 1`] = `
         key="org.sonarsource.xml:xml"
       >
         <Link
-          className="link-with-icon"
           to={
             Object {
               "pathname": "/dashboard",
index 74a4d1abcf21402825db8cb365e2582b0b20eb52..a1eb150e99613338128688b86b1be667edc907ff 100644 (file)
@@ -29,7 +29,7 @@ exports[`should render correctly 1`] = `
     className="thin nowrap text-right"
   >
     <Link
-      className="small text-muted"
+      className="small"
       to={
         Object {
           "pathname": "/coding_rules",
@@ -72,7 +72,7 @@ exports[`should render correctly if there is 0 rules 1`] = `
     className="thin nowrap text-right"
   >
     <span
-      className="note text-muted"
+      className="note"
     >
       0
     </span>
index 5e18680e3b4664e0ab1eef3ef99e44b1d1dd880f..695b3fbe04487eca58213c189d56cd0ea0fcf9e8 100644 (file)
@@ -27,7 +27,7 @@ exports[`should render correctly 1`] = `
     className="thin nowrap text-right"
   >
     <Link
-      className="small text-muted"
+      className="small"
       to={
         Object {
           "pathname": "/coding_rules",
@@ -70,7 +70,7 @@ exports[`should render correctly if there is 0 rules 1`] = `
     className="thin nowrap text-right"
   >
     <span
-      className="note text-muted"
+      className="note"
     >
       0
     </span>
index 18a7b1f33e38e057244ade8db469ef1f5b38d942..3c7ce567769e29de0c13438dc6f078902b69c401 100644 (file)
@@ -119,11 +119,8 @@ export default class EvolutionDeprecated extends React.PureComponent<Props> {
         <ul>
           {sortedProfiles.map(profile => (
             <li className="spacer-top" key={profile.key}>
-              <div className="text-ellipsis">
-                <ProfileLink
-                  className="link-no-underline"
-                  language={profile.language}
-                  name={profile.name}>
+              <div className="text-ellipsis little-spacer-bottom">
+                <ProfileLink language={profile.language} name={profile.name}>
                   {profile.name}
                 </ProfileLink>
               </div>
@@ -131,7 +128,7 @@ export default class EvolutionDeprecated extends React.PureComponent<Props> {
                 {profile.languageName}
                 {', '}
                 <Link
-                  className="text-muted"
+                  className="link-no-underline"
                   to={getDeprecatedActiveRulesUrl({ qprofile: profile.key })}>
                   {translateWithParameters(
                     'quality_profile.x_rules',
index 292172b31e55cf664148650badddc5ae480b1a20..9166e4285ddf945791f94430266168145de91782 100644 (file)
@@ -22,10 +22,9 @@ exports[`should render correctly 1`] = `
       key="qp-5"
     >
       <div
-        className="text-ellipsis"
+        className="text-ellipsis little-spacer-bottom"
       >
         <ProfileLink
-          className="link-no-underline"
           language="js"
           name="Quality Profile 5"
         >
@@ -38,7 +37,7 @@ exports[`should render correctly 1`] = `
         JavaScript
         , 
         <Link
-          className="text-muted"
+          className="link-no-underline"
           to={
             Object {
               "pathname": "/coding_rules",
@@ -69,10 +68,9 @@ exports[`should render correctly 1`] = `
       key="qp-4"
     >
       <div
-        className="text-ellipsis"
+        className="text-ellipsis little-spacer-bottom"
       >
         <ProfileLink
-          className="link-no-underline"
           language="js"
           name="Quality Profile 4"
         >
@@ -85,7 +83,7 @@ exports[`should render correctly 1`] = `
         JavaScript
         , 
         <Link
-          className="text-muted"
+          className="link-no-underline"
           to={
             Object {
               "pathname": "/coding_rules",
@@ -109,10 +107,9 @@ exports[`should render correctly 1`] = `
       key="qp-2"
     >
       <div
-        className="text-ellipsis"
+        className="text-ellipsis little-spacer-bottom"
       >
         <ProfileLink
-          className="link-no-underline"
           language="js"
           name="Quality Profile 2"
         >
@@ -125,7 +122,7 @@ exports[`should render correctly 1`] = `
         JavaScript
         , 
         <Link
-          className="text-muted"
+          className="link-no-underline"
           to={
             Object {
               "pathname": "/coding_rules",
@@ -142,10 +139,9 @@ exports[`should render correctly 1`] = `
       key="qp-3"
     >
       <div
-        className="text-ellipsis"
+        className="text-ellipsis little-spacer-bottom"
       >
         <ProfileLink
-          className="link-no-underline"
           language="js"
           name="Quality Profile 3"
         >
@@ -158,7 +154,7 @@ exports[`should render correctly 1`] = `
         JavaScript
         , 
         <Link
-          className="text-muted"
+          className="link-no-underline"
           to={
             Object {
               "pathname": "/coding_rules",
index aa137b6a5bb1e8faf7b7e44ee5e5aeeb94d4e2e6..c395c1f80d0b384f70be7c104d47708c47100f98 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { SubmitButton } from '../../../components/controls/buttons';
+import { ButtonLink, SubmitButton } from '../../../components/controls/buttons';
 import DeferredSpinner from '../../../components/ui/DeferredSpinner';
 import { translate } from '../../../helpers/l10n';
 import { getBaseUrl } from '../../../helpers/system';
@@ -59,8 +59,7 @@ export default class LoginForm extends React.PureComponent<Props, State> {
       .then(this.stopLoading, this.stopLoading);
   };
 
-  handleMoreOptionsClick = (event: React.MouseEvent<HTMLAnchorElement>) => {
-    event.preventDefault();
+  handleMoreOptionsClick = () => {
     this.setState({ collapsed: false });
   };
 
@@ -74,12 +73,12 @@ export default class LoginForm extends React.PureComponent<Props, State> {
     if (this.state.collapsed) {
       return (
         <div className="text-center">
-          <a
-            className="small text-muted js-more-options"
-            href="#"
+          <ButtonLink
+            aria-expanded={false}
+            className="small js-more-options"
             onClick={this.handleMoreOptionsClick}>
             {translate('login.more_options')}
-          </a>
+          </ButtonLink>
         </div>
       );
     }
index d45b19528093474bea7196d372ab4a08847a3cef..3d97ba42e31096953165a9c4e889d4ac27a5f187 100644 (file)
@@ -4,13 +4,13 @@ exports[`expands more options 1`] = `
 <div
   className="text-center"
 >
-  <a
-    className="small text-muted js-more-options"
-    href="#"
+  <ButtonLink
+    aria-expanded={false}
+    className="small js-more-options"
     onClick={[Function]}
   >
     login.more_options
-  </a>
+  </ButtonLink>
 </div>
 `;
 
index c04ccc4f6fd2a3a65c2605ec46b411efc95aaec2..7343f6a84208dd542cc51f0fd06718456f5a5377 100644 (file)
@@ -129,9 +129,9 @@ export default class SourceViewerHeader extends React.PureComponent<Props, State
           <div className="component-name">
             <div className="component-name-parent">
               <a
-                className="link-with-icon"
+                className="link-no-underline"
                 href={getPathUrlAsString(getBranchLikeUrl(project, this.props.branchLike))}>
-                <QualifierIcon qualifier="TRK" /> <span>{projectName}</span>
+                <QualifierIcon qualifier={ComponentQualifier.Project} /> <span>{projectName}</span>
               </a>
             </div>
 
index f5c25d061bae714ac0c24dacd305ecee9a359487..1aa0e65f921cc630562dff3b2c89ec42ed028449 100644 (file)
@@ -14,7 +14,7 @@ exports[`should render correctly for a regular file 1`] = `
         className="component-name-parent"
       >
         <a
-          className="link-with-icon"
+          className="link-no-underline"
           href="/dashboard?id=project"
         >
           <QualifierIcon
@@ -129,7 +129,7 @@ exports[`should render correctly for a unit test 1`] = `
         className="component-name-parent"
       >
         <a
-          className="link-with-icon"
+          className="link-no-underline"
           href="/dashboard?id=my-project"
         >
           <QualifierIcon
@@ -262,7 +262,7 @@ exports[`should render correctly if issue details are passed 1`] = `
         className="component-name-parent"
       >
         <a
-          className="link-with-icon"
+          className="link-no-underline"
           href="/dashboard?id=project"
         >
           <QualifierIcon
index f0a776dcf435d249155e896d21e6d9780fe3dec8..c0fd6951d4d261f876aade8465d73a7d1374da5b 100644 (file)
@@ -145,7 +145,6 @@ export class AnalysisWarningsModal extends React.PureComponent<Props, State> {
                   {dismissable && currentUser.isLoggedIn && (
                     <div className="spacer-top display-flex-inline">
                       <ButtonLink
-                        className="link-base-color"
                         disabled={Boolean(dismissedWarning)}
                         onClick={() => {
                           this.handleDismissMessage(key);
index 3e582b2aed032ad8b365b124b368c84bf3ccddc7..b1e6b85ee7f4e97022dbc2a68d3dba5cf8a26c75 100644 (file)
@@ -66,7 +66,7 @@ export default function DocumentationTooltip(props: DocumentationTooltipProps) {
                     </Link>
                   ) : (
                     <Link
-                      className="display-inline-flex-center link-with-icon"
+                      className="display-inline-flex-center"
                       to={href}
                       rel="noopener noreferrer"
                       target="_blank">
index 68788eb7faeef1febf07e5c5cdc19226ce2d26e8..bd8f9d4a99a169b5733705b6e43f21cec0ed81d9 100644 (file)
@@ -22,7 +22,8 @@ import * as React from 'react';
 import { dismissAnalysisWarning, getTask } from '../../../api/ce';
 import { mockTaskWarning } from '../../../helpers/mocks/tasks';
 import { mockCurrentUser } from '../../../helpers/testMocks';
-import { mockEvent, waitAndUpdate } from '../../../helpers/testUtils';
+import { waitAndUpdate } from '../../../helpers/testUtils';
+import { ButtonLink } from '../../controls/buttons';
 import { AnalysisWarningsModal } from '../AnalysisWarningsModal';
 
 jest.mock('../../../api/ce', () => ({
@@ -67,11 +68,14 @@ it('should correctly handle dismissing warnings', async () => {
     warnings: [mockTaskWarning({ key: 'bar', dismissable: true })]
   });
 
-  const click = wrapper.find('ButtonLink.link-base-color').props().onClick;
+  const { onClick } = wrapper
+    .find(ButtonLink)
+    .at(0)
+    .props();
 
-  expect(click).toBeDefined();
-
-  click!(mockEvent());
+  if (onClick) {
+    onClick();
+  }
 
   await waitAndUpdate(wrapper);
 
index b703954b0eae133d0908893848e89b80d9366c7a..7b9218712f424f1a5d97d504c647911a610ed383 100644 (file)
@@ -254,7 +254,6 @@ exports[`should render correctly: with dismissable warnings 1`] = `
             className="spacer-top display-flex-inline"
           >
             <ButtonLink
-              className="link-base-color"
               disabled={false}
               onClick={[Function]}
             >
index 949ca3317f014b163dc7fa520987ac2e0fb61972..5c6a804f4e00e39354403d46ac8d068db0eca3d4 100644 (file)
@@ -78,7 +78,7 @@ exports[`renders correctly: with links 1`] = `
           className="little-spacer-bottom"
         >
           <Link
-            className="display-inline-flex-center link-with-icon"
+            className="display-inline-flex-center"
             rel="noopener noreferrer"
             target="_blank"
             to="http://link.tosome.place"
@@ -97,7 +97,7 @@ exports[`renders correctly: with links 1`] = `
           className="little-spacer-bottom"
         >
           <Link
-            className="display-inline-flex-center link-with-icon"
+            className="display-inline-flex-center"
             rel="noopener noreferrer"
             target="_blank"
             to="/documentation/guide"
index 2e8f9473d2c3cdfff99a1f672d90be029165f23c..45be643969c9a96d262610129934ddd010204b72 100644 (file)
@@ -20,6 +20,7 @@
 import * as React from 'react';
 import { translate, translateWithParameters } from '../../helpers/l10n';
 import { formatMeasure } from '../../helpers/measures';
+import { ButtonLink } from '../controls/buttons';
 
 interface Props {
   count: number;
@@ -29,15 +30,11 @@ interface Props {
 }
 
 export default class ListStyleFacetFooter extends React.PureComponent<Props> {
-  handleShowMoreClick = (event: React.MouseEvent<HTMLAnchorElement>) => {
-    event.preventDefault();
-    event.currentTarget.blur();
+  handleShowMoreClick = () => {
     this.props.showMore();
   };
 
-  handleShowLessClick = (event: React.MouseEvent<HTMLAnchorElement>) => {
-    event.preventDefault();
-    event.currentTarget.blur();
+  handleShowLessClick = () => {
     if (this.props.showLess) {
       this.props.showLess();
     }
@@ -53,15 +50,15 @@ export default class ListStyleFacetFooter extends React.PureComponent<Props> {
         {translateWithParameters('x_show', formatMeasure(count, 'INT', null))}
 
         {hasMore && (
-          <a className="spacer-left text-muted" href="#" onClick={this.handleShowMoreClick}>
+          <ButtonLink className="spacer-left" onClick={this.handleShowMoreClick}>
             {translate('show_more')}
-          </a>
+          </ButtonLink>
         )}
 
         {this.props.showLess && allShown && (
-          <a className="spacer-left text-muted" href="#" onClick={this.handleShowLessClick}>
+          <ButtonLink className="spacer-left" onClick={this.handleShowLessClick}>
             {translate('show_less')}
-          </a>
+          </ButtonLink>
         )}
       </footer>
     );
index eda9b9d98f15c2cb8fef045a6a504f1ffe34574a..3a2fd18f845dfcc039df0b7b3baff54bbe8b9583 100644 (file)
@@ -20,6 +20,7 @@
 import { shallow } from 'enzyme';
 import * as React from 'react';
 import { click } from '../../../helpers/testUtils';
+import { ButtonLink } from '../../controls/buttons';
 import ListStyleFacetFooter from '../ListStyleFacetFooter';
 
 it('should not render "show more"', () => {
@@ -34,7 +35,7 @@ it('should show more', () => {
     <ListStyleFacetFooter count={3} showLess={undefined} showMore={showMore} total={15} />
   );
   expect(wrapper).toMatchSnapshot();
-  click(wrapper.find('a'));
+  click(wrapper.find(ButtonLink));
   expect(showMore).toBeCalled();
 });
 
@@ -44,7 +45,7 @@ it('should show less', () => {
     <ListStyleFacetFooter count={15} showLess={showLess} showMore={jest.fn()} total={15} />
   );
   expect(wrapper).toMatchSnapshot();
-  click(wrapper.find('a'));
+  click(wrapper.find(ButtonLink));
   expect(showLess).toBeCalled();
 });
 
index 85a2744871cec39d4f4bb3f3f9a9a170a818a536..ea8274402b96bfefbcd828f6a4bee9b4665f742f 100644 (file)
@@ -21,13 +21,12 @@ exports[`should show less 1`] = `
   className="note spacer-top spacer-bottom text-center"
 >
   x_show.15
-  <a
-    className="spacer-left text-muted"
-    href="#"
+  <ButtonLink
+    className="spacer-left"
     onClick={[Function]}
   >
     show_less
-  </a>
+  </ButtonLink>
 </footer>
 `;
 
@@ -36,12 +35,11 @@ exports[`should show more 1`] = `
   className="note spacer-top spacer-bottom text-center"
 >
   x_show.3
-  <a
-    className="spacer-left text-muted"
-    href="#"
+  <ButtonLink
+    className="spacer-left"
     onClick={[Function]}
   >
     show_more
-  </a>
+  </ButtonLink>
 </footer>
 `;
index 94b098f0dcd45aba981a36d42369d33b75639b88..547e084b077fa6eb51ab8046c4a782eb2264782a 100644 (file)
@@ -26,7 +26,7 @@ export default function BranchIcon({ fill, ...iconProps }: IconProps) {
     <Icon {...iconProps}>
       <path
         d="M12.5 6.5c0-1.1-.9-2-2-2s-2 .9-2 2c0 .8.5 1.5 1.2 1.8-.3.6-.7 1.1-1.2 1.4-.9.5-1.9.5-2.5.4V4c.9-.2 1.5-1 1.5-1.9 0-1.1-.9-2-2-2s-2 .9-2 2C3.5 3 4.1 3.8 5 4v8c-.9.2-1.5 1-1.5 1.9 0 1.1.9 2 2 2s2-.9 2-2c0-.9-.6-1.7-1.5-1.9v-1c.2 0 .5.1.7.1.7 0 1.5-.1 2.2-.6.8-.5 1.4-1.2 1.7-2.1 1.1 0 1.9-.9 1.9-1.9zm-8-4.4c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1-1-.5-1-1zm2 11.9c0 .6-.4 1-1 1s-1-.4-1-1 .4-1 1-1 1 .4 1 1zm4-6.5c-.6 0-1-.4-1-1s.4-1 1-1 1 .4 1 1-.4 1-1 1z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
index e73eabac2a26c373bc7a59a9792ecc3e549fa8f9..6beb58455c72c3c7d2bce1a3ae6c9f386045a3d1 100644 (file)
@@ -26,7 +26,7 @@ export default function PullRequestIcon({ fill, ...iconProps }: IconProps) {
     <Icon {...iconProps}>
       <path
         d="M13,11.9L13,5.5C13,5.4 13.232,1.996 7.9,2L9.1,0.8L8.5,0.1L5.9,2.6L8.5,5.1L9.2,4.4L7.905,3.008C12.256,2.99 12,5.4 12,5.5L12,11.9C11.1,12.1 10.5,12.9 10.5,13.8C10.5,14.9 11.4,15.8 12.5,15.8C13.6,15.8 14.5,14.9 14.5,13.8C14.5,12.9 13.9,12.2 13,11.9ZM4,11.9C4.9,12.2 5.5,12.9 5.5,13.8C5.5,14.9 4.6,15.8 3.5,15.8C2.4,15.8 1.5,14.9 1.5,13.8C1.5,12.9 2.1,12.1 3,11.9L3,4.1C2.1,3.9 1.5,3.1 1.5,2.2C1.5,1.1 2.4,0.2 3.5,0.2C4.6,0.2 5.5,1.1 5.5,2.2C5.5,3.1 4.9,3.9 4,4.1L4,11.9ZM12.5,14.9C11.9,14.9 11.5,14.5 11.5,13.9C11.5,13.3 11.9,12.9 12.5,12.9C13.1,12.9 13.5,13.3 13.5,13.9C13.5,14.5 13.1,14.9 12.5,14.9ZM3.5,14.9C2.9,14.9 2.5,14.5 2.5,13.9C2.5,13.3 2.9,12.9 3.5,12.9C4.1,12.9 4.5,13.3 4.5,13.9C4.5,14.5 4.1,14.9 3.5,14.9ZM2.5,2.2C2.5,1.6 2.9,1.2 3.5,1.2C4.1,1.2 4.5,1.6 4.5,2.2C4.5,2.8 4.1,3.2 3.5,3.2C2.9,3.2 2.5,2.8 2.5,2.2Z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
index 2c97d64e948831f195d8a460affe717a0b61d0bf..05ba3b5c163458c92ba02c7da9253539d07b5954 100644 (file)
@@ -51,7 +51,7 @@ export default function QualifierIcon({
   }
 
   const FoundIcon = qualifierIcons[qualifier.toLowerCase()];
-  const ariaLabel = qualifier != null ? translate(`qualifier.${qualifier}`) : undefined;
+  const ariaLabel = qualifier ? translate(`qualifier.${qualifier}`) : undefined;
   return FoundIcon ? (
     <FoundIcon className={className} fill={fill} ariaLabel={ariaLabel} {...props} />
   ) : null;
@@ -62,7 +62,7 @@ function ApplicationIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M3.014 10.986a2 2 0 1 1-.001 4.001 2 2 0 0 1 .001-4.001zm9.984 0a2 2 0 1 1-.001 4.001 2 2 0 0 1 .001-4.001zm-5.004-.021c1.103 0 2 .896 2 2s-.897 2-2 2a2 2 0 0 1 0-4zm-4.98 1.021a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm9.984 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm-5.004-.021a1 1 0 1 1 0 2 1 1 0 0 1 0-2zM2.984 6a2 2 0 1 1-.001 4.001A2 2 0 0 1 2.984 6zm9.984 0a2 2 0 1 1-.001 4.001A2 2 0 0 1 12.968 6zm-5.004-.021c1.103 0 2 .897 2 2a2 2 0 1 1-2-2zM2.984 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm9.984 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm-5.004-.021a1.001 1.001 0 0 1 0 2 1 1 0 0 1 0-2zM3 1.025a2 2 0 1 1-.001 4.001A2 2 0 0 1 3 1.025zm9.984 0a2 2 0 1 1-.001 4.001 2 2 0 0 1 .001-4.001zM7.98 1.004c1.103 0 2 .896 2 2s-.897 2-2 2a2 2 0 0 1 0-4zM3 2.025a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm9.984 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2zM7.98 2.004a1.001 1.001 0 0 1 0 2 1 1 0 0 1 0-2z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
@@ -73,7 +73,7 @@ function DeveloperIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M7.974 8.02a3.5 3.5 0 0 1-2.482-1.017 3.428 3.428 0 0 1-1.028-2.455c0-.927.365-1.8 1.028-2.455a3.505 3.505 0 0 1 2.482-1.017 3.5 3.5 0 0 1 2.482 1.017 3.434 3.434 0 0 1 1.027 2.455c0 .928-.365 1.8-1.027 2.455A3.504 3.504 0 0 1 7.974 8.02zm0-5.778c-1.286 0-2.332 1.034-2.332 2.306s1.046 2.307 2.332 2.307c1.285 0 2.332-1.035 2.332-2.307S9.258 2.242 7.974 2.242zm3.534 6.418c.127.016.243.045.348.086.17.066.302.146.406.246.132.124.253.282.36.47.126.218.226.442.3.668.08.253.15.535.206.838.056.313.095.604.113.867.02.28.03.57.03.862 0 .532-.174.758-.306.882-.142.132-.397.31-.973.31H3.948c-.233 0-.437-.03-.606-.09-.14-.05-.26-.123-.366-.222-.13-.123-.306-.35-.306-.88 0-.294.01-.584.03-.863.018-.263.056-.554.112-.867a6.5 6.5 0 0 1 .207-.838c.073-.226.173-.45.298-.667.108-.19.23-.347.36-.47.106-.1.238-.18.407-.247.105-.04.22-.07.348-.086.202.13.432.277.683.435.342.217.756.4 1.265.564.523.166 1.06.25 1.59.25a5.25 5.25 0 0 0 1.592-.25c.51-.164.923-.348 1.266-.565.25-.158.48-.304.682-.435l-.002.002zm-.244-1.18c-.055 0-.184.066-.387.196-.202.13-.43.276-.685.437-.255.16-.586.307-.994.437-.408.13-.818.196-1.23.196-.41 0-.82-.065-1.228-.196a4.303 4.303 0 0 1-.993-.437c-.255-.16-.484-.306-.686-.437-.202-.13-.33-.196-.386-.196-.374 0-.716.06-1.026.183-.31.12-.572.283-.787.487a3.28 3.28 0 0 0-.57.737 4.662 4.662 0 0 0-.395.888c-.098.303-.18.633-.244.988a9.652 9.652 0 0 0-.128.992c-.02.306-.032.62-.032.942 0 .73.224 1.304.672 1.726.448.42 1.043.632 1.785.632h8.044c.743 0 1.34-.21 1.787-.633.447-.42.67-.996.67-1.725 0-.32-.01-.635-.03-.942a9.159 9.159 0 0 0-.374-1.98c-.098-.304-.23-.6-.395-.888a3.23 3.23 0 0 0-.57-.737 2.404 2.404 0 0 0-.788-.487 2.779 2.779 0 0 0-1.026-.183h-.004z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
@@ -95,7 +95,7 @@ function FileIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M14 15H2V1l7.997.02c1 .034 1.759.758 2.428 1.42.667.663 1.561 1.605 1.574 2.555H14V15zM9 2H3v12h10V6H9V2zm3 10H4v-1h8v1zm0-2H4V9h8v1zm-1.988-5h3.008c-.012-.674-.714-1.443-1.204-1.937-.488-.495-1.039-1.058-1.816-1.055v2.96l.012.032z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
@@ -106,7 +106,7 @@ function PortfolioIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M14.97 14.97H1.016V1.015H14.97V14.97zm-1-12.955H2.015V13.97H13.97V2.015zm-.973 10.982H9V9h3.997v3.997zM7 12.996H3.004V9H7v3.996zM11.997 10H10v1.997h1.997V10zM6 10H4.004v1.996H6V10zm1-3H3.006V3.006H7V7zm5.985 0H9V3.015h3.985V7zM6 4.006H4.006V6H6V4.006zm5.985.009H10V6h1.985V4.015z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
@@ -117,7 +117,7 @@ function ProjectIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M14.985 13.988L1 14.005 1.02 5h13.966v8.988h-.001zM1.998 5.995l.006 7.02L14.022 13 14 6.004l-12.002-.01v.001zM3 4.5V4h9.996l.004.5h1l-.005-1.497-11.98.003L2 4.5h1zm1-2v-.504h8.002L12 2.5h1l-.004-1.495H3.003L3 2.5h1z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
@@ -128,7 +128,7 @@ function SubPortfolioIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M14 7h2v9H7v-2H0V0h14v7zM8 8v7h7V8H8zm3 6H9v-2h2v2zm3 0h-2v-2h2v2zm-1-7V1H1v12h6V7h6zm-7 5H2V8h4v4zm5-1H9V9h2v2zm3 0h-2V9h2v2zM5 9H3v2h2V9zm1-3H2V2h4v4zm6 0H8V2h4v4zM5 3H3v2h2V3zm6 0H9v2h2V3z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );
@@ -139,7 +139,7 @@ function UnitTestIcon({ fill, ariaLabel, ...iconProps }: IconProps) {
     <Icon {...iconProps} ariaLabel={ariaLabel}>
       <path
         d="M14 15H2V1l7.997.02c1.013-.03 1.57.893 2.239 1.555.667.663 1.75 1.47 1.763 2.42H14V15zM9 2H3v12h10V6H9V2zM7 8l-3 2.5L7 13V8zm1 5l3-2.5L8 8v5zm2.012-8h3.008c-.012-.674-.78-1.258-1.27-1.752-.488-.495-.973-1.243-1.75-1.24v2.96l.012.032z"
-        style={{ fill: fill || colors.blue }}
+        style={{ fill: fill || colors.primary }}
       />
     </Icon>
   );