Quellcode durchsuchen

SONARCLOUD-45 Advertise featured projects on SonarCloud

* Update code to use the new homepage.json file
* Update fields name
* Add business metric project_public_projects
* Add business metric project_public_loc
* generator of JSON input for SonarCloud homepage
* add generator zip to burgr
* add integration test
* rename "7dNewPullRequests" to "newPullRequests7d"
* Use new 'newPullRequests7d' field
tags/7.5
Pascal Mugnier vor 5 Jahren
Ursprung
Commit
458617e27f
60 geänderte Dateien mit 1180 neuen und 1162 gelöschten Zeilen
  1. 2
    6
      build.gradle
  2. 4
    0
      server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java
  3. 2
    0
      server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java
  4. 4
    0
      server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java
  5. 2
    0
      server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java
  6. 8
    0
      server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml
  7. 19
    0
      server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml
  8. 16
    0
      server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java
  9. 36
    0
      server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java
  10. 1
    10
      server/sonar-web/public/images/languages/black/abap.svg
  11. 1
    29
      server/sonar-web/public/images/languages/black/c-c-plus-plus.svg
  12. 1
    23
      server/sonar-web/public/images/languages/black/csharp.svg
  13. 1
    0
      server/sonar-web/public/images/languages/black/css.svg
  14. 1
    44
      server/sonar-web/public/images/languages/black/go.svg
  15. 1
    24
      server/sonar-web/public/images/languages/black/html5.svg
  16. 1
    23
      server/sonar-web/public/images/languages/black/java.svg
  17. 1
    15
      server/sonar-web/public/images/languages/black/js.svg
  18. 1
    24
      server/sonar-web/public/images/languages/black/kotlin.svg
  19. 1
    10
      server/sonar-web/public/images/languages/black/obj-c.svg
  20. 1
    12
      server/sonar-web/public/images/languages/black/php.svg
  21. 1
    10
      server/sonar-web/public/images/languages/black/pl-sql.svg
  22. 1
    29
      server/sonar-web/public/images/languages/black/python.svg
  23. 1
    51
      server/sonar-web/public/images/languages/black/ruby.svg
  24. 1
    0
      server/sonar-web/public/images/languages/black/scala.svg
  25. 1
    24
      server/sonar-web/public/images/languages/black/swift.svg
  26. 1
    10
      server/sonar-web/public/images/languages/black/t-sql.svg
  27. 1
    13
      server/sonar-web/public/images/languages/black/ts.svg
  28. 1
    23
      server/sonar-web/public/images/languages/black/vb.svg
  29. 1
    10
      server/sonar-web/public/images/languages/black/xml.svg
  30. 1
    0
      server/sonar-web/public/images/languages/css.svg
  31. 1
    0
      server/sonar-web/public/images/languages/scala.svg
  32. 1
    0
      server/sonar-web/public/images/sonarcloud/chevron-left.svg
  33. 1
    0
      server/sonar-web/public/images/sonarcloud/chevron-right.svg
  34. 1
    188
      server/sonar-web/public/images/sonarcloud/collab.svg
  35. BIN
      server/sonar-web/public/images/sonarcloud/home-header-people.png
  36. 117
    0
      server/sonar-web/public/json/homepage.json
  37. 1
    0
      server/sonar-web/scripts/start.js
  38. 1
    0
      server/sonar-web/src/main/js/app/theme.js
  39. 1
    1
      server/sonar-web/src/main/js/apps/about/routes.ts
  40. 1
    1
      server/sonar-web/src/main/js/apps/about/sonarcloud/AzureDevOps.tsx
  41. 103
    53
      server/sonar-web/src/main/js/apps/about/sonarcloud/Home.tsx
  42. 32
    21
      server/sonar-web/src/main/js/apps/about/sonarcloud/Pricing.tsx
  43. 16
    0
      server/sonar-web/src/main/js/apps/about/sonarcloud/SQHome.tsx
  44. 34
    1
      server/sonar-web/src/main/js/apps/about/sonarcloud/__tests__/Home-test.tsx
  45. 185
    44
      server/sonar-web/src/main/js/apps/about/sonarcloud/__tests__/__snapshots__/Home-test.tsx.snap
  46. 17
    7
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/FeaturedProjects.css
  47. 84
    96
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/FeaturedProjects.tsx
  48. 25
    20
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/Languages.tsx
  49. 1
    1
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/LoginButtons.css
  50. 56
    22
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/NavBars.css
  51. 19
    11
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/NavBars.tsx
  52. 8
    3
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/Statistics.css
  53. 6
    4
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/Statistics.tsx
  54. 101
    61
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/__tests__/FeaturedProjects-test.tsx
  55. 159
    98
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/__tests__/__snapshots__/FeaturedProjects-test.tsx.snap
  56. 3
    5
      server/sonar-web/src/main/js/apps/about/sonarcloud/components/__tests__/__snapshots__/Statistics-test.tsx.snap
  57. 61
    20
      server/sonar-web/src/main/js/apps/about/sonarcloud/new_style.css
  58. 25
    108
      server/sonar-web/src/main/js/apps/about/sonarcloud/utils.ts
  59. 1
    1
      sonar-plugin-api/src/main/java/org/sonar/api/web/ServletFilter.java
  60. 5
    6
      sonar-plugin-api/src/test/java/org/sonar/api/web/ServletFilterTest.java

+ 2
- 6
build.gradle Datei anzeigen

@@ -122,6 +122,7 @@ subprojects {
entry 'jackson-databind'
entry 'jackson-annotations'
}
dependency 'com.eclipsesource.minimal-json:minimal-json:0.9.5'
dependency 'com.github.kevinsawicki:http-request:5.4.1'
dependency 'com.googlecode.java-diff-utils:diffutils:1.2'
dependency('com.googlecode.json-simple:json-simple:1.1.1') {
@@ -144,6 +145,7 @@ subprojects {
entry 'mockwebserver'
}
dependency 'com.tngtech.java:junit-dataprovider:1.9.2'
dependency 'info.picocli:picocli:3.6.1'
dependency 'io.jsonwebtoken:jjwt:0.9.0'
dependency 'javax.servlet:javax.servlet-api:3.0.1'
dependency 'javax.xml.bind:jaxb-api:2.3.0'
@@ -417,12 +419,6 @@ artifactory {
"com.sonarsource.sonarqube:sonarqube-developer:zip," +
"com.sonarsource.sonarqube:sonarqube-datacenter:zip," +
"com.sonarsource.sonarqube:sonarqube-enterprise:zip")
clientConfig.info.addEnvironmentProperty('ARTIFACTS_TO_DOWNLOAD',
'com.sonarsource.sonarqube:sonarcloud:zip,' +
'com.sonarsource.sonarqube:sonarqube-developer:yguard,' +
'com.sonarsource.sonarqube:sonarqube-datacenter:yguard,' +
'com.sonarsource.sonarqube:sonarqube-enterprise:yguard,' +
'com.sonarsource.sonarqube:sonar-docs:zip')
// The name of this variable is important because it's used by the delivery process when extracting version from Artifactory build info.
clientConfig.info.addEnvironmentProperty('PROJECT_VERSION', "${version}")
}

+ 4
- 0
server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java Datei anzeigen

@@ -95,6 +95,10 @@ public class BranchDao implements Dao {
return mapper(dbSession).countNonMainBranches() > 0L;
}

public long countByTypeAndCreationDate(DbSession dbSession, BranchType branchType, long sinceDate) {
return mapper(dbSession).countByTypeAndCreationDate(branchType.name(), sinceDate);
}

private static BranchMapper mapper(DbSession dbSession) {
return dbSession.getMapper(BranchMapper.class);
}

+ 2
- 0
server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java Datei anzeigen

@@ -40,4 +40,6 @@ public interface BranchMapper {
List<BranchDto> selectByUuids(@Param("uuids") Collection<String> uuids);

long countNonMainBranches();

long countByTypeAndCreationDate(@Param("branchType")String branchType, @Param("sinceDate") long sinceDate);
}

+ 4
- 0
server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java Datei anzeigen

@@ -142,6 +142,10 @@ public class ComponentDao implements Dao {
return mapper(dbSession).countByNclocRanges();
}

public long countPublicNcloc(DbSession dbSession) {
return mapper(dbSession).countPublicNcloc();
}

public List<ComponentDto> selectSubProjectsByComponentUuids(DbSession session, Collection<String> uuids) {
if (uuids.isEmpty()) {
return emptyList();

+ 2
- 0
server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentMapper.java Datei anzeigen

@@ -78,6 +78,8 @@ public interface ComponentMapper {

List<KeyLongValue> countByNclocRanges();

long countPublicNcloc();

List<ComponentDto> selectDescendants(@Param("query") ComponentTreeQuery query, @Param("baseUuid") String baseUuid, @Param("baseUuidPath") String baseUuidPath);

/**

+ 8
- 0
server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml Datei anzeigen

@@ -95,4 +95,12 @@
pb.uuid &lt;&gt; pb.project_uuid
</select>

<select id="countByTypeAndCreationDate" parameterType="map" resultType="long">
select count(pb.uuid)
from project_branches pb
where
pb.branch_type = #{branchType, jdbcType=VARCHAR}
and pb.created_at &gt;= #{sinceDate, jdbcType=BIGINT}
</select>

</mapper>

+ 19
- 0
server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml Datei anzeigen

@@ -335,6 +335,25 @@
group by kee
</select>

<select id="countPublicNcloc" resultType="long">
select coalesce(sum(locs), 0)
from (
select b.project_uuid, max(lm.value) as locs
from live_measures lm
inner join metrics m on m.id = lm.metric_id
inner join projects p on p.uuid = lm.component_uuid
inner join project_branches b on b.uuid = p.uuid
where m.name = 'ncloc'
and p.enabled = ${_true}
and p.scope = 'PRJ'
and p.qualifier = 'TRK'
and p.copy_component_uuid is null
and b.branch_type = 'LONG'
and b.key_type = 'BRANCH'
group by b.project_uuid
) projectLocs
</select>

<select id="selectByQuery" resultType="Component">
select
<include refid="componentColumns"/>

+ 16
- 0
server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java Datei anzeigen

@@ -399,4 +399,20 @@ public class BranchDaoTest {
ComponentDto branch2 = db.components().insertProjectBranch(project);
assertThat(underTest.hasNonMainBranches(dbSession)).isTrue();
}

@Test
public void countByTypeAndCreationDate() {
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.LONG, 0L)).isEqualTo(0);

ComponentDto project = db.components().insertPrivateProject();
ComponentDto longBranch1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG));
ComponentDto longBranch2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG));
ComponentDto pr = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST));
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.LONG, 0L)).isEqualTo(2);
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.LONG, NOW)).isEqualTo(2);
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.LONG, NOW + 100)).isEqualTo(0);
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, 0L)).isEqualTo(1);
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, NOW)).isEqualTo(1);
assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, NOW + 100)).isEqualTo(0);
}
}

+ 36
- 0
server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java Datei anzeigen

@@ -1219,6 +1219,42 @@ public class ComponentDaoTest {
tuple("+1M", 0L));
}

@Test
public void countPublicNcloc_on_zero_projects() {
db.measures().insertMetric(m -> m.setKey(CoreMetrics.NCLOC_KEY));

assertThat(underTest.countPublicNcloc(dbSession)).isEqualTo(0L);
}

@Test
public void countPublicNcloc() {
MetricDto ncloc = db.measures().insertMetric(m -> m.setKey(CoreMetrics.NCLOC_KEY));

// public project with highest ncloc in non-main branch
OrganizationDto org = db.organizations().insert();
ComponentDto project1 = db.components().insertMainBranch(org);
ComponentDto project1Branch = db.components().insertProjectBranch(project1);
db.measures().insertLiveMeasure(project1, ncloc, m -> m.setValue(100.0));
db.measures().insertLiveMeasure(project1Branch, ncloc, m -> m.setValue(90_000.0));

// public project with only main branch
ComponentDto project2 = db.components().insertMainBranch(org);
db.measures().insertLiveMeasure(project2, ncloc, m -> m.setValue(50.0));

// public project with highest ncloc in main branch
ComponentDto project3 = db.components().insertMainBranch(org);
ComponentDto project3Branch = db.components().insertProjectBranch(project3);
db.measures().insertLiveMeasure(project3, ncloc, m -> m.setValue(80_000.0));
db.measures().insertLiveMeasure(project3Branch, ncloc, m -> m.setValue(25_000.0));

// private project is excluded
ComponentDto privateProject = db.components().insertPrivateProject(org);
db.measures().insertLiveMeasure(privateProject, ncloc, m -> m.setValue(1_000.0));

assertThat(underTest.countPublicNcloc(dbSession))
.isEqualTo(90_000L + 50 + 80_000);
}

@Test
public void select_ghost_projects() {
OrganizationDto organization = db.organizations().insert();

+ 1
- 10
server/sonar-web/public/images/languages/black/abap.svg Datei anzeigen

@@ -1,10 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 51.836 14.93">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<path id="Tracé_11993" data-name="Tracé 11993" class="cls-1" d="M34.126,15.924H28.733L27.707,19H24.436L29.994,4.07h2.851L38.433,19H35.162Zm-4.563-2.492H33.3L31.419,7.844ZM38.988,19V4.07h5.229a6.867,6.867,0,0,1,4.122,1.041,3.559,3.559,0,0,1,1.4,3.051,3.373,3.373,0,0,1-.564,1.933,3.258,3.258,0,0,1-1.569,1.225,3.152,3.152,0,0,1,1.81,1.159,3.426,3.426,0,0,1,.661,2.133,3.94,3.94,0,0,1-1.374,3.261A6.186,6.186,0,0,1,44.791,19Zm3.076-6.5v4.03H44.7a2.543,2.543,0,0,0,1.7-.518,1.776,1.776,0,0,0,.61-1.43A1.875,1.875,0,0,0,44.884,12.5Zm0-2.174H44.34q2.328-.041,2.328-1.856a1.715,1.715,0,0,0-.59-1.461,3.1,3.1,0,0,0-1.861-.446H42.064Zm17.914,5.6H54.585L53.559,19H50.288L55.846,4.07H58.7L64.285,19H61.014Zm-4.563-2.492h3.732L57.271,7.844Zm12.5.308V19H64.839V4.07h5.824a6.738,6.738,0,0,1,2.958.615,4.534,4.534,0,0,1,1.964,1.748,4.875,4.875,0,0,1,.687,2.579,4.287,4.287,0,0,1-1.5,3.461,6.257,6.257,0,0,1-4.158,1.266Zm0-2.492h2.748a2.7,2.7,0,0,0,1.861-.574,2.088,2.088,0,0,0,.641-1.641,2.463,2.463,0,0,0-.646-1.774,2.413,2.413,0,0,0-1.784-.7h-2.82Z" transform="translate(-24.437 -4.07)"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 51.836 14.93"><path data-name="Tracé 11993" d="M9.689 11.854H4.296L3.27 14.93H-.001L5.557 0h2.851l5.588 14.93h-3.271zM5.126 9.362h3.737L6.982 3.774zm9.425 5.568V0h5.229a6.867 6.867 0 0 1 4.122 1.041 3.559 3.559 0 0 1 1.4 3.051 3.373 3.373 0 0 1-.564 1.933 3.258 3.258 0 0 1-1.569 1.225 3.152 3.152 0 0 1 1.81 1.159 3.426 3.426 0 0 1 .661 2.133 3.94 3.94 0 0 1-1.374 3.261 6.186 6.186 0 0 1-3.912 1.127zm3.076-6.5v4.03h2.636a2.543 2.543 0 0 0 1.7-.518 1.776 1.776 0 0 0 .61-1.43 1.875 1.875 0 0 0-2.126-2.082zm0-2.174h2.276q2.328-.041 2.328-1.856a1.715 1.715 0 0 0-.59-1.461 3.1 3.1 0 0 0-1.861-.446h-2.153zm17.914 5.6h-5.393l-1.026 3.074h-3.271L31.409 0h2.854l5.585 14.93h-3.271zm-4.563-2.492h3.732l-1.876-5.59zm12.5.308v5.258h-3.076V0h5.824a6.738 6.738 0 0 1 2.958.615 4.534 4.534 0 0 1 1.964 1.748 4.875 4.875 0 0 1 .687 2.579 4.287 4.287 0 0 1-1.5 3.461 6.257 6.257 0 0 1-4.158 1.266zm0-2.492h2.748a2.7 2.7 0 0 0 1.861-.574 2.088 2.088 0 0 0 .641-1.641 2.463 2.463 0 0 0-.646-1.774 2.413 2.413 0 0 0-1.784-.7h-2.82z" fill="#2e3032"/></svg>

+ 1
- 29
server/sonar-web/public/images/languages/black/c-c-plus-plus.svg Datei anzeigen

@@ -1,29 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 53.435 60.056">
<defs>
<style>
.cls-1 {
fill: #6b7076;
}

.cls-2 {
fill: #4a4d50;
}

.cls-3 {
fill: #2e3032;
}

.cls-4 {
fill: #fff;
}
</style>
</defs>
<g id="Groupe_7545" data-name="Groupe 7545" transform="translate(-6792.164 -10501.433)">
<path id="Tracé_10199" data-name="Tracé 10199" class="cls-1" d="M53.432,17.924a5.3,5.3,0,0,0-.653-2.668,5.1,5.1,0,0,0-1.933-1.883Q40.175,7.22,29.5,1.076a5.24,5.24,0,0,0-5.679.056C20.99,2.8,6.814,10.924,2.589,13.37A4.934,4.934,0,0,0,0,17.922Q0,30.3,0,42.668a5.326,5.326,0,0,0,.625,2.617A5.084,5.084,0,0,0,2.587,47.22c4.224,2.447,18.4,10.568,21.233,12.238a5.241,5.241,0,0,0,5.68.056q10.667-6.159,21.347-12.3a5.086,5.086,0,0,0,1.962-1.934,5.333,5.333,0,0,0,.624-2.617s0-16.493,0-24.742" transform="translate(6792.164 10501.165)"/>
<path id="Tracé_10200" data-name="Tracé 10200" class="cls-2" d="M29.162,143.509,2.988,158.579a5.084,5.084,0,0,0,1.962,1.935c4.224,2.447,18.4,10.568,21.233,12.238a5.241,5.241,0,0,0,5.68.056q10.667-6.159,21.347-12.3a5.086,5.086,0,0,0,1.962-1.934L29.162,143.509" transform="translate(6789.801 10387.871)"/>
<path id="Tracé_10201" data-name="Tracé 10201" class="cls-2" d="M91.1,147.973a8.834,8.834,0,0,0,15.37-.051l-7.618-4.413L91.1,147.973" transform="translate(6720.109 10387.871)"/>
<path id="Tracé_10202" data-name="Tracé 10202" class="cls-3" d="M154.815,74.627a5.3,5.3,0,0,0-.653-2.668l-25.98,14.959,26.011,15.068a5.333,5.333,0,0,0,.624-2.617s0-16.493,0-24.742" transform="translate(6690.781 10444.462)"/>
<path id="Tracé_10203" data-name="Tracé 10203" class="cls-4" d="M197.6,133.283H195.57v2.033h-2.033v-2.033H191.5v-2.032h2.032v-2.033h2.033v2.033H197.6v2.032m-7.417,0h-2.032v2.033h-2.033v-2.033h-2.033v-2.032h2.033v-2.033h2.033v2.033h2.032v2.032" transform="translate(6646.563 10399.174)"/>
<path id="Tracé_10204" data-name="Tracé 10204" class="cls-4" d="M68.36,81.1A8.836,8.836,0,1,1,68.3,72.33l7.723-4.447a17.745,17.745,0,1,0,.046,17.681L68.36,81.1" transform="translate(6758.221 10454.696)"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 53.435 60.056"><defs><style>.cls-2{fill:#4a4d50}.cls-4{fill:#fff}</style></defs><g id="Groupe_7545" data-name="Groupe 7545" transform="translate(-6792.164 -10501.433)"><path id="Tracé_10199" data-name="Tracé 10199" d="M53.432 17.924a5.3 5.3 0 0 0-.653-2.668 5.1 5.1 0 0 0-1.933-1.883Q40.175 7.22 29.5 1.076a5.24 5.24 0 0 0-5.679.056C20.99 2.8 6.814 10.924 2.589 13.37A4.934 4.934 0 0 0 0 17.922v24.746a5.326 5.326 0 0 0 .625 2.617 5.084 5.084 0 0 0 1.962 1.935c4.224 2.447 18.4 10.568 21.233 12.238a5.241 5.241 0 0 0 5.68.056q10.667-6.159 21.347-12.3a5.086 5.086 0 0 0 1.962-1.934 5.333 5.333 0 0 0 .624-2.617V17.921" transform="translate(6792.164 10501.165)" fill="#6b7076"/><path id="Tracé_10200" data-name="Tracé 10200" class="cls-2" d="M29.162 143.509l-26.174 15.07a5.084 5.084 0 0 0 1.962 1.935c4.224 2.447 18.4 10.568 21.233 12.238a5.241 5.241 0 0 0 5.68.056q10.667-6.159 21.347-12.3a5.086 5.086 0 0 0 1.962-1.934l-26.01-15.065" transform="translate(6789.801 10387.871)"/><path id="Tracé_10201" data-name="Tracé 10201" class="cls-2" d="M91.1 147.973a8.834 8.834 0 0 0 15.37-.051l-7.618-4.413-7.752 4.464" transform="translate(6720.109 10387.871)"/><path id="Tracé_10202" data-name="Tracé 10202" d="M154.815 74.627a5.3 5.3 0 0 0-.653-2.668l-25.98 14.959 26.011 15.068a5.333 5.333 0 0 0 .624-2.617V74.627" transform="translate(6690.781 10444.462)" fill="#2e3032"/><path id="Tracé_10203" data-name="Tracé 10203" class="cls-4" d="M197.6 133.283h-2.03v2.033h-2.033v-2.033H191.5v-2.032h2.032v-2.033h2.033v2.033h2.035v2.032m-7.417 0h-2.032v2.033h-2.033v-2.033h-2.033v-2.032h2.033v-2.033h2.033v2.033h2.032v2.032" transform="translate(6646.563 10399.174)"/><path id="Tracé_10204" data-name="Tracé 10204" class="cls-4" d="M68.36 81.1a8.836 8.836 0 1 1-.06-8.77l7.723-4.447a17.745 17.745 0 1 0 .046 17.681L68.36 81.1" transform="translate(6758.221 10454.696)"/></g></svg>

+ 1
- 23
server/sonar-web/public/images/languages/black/csharp.svg Datei anzeigen

@@ -1,23 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.056 60.056">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}

.cls-2 {
fill: #4a4d50;
}

.cls-3 {
fill: #fff;
}
</style>
</defs>
<g id="Groupe_7543" data-name="Groupe 7543" transform="translate(-7196.293 -10382.932)">
<path id="Tracé_10198" data-name="Tracé 10198" class="cls-1" d="M29.615,0A29.615,29.615,0,1,1,0,29.615,29.615,29.615,0,0,1,29.615,0Z" transform="translate(7197.118 10382.932)"/>
<path id="Tracé_10195" data-name="Tracé 10195" class="cls-2" d="M9.022,9A29.615,29.615,0,1,0,50.835,50.813Z" transform="translate(7197.185 10382.261)"/>
<path id="Tracé_10196" data-name="Tracé 10196" class="cls-3" d="M29.025,41.72a13.679,13.679,0,0,1-6.478,1.37,10.393,10.393,0,0,1-7.968-3.2,11.827,11.827,0,0,1-2.989-8.413,12.392,12.392,0,0,1,3.369-9.042A11.43,11.43,0,0,1,23.528,19a13.7,13.7,0,0,1,5.5.925V22.84a11.106,11.106,0,0,0-5.553-1.4,8.487,8.487,0,0,0-6.478,2.684A10.115,10.115,0,0,0,14.5,31.3a9.625,9.625,0,0,0,2.332,6.793,7.941,7.941,0,0,0,6.127,2.527,11.5,11.5,0,0,0,6.08-1.564Z" transform="translate(7196.255 10381.517)"/>
<path id="Tracé_10197" data-name="Tracé 10197" class="cls-3" d="M51.276,25.934l-.37,1.721H46.648L45.63,32.542H50.2l-.435,1.721H45.288l-1.434,6.478H41.808l1.4-6.478H39.133l-1.37,6.478h-2l1.37-6.478H32.84l.324-1.721h4.313l.99-4.877H33.96l.342-1.721h4.507l1.37-6.543h2.064l-1.37,6.543h4.1l1.4-6.543h2L47,25.943ZM44.64,27.655H40.531l-1.064,4.886h4.128Z" transform="translate(7194.671 10381.485)"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.056 60.056"><defs><style>.cls-3{fill:#fff}</style></defs><g id="Groupe_7543" data-name="Groupe 7543" transform="translate(-7196.293 -10382.932)"><path id="Tracé_10198" data-name="Tracé 10198" d="M29.615 0A29.615 29.615 0 1 1 0 29.615 29.615 29.615 0 0 1 29.615 0z" transform="translate(7197.118 10382.932)" fill="#2e3032"/><path id="Tracé_10195" data-name="Tracé 10195" d="M9.022 9a29.615 29.615 0 1 0 41.813 41.813z" transform="translate(7197.185 10382.261)" fill="#4a4d50"/><path id="Tracé_10196" data-name="Tracé 10196" class="cls-3" d="M29.025 41.72a13.679 13.679 0 0 1-6.478 1.37 10.393 10.393 0 0 1-7.968-3.2 11.827 11.827 0 0 1-2.989-8.413 12.392 12.392 0 0 1 3.369-9.042A11.43 11.43 0 0 1 23.528 19a13.7 13.7 0 0 1 5.5.925v2.915a11.106 11.106 0 0 0-5.553-1.4 8.487 8.487 0 0 0-6.478 2.684A10.115 10.115 0 0 0 14.5 31.3a9.625 9.625 0 0 0 2.332 6.793 7.941 7.941 0 0 0 6.127 2.527 11.5 11.5 0 0 0 6.08-1.564z" transform="translate(7196.255 10381.517)"/><path id="Tracé_10197" data-name="Tracé 10197" class="cls-3" d="M51.276 25.934l-.37 1.721h-4.258l-1.018 4.887h4.57l-.435 1.721h-4.477l-1.434 6.478h-2.046l1.4-6.478h-4.075l-1.37 6.478h-2l1.37-6.478H32.84l.324-1.721h4.313l.99-4.877H33.96l.342-1.721h4.507l1.37-6.543h2.064l-1.37 6.543h4.1l1.4-6.543h2L47 25.943zm-6.636 1.721h-4.109l-1.064 4.886h4.128z" transform="translate(7194.671 10381.485)"/></g></svg>

+ 1
- 0
server/sonar-web/public/images/languages/black/css.svg Datei anzeigen

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40.223 56.773"><defs><style>.cls-1{fill:#2e3032}.cls-3{fill:#fff}</style></defs><g id="CSS3_logo_and_wordmark_1_" data-name="CSS3_logo_and_wordmark (1)" transform="translate(-193.633 -276.362)"><g id="g3013" transform="translate(193.633 276.362)"><path id="polygon2989" class="cls-1" d="M114.855 100.62l-3.664 41.05-16.471 4.566-16.426-4.56-3.66-41.056z" transform="translate(-74.633 -89.463)"/><path id="polygon2991" d="M269.31 165.973l3.131-35.079H256v38.769z" transform="translate(-235.889 -116.38)" fill="#4a4d50"/><path id="polygon2993" class="cls-3" d="M150.31 268.217l.451 5.035h11.269v-5.035z" transform="translate(-141.918 -238.475)"/><path id="polygon2995" class="cls-3" d="M154.758 176.3h-12.626l.458 5.035h12.169z" transform="translate(-134.647 -156.755)"/><path id="polygon2997" class="cls-3" d="M167.452 347.1v-5.239l-.022.006-5.608-1.514-.359-4.016h-5.055l.705 7.906 10.315 2.863z" transform="translate(-147.341 -299.038)"/><path id="path2999" class="cls-1" d="M160 0h6.1v2.55h-3.55V5.1h3.55v2.55H160z" transform="translate(-150.534)"/><path id="path3001" class="cls-1" d="M226 0h6.1v2.218h-3.55v.444h3.55v5.1H226V5.433h3.548V4.99H226z" transform="translate(-209.215)"/><path id="path3003" class="cls-1" d="M292 0h6.1v2.218h-3.55v.444h3.55v5.1H292V5.433h3.548V4.99H292z" transform="translate(-267.897)"/><path id="polygon3005" class="cls-3" d="M262.044 191.532l-.584 6.531-5.616 1.516v5.239l10.323-2.861.076-.851 1.183-13.257.123-1.352.909-10.192h-12.615v5.035h7.1l-.458 5.156h-6.637v5.035z" transform="translate(-235.749 -156.755)"/></g></g></svg>

+ 1
- 44
server/sonar-web/public/images/languages/black/go.svg Datei anzeigen

@@ -1,44 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 91.042 34.014">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<g id="Groupe_7546" data-name="Groupe 7546" transform="translate(-6892.702 -10514.941)">
<g id="Groupe_7247" data-name="Groupe 7247" transform="translate(6899.396 10523.601)">
<g id="Groupe_7246" data-name="Groupe 7246" transform="translate(0)">
<g id="Groupe_7245" data-name="Groupe 7245">
<path id="Tracé_11502" data-name="Tracé 11502" class="cls-1" d="M39.977,99.04c-.177,0-.222-.089-.133-.222l.931-1.2a.635.635,0,0,1,.488-.222H57.087c.177,0,.222.133.133.266l-.754,1.152a.675.675,0,0,1-.443.266Z" transform="translate(-39.8 -97.4)"/>
</g>
</g>
</g>
<g id="Groupe_7250" data-name="Groupe 7250" transform="translate(6892.702 10527.679)">
<g id="Groupe_7249" data-name="Groupe 7249">
<g id="Groupe_7248" data-name="Groupe 7248">
<path id="Tracé_11503" data-name="Tracé 11503" class="cls-1" d="M24.877,108.24c-.177,0-.222-.089-.133-.222l.931-1.2a.635.635,0,0,1,.488-.222H46.376a.2.2,0,0,1,.222.266l-.355,1.064a.388.388,0,0,1-.4.266Z" transform="translate(-24.7 -106.6)"/>
</g>
</g>
</g>
<g id="Groupe_7253" data-name="Groupe 7253" transform="translate(6903.429 10531.757)">
<g id="Groupe_7252" data-name="Groupe 7252" transform="translate(0 0)">
<g id="Groupe_7251" data-name="Groupe 7251">
<path id="Tracé_11504" data-name="Tracé 11504" class="cls-1" d="M49.077,117.44c-.177,0-.222-.133-.133-.266l.621-1.108a.588.588,0,0,1,.443-.266h8.865c.177,0,.266.133.266.31l-.089,1.064a.333.333,0,0,1-.31.31Z" transform="translate(-48.9 -115.8)"/>
</g>
</g>
</g>
<g id="Groupe_7257" data-name="Groupe 7257" transform="translate(6916.867 10514.941)">
<g id="CXHf1q_3_" transform="translate(0)">
<g id="Groupe_7256" data-name="Groupe 7256">
<g id="Groupe_7254" data-name="Groupe 7254">
<path id="Tracé_11505" data-name="Tracé 11505" class="cls-1" d="M111.966,87.367c-2.793.709-4.7,1.241-7.447,1.95-.665.177-.709.222-1.285-.443a5.934,5.934,0,0,0-2.083-1.684,7.707,7.707,0,0,0-8.023.665,9.427,9.427,0,0,0-4.521,8.422,6.949,6.949,0,0,0,5.984,6.959,8.181,8.181,0,0,0,7.536-2.926c.4-.488.754-1.02,1.2-1.64H94.767c-.931,0-1.152-.576-.842-1.33.576-1.374,1.64-3.679,2.261-4.832a1.2,1.2,0,0,1,1.108-.709h16.135c-.089,1.2-.089,2.394-.266,3.59a18.9,18.9,0,0,1-3.635,8.688,18.465,18.465,0,0,1-12.633,7.536,15.7,15.7,0,0,1-11.924-2.926,13.923,13.923,0,0,1-5.63-9.841A17.4,17.4,0,0,1,83.109,85.86a19.671,19.671,0,0,1,12.412-7.669,15.275,15.275,0,0,1,11.747,2.172,13.9,13.9,0,0,1,5.142,6.25C112.675,87.012,112.5,87.234,111.966,87.367Z" transform="translate(-79.215 -77.866)"/>
</g>
<g id="Groupe_7255" data-name="Groupe 7255" transform="translate(31.597 0.41)">
<path id="Tracé_11506" data-name="Tracé 11506" class="cls-1" d="M166.323,112.4a16.629,16.629,0,0,1-10.816-3.9,13.9,13.9,0,0,1-4.787-8.555,16.921,16.921,0,0,1,3.59-13.387,18.582,18.582,0,0,1,12.411-7.4c4.521-.8,8.777-.355,12.633,2.261A13.8,13.8,0,0,1,185.6,91.3a17.111,17.111,0,0,1-5.1,15.027A20.312,20.312,0,0,1,169.869,112C168.672,112.218,167.475,112.262,166.323,112.4Zm10.55-17.908a12.755,12.755,0,0,0-.133-1.463,7.3,7.3,0,0,0-9.043-5.9,9.683,9.683,0,0,0-7.757,7.713,7.3,7.3,0,0,0,4.078,8.378,8.126,8.126,0,0,0,7.225-.266A9.7,9.7,0,0,0,176.872,94.487Z" transform="translate(-150.496 -78.792)"/>
</g>
</g>
</g>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 91.042 34.014"><defs><style>.cls-1{fill:#2e3032}</style></defs><g id="Groupe_7546" data-name="Groupe 7546" transform="translate(-6892.702 -10514.941)"><g id="Groupe_7247" data-name="Groupe 7247" transform="translate(6899.396 10523.601)"><g id="Groupe_7246" data-name="Groupe 7246"><g id="Groupe_7245" data-name="Groupe 7245"><path id="Tracé_11502" data-name="Tracé 11502" class="cls-1" d="M39.977 99.04c-.177 0-.222-.089-.133-.222l.931-1.2a.635.635 0 0 1 .488-.222h15.824c.177 0 .222.133.133.266l-.754 1.152a.675.675 0 0 1-.443.266z" transform="translate(-39.8 -97.4)"/></g></g></g><g id="Groupe_7250" data-name="Groupe 7250" transform="translate(6892.702 10527.679)"><g id="Groupe_7249" data-name="Groupe 7249"><g id="Groupe_7248" data-name="Groupe 7248"><path id="Tracé_11503" data-name="Tracé 11503" class="cls-1" d="M24.877 108.24c-.177 0-.222-.089-.133-.222l.931-1.2a.635.635 0 0 1 .488-.222h20.213a.2.2 0 0 1 .222.266l-.355 1.064a.388.388 0 0 1-.4.266z" transform="translate(-24.7 -106.6)"/></g></g></g><g id="Groupe_7253" data-name="Groupe 7253" transform="translate(6903.429 10531.757)"><g id="Groupe_7252" data-name="Groupe 7252"><g id="Groupe_7251" data-name="Groupe 7251"><path id="Tracé_11504" data-name="Tracé 11504" class="cls-1" d="M49.077 117.44c-.177 0-.222-.133-.133-.266l.621-1.108a.588.588 0 0 1 .443-.266h8.865c.177 0 .266.133.266.31l-.089 1.064a.333.333 0 0 1-.31.31z" transform="translate(-48.9 -115.8)"/></g></g></g><g id="Groupe_7257" data-name="Groupe 7257" transform="translate(6916.867 10514.941)"><g id="CXHf1q_3_"><g id="Groupe_7256" data-name="Groupe 7256"><g id="Groupe_7254" data-name="Groupe 7254"><path id="Tracé_11505" data-name="Tracé 11505" class="cls-1" d="M111.966 87.367c-2.793.709-4.7 1.241-7.447 1.95-.665.177-.709.222-1.285-.443a5.934 5.934 0 0 0-2.083-1.684 7.707 7.707 0 0 0-8.023.665 9.427 9.427 0 0 0-4.521 8.422 6.949 6.949 0 0 0 5.984 6.959 8.181 8.181 0 0 0 7.536-2.926c.4-.488.754-1.02 1.2-1.64h-8.56c-.931 0-1.152-.576-.842-1.33.576-1.374 1.64-3.679 2.261-4.832a1.2 1.2 0 0 1 1.108-.709h16.135c-.089 1.2-.089 2.394-.266 3.59a18.9 18.9 0 0 1-3.635 8.688 18.465 18.465 0 0 1-12.633 7.536 15.7 15.7 0 0 1-11.924-2.926 13.923 13.923 0 0 1-5.63-9.841 17.4 17.4 0 0 1 3.768-12.986 19.671 19.671 0 0 1 12.412-7.669 15.275 15.275 0 0 1 11.747 2.172 13.9 13.9 0 0 1 5.142 6.25c.265.399.09.621-.444.754z" transform="translate(-79.215 -77.866)"/></g><g id="Groupe_7255" data-name="Groupe 7255" transform="translate(31.597 .41)"><path id="Tracé_11506" data-name="Tracé 11506" class="cls-1" d="M166.323 112.4a16.629 16.629 0 0 1-10.816-3.9 13.9 13.9 0 0 1-4.787-8.555 16.921 16.921 0 0 1 3.59-13.387 18.582 18.582 0 0 1 12.411-7.4c4.521-.8 8.777-.355 12.633 2.261A13.8 13.8 0 0 1 185.6 91.3a17.111 17.111 0 0 1-5.1 15.027A20.312 20.312 0 0 1 169.869 112c-1.197.218-2.394.262-3.546.4zm10.55-17.908a12.755 12.755 0 0 0-.133-1.463 7.3 7.3 0 0 0-9.043-5.9 9.683 9.683 0 0 0-7.757 7.713 7.3 7.3 0 0 0 4.078 8.378 8.126 8.126 0 0 0 7.225-.266 9.7 9.7 0 0 0 5.629-8.467z" transform="translate(-150.496 -78.792)"/></g></g></g></g></g></svg>

+ 1
- 24
server/sonar-web/public/images/languages/black/html5.svg Datei anzeigen

@@ -1,24 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40.057 56.531">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}

.cls-2 {
fill: #4a4d50;
}

.cls-3 {
fill: #fff;
}
</style>
</defs>
<g id="Groupe_7549" data-name="Groupe 7549" transform="translate(-6925.663 -10618)">
<path id="Tracé_10304" data-name="Tracé 10304" class="cls-1" d="M108.4,0h2.539V2.517h2.341V0h2.539V7.618H113.28V5.079h-2.319V7.618H108.4m10.776-5.079h-2.241V0h7.033V2.539h-2.252V7.618h-2.539M125.083,0h2.661l1.634,2.683L131.012,0h2.661V7.618h-2.539V3.842l-1.778,2.738-1.778-2.738V7.618h-2.5M134.932,0h2.539V5.1h3.6V7.618h-6.139" transform="translate(6820.995 10618)"/>
<path id="Tracé_10305" data-name="Tracé 10305" class="cls-1" d="M78.244,141.5,74.6,100.6h40.057l-3.644,40.874L94.6,146.023" transform="translate(6851.063 10528.508)"/>
<path id="Tracé_10306" data-name="Tracé 10306" class="cls-2" d="M256,169.589V131h16.374l-3.125,34.89" transform="translate(6689.692 10501.464)"/>
<path id="Tracé_10307" data-name="Tracé 10307" class="cls-3" d="M142,176.3h12.587v5.013H147.5l.464,5.134h6.625v5H143.369m.221,2.517h5.035l.353,4.008,5.609,1.5v5.234l-10.29-2.871" transform="translate(6791.105 10461.165)"/>
<path id="Tracé_10308" data-name="Tracé 10308" class="cls-3" d="M268.365,176.3H255.8v5.013h12.1m-.453,5.134H255.8v5.013h6.183l-.585,6.514-5.6,1.5v5.211l10.268-2.849" transform="translate(6689.87 10461.165)"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40.057 56.531"><defs><style>.cls-1{fill:#2e3032}.cls-3{fill:#fff}</style></defs><g id="Groupe_7549" data-name="Groupe 7549" transform="translate(-6925.663 -10618)"><path id="Tracé_10304" data-name="Tracé 10304" class="cls-1" d="M108.4 0h2.539v2.517h2.341V0h2.539v7.618h-2.539V5.079h-2.319v2.539H108.4m10.776-5.079h-2.241V0h7.033v2.539h-2.252v5.079h-2.539M125.083 0h2.661l1.634 2.683L131.012 0h2.661v7.618h-2.539V3.842l-1.778 2.738-1.778-2.738v3.776h-2.5M134.932 0h2.539v5.1h3.6v2.518h-6.139" transform="translate(6820.995 10618)"/><path id="Tracé_10305" data-name="Tracé 10305" class="cls-1" d="M78.244 141.5L74.6 100.6h40.057l-3.644 40.874-16.413 4.549" transform="translate(6851.063 10528.508)"/><path id="Tracé_10306" data-name="Tracé 10306" d="M256 169.589V131h16.374l-3.125 34.89" transform="translate(6689.692 10501.464)" fill="#4a4d50"/><path id="Tracé_10307" data-name="Tracé 10307" class="cls-3" d="M142 176.3h12.587v5.013H147.5l.464 5.134h6.625v5h-11.22m.221 2.517h5.035l.353 4.008 5.609 1.5v5.234l-10.29-2.871" transform="translate(6791.105 10461.165)"/><path id="Tracé_10308" data-name="Tracé 10308" class="cls-3" d="M268.365 176.3H255.8v5.013h12.1m-.453 5.134H255.8v5.013h6.183l-.585 6.514-5.6 1.5v5.211l10.268-2.849" transform="translate(6689.87 10461.165)"/></g></svg>

+ 1
- 23
server/sonar-web/public/images/languages/black/java.svg Datei anzeigen

@@ -1,23 +1 @@
<svg id="Groupe_7533" data-name="Groupe 7533" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 39.004 72.543">
<defs>
<style>
.cls-1 {
fill: #2e3032;
fill-rule: evenodd;
}
</style>
</defs>
<path id="Tracé_10176" data-name="Tracé 10176" class="cls-1" d="M97.814,349.592s-1.9,1.106,1.354,1.479a28.484,28.484,0,0,0,10.3-.436,18.015,18.015,0,0,0,2.74,1.336c-9.741,4.173-22.047-.242-14.4-2.38Z" transform="translate(-84.919 -311.112)"/>
<path id="Tracé_10177" data-name="Tracé 10177" class="cls-1" d="M84.688,300.1s-2.132,1.578,1.125,1.915a40.2,40.2,0,0,0,13.3-.638,5.88,5.88,0,0,0,2.046,1.248c-11.776,3.445-24.892.271-16.467-2.525Z" transform="translate(-72.984 -267.071)"/>
<path id="Tracé_10178" data-name="Tracé 10178" class="cls-1" d="M179.7,105.966c2.4,2.764-.63,5.25-.63,5.25s6.094-3.145,3.3-7.086c-2.614-3.673-4.619-5.5,6.233-11.791,0,0-17.034,4.253-8.9,13.628Z" transform="translate(-157.96 -82.174)"/>
<path id="Tracé_10179" data-name="Tracé 10179" class="cls-1" d="M43.326,382.8s1.407,1.16-1.549,2.057c-5.621,1.7-23.4,2.216-28.34.068-1.774-.773,1.554-1.844,2.6-2.07a6.8,6.8,0,0,1,1.715-.193c-1.974-1.39-12.761,2.731-5.479,3.912,19.86,3.219,36.2-1.45,31.051-3.774Z" transform="translate(-8.704 -340.286)"/>
<path id="Tracé_10180" data-name="Tracé 10180" class="cls-1" d="M54.825,248.756s-9.043,2.148-3.2,2.929a67.916,67.916,0,0,0,11.963-.13c3.743-.314,7.5-.986,7.5-.986a15.948,15.948,0,0,0-2.274,1.217c-9.185,2.416-26.925,1.291-21.817-1.179a17.094,17.094,0,0,1,7.83-1.851Z" transform="translate(-41.015 -221.368)"/>
<path id="Tracé_10181" data-name="Tracé 10181" class="cls-1" d="M271.338,254.01c9.336-4.85,5.019-9.511,2.006-8.884a7.061,7.061,0,0,0-1.067.287,1.7,1.7,0,0,1,.8-.615c5.961-2.095,10.544,6.18-1.922,9.457a.829.829,0,0,0,.187-.245Z" transform="translate(-241.305 -217.555)"/>
<path id="Tracé_10182" data-name="Tracé 10182" class="cls-1" d="M128.721,0s5.169,5.172-4.9,13.123c-8.078,6.381-1.842,10.017,0,14.175-4.716-4.255-8.175-8-5.855-11.486C121.366,10.7,130.806,8.215,128.721,0Z" transform="translate(-104.316 0)"/>
<path id="Tracé_10183" data-name="Tracé 10183" class="cls-1" d="M76.926,413.781c8.96.573,22.722-.319,23.047-4.559,0,0-.626,1.607-7.405,2.882a73.621,73.621,0,0,1-22.677.349s1.146.948,7.034,1.327Z" transform="translate(-62.199 -364.178)"/>
<path id="Tracé_10184" data-name="Tracé 10184" class="cls-1" d="M337.22,518.483h-.273v-.153h.735v.153h-.272v.762h-.19v-.762Zm1.467.039h0l-.271.724h-.125l-.269-.724h0v.724h-.18v-.915h.264l.249.648.25-.648h.263v.915h-.175v-.724Z" transform="translate(-299.859 -461.277)"/>
<path id="Tracé_10185" data-name="Tracé 10185" class="cls-1" d="M66.813,525.293a4.07,4.07,0,0,1-2.54,1.144,1.62,1.62,0,0,1-1.762-1.785c0-1.189.663-2.059,3.32-2.059h.982v2.7Zm2.332,2.631V519.78c0-2.082-1.187-3.456-4.049-3.456a10.682,10.682,0,0,0-4.323.938l.342,1.443a10.041,10.041,0,0,1,3.339-.664c1.649,0,2.358.664,2.358,2.037v1.03H65.99c-4,0-5.812,1.553-5.812,3.889,0,2.013,1.191,3.157,3.433,3.157a5.177,5.177,0,0,0,3.522-1.466l.183,1.236Z" transform="translate(-53.554 -459.492)"/>
<path id="Tracé_10186" data-name="Tracé 10186" class="cls-1" d="M160.541,529.607h-2.908l-3.5-11.393h2.54l2.173,7,.483,2.1a43.88,43.88,0,0,0,2.264-9.1h2.471a46.188,46.188,0,0,1-3.521,11.393Z" transform="translate(-137.166 -461.174)"/>
<path id="Tracé_10187" data-name="Tracé 10187" class="cls-1" d="M260.1,525.293a4.083,4.083,0,0,1-2.541,1.144,1.62,1.62,0,0,1-1.762-1.785c0-1.189.665-2.059,3.319-2.059h.984v2.7Zm2.333,2.631V519.78c0-2.082-1.191-3.456-4.049-3.456a10.683,10.683,0,0,0-4.325.938l.343,1.443a10.057,10.057,0,0,1,3.341-.664c1.647,0,2.357.664,2.357,2.037v1.03h-.824c-4.006,0-5.812,1.553-5.812,3.889,0,2.013,1.189,3.157,3.431,3.157a5.184,5.184,0,0,0,3.524-1.466l.184,1.236Z" transform="translate(-225.568 -459.492)"/>
<path id="Tracé_10188" data-name="Tracé 10188" class="cls-1" d="M4.066,498.779a6.122,6.122,0,0,1-2.915,2.174L0,499.6a4.84,4.84,0,0,0,2.019-1.891,7.317,7.317,0,0,0,.436-3.3V481.4H4.934v12.829c0,2.532-.2,3.555-.868,4.552Z" transform="translate(0 -428.41)"/>
</svg>
<svg id="Groupe_7533" data-name="Groupe 7533" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 39.004 72.543"><defs><style>.cls-1{fill:#2e3032;fill-rule:evenodd}</style></defs><path id="Tracé_10176" data-name="Tracé 10176" class="cls-1" d="M97.814 349.592s-1.9 1.106 1.354 1.479a28.484 28.484 0 0 0 10.3-.436 18.015 18.015 0 0 0 2.74 1.336c-9.741 4.173-22.047-.242-14.4-2.38z" transform="translate(-84.919 -311.112)"/><path id="Tracé_10177" data-name="Tracé 10177" class="cls-1" d="M84.688 300.1s-2.132 1.578 1.125 1.915a40.2 40.2 0 0 0 13.3-.638 5.88 5.88 0 0 0 2.046 1.248c-11.776 3.445-24.892.271-16.467-2.525z" transform="translate(-72.984 -267.071)"/><path id="Tracé_10178" data-name="Tracé 10178" class="cls-1" d="M179.7 105.966c2.4 2.764-.63 5.25-.63 5.25s6.094-3.145 3.3-7.086c-2.614-3.673-4.619-5.5 6.233-11.791 0 0-17.034 4.253-8.9 13.628z" transform="translate(-157.96 -82.174)"/><path id="Tracé_10179" data-name="Tracé 10179" class="cls-1" d="M43.326 382.8s1.407 1.16-1.549 2.057c-5.621 1.7-23.4 2.216-28.34.068-1.774-.773 1.554-1.844 2.6-2.07a6.8 6.8 0 0 1 1.715-.193c-1.974-1.39-12.761 2.731-5.479 3.912 19.86 3.219 36.2-1.45 31.051-3.774z" transform="translate(-8.704 -340.286)"/><path id="Tracé_10180" data-name="Tracé 10180" class="cls-1" d="M54.825 248.756s-9.043 2.148-3.2 2.929a67.916 67.916 0 0 0 11.963-.13c3.743-.314 7.5-.986 7.5-.986a15.948 15.948 0 0 0-2.274 1.217c-9.185 2.416-26.925 1.291-21.817-1.179a17.094 17.094 0 0 1 7.83-1.851z" transform="translate(-41.015 -221.368)"/><path id="Tracé_10181" data-name="Tracé 10181" class="cls-1" d="M271.338 254.01c9.336-4.85 5.019-9.511 2.006-8.884a7.061 7.061 0 0 0-1.067.287 1.7 1.7 0 0 1 .8-.615c5.961-2.095 10.544 6.18-1.922 9.457a.829.829 0 0 0 .187-.245z" transform="translate(-241.305 -217.555)"/><path id="Tracé_10182" data-name="Tracé 10182" class="cls-1" d="M128.721 0s5.169 5.172-4.9 13.123c-8.078 6.381-1.842 10.017 0 14.175-4.716-4.255-8.175-8-5.855-11.486 3.4-5.112 12.84-7.597 10.755-15.812z" transform="translate(-104.316)"/><path id="Tracé_10183" data-name="Tracé 10183" class="cls-1" d="M76.926 413.781c8.96.573 22.722-.319 23.047-4.559 0 0-.626 1.607-7.405 2.882a73.621 73.621 0 0 1-22.677.349s1.146.948 7.034 1.327z" transform="translate(-62.199 -364.178)"/><path id="Tracé_10184" data-name="Tracé 10184" class="cls-1" d="M337.22 518.483h-.273v-.153h.735v.153h-.272v.762h-.19v-.762zm1.467.039l-.271.724h-.125l-.269-.724v.724h-.18v-.915h.264l.249.648.25-.648h.263v.915h-.175v-.724z" transform="translate(-299.859 -461.277)"/><path id="Tracé_10185" data-name="Tracé 10185" class="cls-1" d="M66.813 525.293a4.07 4.07 0 0 1-2.54 1.144 1.62 1.62 0 0 1-1.762-1.785c0-1.189.663-2.059 3.32-2.059h.982v2.7zm2.332 2.631v-8.144c0-2.082-1.187-3.456-4.049-3.456a10.682 10.682 0 0 0-4.323.938l.342 1.443a10.041 10.041 0 0 1 3.339-.664c1.649 0 2.358.664 2.358 2.037v1.03h-.822c-4 0-5.812 1.553-5.812 3.889 0 2.013 1.191 3.157 3.433 3.157a5.177 5.177 0 0 0 3.522-1.466l.183 1.236z" transform="translate(-53.554 -459.492)"/><path id="Tracé_10186" data-name="Tracé 10186" class="cls-1" d="M160.541 529.607h-2.908l-3.5-11.393h2.54l2.173 7 .483 2.1a43.88 43.88 0 0 0 2.264-9.1h2.471a46.188 46.188 0 0 1-3.521 11.393z" transform="translate(-137.166 -461.174)"/><path id="Tracé_10187" data-name="Tracé 10187" class="cls-1" d="M260.1 525.293a4.083 4.083 0 0 1-2.541 1.144 1.62 1.62 0 0 1-1.762-1.785c0-1.189.665-2.059 3.319-2.059h.984v2.7zm2.333 2.631v-8.144c0-2.082-1.191-3.456-4.049-3.456a10.683 10.683 0 0 0-4.325.938l.343 1.443a10.057 10.057 0 0 1 3.341-.664c1.647 0 2.357.664 2.357 2.037v1.03h-.824c-4.006 0-5.812 1.553-5.812 3.889 0 2.013 1.189 3.157 3.431 3.157a5.184 5.184 0 0 0 3.524-1.466l.184 1.236z" transform="translate(-225.568 -459.492)"/><path id="Tracé_10188" data-name="Tracé 10188" class="cls-1" d="M4.066 498.779a6.122 6.122 0 0 1-2.915 2.174L0 499.6a4.84 4.84 0 0 0 2.019-1.891 7.317 7.317 0 0 0 .436-3.3V481.4h2.479v12.829c0 2.532-.2 3.555-.868 4.552z" transform="translate(0 -428.41)"/></svg>

+ 1
- 15
server/sonar-web/public/images/languages/black/js.svg Datei anzeigen

@@ -1,15 +1 @@
<svg id="Unofficial_JavaScript_logo_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.208 60.207">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}

.cls-2 {
fill: #fff;
}
</style>
</defs>
<rect id="Rectangle_5722" data-name="Rectangle 5722" class="cls-1" width="60.207" height="60.207"/>
<path id="Tracé_10175" data-name="Tracé 10175" class="cls-2" d="M190.471,305.605c1.213,1.98,2.791,3.436,5.581,3.436,2.344,0,3.842-1.172,3.842-2.791,0-1.94-1.539-2.627-4.119-3.756l-1.414-.607c-4.083-1.739-6.795-3.918-6.795-8.524,0-4.243,3.233-7.473,8.286-7.473,3.6,0,6.183,1.252,8.047,4.53l-4.406,2.829c-.97-1.739-2.016-2.425-3.641-2.425a2.462,2.462,0,0,0-2.707,2.425c0,1.7,1.051,2.384,3.479,3.436l1.414.606c4.807,2.061,7.521,4.163,7.521,8.888,0,5.094-4,7.884-9.375,7.884-5.254,0-8.649-2.5-10.31-5.786Zm-19.986.49c.889,1.577,1.7,2.91,3.641,2.91,1.859,0,3.031-.727,3.031-3.555V286.213h5.658v19.314c0,5.858-3.435,8.524-8.448,8.524a8.783,8.783,0,0,1-8.487-5.168Z" transform="translate(-150.027 -258.568)"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.208 60.207"><path data-name="Rectangle 5722" fill="#2e3032" d="M0 0h60.207v60.207H0z"/><path data-name="Tracé 10175" d="M40.444 47.037c1.213 1.98 2.791 3.436 5.581 3.436 2.344 0 3.842-1.172 3.842-2.791 0-1.94-1.539-2.627-4.119-3.756l-1.414-.607c-4.083-1.739-6.795-3.918-6.795-8.524 0-4.243 3.233-7.473 8.286-7.473 3.6 0 6.183 1.252 8.047 4.53l-4.406 2.829c-.97-1.739-2.016-2.425-3.641-2.425a2.462 2.462 0 0 0-2.707 2.425c0 1.7 1.051 2.384 3.479 3.436l1.414.606c4.807 2.061 7.521 4.163 7.521 8.888 0 5.094-4 7.884-9.375 7.884-5.254 0-8.649-2.5-10.31-5.786zm-19.986.49c.889 1.577 1.7 2.91 3.641 2.91 1.859 0 3.031-.727 3.031-3.555V27.645h5.658v19.314c0 5.858-3.435 8.524-8.448 8.524a8.783 8.783 0 0 1-8.487-5.168z" fill="#fff"/></svg>

+ 1
- 24
server/sonar-web/public/images/languages/black/kotlin.svg Datei anzeigen

@@ -1,24 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 41.206 41.206">
<defs>
<style>
.cls-1 {
fill: #6b7076;
}

.cls-2 {
fill: #2e3032;
}

.cls-3 {
fill: #4a4d50;
}
</style>
</defs>
<g id="Groupe_7547" data-name="Groupe 7547" transform="translate(-7064.794 -10496.794)">
<g id="Kotlin-logo" transform="translate(7064.794 10496.794)">
<path id="XMLID_2_" class="cls-1" d="M0,50.572,20.672,29.9,41.206,50.572Z" transform="translate(0 -9.366)"/>
<path id="Tracé_11935" data-name="Tracé 11935" class="cls-2" d="M0,0H20.672L0,22.32Z"/>
<path id="Tracé_11936" data-name="Tracé 11936" class="cls-3" d="M20.672,0,0,21.771V41.206L20.672,20.534,41.206,0Z"/>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 41.206 41.206"><g data-name="Groupe 7547"><path d="M0 41.206l20.672-20.672 20.534 20.672z" fill="#6b7076"/><path data-name="Tracé 11935" d="M0 0h20.672L0 22.32z" fill="#2e3032"/><path data-name="Tracé 11936" d="M20.672 0L0 21.771v19.435l20.672-20.672L41.206 0z" fill="#4a4d50"/></g></svg>

+ 1
- 10
server/sonar-web/public/images/languages/black/obj-c.svg Datei anzeigen

@@ -1,10 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.547 41.015">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<path id="Apple_logo_black" class="cls-1" d="M50.593,35.962a22.3,22.3,0,0,1-2.205,3.965,20.143,20.143,0,0,1-2.841,3.433A5.51,5.51,0,0,1,41.9,44.967a9.15,9.15,0,0,1-3.372-.805,9.676,9.676,0,0,0-3.63-.8,10,10,0,0,0-3.733.8,10.045,10.045,0,0,1-3.226.848A5.188,5.188,0,0,1,24.2,43.359,21.151,21.151,0,0,1,21.231,39.8a24.583,24.583,0,0,1-3.142-6.241,22.851,22.851,0,0,1-1.319-7.438,13.582,13.582,0,0,1,1.784-7.106,10.463,10.463,0,0,1,3.736-3.779,10.049,10.049,0,0,1,5.05-1.425,11.891,11.891,0,0,1,3.906.909,12.557,12.557,0,0,0,3.1.911,18.539,18.539,0,0,0,3.435-1.073,11.356,11.356,0,0,1,4.67-.829,9.915,9.915,0,0,1,7.767,4.089,8.64,8.64,0,0,0-4.582,7.849A8.659,8.659,0,0,0,48.477,32.2a9.343,9.343,0,0,0,2.841,1.863q-.342.991-.724,1.9ZM42.679,4.82a8.75,8.75,0,0,1-2.243,5.739c-1.8,2.107-3.983,3.325-6.347,3.133a6.385,6.385,0,0,1-.048-.777,8.99,8.99,0,0,1,2.38-5.8,9.162,9.162,0,0,1,2.9-2.176A8.643,8.643,0,0,1,42.636,4a7.45,7.45,0,0,1,.043.82Z" transform="translate(-16.77 -3.999)"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.547 41.015"><path d="M33.823 31.963a22.3 22.3 0 0 1-2.205 3.965 20.143 20.143 0 0 1-2.841 3.433 5.51 5.51 0 0 1-3.647 1.607 9.15 9.15 0 0 1-3.372-.805 9.676 9.676 0 0 0-3.63-.8 10 10 0 0 0-3.733.8 10.045 10.045 0 0 1-3.226.848A5.188 5.188 0 0 1 7.43 39.36a21.151 21.151 0 0 1-2.969-3.559 24.583 24.583 0 0 1-3.142-6.241A22.851 22.851 0 0 1 0 22.122a13.582 13.582 0 0 1 1.784-7.106 10.463 10.463 0 0 1 3.736-3.779 10.049 10.049 0 0 1 5.05-1.425 11.891 11.891 0 0 1 3.906.909 12.557 12.557 0 0 0 3.1.911 18.539 18.539 0 0 0 3.435-1.073 11.356 11.356 0 0 1 4.67-.829 9.915 9.915 0 0 1 7.767 4.089 8.64 8.64 0 0 0-4.582 7.849 8.659 8.659 0 0 0 2.841 6.533 9.343 9.343 0 0 0 2.841 1.863q-.342.991-.724 1.9zM25.909.821a8.75 8.75 0 0 1-2.243 5.739c-1.8 2.107-3.983 3.325-6.347 3.133a6.385 6.385 0 0 1-.048-.777 8.99 8.99 0 0 1 2.38-5.8 9.162 9.162 0 0 1 2.9-2.176 8.643 8.643 0 0 1 3.315-.939 7.45 7.45 0 0 1 .043.82z" fill="#2e3032"/></svg>

+ 1
- 12
server/sonar-web/public/images/languages/black/php.svg Datei anzeigen

@@ -1,12 +1 @@
<svg id="_4c69e694f411fe8138a5242020efdc8d" data-name="4c69e694f411fe8138a5242020efdc8d" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57.583 30.33">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<path id="Tracé_10232" data-name="Tracé 10232" class="cls-1" d="M239.078,425.051h-3.032l-1.246,6.41h2.832s3.449.088,3.608-4.154A1.96,1.96,0,0,0,239.078,425.051Z" transform="translate(-221.591 -414.286)"/>
<path id="Tracé_10233" data-name="Tracé 10233" class="cls-1" d="M679.577,425.051h-3.032l-1.246,6.41h2.832s3.449.088,3.608-4.154A1.958,1.958,0,0,0,679.577,425.051Z" transform="translate(-636.208 -414.286)"/>
<path id="Tracé_10234" data-name="Tracé 10234" class="cls-1" d="M38.792,241.9C22.892,241.9,10,248.692,10,257.065s12.892,15.165,28.792,15.165,28.792-6.787,28.792-15.165S54.692,241.9,38.792,241.9ZM25.9,261.455l-3.067-.023-.864,4.031H18.684L21.646,250.3s4.207.053,6.969,0,5.476,1.9,4.207,6.316C31.294,261.889,25.9,261.455,25.9,261.455Zm14.766,0s.787-3.525,1.134-5.97c.141-1,.764-2.715-.881-2.715-1.375-.006-3.431-.012-3.431-.012l-1.733,8.7H32.5l3.032-15.236h3.326l-.834,4.072h3.431s4.548-.358,4.007,3.4-1.551,7.762-1.551,7.762ZM58.7,256.619c-1.516,5.271-6.916,4.836-6.916,4.836l-3.067-.023-.864,4.031H44.568L47.529,250.3s4.207.053,6.969,0S59.968,252.194,58.7,256.619Z" transform="translate(-10 -241.9)"/>
</svg>
<svg id="_4c69e694f411fe8138a5242020efdc8d" data-name="4c69e694f411fe8138a5242020efdc8d" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57.583 30.33"><defs><style>.cls-1{fill:#2e3032}</style></defs><path id="Tracé_10232" data-name="Tracé 10232" class="cls-1" d="M239.078 425.051h-3.032l-1.246 6.41h2.832s3.449.088 3.608-4.154a1.96 1.96 0 0 0-2.162-2.256z" transform="translate(-221.591 -414.286)"/><path id="Tracé_10233" data-name="Tracé 10233" class="cls-1" d="M679.577 425.051h-3.032l-1.246 6.41h2.832s3.449.088 3.608-4.154a1.958 1.958 0 0 0-2.162-2.256z" transform="translate(-636.208 -414.286)"/><path id="Tracé_10234" data-name="Tracé 10234" class="cls-1" d="M38.792 241.9c-15.9 0-28.792 6.792-28.792 15.165s12.892 15.165 28.792 15.165 28.792-6.787 28.792-15.165S54.692 241.9 38.792 241.9zM25.9 261.455l-3.067-.023-.864 4.031h-3.285l2.962-15.163s4.207.053 6.969 0 5.476 1.9 4.207 6.316c-1.528 5.273-6.922 4.839-6.922 4.839zm14.766 0s.787-3.525 1.134-5.97c.141-1 .764-2.715-.881-2.715-1.375-.006-3.431-.012-3.431-.012l-1.733 8.7H32.5l3.032-15.236h3.326l-.834 4.072h3.431s4.548-.358 4.007 3.4-1.551 7.762-1.551 7.762zm18.034-4.836c-1.516 5.271-6.916 4.836-6.916 4.836l-3.067-.023-.864 4.031h-3.285l2.961-15.163s4.207.053 6.969 0 5.47 1.894 4.202 6.319z" transform="translate(-10 -241.9)"/></svg>

+ 1
- 10
server/sonar-web/public/images/languages/black/pl-sql.svg Datei anzeigen

@@ -1,10 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 65.578 17.801">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<path id="Tracé_11994" data-name="Tracé 11994" class="cls-1" d="M21.447,13.74V19H18.37V4.07h5.824a6.738,6.738,0,0,1,2.958.615,4.534,4.534,0,0,1,1.964,1.748A4.875,4.875,0,0,1,29.8,9.013a4.287,4.287,0,0,1-1.5,3.461,6.257,6.257,0,0,1-4.158,1.266Zm0-2.492h2.748a2.7,2.7,0,0,0,1.861-.574A2.088,2.088,0,0,0,26.7,9.033a2.463,2.463,0,0,0-.646-1.774,2.413,2.413,0,0,0-1.784-.7h-2.82Zm12.705,5.281h6.532V19H31.076V4.07h3.076Zm8.194,3.753h-2.2l5.5-16.211h2.2Zm14.008-5.2a1.579,1.579,0,0,0-.615-1.338,8.07,8.07,0,0,0-2.215-.984,15.7,15.7,0,0,1-2.533-1.02,4.138,4.138,0,0,1-2.543-3.7,3.605,3.605,0,0,1,.682-2.158A4.448,4.448,0,0,1,51.088,4.4a7.372,7.372,0,0,1,2.866-.533,6.71,6.71,0,0,1,2.851.579A4.539,4.539,0,0,1,58.748,6.08a4.28,4.28,0,0,1,.692,2.4H56.364a2.013,2.013,0,0,0-.646-1.594A2.655,2.655,0,0,0,53.9,6.316a2.837,2.837,0,0,0-1.753.477,1.5,1.5,0,0,0-.625,1.256,1.44,1.44,0,0,0,.733,1.22,8.283,8.283,0,0,0,2.158.923A9.326,9.326,0,0,1,58.24,12.15a3.9,3.9,0,0,1,1.2,2.912,3.593,3.593,0,0,1-1.466,3.04,6.419,6.419,0,0,1-3.948,1.1,7.623,7.623,0,0,1-3.138-.631,4.965,4.965,0,0,1-2.158-1.728,4.425,4.425,0,0,1-.743-2.543h3.086q0,2.471,2.953,2.471a2.873,2.873,0,0,0,1.712-.446A1.451,1.451,0,0,0,56.353,15.083Zm16.571-3.209a9,9,0,0,1-.677,3.635,6.24,6.24,0,0,1-1.876,2.476l2.481,1.948-1.958,1.733-3.179-2.553a6.728,6.728,0,0,1-1.128.092,6.211,6.211,0,0,1-3.312-.892,5.926,5.926,0,0,1-2.256-2.548,8.755,8.755,0,0,1-.81-3.809v-.738A8.965,8.965,0,0,1,61,7.336,5.917,5.917,0,0,1,63.25,4.762a6.581,6.581,0,0,1,6.634,0A5.917,5.917,0,0,1,72.13,7.336a8.94,8.94,0,0,1,.795,3.871ZM69.807,11.2a6.283,6.283,0,0,0-.841-3.568,2.97,2.97,0,0,0-4.789-.015,6.211,6.211,0,0,0-.851,3.532v.728a6.361,6.361,0,0,0,.841,3.548,2.944,2.944,0,0,0,4.8.046,6.324,6.324,0,0,0,.841-3.543Zm7.609,5.332h6.532V19H74.34V4.07h3.076Z" transform="translate(-18.371 -3.865)"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 65.578 17.801"><path data-name="Tracé 11994" d="M3.076 9.875v5.26H-.001V.205h5.824A6.738 6.738 0 0 1 8.781.82a4.534 4.534 0 0 1 1.964 1.748 4.875 4.875 0 0 1 .684 2.58 4.287 4.287 0 0 1-1.5 3.461 6.257 6.257 0 0 1-4.158 1.266zm0-2.492h2.748a2.7 2.7 0 0 0 1.861-.574 2.088 2.088 0 0 0 .644-1.641 2.463 2.463 0 0 0-.646-1.774 2.413 2.413 0 0 0-1.784-.7h-2.82zm12.705 5.281h6.532v2.471h-9.608V.205h3.076zm8.194 3.753h-2.2l5.5-16.211h2.2zm14.008-5.2a1.579 1.579 0 0 0-.615-1.338 8.07 8.07 0 0 0-2.215-.984 15.7 15.7 0 0 1-2.533-1.02 4.138 4.138 0 0 1-2.543-3.7 3.605 3.605 0 0 1 .682-2.158A4.448 4.448 0 0 1 32.717.535a7.372 7.372 0 0 1 2.866-.533 6.71 6.71 0 0 1 2.851.579 4.539 4.539 0 0 1 1.943 1.634 4.28 4.28 0 0 1 .692 2.4h-3.076a2.013 2.013 0 0 0-.646-1.594 2.655 2.655 0 0 0-1.818-.57 2.837 2.837 0 0 0-1.753.477 1.5 1.5 0 0 0-.625 1.256 1.44 1.44 0 0 0 .733 1.22 8.283 8.283 0 0 0 2.158.923 9.326 9.326 0 0 1 3.827 1.958 3.9 3.9 0 0 1 1.2 2.912 3.593 3.593 0 0 1-1.466 3.04 6.419 6.419 0 0 1-3.948 1.1 7.623 7.623 0 0 1-3.138-.631 4.965 4.965 0 0 1-2.158-1.728 4.425 4.425 0 0 1-.743-2.543h3.086q0 2.471 2.953 2.471a2.873 2.873 0 0 0 1.712-.446 1.451 1.451 0 0 0 .615-1.242zm16.571-3.209a9 9 0 0 1-.677 3.635 6.24 6.24 0 0 1-1.876 2.476l2.481 1.948-1.958 1.733-3.179-2.553a6.728 6.728 0 0 1-1.128.092 6.211 6.211 0 0 1-3.312-.892 5.926 5.926 0 0 1-2.256-2.548 8.755 8.755 0 0 1-.81-3.809v-.738a8.965 8.965 0 0 1 .79-3.881 5.917 5.917 0 0 1 2.25-2.574 6.581 6.581 0 0 1 6.634 0 5.917 5.917 0 0 1 2.246 2.574 8.94 8.94 0 0 1 .795 3.871zm-3.118-.673a6.283 6.283 0 0 0-.841-3.568 2.97 2.97 0 0 0-4.789-.015 6.211 6.211 0 0 0-.851 3.532v.728a6.361 6.361 0 0 0 .841 3.548 2.944 2.944 0 0 0 4.8.046 6.324 6.324 0 0 0 .841-3.543zm7.609 5.332h6.532v2.468h-9.608V.205h3.076z" fill="#2e3032"/></svg>

+ 1
- 29
server/sonar-web/public/images/languages/black/python.svg Datei anzeigen

@@ -1,29 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 42.597 51.604">
<defs>
<style>
.cls-1 {
fill: #4a4d50;
}

.cls-2 {
fill: #2e3032;
}

.cls-3 {
opacity: 0.444;
fill: url(#radial-gradient);
}
</style>
<radialGradient id="radial-gradient" cx="58.835" cy="-130.697" r="12.486" gradientTransform="translate(201.505 -205.779) rotate(-90) scale(0.194 1.037)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#b8b8b8" stop-opacity="0.498"/>
<stop offset="1" stop-color="#7f7f7f" stop-opacity="0"/>
</radialGradient>
</defs>
<g id="Groupe_7544" data-name="Groupe 7544" transform="translate(-7321.846 -10384.27)">
<g id="python-logo-generic" transform="translate(7321.846 10384.27)">
<path id="path1948" class="cls-1" d="M26.636,6.4a29.338,29.338,0,0,0-4.91.419c-4.348.768-5.137,2.376-5.137,5.341v3.916H26.864v1.305H12.733a6.415,6.415,0,0,0-6.419,5.209,19.2,19.2,0,0,0,0,10.442c.73,3.042,2.475,5.209,5.461,5.209h3.533V33.545a6.529,6.529,0,0,1,6.419-6.383H31.989a5.176,5.176,0,0,0,5.137-5.221V12.157c0-2.784-2.349-4.876-5.137-5.341A32.047,32.047,0,0,0,26.636,6.4ZM21.08,9.547a1.958,1.958,0,1,1-1.928,1.964A1.949,1.949,0,0,1,21.08,9.547Z" transform="translate(-5.591 -6.397)"/>
<path id="path1950" class="cls-2" d="M56.11,35.054v4.562a6.59,6.59,0,0,1-6.419,6.514H39.429a5.241,5.241,0,0,0-5.137,5.221v9.784c0,2.784,2.421,4.422,5.137,5.221a17.19,17.19,0,0,0,10.263,0c2.587-.749,5.137-2.256,5.137-5.221V57.22H44.566V55.915h15.4c2.986,0,4.1-2.083,5.137-5.209,1.073-3.218,1.027-6.314,0-10.442-.738-2.973-2.147-5.209-5.137-5.209ZM50.338,59.831a1.958,1.958,0,1,1-1.928,1.952A1.939,1.939,0,0,1,50.338,59.831Z" transform="translate(-23.294 -24.073)"/>
<path id="path1894" class="cls-3" d="M36.765,102.791c0,1.475-6.165,2.67-13.769,2.67s-13.769-1.2-13.769-2.67,6.165-2.67,13.769-2.67S36.765,101.316,36.765,102.791Z" transform="translate(-1.607 -53.856)"/>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 42.597 51.604"><defs><radialGradient id="a" cx="58.835" cy="-130.697" r="12.486" gradientTransform="matrix(0 -.194 1.037 0 201.505 -205.779)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b8b8b8" stop-opacity=".498"/><stop offset="1" stop-color="#7f7f7f" stop-opacity="0"/></radialGradient></defs><g data-name="Groupe 7544"><path d="M21.045.003a29.338 29.338 0 0 0-4.91.419c-4.348.768-5.137 2.376-5.137 5.341v3.916h10.275v1.305H7.142a6.415 6.415 0 0 0-6.419 5.209 19.2 19.2 0 0 0 0 10.442c.73 3.042 2.475 5.209 5.461 5.209h3.533v-4.696a6.529 6.529 0 0 1 6.419-6.383h10.262a5.176 5.176 0 0 0 5.137-5.221V5.76c0-2.784-2.349-4.876-5.137-5.341a32.047 32.047 0 0 0-5.353-.416zM15.489 3.15a1.958 1.958 0 1 1-1.928 1.964 1.949 1.949 0 0 1 1.928-1.964z" fill="#4a4d50"/><path d="M32.816 10.981v4.562a6.59 6.59 0 0 1-6.419 6.514H16.135a5.241 5.241 0 0 0-5.137 5.221v9.784c0 2.784 2.421 4.422 5.137 5.221a17.19 17.19 0 0 0 10.263 0c2.587-.749 5.137-2.256 5.137-5.221v-3.915H21.272v-1.305h15.4c2.986 0 4.1-2.083 5.137-5.209 1.073-3.218 1.027-6.314 0-10.442-.738-2.973-2.147-5.209-5.137-5.209zm-5.772 24.777a1.958 1.958 0 1 1-1.928 1.952 1.939 1.939 0 0 1 1.928-1.952z" fill="#2e3032"/><path d="M36.765 102.791c0 1.475-6.165 2.67-13.769 2.67s-13.769-1.2-13.769-2.67 6.165-2.67 13.769-2.67 13.769 1.195 13.769 2.67z" transform="translate(-1.607 -53.856)" opacity=".444" fill="url(#a)"/></g></svg>

+ 1
- 51
server/sonar-web/public/images/languages/black/ruby.svg Datei anzeigen

@@ -1,51 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 42.118 42.001">
<defs>
<style>
.cls-1 {
fill: #8a8c8f;
}

.cls-1, .cls-2, .cls-3, .cls-4, .cls-5 {
fill-rule: evenodd;
}

.cls-2 {
fill: #2d3032;
}

.cls-3 {
fill: #fff;
}

.cls-4 {
fill: #434447;
}

.cls-5 {
fill: #636567;
}
</style>
</defs>
<g id="Groupe_7548" data-name="Groupe 7548" transform="translate(-7202.253 -10496)">
<g id="Groupe_7541" data-name="Groupe 7541" transform="translate(6622.253 8582)">
<path id="polygon3282" class="cls-1" d="M64.427,59.18,40.38,73.459l31.136-2.113,2.4-31.4Z" transform="translate(548.204 1882.542)"/>
<path id="polygon3293" class="cls-2" d="M150.175,119.121,147.5,100.65l-7.29,9.626Z" transform="translate(469.596 1834.746)"/>
<path id="polygon3304" class="cls-2" d="M71.989,181.839,52.383,180.3,40.87,183.933Z" transform="translate(547.818 1772.028)"/>
<path id="polygon3319" class="cls-1" d="M19.22,137.975l4.9-16.045-10.778,2.3Z" transform="translate(569.496 1817.99)"/>
<path id="polygon3334" class="cls-1" d="M75.734,80.792,71.227,63.14,58.33,75.229Z" transform="translate(534.07 1864.282)"/>
<path id="polygon3349" class="cls-1" d="M135.586,27.427,123.395,17.47,120,28.445Z" transform="translate(485.509 1900.244)"/>
<path id="polygon3362" class="cls-1" d="M123.184.573l-7.17,3.962L111.49.52Z" transform="translate(492.21 1913.59)"/>
<path id="polygon3375" class="cls-1" d="M0,113.624l3-5.478L.574,101.62Z" transform="translate(580 1833.982)"/>
<path id="path3377" class="cls-3" d="M1.94,21.4,4.385,28.33l10.623-2.383L27.135,14.676,30.557,3.805,25.168,0,16.006,3.429c-2.887,2.685-8.488,8-8.69,8.1S3.617,18.241,1.94,21.4Z" transform="translate(578.473 1914)"/>
<path id="path3400" class="cls-4" d="M14.393,12.858c6.256-6.2,14.321-9.868,17.417-6.745s-.187,10.712-6.443,16.913S11.145,33.093,8.052,29.97,8.137,19.059,14.393,12.858Z" transform="translate(574.603 1910.081)"/>
<path id="path3413" class="cls-5" d="M41,137.756l4.86-16.1L62,126.845C56.163,132.317,49.673,136.942,41,137.756Z" transform="translate(547.716 1818.202)"/>
<path id="path3424" class="cls-4" d="M120.56,65.039,124.7,81.451C129.578,76.325,133.952,70.815,136.1,64Z" transform="translate(485.068 1863.605)"/>
<path id="path3435" class="cls-5" d="M148.273,14.326c1.658-5,2.041-12.183-5.778-13.516l-6.416,3.544Z" transform="translate(472.848 1913.362)"/>
<path id="path3437" class="cls-5" d="M0,138.348c.23,8.259,6.188,8.382,8.726,8.454L2.863,133.11Z" transform="translate(580 1809.186)"/>
<path id="path3448" class="cls-5" d="M120.669,65.207c3.746,2.3,11.295,6.926,11.448,7.011.238.134,3.255-5.087,3.939-8.038Z" transform="translate(484.983 1863.463)"/>
<path id="path3459" class="cls-4" d="M63.83,121.66l6.5,12.534a42.008,42.008,0,0,0,9.6-7.34Z" transform="translate(529.739 1818.202)"/>
<path id="path3472" class="cls-4" d="M9.94,133.18,9.02,144.14c1.737,2.372,4.126,2.579,6.632,2.394C13.839,142.021,10.217,133,9.94,133.18Z" transform="translate(572.898 1809.133)"/>
<path id="path3485" class="cls-4" d="M135.9,4.35l12.906,1.811c-.689-2.919-2.8-4.8-6.409-5.391Z" transform="translate(472.989 1913.394)"/>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 42.118 42.001"><defs><style>.cls-1{fill:#8a8c8f}.cls-1,.cls-2,.cls-4,.cls-5{fill-rule:evenodd}.cls-2{fill:#2d3032}.cls-4{fill:#434447}.cls-5{fill:#636567}</style></defs><g id="Groupe_7548" data-name="Groupe 7548" transform="translate(-7202.253 -10496)"><g id="Groupe_7541" data-name="Groupe 7541" transform="translate(6622.253 8582)"><path id="polygon3282" class="cls-1" d="M64.427 59.18L40.38 73.459l31.136-2.113 2.4-31.4z" transform="translate(548.204 1882.542)"/><path id="polygon3293" class="cls-2" d="M150.175 119.121L147.5 100.65l-7.29 9.626z" transform="translate(469.596 1834.746)"/><path id="polygon3304" class="cls-2" d="M71.989 181.839L52.383 180.3l-11.513 3.633z" transform="translate(547.818 1772.028)"/><path id="polygon3319" class="cls-1" d="M19.22 137.975l4.9-16.045-10.778 2.3z" transform="translate(569.496 1817.99)"/><path id="polygon3334" class="cls-1" d="M75.734 80.792L71.227 63.14 58.33 75.229z" transform="translate(534.07 1864.282)"/><path id="polygon3349" class="cls-1" d="M135.586 27.427l-12.191-9.957L120 28.445z" transform="translate(485.509 1900.244)"/><path id="polygon3362" class="cls-1" d="M123.184.573l-7.17 3.962L111.49.52z" transform="translate(492.21 1913.59)"/><path id="polygon3375" class="cls-1" d="M0 113.624l3-5.478-2.426-6.526z" transform="translate(580 1833.982)"/><path id="path3377" d="M1.94 21.4l2.445 6.93 10.623-2.383 12.127-11.271 3.422-10.871L25.168 0l-9.162 3.429c-2.887 2.685-8.488 8-8.69 8.1S3.617 18.241 1.94 21.4z" transform="translate(578.473 1914)" fill="#fff" fill-rule="evenodd"/><path id="path3400" class="cls-4" d="M14.393 12.858c6.256-6.2 14.321-9.868 17.417-6.745s-.187 10.712-6.443 16.913S11.145 33.093 8.052 29.97s.085-10.911 6.341-17.112z" transform="translate(574.603 1910.081)"/><path id="path3413" class="cls-5" d="M41 137.756l4.86-16.1L62 126.845c-5.837 5.472-12.327 10.097-21 10.911z" transform="translate(547.716 1818.202)"/><path id="path3424" class="cls-4" d="M120.56 65.039l4.14 16.412c4.878-5.126 9.252-10.636 11.4-17.451z" transform="translate(485.068 1863.605)"/><path id="path3435" class="cls-5" d="M148.273 14.326c1.658-5 2.041-12.183-5.778-13.516l-6.416 3.544z" transform="translate(472.848 1913.362)"/><path id="path3437" class="cls-5" d="M0 138.348c.23 8.259 6.188 8.382 8.726 8.454L2.863 133.11z" transform="translate(580 1809.186)"/><path id="path3448" class="cls-5" d="M120.669 65.207c3.746 2.3 11.295 6.926 11.448 7.011.238.134 3.255-5.087 3.939-8.038z" transform="translate(484.983 1863.463)"/><path id="path3459" class="cls-4" d="M63.83 121.66l6.5 12.534a42.008 42.008 0 0 0 9.6-7.34z" transform="translate(529.739 1818.202)"/><path id="path3472" class="cls-4" d="M9.94 133.18l-.92 10.96c1.737 2.372 4.126 2.579 6.632 2.394-1.813-4.513-5.435-13.534-5.712-13.354z" transform="translate(572.898 1809.133)"/><path id="path3485" class="cls-4" d="M135.9 4.35l12.906 1.811c-.689-2.919-2.8-4.8-6.409-5.391z" transform="translate(472.989 1913.394)"/></g></g></svg>

+ 1
- 0
server/sonar-web/public/images/languages/black/scala.svg Datei anzeigen

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 64.732"><defs><style>.cls-1{fill:#676a71}.cls-2{fill:#2e3032}</style></defs><g transform="translate(-7665 -10721.268)"><g transform="translate(6585.924 8871.268)"><path id="path7" class="cls-1" d="M6.6-20s25.076 2.508 25.076 6.687v-10.03s0-4.179-25.076-6.687z" transform="translate(1074.403 1886.718)"/><path id="path14" class="cls-1" d="M6.6-.308S31.673 2.2 31.673 6.379V-3.652s0-4.179-25.076-6.687z" transform="translate(1074.403 1880.399)"/><path id="path21" class="cls-2" d="M31.673-39.877v10.03s0 4.179-25.076 6.687v-10.03s25.076-2.51 25.076-6.687" transform="translate(1074.403 1889.877)"/><path id="path28" class="cls-2" d="M6.6-13.5s25.076-2.508 25.076-6.687v10.03s0 4.179-25.076 6.687z" transform="translate(1074.403 1883.558)"/><path id="path35" class="cls-2" d="M6.6 16.225V6.195S31.673 3.687 31.673-.492v10.03s0 4.179-25.076 6.687" transform="translate(1074.403 1877.24)"/></g><text id="Scala" transform="translate(7665 10783)" font-size="12" font-family="Roboto-Regular,Roboto" fill="#2e3032"><tspan x="0" y="0">Scala</tspan></text></g></svg>

+ 1
- 24
server/sonar-web/public/images/languages/black/swift.svg Datei anzeigen

@@ -1,24 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 39.267 39.239">
<defs>
<style>
.cls-1 {
fill: #4a4d50;
}

.cls-2 {
fill: #2e3032;
}

.cls-3 {
fill: #fff;
}
</style>
</defs>
<g id="Groupe_7550" data-name="Groupe 7550" transform="translate(-7321.753 -10620)">
<g id="Groupe_6112" data-name="Groupe 6112" transform="translate(7321.753 10620)">
<path id="Tracé_10237" data-name="Tracé 10237" class="cls-1" d="M9.691.1H31.545a8.693,8.693,0,0,1,8.691,8.691V30.644a8.693,8.693,0,0,1-8.691,8.691H9.691A8.693,8.693,0,0,1,1,30.644V8.791A8.693,8.693,0,0,1,9.691.1Z" transform="translate(-0.969 -0.097)"/>
<path id="Tracé_10238" data-name="Tracé 10238" class="cls-2" d="M33.149,32.1s-1.523-2.539-4.064-2.539c-2.454,0-3.9,2.539-8.848,2.539-10.961,0-16.17-9.113-16.21-9.185h0L0,18.583V8.691A8.693,8.693,0,0,1,8.691,0h7.757l5.737,5.818h0c12.956,8.807,8.766,18.5,8.766,18.5S34.631,28.465,33.149,32.1Z"/>
<path id="Tracé_10239" data-name="Tracé 10239" class="cls-3" d="M147.961,186.2c12.953,8.8,8.76,18.5,8.76,18.5s3.683,4.149,2.2,7.788c0,0-1.523-2.539-4.064-2.539-2.454,0-3.9,2.539-8.848,2.539-11,0-16.21-9.185-16.21-9.185,9.911,6.531,16.676,1.9,16.676,1.9-4.471-2.6-13.969-14.985-13.969-14.985,8.279,7.041,11.852,8.888,11.852,8.888-2.138-1.76-8.129-10.37-8.129-10.37,4.793,4.849,14.306,11.6,14.306,11.6C153.257,192.878,147.961,186.2,147.961,186.2Z" transform="translate(-125.742 -180.379)"/>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 39.267 39.239"><g data-name="Groupe 7550"><g data-name="Groupe 6112"><path data-name="Tracé 10237" d="M8.722.003h21.854a8.693 8.693 0 0 1 8.691 8.691v21.853a8.693 8.693 0 0 1-8.691 8.691H8.722a8.693 8.693 0 0 1-8.691-8.691V8.694A8.693 8.693 0 0 1 8.722.003z" fill="#4a4d50"/><path data-name="Tracé 10238" d="M33.149 32.1s-1.523-2.539-4.064-2.539c-2.454 0-3.9 2.539-8.848 2.539-10.961 0-16.17-9.113-16.21-9.185L0 18.583V8.691A8.693 8.693 0 0 1 8.691 0h7.757l5.737 5.818c12.956 8.807 8.766 18.5 8.766 18.5s3.68 4.147 2.198 7.782z" fill="#2e3032"/><path data-name="Tracé 10239" d="M22.219 5.821c12.953 8.8 8.76 18.5 8.76 18.5s3.683 4.149 2.2 7.788c0 0-1.523-2.539-4.064-2.539-2.454 0-3.9 2.539-8.848 2.539-11 0-16.21-9.185-16.21-9.185 9.911 6.531 16.676 1.9 16.676 1.9-4.471-2.6-13.969-14.985-13.969-14.985 8.279 7.041 11.852 8.888 11.852 8.888-2.138-1.76-8.129-10.37-8.129-10.37 4.793 4.849 14.306 11.6 14.306 11.6 2.722-7.458-2.574-14.136-2.574-14.136z" fill="#fff"/></g></g></svg>

+ 1
- 10
server/sonar-web/public/images/languages/black/t-sql.svg Datei anzeigen

@@ -1,10 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52.923 17.801">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<path id="Tracé_11995" data-name="Tracé 11995" class="cls-1" d="M19.226,6.562H14.653V19H11.577V6.562H7.065V4.07H19.226ZM22.919,13.8H17.146V11.412h5.773Zm9.475,1.282a1.579,1.579,0,0,0-.615-1.338,8.07,8.07,0,0,0-2.215-.984,15.7,15.7,0,0,1-2.533-1.02,4.138,4.138,0,0,1-2.543-3.7A3.605,3.605,0,0,1,25.17,5.88,4.448,4.448,0,0,1,27.129,4.4a7.372,7.372,0,0,1,2.866-.533,6.71,6.71,0,0,1,2.851.579A4.539,4.539,0,0,1,34.788,6.08a4.28,4.28,0,0,1,.692,2.4H32.4a2.013,2.013,0,0,0-.646-1.594,2.655,2.655,0,0,0-1.815-.569,2.837,2.837,0,0,0-1.753.477,1.5,1.5,0,0,0-.625,1.256,1.44,1.44,0,0,0,.733,1.22,8.283,8.283,0,0,0,2.158.923,9.326,9.326,0,0,1,3.825,1.958,3.9,3.9,0,0,1,1.2,2.912,3.593,3.593,0,0,1-1.466,3.04,6.419,6.419,0,0,1-3.948,1.1,7.623,7.623,0,0,1-3.138-.631,4.965,4.965,0,0,1-2.158-1.728,4.425,4.425,0,0,1-.743-2.543h3.086q0,2.471,2.953,2.471a2.873,2.873,0,0,0,1.712-.446A1.451,1.451,0,0,0,32.394,15.083Zm16.571-3.209a9,9,0,0,1-.677,3.635,6.24,6.24,0,0,1-1.876,2.476l2.481,1.948-1.958,1.733-3.179-2.553a6.728,6.728,0,0,1-1.128.092,6.211,6.211,0,0,1-3.312-.892,5.926,5.926,0,0,1-2.256-2.548,8.755,8.755,0,0,1-.81-3.809v-.738a8.965,8.965,0,0,1,.795-3.881,5.917,5.917,0,0,1,2.246-2.574,6.581,6.581,0,0,1,6.634,0A5.917,5.917,0,0,1,48.17,7.336a8.94,8.94,0,0,1,.795,3.871ZM45.848,11.2a6.283,6.283,0,0,0-.841-3.568,2.97,2.97,0,0,0-4.789-.015,6.211,6.211,0,0,0-.851,3.532v.728a6.361,6.361,0,0,0,.841,3.548,2.944,2.944,0,0,0,4.8.046,6.324,6.324,0,0,0,.841-3.543Zm7.609,5.332h6.532V19H50.381V4.07h3.076Z" transform="translate(-7.065 -3.865)"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52.923 17.801"><path data-name="Tracé 11995" d="M12.161 2.697H7.588v12.438H4.512V2.697H0V.205h12.161zm3.693 7.238h-5.773V7.547h5.773zm9.475 1.282a1.579 1.579 0 0 0-.615-1.338 8.07 8.07 0 0 0-2.215-.984 15.7 15.7 0 0 1-2.533-1.02 4.138 4.138 0 0 1-2.543-3.7 3.605 3.605 0 0 1 .682-2.16 4.448 4.448 0 0 1 1.959-1.48A7.372 7.372 0 0 1 22.93.002a6.71 6.71 0 0 1 2.851.579 4.539 4.539 0 0 1 1.942 1.634 4.28 4.28 0 0 1 .692 2.4h-3.08a2.013 2.013 0 0 0-.646-1.594 2.655 2.655 0 0 0-1.815-.569 2.837 2.837 0 0 0-1.753.477 1.5 1.5 0 0 0-.625 1.256 1.44 1.44 0 0 0 .733 1.22 8.283 8.283 0 0 0 2.158.923 9.326 9.326 0 0 1 3.825 1.958 3.9 3.9 0 0 1 1.2 2.912 3.593 3.593 0 0 1-1.466 3.04 6.419 6.419 0 0 1-3.948 1.1 7.623 7.623 0 0 1-3.138-.631 4.965 4.965 0 0 1-2.158-1.728 4.425 4.425 0 0 1-.743-2.543h3.086q0 2.471 2.953 2.471a2.873 2.873 0 0 0 1.712-.446 1.451 1.451 0 0 0 .619-1.243zM41.9 8.008a9 9 0 0 1-.677 3.635 6.24 6.24 0 0 1-1.876 2.476l2.481 1.948L39.87 17.8l-3.179-2.553a6.728 6.728 0 0 1-1.128.092 6.211 6.211 0 0 1-3.312-.892 5.926 5.926 0 0 1-2.256-2.548 8.755 8.755 0 0 1-.81-3.809v-.738a8.965 8.965 0 0 1 .795-3.881A5.917 5.917 0 0 1 32.226.897a6.581 6.581 0 0 1 6.634 0 5.917 5.917 0 0 1 2.245 2.574 8.94 8.94 0 0 1 .795 3.871zm-3.117-.673a6.283 6.283 0 0 0-.841-3.568 2.97 2.97 0 0 0-4.789-.015 6.211 6.211 0 0 0-.851 3.532v.728a6.361 6.361 0 0 0 .841 3.548 2.944 2.944 0 0 0 4.8.046 6.324 6.324 0 0 0 .841-3.543zm7.609 5.332h6.532v2.468h-9.608V.205h3.076z" fill="#2e3032"/></svg>

+ 1
- 13
server/sonar-web/public/images/languages/black/ts.svg Datei anzeigen

@@ -1,13 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100.671 24.133">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<g id="Groupe_7542" data-name="Groupe 7542" transform="translate(-7035.248 -10407.063)">
<path id="Tracé_10235" data-name="Tracé 10235" class="cls-1" d="M-52.485,419.507h-5.161v15.949h-2.092V419.507H-64.9V417.6h12.369v1.906Z" transform="translate(7100.148 9989.741)"/>
<path id="Tracé_10236" data-name="Tracé 10236" class="cls-1" d="M-30.757,422.394l-5.859,14.787c-1.069,2.65-2.511,3.952-4.417,3.952a5.723,5.723,0,0,1-1.348-.14V439.18a3.958,3.958,0,0,0,1.209.232,2.5,2.5,0,0,0,2.325-1.86l1.023-2.418L-42.8,422.394h2.278l3.441,9.811q.07.209.279.976h.093c.047-.186.139-.511.233-.93l3.627-9.858Zm3.441,10.927h-.047v7.719h-2.046v-18.6h2.046v2.232h.047a4.895,4.895,0,0,1,4.417-2.557,4.672,4.672,0,0,1,3.859,1.72,7.063,7.063,0,0,1,1.395,4.6,7.893,7.893,0,0,1-1.534,5.115,5.249,5.249,0,0,1-4.278,1.906A4.307,4.307,0,0,1-27.316,433.321Zm-.047-5.161v1.767a3.756,3.756,0,0,0,1.023,2.7,3.377,3.377,0,0,0,2.6,1.116,3.431,3.431,0,0,0,2.929-1.442,6.33,6.33,0,0,0,1.069-3.952A5.218,5.218,0,0,0-20.713,425a3.271,3.271,0,0,0-2.65-1.209,3.636,3.636,0,0,0-2.883,1.255A4.492,4.492,0,0,0-27.362,428.16Zm22.32,1.116h-9.021a4.806,4.806,0,0,0,1.162,3.3,3.892,3.892,0,0,0,3.022,1.162A6.1,6.1,0,0,0-5.926,432.3V434.2a7.256,7.256,0,0,1-4.464,1.209,5.307,5.307,0,0,1-4.231-1.72,7.147,7.147,0,0,1-1.534-4.882,6.954,6.954,0,0,1,1.674-4.836,5.346,5.346,0,0,1,4.185-1.86,4.754,4.754,0,0,1,3.859,1.627,6.62,6.62,0,0,1,1.348,4.51v1.023Zm-2.092-1.721a4.116,4.116,0,0,0-.837-2.743,2.92,2.92,0,0,0-2.325-.976,3.3,3.3,0,0,0-2.464,1.023,5.034,5.034,0,0,0-1.255,2.7Zm3.208,6.975v-1.395a7,7,0,0,0,3.906,1.209,4.751,4.751,0,0,0,3.162-.883,2.843,2.843,0,0,0,1.069-2.418,3.044,3.044,0,0,0-.744-2.185A13,13,0,0,0,.3,426.625a11.418,11.418,0,0,1-3.441-2.65,4.4,4.4,0,0,1-.744-2.464A4.2,4.2,0,0,1-2.392,418.3,5.589,5.589,0,0,1,1.514,417a9.714,9.714,0,0,1,3.208.558v1.3a8.311,8.311,0,0,0-3.348-.7,4.292,4.292,0,0,0-2.883.93,2.98,2.98,0,0,0-1.069,2.325,3.044,3.044,0,0,0,.744,2.185,13.229,13.229,0,0,0,3.162,2.185A10.95,10.95,0,0,1,4.676,428.3a4.118,4.118,0,0,1,.837,2.557A4.3,4.3,0,0,1,4.071,434.2a5.648,5.648,0,0,1-4.045,1.3,10,10,0,0,1-2.139-.279,12.45,12.45,0,0,1-1.813-.7Zm20.227.047a6.577,6.577,0,0,1-3.394.883,5.44,5.44,0,0,1-4.185-1.767A6.76,6.76,0,0,1,7.14,429a6.973,6.973,0,0,1,1.813-4.975,6.009,6.009,0,0,1,4.6-1.953,6.77,6.77,0,0,1,2.836.6v1.3a5.692,5.692,0,0,0-3.022-.837,4.6,4.6,0,0,0-3.627,1.628,6.148,6.148,0,0,0-1.395,4.185,6.056,6.056,0,0,0,1.255,4,4.069,4.069,0,0,0,3.348,1.488,5.6,5.6,0,0,0,3.348-1.023v1.162ZM24.019,423.6a2.216,2.216,0,0,0-1.348-.419,2.9,2.9,0,0,0-2.511,1.534,7.862,7.862,0,0,0-1.023,4.417v6H18.021V422.394h1.116v2.836h.046a4.532,4.532,0,0,1,1.395-2.278,3.172,3.172,0,0,1,2.185-.79,3.55,3.55,0,0,1,1.255.233V423.6Zm1.953-4.417a.918.918,0,0,1-.651-.279.946.946,0,0,1-.279-.7.78.78,0,0,1,.279-.651.87.87,0,0,1,.651-.233,1.253,1.253,0,0,1,.7.233.844.844,0,0,1,.279.651.946.946,0,0,1-.279.7A1.025,1.025,0,0,1,25.972,419.185Zm-.558,16V422.44h1.162v12.741Zm5.161-2.279h-.046v8.137H29.367v-18.6h1.162v2.651h.046a5.079,5.079,0,0,1,4.743-2.93,4.678,4.678,0,0,1,3.813,1.674,6.916,6.916,0,0,1,1.348,4.557,7.867,7.867,0,0,1-1.581,5.161,5.008,5.008,0,0,1-4.138,1.953,4.591,4.591,0,0,1-4.185-2.6Zm-.046-4.743v1.627a4.9,4.9,0,0,0,1.209,3.3,3.962,3.962,0,0,0,3.162,1.395,3.71,3.71,0,0,0,3.162-1.674,7.523,7.523,0,0,0,1.209-4.417,6,6,0,0,0-1.116-3.813,3.659,3.659,0,0,0-2.976-1.395,4.2,4.2,0,0,0-3.441,1.488,5.388,5.388,0,0,0-1.209,3.487ZM47.594,435a4.028,4.028,0,0,1-1.674.418c-1.906,0-2.836-1.116-2.836-3.394v-8.556H40.805v-1.07h2.278v-3.3c.186-.047.372-.14.558-.186s.372-.14.558-.186v3.72h3.348v1.069H44.2v8.416a3.3,3.3,0,0,0,.418,1.906,1.654,1.654,0,0,0,1.395.6,3.043,3.043,0,0,0,1.534-.465V435h.047Z" transform="translate(7088.325 9990.063)"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100.671 24.133"><defs><style>.cls-1{fill:#2e3032}</style></defs><g id="Groupe_7542" data-name="Groupe 7542" transform="translate(-7035.248 -10407.063)"><path id="Tracé_10235" data-name="Tracé 10235" class="cls-1" d="M-52.485 419.507h-5.161v15.949h-2.092v-15.949H-64.9V417.6h12.369v1.906z" transform="translate(7100.148 9989.741)"/><path id="Tracé_10236" data-name="Tracé 10236" class="cls-1" d="M-30.757 422.394l-5.859 14.787c-1.069 2.65-2.511 3.952-4.417 3.952a5.723 5.723 0 0 1-1.348-.14v-1.813a3.958 3.958 0 0 0 1.209.232 2.5 2.5 0 0 0 2.325-1.86l1.023-2.418-4.976-12.74h2.278l3.441 9.811q.07.209.279.976h.093c.047-.186.139-.511.233-.93l3.627-9.858zm3.441 10.927h-.047v7.719h-2.046v-18.6h2.046v2.232h.047a4.895 4.895 0 0 1 4.417-2.557 4.672 4.672 0 0 1 3.859 1.72 7.063 7.063 0 0 1 1.395 4.6 7.893 7.893 0 0 1-1.534 5.115 5.249 5.249 0 0 1-4.278 1.906 4.307 4.307 0 0 1-3.859-2.135zm-.047-5.161v1.767a3.756 3.756 0 0 0 1.023 2.7 3.377 3.377 0 0 0 2.6 1.116 3.431 3.431 0 0 0 2.929-1.442 6.33 6.33 0 0 0 1.069-3.952 5.218 5.218 0 0 0-.971-3.349 3.271 3.271 0 0 0-2.65-1.209 3.636 3.636 0 0 0-2.883 1.255 4.492 4.492 0 0 0-1.116 3.114zm22.32 1.116h-9.021a4.806 4.806 0 0 0 1.162 3.3 3.892 3.892 0 0 0 3.022 1.162 6.1 6.1 0 0 0 3.954-1.438v1.9a7.256 7.256 0 0 1-4.464 1.209 5.307 5.307 0 0 1-4.231-1.72 7.147 7.147 0 0 1-1.534-4.882 6.954 6.954 0 0 1 1.674-4.836 5.346 5.346 0 0 1 4.185-1.86 4.754 4.754 0 0 1 3.859 1.627 6.62 6.62 0 0 1 1.348 4.51v1.023zm-2.092-1.721a4.116 4.116 0 0 0-.837-2.743 2.92 2.92 0 0 0-2.325-.976 3.3 3.3 0 0 0-2.464 1.023 5.034 5.034 0 0 0-1.255 2.7zm3.208 6.975v-1.395a7 7 0 0 0 3.906 1.209 4.751 4.751 0 0 0 3.162-.883 2.843 2.843 0 0 0 1.069-2.418 3.044 3.044 0 0 0-.744-2.185A13 13 0 0 0 .3 426.625a11.418 11.418 0 0 1-3.441-2.65 4.4 4.4 0 0 1-.744-2.464 4.2 4.2 0 0 1 1.493-3.211 5.589 5.589 0 0 1 3.906-1.3 9.714 9.714 0 0 1 3.208.558v1.3a8.311 8.311 0 0 0-3.348-.7 4.292 4.292 0 0 0-2.883.93 2.98 2.98 0 0 0-1.069 2.325 3.044 3.044 0 0 0 .744 2.185 13.229 13.229 0 0 0 3.162 2.185 10.95 10.95 0 0 1 3.348 2.517 4.118 4.118 0 0 1 .837 2.557 4.3 4.3 0 0 1-1.442 3.343 5.648 5.648 0 0 1-4.045 1.3 10 10 0 0 1-2.139-.279 12.45 12.45 0 0 1-1.813-.7zm20.227.047a6.577 6.577 0 0 1-3.394.883 5.44 5.44 0 0 1-4.185-1.767A6.76 6.76 0 0 1 7.14 429a6.973 6.973 0 0 1 1.813-4.975 6.009 6.009 0 0 1 4.6-1.953 6.77 6.77 0 0 1 2.836.6v1.3a5.692 5.692 0 0 0-3.022-.837 4.6 4.6 0 0 0-3.627 1.628 6.148 6.148 0 0 0-1.395 4.185 6.056 6.056 0 0 0 1.255 4 4.069 4.069 0 0 0 3.348 1.488 5.6 5.6 0 0 0 3.348-1.023v1.162zm7.719-10.977a2.216 2.216 0 0 0-1.348-.419 2.9 2.9 0 0 0-2.511 1.534 7.862 7.862 0 0 0-1.023 4.417v6h-1.116v-12.738h1.116v2.836h.046a4.532 4.532 0 0 1 1.395-2.278 3.172 3.172 0 0 1 2.185-.79 3.55 3.55 0 0 1 1.255.233v1.205zm1.953-4.417a.918.918 0 0 1-.651-.279.946.946 0 0 1-.279-.7.78.78 0 0 1 .279-.651.87.87 0 0 1 .651-.233 1.253 1.253 0 0 1 .7.233.844.844 0 0 1 .279.651.946.946 0 0 1-.279.7 1.025 1.025 0 0 1-.7.281zm-.558 16V422.44h1.162v12.741zm5.161-2.279h-.046v8.137h-1.162v-18.6h1.162v2.651h.046a5.079 5.079 0 0 1 4.743-2.93 4.678 4.678 0 0 1 3.813 1.674 6.916 6.916 0 0 1 1.348 4.557 7.867 7.867 0 0 1-1.581 5.161 5.008 5.008 0 0 1-4.138 1.953 4.591 4.591 0 0 1-4.185-2.6zm-.046-4.743v1.627a4.9 4.9 0 0 0 1.209 3.3 3.962 3.962 0 0 0 3.162 1.395 3.71 3.71 0 0 0 3.162-1.674 7.523 7.523 0 0 0 1.209-4.417 6 6 0 0 0-1.116-3.813 3.659 3.659 0 0 0-2.976-1.395 4.2 4.2 0 0 0-3.441 1.488 5.388 5.388 0 0 0-1.209 3.487zM47.594 435a4.028 4.028 0 0 1-1.674.418c-1.906 0-2.836-1.116-2.836-3.394v-8.556h-2.279v-1.07h2.278v-3.3c.186-.047.372-.14.558-.186s.372-.14.558-.186v3.72h3.348v1.069H44.2v8.416a3.3 3.3 0 0 0 .418 1.906 1.654 1.654 0 0 0 1.395.6 3.043 3.043 0 0 0 1.534-.465V435h.047z" transform="translate(7088.325 9990.063)"/></g></svg>

+ 1
- 23
server/sonar-web/public/images/languages/black/vb.svg Datei anzeigen

@@ -1,23 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61.038 61.037">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}

.cls-2 {
fill: #4a4d50;
}

.cls-3 {
fill: #fff;
}
</style>
</defs>
<g id="Groupe_7551" data-name="Groupe 7551" transform="translate(-7054.816 -10716.932)">
<path id="Tracé_11982" data-name="Tracé 11982" class="cls-1" d="M30.1,0A30.1,30.1,0,1,1,0,30.1,30.1,30.1,0,0,1,30.1,0Z" transform="translate(7055.655 10716.932)"/>
<path id="Tracé_10244" data-name="Tracé 10244" class="cls-2" d="M9.184,9a30.1,30.1,0,1,0,42.5,42.5Z" transform="translate(7055.708 10716.397)"/>
<path id="Tracé_10245" data-name="Tracé 10245" class="cls-3" d="M32,19.4,23.262,43.1H20.167l-8.6-23.7h3.095l6.584,18.812a11.165,11.165,0,0,1,.48,2.1h.066a10.346,10.346,0,0,1,.527-2.145l6.7-18.812Z" transform="translate(7054.968 10715.782)"/>
<path id="Tracé_10246" data-name="Tracé 10246" class="cls-3" d="M36.92,43.1V19.4h6.744a7.374,7.374,0,0,1,4.872,1.5,4.863,4.863,0,0,1,1.806,3.922,5.766,5.766,0,0,1-1.119,3.5,5.888,5.888,0,0,1-3.01,2.116v.066a6.029,6.029,0,0,1,3.838,1.806,5.568,5.568,0,0,1,1.439,3.979,6.2,6.2,0,0,1-2.182,4.929,8.127,8.127,0,0,1-5.5,1.881Zm2.822-21.2v7.656h2.822a5.4,5.4,0,0,0,3.565-1.129,3.828,3.828,0,0,0,1.307-3.1q0-3.452-4.543-3.452Zm0,10.149v8.531H43.5a5.644,5.644,0,0,0,3.762-1.157,3.96,3.96,0,0,0,1.345-3.17q0-4.2-5.719-4.2Z" transform="translate(7053.462 10715.78)"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 61.038 61.037"><defs><style>.cls-3{fill:#fff}</style></defs><g id="Groupe_7551" data-name="Groupe 7551" transform="translate(-7054.816 -10716.932)"><path id="Tracé_11982" data-name="Tracé 11982" d="M30.1 0A30.1 30.1 0 1 1 0 30.1 30.1 30.1 0 0 1 30.1 0z" transform="translate(7055.655 10716.932)" fill="#2e3032"/><path id="Tracé_10244" data-name="Tracé 10244" d="M9.184 9a30.1 30.1 0 1 0 42.5 42.5z" transform="translate(7055.708 10716.397)" fill="#4a4d50"/><path id="Tracé_10245" data-name="Tracé 10245" class="cls-3" d="M32 19.4l-8.738 23.7h-3.095l-8.6-23.7h3.095l6.584 18.812a11.165 11.165 0 0 1 .48 2.1h.066a10.346 10.346 0 0 1 .527-2.145l6.7-18.812z" transform="translate(7054.968 10715.782)"/><path id="Tracé_10246" data-name="Tracé 10246" class="cls-3" d="M36.92 43.1V19.4h6.744a7.374 7.374 0 0 1 4.872 1.5 4.863 4.863 0 0 1 1.806 3.922 5.766 5.766 0 0 1-1.119 3.5 5.888 5.888 0 0 1-3.01 2.116v.066a6.029 6.029 0 0 1 3.838 1.806 5.568 5.568 0 0 1 1.439 3.979 6.2 6.2 0 0 1-2.182 4.929 8.127 8.127 0 0 1-5.5 1.881zm2.822-21.2v7.656h2.822a5.4 5.4 0 0 0 3.565-1.129 3.828 3.828 0 0 0 1.307-3.1q0-3.452-4.543-3.452zm0 10.149v8.531H43.5a5.644 5.644 0 0 0 3.762-1.157 3.96 3.96 0 0 0 1.345-3.17q0-4.2-5.719-4.2z" transform="translate(7053.462 10715.78)"/></g></svg>

+ 1
- 10
server/sonar-web/public/images/languages/black/xml.svg Datei anzeigen

@@ -1,10 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 67.044 16.212">
<defs>
<style>
.cls-1 {
fill: #2e3032;
}
</style>
</defs>
<path id="Tracé_11996" data-name="Tracé 11996" class="cls-1" d="M20.1,12.663l5.845,2.061V17.6l-8.829-3.743v-2.42L25.948,7.69v2.871ZM33.086,9.218l2.8-5.147h3.538l-4.348,7.4L39.535,19H35.957l-2.871-5.229L30.214,19H26.636l4.46-7.526-4.348-7.4h3.538ZM44.263,4.07,48.1,14.9,51.913,4.07h4.04V19H52.866V14.919l.308-7.044L49.144,19H47.032L43.012,7.885l.308,7.034V19H40.244V4.07ZM60.875,16.529h6.532V19H57.8V4.07h3.076Zm8.194,3.753h-2.2L72.36,4.07h2.2ZM81.19,12.632l-5.958-2.082V7.7l8.931,3.743v2.41l-8.931,3.753V14.745Z" transform="translate(-17.12 -4.07)"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 67.044 16.212"><path data-name="Tracé 11996" d="M2.98 8.593l5.845 2.061v2.876L-.004 9.787v-2.42L8.828 3.62v2.871zm12.986-3.445l2.8-5.147h3.538l-4.348 7.4 4.459 7.529h-3.578l-2.871-5.229-2.872 5.229H9.516l4.46-7.526-4.348-7.4h3.538zM27.143 0l3.837 10.83L34.793 0h4.04v14.93h-3.087v-4.081l.308-7.044-4.03 11.125h-2.112l-4.02-11.115.308 7.034v4.081h-3.076V0zm16.612 12.459h6.532v2.471H40.68V0h3.076zm8.194 3.753h-2.2L55.24 0h2.2zm12.121-7.65L58.112 6.48V3.63l8.931 3.743v2.41l-8.931 3.753v-2.861z" fill="#2e3032"/></svg>

+ 1
- 0
server/sonar-web/public/images/languages/css.svg Datei anzeigen

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40.223 56.773"><defs><style>.cls-1{fill:#fff}.cls-3{fill:#2d3032}</style></defs><g id="CSS3_logo_and_wordmark_1_" data-name="CSS3_logo_and_wordmark (1)" transform="translate(-193.633 -276.363)"><g id="g3013" transform="translate(193.633 276.362)"><path id="polygon2989" class="cls-1" d="M114.855 100.62l-3.664 41.05-16.471 4.566-16.426-4.56-3.66-41.056z" transform="translate(-74.633 -89.463)"/><path id="polygon2991" d="M269.31 165.973l3.131-35.079H256v38.769z" transform="translate(-235.889 -116.38)" fill="#cfd3d7"/><path id="polygon2993" class="cls-3" d="M150.31 268.217l.451 5.035h11.269v-5.035z" transform="translate(-141.918 -238.475)"/><path id="polygon2995" class="cls-3" d="M154.758 176.3h-12.626l.458 5.035h12.169z" transform="translate(-134.647 -156.755)"/><path id="polygon2997" class="cls-3" d="M167.452 347.1v-5.239l-.022.006-5.608-1.514-.359-4.016h-5.055l.705 7.906 10.315 2.863z" transform="translate(-147.341 -299.038)"/><path id="path2999" class="cls-1" d="M160 0h6.1v2.55h-3.55V5.1h3.55v2.55H160z" transform="translate(-150.534)"/><path id="path3001" class="cls-1" d="M226 0h6.1v2.218h-3.55v.444h3.55v5.1H226V5.433h3.548V4.99H226z" transform="translate(-209.215)"/><path id="path3003" class="cls-1" d="M292 0h6.1v2.218h-3.55v.444h3.55v5.1H292V5.433h3.548V4.99H292z" transform="translate(-267.897)"/><path id="polygon3005" class="cls-3" d="M262.044 191.532l-.584 6.531-5.616 1.516v5.239l10.323-2.861.076-.851 1.183-13.257.123-1.352.909-10.192h-12.615v5.035h7.1l-.458 5.156h-6.637v5.035z" transform="translate(-235.749 -156.755)"/></g></g></svg>

+ 1
- 0
server/sonar-web/public/images/languages/scala.svg Datei anzeigen

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 64.732"><defs><style>.cls-1{fill:#676a71}.cls-2{fill:#fff}</style></defs><g id="Groupe_7555" data-name="Groupe 7555" transform="translate(-1164 -1857.268)"><path id="path7" class="cls-1" d="M6.6-20s25.076 2.508 25.076 6.687v-10.03s0-4.179-25.076-6.687z" transform="translate(1159.327 1893.985)"/><path id="path14" class="cls-1" d="M6.6-.308S31.673 2.2 31.673 6.379V-3.652s0-4.179-25.076-6.687z" transform="translate(1159.327 1887.667)"/><path id="path21" class="cls-2" d="M31.673-39.877v10.03s0 4.179-25.076 6.687v-10.03s25.076-2.51 25.076-6.687" transform="translate(1159.327 1897.145)"/><path id="path28" class="cls-2" d="M6.6-13.5s25.076-2.508 25.076-6.687v10.03s0 4.179-25.076 6.687z" transform="translate(1159.327 1890.826)"/><path id="path35" class="cls-2" d="M6.6 16.225V6.195S31.673 3.687 31.673-.492v10.03s0 4.179-25.076 6.687" transform="translate(1159.327 1884.507)"/><text id="Scala" transform="translate(1164 1919)" font-size="12" font-family="Roboto-Regular,Roboto" fill="#fff"><tspan x="0" y="0">Scala</tspan></text></g></svg>

+ 1
- 0
server/sonar-web/public/images/sonarcloud/chevron-left.svg Datei anzeigen

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.9 34.488"><path d="M17.15 0a1.606 1.606 0 0 1 1.1.5 1.693 1.693 0 0 1 0 2.3L3.95 17.1l14.5 14.6a1.693 1.693 0 0 1 0 2.3 1.6 1.6 0 0 1-2.3 0L.45 18.3a1.693 1.693 0 0 1 0-2.3L16.05.5a1.606 1.606 0 0 1 1.1-.5z" fill="#cfd3d7"/></svg>

+ 1
- 0
server/sonar-web/public/images/sonarcloud/chevron-right.svg Datei anzeigen

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.9 34.488"><path d="M1.75 34.488a1.606 1.606 0 0 1-1.1-.5 1.693 1.693 0 0 1 0-2.3l14.3-14.3-14.5-14.6a1.693 1.693 0 0 1 0-2.3 1.6 1.6 0 0 1 2.3 0l15.7 15.7a1.693 1.693 0 0 1 0 2.3l-15.6 15.5a1.606 1.606 0 0 1-1.1.5z" fill="#cfd3d7"/></svg>

+ 1
- 188
server/sonar-web/public/images/sonarcloud/collab.svg
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


BIN
server/sonar-web/public/images/sonarcloud/home-header-people.png Datei anzeigen


+ 117
- 0
server/sonar-web/public/json/homepage.json Datei anzeigen

@@ -0,0 +1,117 @@
{
"generatedAt": "2018-10-14T19:13:28Z",
"publicProjects": 236,
"publicLoc": 12345,
"rules": 1234,
"newPullRequests7d": 300,
"featuredProjects": [
{
"key": "sonarsource-jfrog.simple-js-php-project",
"avatarUrl": null,
"organizationKey": "sonarsource-jfrog",
"organizationName": "SonarSource & JFrog",
"name": "Simple JS & PHP project",
"bugs": 0,
"codeSmells": 7,
"coverage": 9.7,
"duplications": 56.2,
"gateStatus": "OK",
"languages": ["js", "php"],
"maintainabilityRating": 1,
"ncloc": 324,
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0
},
{
"key": "example-js",
"avatarUrl": null,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"name": "example-js",
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"languages": ["go", "js", "php", "py"],
"maintainabilityRating": 1,
"ncloc": 80,
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0
},
{
"key": "example-js-2",
"avatarUrl": null,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"name": "example-js",
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"languages": ["go", "js", "php", "py"],
"maintainabilityRating": 1,
"ncloc": 80,
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0
},
{
"key": "example-js-3",
"avatarUrl": null,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"name": "example-js",
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"languages": ["go", "js", "php", "py"],
"maintainabilityRating": 1,
"ncloc": 80,
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0
},
{
"key": "example-js-4",
"avatarUrl": null,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"name": "example-js",
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"languages": ["go", "js", "php", "py"],
"maintainabilityRating": 1,
"ncloc": 80,
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0
},
{
"key": "example-js-5",
"avatarUrl": null,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"name": "example-js",
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"languages": ["go", "js", "php", "py"],
"maintainabilityRating": 1,
"ncloc": 80,
"reliabilityRating": "E",
"securityRating": 1,
"vulnerabilities": 0
}
]
}

+ 1
- 0
server/sonar-web/scripts/start.js Datei anzeigen

@@ -20,6 +20,7 @@
/* eslint-disable no-console */
process.env.NODE_ENV = 'development';

const fs = require('fs');
const chalk = require('chalk');
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');

+ 1
- 0
server/sonar-web/src/main/js/app/theme.js Datei anzeigen

@@ -139,6 +139,7 @@ module.exports = {
sonarcloudOrange700: '#db5700',
sonarcloudBlack100: '#ffffff',
sonarcloudBlack200: '#f9f9fb',
sonarcloudBlack250: '#e6e8ea',
sonarcloudBlack300: '#cfd3d7',
sonarcloudBlack500: '#8a8c8f',
sonarcloudBlack700: '#434447',

+ 1
- 1
server/sonar-web/src/main/js/apps/about/routes.ts Datei anzeigen

@@ -55,7 +55,7 @@ const routes = [
},
{
path: 'vsts',
component: lazyLoad(() => import('./sonarcloud/VSTS'))
component: lazyLoad(() => import('./sonarcloud/AzureDevOps'))
}
]
}

server/sonar-web/src/main/js/apps/about/sonarcloud/VSTS.tsx → server/sonar-web/src/main/js/apps/about/sonarcloud/AzureDevOps.tsx Datei anzeigen

@@ -24,7 +24,7 @@ import { isLoggedIn } from '../../../app/types';
import { getBaseUrl } from '../../../helpers/urls';
import './style.css';

export default function VSTS() {
export default function AzureDevOps() {
return (
<SQPageContainer>
{({ currentUser }) => (

+ 103
- 53
server/sonar-web/src/main/js/apps/about/sonarcloud/Home.tsx Datei anzeigen

@@ -18,39 +18,58 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
import Helmet from 'react-helmet';
import { FixedNavBar, TopNavBar } from './components/NavBars';
import FeaturedProjects from './components/FeaturedProjects';
import Footer from './components/Footer';
import Statistics from './components/Statistics';
import { Languages } from './components/Languages';
import LoginButtons from './components/LoginButtons';
import { requestHomepageData, HomepageData, FeaturedProject } from './utils';
import { getBaseUrl } from '../../../helpers/urls';
import './new_style.css';

// TODO Get this from an external source
const STATISTICS = [
{ icon: 'rules', text: 'Static analysis rules checked', value: 9675 },
{ icon: 'locs', text: 'Lines of code analyzed', value: 20000000 },
{ icon: 'pull-request', text: 'Pull Requests decorated', value: 100675 },
{ icon: 'open-source', text: 'Open source projects inspected', value: 99675 }
];
interface State {
data?: HomepageData;
}

export default class Home extends React.PureComponent<{}, State> {
state: State = {};

export default class Home extends React.PureComponent {
componentDidMount() {
document.documentElement.classList.add('white-page');
if (document.documentElement) {
document.documentElement.classList.add('white-page');
}
document.body.classList.add('white-page');
this.fetchData();
}

componentWillUnmount() {
document.documentElement.classList.remove('white-page');
if (document.documentElement) {
document.documentElement.classList.remove('white-page');
}
document.body.classList.remove('white-page');
}

fetchData = () => {
requestHomepageData()
.then(data => this.setState({ data }))
.catch(() => {
/* Fail silently */
});
};

render() {
return (
<div className="global-container">
<div className="page-wrapper">
<div className="page-container sc-page">
<Helmet title="SonarCloud | Clean Code, Rockstar Status">
<meta
content="Enhance your workflow with continuous code quality, SonarCloud automatically analyzes and decorates pull requests on GitHub, Bitbucket and Azure DevOps on major languages."
name="description"
/>
</Helmet>
<FixedNavBar />
<PageBackgroundHeader />
<TopNavBar />
@@ -58,8 +77,10 @@ export default class Home extends React.PureComponent {
<EnhanceWorkflow />
<Functionality />
<Languages />
<Stats />
<Projects />
<Stats data={this.state.data} />
<Projects
featuredProjects={this.state.data ? this.state.data.featuredProjects : undefined}
/>
</div>
</div>
<Footer />
@@ -82,30 +103,30 @@ function PageBackgroundHeader() {

function PageTitle() {
return (
<div className="sc-section sc-columns">
<div className="sc-section sc-columns big-spacer-top">
<div className="sc-column sc-column-half display-flex-center">
<div>
<h1 className="sc-title-orange">Clean Code</h1>
<h1 className="sc-title-orange big-spacer-top">Clean Code</h1>
<h1 className="sc-spacer-bottom">Rockstar Status</h1>
<h5 className="sc-big-spacer-bottom sc-regular-weight">
Eliminate bugs and vulnerabilities,
Eliminate bugs and vulnerabilities.
<br />
champion quality code in your projects.
Champion quality code in your projects.
</h5>
<div>
<h6>Go ahead! Analyze your repo:</h6>
<LoginButtons />
<p className="sc-mention sc-regular-weight big-spacer-top">
Free for Open Source Projects
Free for Open-Source Projects
</p>
</div>
</div>
</div>
<div className="sc-column sc-column-half text-center">
<div className="sc-column sc-column-half text-right">
<img
alt=""
src={`${getBaseUrl()}/images/sonarcloud/home-header-people.png`}
width="480px"
width="430px"
/>
</div>
</div>
@@ -127,9 +148,9 @@ function EnhanceWorkflow() {
src={`${getBaseUrl()}/images/sonarcloud/home-branch.png`}
srcSet={`${getBaseUrl()}/images/sonarcloud/home-branch.png 1x, ${getBaseUrl()}/images/sonarcloud/home-branch@2x.png 2x`}
/>
<h5 className="spacer-bottom">Maximize your throughput, only release clean code</h5>
<h6 className="sc-regular-weight">
Sonarcloud automatically analyzes branches and decorates pull requests
<h5 className="spacer-bottom">Maximize your throughput and only release clean code</h5>
<h6 className="sc-big-spacer-bottom sc-regular-weight">
SonarCloud automatically analyzes branches and decorates pull requests
</h6>
</div>
</div>
@@ -156,7 +177,7 @@ function Functionality() {
that Fits Your Projects
</h3>
<div className="sc-columns">
<div className="sc-column sc-column-small">
<div className="sc-column sc-column-small big-spacer-top">
<h6 className="sc-regular-weight spacer-bottom">Easy to Use</h6>
<p>
With just a few clicks you’re up and running right where your code lives. Immediate
@@ -166,7 +187,7 @@ function Functionality() {
<span className="big-spacer-bottom sc-with-icon">
<img
alt=""
className="spacer-right"
className="big-spacer-right"
src={`${getBaseUrl()}/images/sonarcloud/scale.svg`}
/>{' '}
Scale on-demand as your projects grow.
@@ -174,13 +195,13 @@ function Functionality() {
<span className="sc-with-icon">
<img
alt=""
className="spacer-right"
className="big-spacer-right"
src={`${getBaseUrl()}/images/sonarcloud/stop.svg`}
/>{' '}
No contracts, stop/start anytime.
</span>
</div>
<div className="sc-column sc-column-big">
<div className="sc-column sc-column-big big-spacer-top">
<img
alt=""
className="sc-rounded-img"
@@ -200,12 +221,12 @@ function Functionality() {
</div>
<div className="sc-column sc-column-small">
<div>
<h6 className="sc-regular-weight spacer-bottom">Open and transparent</h6>
<h6 className="sc-regular-weight spacer-bottom">Open and Transparent</h6>
<p className="big-spacer-bottom">
Project dashboards keep teams and stakeholders informed on code quality and
releasability
releasability.
</p>
<p>Display project badges and show your communities you’re all about awesome</p>
<p>Display project badges and show your communities you’re all about awesome.</p>
<img
alt=""
className="big-spacer-top"
@@ -216,7 +237,7 @@ function Functionality() {
</div>
</div>
<div className="sc-columns">
<div className="sc-column sc-column-full">
<div className="sc-column sc-column-full big-spacer-bottom">
<div>
<h6 className="sc-regular-weight spacer-bottom">Effective Collaboration</h6>

@@ -229,7 +250,7 @@ function Functionality() {
with your team, share best practices and have fun writing quality code!
</p>
<br />
<p className="sc-with-inline-icon huge-spacer-bottom">
<p className="sc-with-inline-icon">
Connect with
<img
alt="SonarCloud"
@@ -237,10 +258,10 @@ function Functionality() {
/>
and get real-time notifications in your IDE as you work.
</p>
<div>
<div className="big-spacer-top">
<img
alt=""
className="huge-spacer-bottom"
className="big-spacer-top huge-spacer-bottom"
src={`${getBaseUrl()}/images/sonarcloud/ide.svg`}
width="216px"
/>
@@ -255,40 +276,69 @@ function Functionality() {
);
}

function Stats() {
interface StatsProps {
data?: HomepageData;
}

function Stats({ data }: StatsProps) {
return (
<div className="sc-section sc-columns">
<div className="sc-column sc-column-full">
<h5 className="sc-big-spacer-bottom">
Over 3,000 projects
<h3>
Over 3,000 Projects
<br />
continuously analyzed
</h5>
<Statistics statistics={STATISTICS} />
Continuously Analyzed
</h3>
{data && (
<Statistics
statistics={[
{ icon: 'rules', text: 'Static analysis rules checked', value: data.rules },
{ icon: 'locs', text: 'Lines of code analyzed', value: data.publicLoc },
{
icon: 'pull-request',
text: 'Pull Requests decorated/week',
value: data.newPullRequests7d
},
{
icon: 'open-source',
text: 'Open-source projects inspected',
value: data.publicProjects
}
]}
/>
)}
</div>
</div>
);
}

function Projects() {
interface ProjectsProps {
featuredProjects?: FeaturedProject[];
}

function Projects({ featuredProjects }: ProjectsProps) {
return (
<div className="sc-section sc-columns">
<div className="sc-column sc-column-full">
<h6 className="big-spacer-bottom">
Transparency makes sense
<br />
and that’s why the trend is growing.
</h6>
<p className="sc-big-spacer-bottom">
Check out these open source projects showing users
<br />
their commitment to quality.
</p>
<FeaturedProjects />
{featuredProjects && (
<>
<h6 className="big-spacer-bottom">
Transparency makes sense
<br />
and that’s why the trend is growing.
</h6>
<p>
Check out these open-source projects showing users
<br />
their commitment to quality.
</p>
<FeaturedProjects projects={featuredProjects} />
</>
)}
<h6 className="spacer-bottom">
Come join the fun, it’s entirely free for open source projects !
Come join the fun, it’s entirely free for open-source projects!
</h6>
<div className="big-spacer-bottom">
<div className="sc-spacer-bottom">
<LoginButtons />
</div>
</div>

+ 32
- 21
server/sonar-web/src/main/js/apps/about/sonarcloud/Pricing.tsx Datei anzeigen

@@ -18,6 +18,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
import Helmet from 'react-helmet';
import Footer from './components/Footer';
import { TopNavBar, FixedNavBar } from './components/NavBars';
import { getBaseUrl } from '../../../helpers/urls';
@@ -28,12 +29,16 @@ export default class Pricing extends React.PureComponent {
container?: HTMLElement | null;

componentDidMount() {
document.documentElement.classList.add('white-page');
if (document.documentElement) {
document.documentElement.classList.add('white-page');
}
document.body.classList.add('white-page');
}

componentWillUnmount() {
document.documentElement.classList.remove('white-page');
if (document.documentElement) {
document.documentElement.classList.remove('white-page');
}
document.body.classList.remove('white-page');
}

@@ -54,9 +59,15 @@ export default class Pricing extends React.PureComponent {
<div className="global-container">
<div className="page-wrapper">
<div className="page-container sc-page">
<FixedNavBar />
<Helmet title="SonarCloud | Plans and Pricing">
<meta
content="Get all the SonarCloud features and functionality for free on your open-source projects. If you need privacy for your code, we have a pricing plan to fit your needs."
name="description"
/>
</Helmet>
<FixedNavBar onPricingPage={true} />
<PageBackgroundHeader />
<TopNavBar whiteLogo={true} />
<TopNavBar onPricingPage={true} whiteLogo={true} />
<ForEveryoneBlock onClick={this.handleClick} />
<LoginCTA />
<PricingFAQ getReference={this.getReference} />
@@ -84,7 +95,7 @@ interface ForEveryoneBlockProps {

function ForEveryoneBlock({ onClick }: ForEveryoneBlockProps) {
return (
<div className="sc-section">
<div className="sc-section big-spacer-top">
<h2 className="white text-center sc-big-spacer-top sc-big-spacer-bottom">
SonarCloud is for everyone
</h2>
@@ -92,7 +103,7 @@ function ForEveryoneBlock({ onClick }: ForEveryoneBlockProps) {
<h4>
Free for <span className="sc-title-orange">public projects</span>
</h4>
<ul className="spacer-top big-spacer-bottom">
<ul className="big-spacer-top big-spacer-bottom">
<li>
<em>Unlimited lines of code</em>
</li>
@@ -106,14 +117,14 @@ function ForEveryoneBlock({ onClick }: ForEveryoneBlockProps) {
<em>Choose members of your team</em> who can work on your projects
</li>
</ul>
<em>Loved by Open Source Developers</em>
<em>Loved by Open-Source Developers</em>
<div className="sc-pricing-privacy">
<h4 className="white">
Need <span className="sc-title-orange">privacy?</span>
</h4>
<ul className="spacer-top big-spacer-bottom">
<ul className="big-spacer-top big-spacer-bottom">
<li>
<em>Create private projects,</em> priced perlines of code.{' '}
<em>Create private projects,</em> priced per lines of code.{' '}
<a href="#" onClick={onClick}>
See price list
</a>
@@ -152,14 +163,14 @@ interface PricingFAQProps {
function PricingFAQ({ getReference }: PricingFAQProps) {
return (
<div className="sc-section pricing-section big-spacer-top sc-big-spacer-bottom">
<h5 className="text-center sc-big-spacer-top big-spacer-bottom">Pricing FAQ</h5>
<h5 className="text-center sc-big-spacer-top sc-big-spacer-bottom">Pricing FAQ</h5>
<div className="sc-columns">
<div className="sc-column sc-column-medium display-flex-center">
<div>
<div className="faq-title" ref={getReference}>
How does pricing works for private projects ?
How does pricing work for private projects?
</div>
<p className="sc-big-spacer-bottom">
<p className="big-spacer-bottom">
Subscribing to a paid plan on SonarCloud allows you to create a private organization
containing private projects. You pay up front for a maximum number of private lines of
code to be analyzed in your organization.
@@ -210,14 +221,14 @@ function PricingFAQ({ getReference }: PricingFAQProps) {
</tbody>
</table>
<div className="faq-title">What payment options are available ?</div>
<p className="sc-big-spacer-bottom">
<p>
Payment is done online by credit card and will happen automatically every month, based
on the plan you choose. We also accept to receive a purchase order and a wire transfer
payment, if ordering a yearly subscription for more than 1M LOCs. In this case, you
need to contact us through the Contact form.
</p>
<div className="faq-title">Can I try a private project on SonarCloud for free?</div>
<p className="sc-big-spacer-bottom">
<p>
Your first 14 days are on us. You just have to upgrade your organization to a paid
plan, and fill your credit card information to get started. After your trial, if you
love it you can continue using SonarCloud and you will be charged for the plan you
@@ -228,13 +239,13 @@ function PricingFAQ({ getReference }: PricingFAQProps) {
<div className="sc-column sc-column-medium display-flex-center">
<div>
<div className="faq-title">What is a Line of Code (LOC) on SonarCloud?</div>
<p className="sc-big-spacer-bottom">
<p>
LOCs are computed by summing up the LOCs of each project analyzed in SonarCloud. The
LOCs used for a project are the LOCs found during the most recent analysis of this
project.
</p>
<div className="faq-title">How are Lines of Code (LOCs) counted towards billing?</div>
<p className="sc-big-spacer-bottom">
<p>
Only LOC from your private projects are counted toward your maximum number of LOCs. If
your project contains branches, the counted LOCs are the ones of the biggest branch.
The count is not related to how frequently the source code is analyzed. If your
@@ -243,19 +254,19 @@ function PricingFAQ({ getReference }: PricingFAQProps) {
notified to either upgrade your plan or reduce the number of LOCs in your projects.
</p>
<div className="faq-title">When will I be invoiced?</div>
<p className="sc-big-spacer-bottom">
<p>
You will be invoiced once a month, the day of the month after your trial ends. For
example if you start your free trial on January 1st, it will last till January 14th
and you will be first billed on January 15th for your upcoming month, aka January 15th
to February 15th.
and you will be first billed on January 15th for your upcoming month, e.g. January
15th to February 15th.
</p>
<div className="faq-title">Can I stop using the service?</div>
<p className="sc-big-spacer-bottom">
<p>
Yes, you can stop using SonarCloud anytime you want. You simply need to downgrade your
organization to the free plan.
</p>
<div className="faq-title">Still have more questions?</div>
<p className="sc-big-spacer-bottom">
<p>
Contact us <a href={`${getBaseUrl()}/about/contact`}>here</a>.
</p>
</div>

+ 16
- 0
server/sonar-web/src/main/js/apps/about/sonarcloud/SQHome.tsx Datei anzeigen

@@ -222,6 +222,14 @@ function Languages() {
width="85"
/>
</li>
<li>
<img
alt="CSS"
height="60"
src={`${getBaseUrl()}/images/languages/black/css.svg`}
width="60"
/>
</li>
<li>
<img
alt="HTML"
@@ -230,6 +238,14 @@ function Languages() {
width="60"
/>
</li>
<li>
<img
alt="Scala"
height="60"
src={`${getBaseUrl()}/images/languages/black/scala.svg`}
width="60"
/>
</li>
<li>
<img
alt="Swift"

+ 34
- 1
server/sonar-web/src/main/js/apps/about/sonarcloud/__tests__/Home-test.tsx Datei anzeigen

@@ -20,9 +20,42 @@
import * as React from 'react';
import { shallow } from 'enzyme';
import Home from '../Home';
import { waitAndUpdate } from '../../../../helpers/testUtils';

it('should render', () => {
jest.mock('../utils', () => ({
requestHomepageData: jest.fn(() =>
Promise.resolve({
publicProjects: 236,
publicLoc: 12345,
pullRequests: 123456,
rules: 1234,
featuredProjects: [
{
key: 'sonarsource-jfrog.simple-js-php-project',
avatarUrl: null,
organizationKey: 'sonarsource-jfrog',
organizationName: 'SonarSource & JFrog',
name: 'Simple JS & PHP project',
bugs: 0,
codeSmells: 7,
coverage: 9.7,
duplications: 56.2,
gateStatus: 'OK',
languages: ['js', 'php'],
maintainabilityRating: 1,
ncloc: 123456,
reliabilityRating: 1,
securityRating: 1,
vulnerabilities: 654321
}
]
})
)
}));

it('should render', async () => {
const wrapper = shallow(<Home />);
await waitAndUpdate(wrapper);
expect(wrapper).toMatchSnapshot();
expect(wrapper.find('PageBackgroundHeader').dive()).toMatchSnapshot();
expect(wrapper.find('PageTitle').dive()).toMatchSnapshot();

+ 185
- 44
server/sonar-web/src/main/js/apps/about/sonarcloud/__tests__/__snapshots__/Home-test.tsx.snap Datei anzeigen

@@ -10,6 +10,16 @@ exports[`should render 1`] = `
<div
className="page-container sc-page"
>
<HelmetWrapper
defer={true}
encodeSpecialCharacters={true}
title="SonarCloud | Clean Code, Rockstar Status"
>
<meta
content="Enhance your workflow with continuous code quality, SonarCloud automatically analyzes and decorates pull requests on GitHub, Bitbucket and Azure DevOps on major languages."
name="description"
/>
</HelmetWrapper>
<FixedNavBar />
<PageBackgroundHeader />
<TopNavBar />
@@ -17,8 +27,66 @@ exports[`should render 1`] = `
<EnhanceWorkflow />
<Functionality />
<Languages />
<Stats />
<Projects />
<Stats
data={
Object {
"featuredProjects": Array [
Object {
"avatarUrl": null,
"bugs": 0,
"codeSmells": 7,
"coverage": 9.7,
"duplications": 56.2,
"gateStatus": "OK",
"key": "sonarsource-jfrog.simple-js-php-project",
"languages": Array [
"js",
"php",
],
"maintainabilityRating": 1,
"name": "Simple JS & PHP project",
"ncloc": 123456,
"organizationKey": "sonarsource-jfrog",
"organizationName": "SonarSource & JFrog",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 654321,
},
],
"publicLoc": 12345,
"publicProjects": 236,
"pullRequests": 123456,
"rules": 1234,
}
}
/>
<Projects
featuredProjects={
Array [
Object {
"avatarUrl": null,
"bugs": 0,
"codeSmells": 7,
"coverage": 9.7,
"duplications": 56.2,
"gateStatus": "OK",
"key": "sonarsource-jfrog.simple-js-php-project",
"languages": Array [
"js",
"php",
],
"maintainabilityRating": 1,
"name": "Simple JS & PHP project",
"ncloc": 123456,
"organizationKey": "sonarsource-jfrog",
"organizationName": "SonarSource & JFrog",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 654321,
},
]
}
/>
</div>
</div>
<Footer />
@@ -49,14 +117,14 @@ exports[`should render 2`] = `

exports[`should render 3`] = `
<div
className="sc-section sc-columns"
className="sc-section sc-columns big-spacer-top"
>
<div
className="sc-column sc-column-half display-flex-center"
>
<div>
<h1
className="sc-title-orange"
className="sc-title-orange big-spacer-top"
>
Clean Code
</h1>
@@ -68,9 +136,9 @@ exports[`should render 3`] = `
<h5
className="sc-big-spacer-bottom sc-regular-weight"
>
Eliminate bugs and vulnerabilities,
Eliminate bugs and vulnerabilities.
<br />
champion quality code in your projects.
Champion quality code in your projects.
</h5>
<div>
<h6>
@@ -80,18 +148,18 @@ exports[`should render 3`] = `
<p
className="sc-mention sc-regular-weight big-spacer-top"
>
Free for Open Source Projects
Free for Open-Source Projects
</p>
</div>
</div>
</div>
<div
className="sc-column sc-column-half text-center"
className="sc-column sc-column-half text-right"
>
<img
alt=""
src="/images/sonarcloud/home-header-people.png"
width="480px"
width="430px"
/>
</div>
</div>
@@ -120,12 +188,12 @@ exports[`should render 4`] = `
<h5
className="spacer-bottom"
>
Maximize your throughput, only release clean code
Maximize your throughput and only release clean code
</h5>
<h6
className="sc-regular-weight"
className="sc-big-spacer-bottom sc-regular-weight"
>
Sonarcloud automatically analyzes branches and decorates pull requests
SonarCloud automatically analyzes branches and decorates pull requests
</h6>
</div>
</div>
@@ -165,7 +233,7 @@ exports[`should render 5`] = `
className="sc-columns"
>
<div
className="sc-column sc-column-small"
className="sc-column sc-column-small big-spacer-top"
>
<h6
className="sc-regular-weight spacer-bottom"
@@ -183,7 +251,7 @@ exports[`should render 5`] = `
>
<img
alt=""
className="spacer-right"
className="big-spacer-right"
src="/images/sonarcloud/scale.svg"
/>
@@ -194,7 +262,7 @@ exports[`should render 5`] = `
>
<img
alt=""
className="spacer-right"
className="big-spacer-right"
src="/images/sonarcloud/stop.svg"
/>
@@ -202,7 +270,7 @@ exports[`should render 5`] = `
</span>
</div>
<div
className="sc-column sc-column-big"
className="sc-column sc-column-big big-spacer-top"
>
<img
alt=""
@@ -232,15 +300,15 @@ exports[`should render 5`] = `
<h6
className="sc-regular-weight spacer-bottom"
>
Open and transparent
Open and Transparent
</h6>
<p
className="big-spacer-bottom"
>
Project dashboards keep teams and stakeholders informed on code quality and releasability
Project dashboards keep teams and stakeholders informed on code quality and releasability.
</p>
<p>
Display project badges and show your communities you’re all about awesome
Display project badges and show your communities you’re all about awesome.
</p>
<img
alt=""
@@ -255,7 +323,7 @@ exports[`should render 5`] = `
className="sc-columns"
>
<div
className="sc-column sc-column-full"
className="sc-column sc-column-full big-spacer-bottom"
>
<div>
<h6
@@ -275,7 +343,7 @@ exports[`should render 5`] = `
</p>
<br />
<p
className="sc-with-inline-icon huge-spacer-bottom"
className="sc-with-inline-icon"
>
Connect with
<img
@@ -284,10 +352,12 @@ exports[`should render 5`] = `
/>
and get real-time notifications in your IDE as you work.
</p>
<div>
<div
className="big-spacer-top"
>
<img
alt=""
className="huge-spacer-bottom"
className="big-spacer-top huge-spacer-bottom"
src="/images/sonarcloud/ide.svg"
width="216px"
/>
@@ -348,6 +418,11 @@ exports[`should render 6`] = `
<img
alt="Java"
src="/images/languages/java.svg"
style={
Object {
"width": "39px",
}
}
/>
</li>
<li
@@ -356,6 +431,11 @@ exports[`should render 6`] = `
<img
alt="JavaScript"
src="/images/languages/js.svg"
style={
Object {
"width": "60px",
}
}
/>
</li>
<li
@@ -364,6 +444,11 @@ exports[`should render 6`] = `
<img
alt="TypeScript"
src="/images/languages/ts.svg"
style={
Object {
"width": "100px",
}
}
/>
</li>
<li
@@ -372,6 +457,11 @@ exports[`should render 6`] = `
<img
alt="C#"
src="/images/languages/csharp.svg"
style={
Object {
"width": "60px",
}
}
/>
</li>
<li
@@ -380,6 +470,11 @@ exports[`should render 6`] = `
<img
alt="Python"
src="/images/languages/python.svg"
style={
Object {
"width": "42px",
}
}
/>
</li>
<li
@@ -388,6 +483,11 @@ exports[`should render 6`] = `
<img
alt="C++"
src="/images/languages/c-c-plus-plus.svg"
style={
Object {
"width": "53px",
}
}
/>
</li>
<li
@@ -396,6 +496,11 @@ exports[`should render 6`] = `
<img
alt="Go"
src="/images/languages/go.svg"
style={
Object {
"width": "91px",
}
}
/>
</li>
<li
@@ -404,6 +509,11 @@ exports[`should render 6`] = `
<img
alt="Kotlin"
src="/images/languages/kotlin.svg"
style={
Object {
"width": "42px",
}
}
/>
</li>
<li
@@ -412,12 +522,21 @@ exports[`should render 6`] = `
<img
alt="Ruby"
src="/images/languages/ruby.svg"
style={
Object {
"width": "43px",
}
}
/>
</li>
<li>
<h3>
<a
className="show-more"
href="#"
onClick={[Function]}
>
</h3>
</a>
</li>
</ul>
</div>
@@ -432,35 +551,33 @@ exports[`should render 7`] = `
<div
className="sc-column sc-column-full"
>
<h5
className="sc-big-spacer-bottom"
>
Over 3,000 projects
<h3>
Over 3,000 Projects
<br />
continuously analyzed
</h5>
Continuously Analyzed
</h3>
<Statistics
statistics={
Array [
Object {
"icon": "rules",
"text": "Static analysis rules checked",
"value": 9675,
"value": 1234,
},
Object {
"icon": "locs",
"text": "Lines of code analyzed",
"value": 20000000,
"value": 12345,
},
Object {
"icon": "pull-request",
"text": "Pull Requests decorated",
"value": 100675,
"text": "Pull Requests decorated/week",
"value": undefined,
},
Object {
"icon": "open-source",
"text": "Open source projects inspected",
"value": 99675,
"text": "Open-source projects inspected",
"value": 236,
},
]
}
@@ -483,21 +600,45 @@ exports[`should render 8`] = `
<br />
and that’s why the trend is growing.
</h6>
<p
className="sc-big-spacer-bottom"
>
Check out these open source projects showing users
<p>
Check out these open-source projects showing users
<br />
their commitment to quality.
</p>
<FeaturedProjects />
<FeaturedProjects
projects={
Array [
Object {
"avatarUrl": null,
"bugs": 0,
"codeSmells": 7,
"coverage": 9.7,
"duplications": 56.2,
"gateStatus": "OK",
"key": "sonarsource-jfrog.simple-js-php-project",
"languages": Array [
"js",
"php",
],
"maintainabilityRating": 1,
"name": "Simple JS & PHP project",
"ncloc": 123456,
"organizationKey": "sonarsource-jfrog",
"organizationName": "SonarSource & JFrog",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 654321,
},
]
}
/>
<h6
className="spacer-bottom"
>
Come join the fun, it’s entirely free for open source projects !
Come join the fun, it’s entirely free for open-source projects!
</h6>
<div
className="big-spacer-bottom"
className="sc-big-spacer-bottom"
>
<LoginButtons />
</div>

+ 17
- 7
server/sonar-web/src/main/js/apps/about/sonarcloud/components/FeaturedProjects.css Datei anzeigen

@@ -19,6 +19,7 @@
*/

.sc-featured-projects {
margin-top: 40px;
position: relative;
}

@@ -46,10 +47,6 @@
transition: transform 0.5s cubic-bezier(0.23, 1, 0.32, 1);
}

.sc-featured-projects-inner.loading {
left: 50%;
}

.sc-project-card-container {
flex: 1 0 calc(100% / 3);
}
@@ -59,7 +56,7 @@
display: inline-block;
margin: 0 10px;
padding: 25px;
border: 1px solid var(--sonarcloudBlack300);
border: 1px solid var(--sonarcloudBlack300) !important;
border-radius: 5px;
box-shadow: 0 1px 1px rgba(7, 7, 6, 0.1);
transition: all 0.1s ease-in;
@@ -89,7 +86,7 @@
align-items: baseline;
justify-content: space-between;
padding: 6px 0 4px;
border-bottom: 1px solid var(--sonarcloudBlack300);
border-bottom: 1px solid var(--sonarcloudBlack250);
}

.sc-project-card-measures li:last-of-type {
@@ -100,12 +97,16 @@
display: inline-flex;
}

.sc-project-card .sc-mention {
color: var(--sonarcloudBlack500);
}

.sc-project-button {
display: block;
position: absolute;
top: 50%;
margin: 0;
padding: 0;
padding: 4px;
border: none;
background: transparent;
color: var(--sonarcloudBlack300);
@@ -115,6 +116,15 @@
transition: all 0.2s ease;
}

.sc-project-button img {
opacity: 0.5;
width: 19px;
}

.sc-project-button:hover img {
opacity: 1;
}

.sc-project-button:last-child {
right: 0;
}

+ 84
- 96
server/sonar-web/src/main/js/apps/about/sonarcloud/components/FeaturedProjects.tsx Datei anzeigen

@@ -22,11 +22,8 @@ import * as classNames from 'classnames';
import CountUp from 'react-countup';
import { throttle } from 'lodash';
import { Link } from 'react-router';
import { Project, requestFeaturedProjects } from '../utils';
import ChevronLeftIcon from '../../../../components/icons-components/ChevronLeftIcon';
import ChevronRightIcon from '../../../../components/icons-components/ChevronRightcon';
import { FeaturedProject } from '../utils';
import CoverageRating from '../../../../components/ui/CoverageRating';
import DeferredSpinner from '../../../../components/common/DeferredSpinner';
import DuplicationsRating from '../../../../components/ui/DuplicationsRating';
import Level from '../../../../components/ui/Level';
import OrganizationAvatar from '../../../../components/common/OrganizationAvatar';
@@ -34,31 +31,33 @@ import ProjectCardLanguagesContainer from '../../../projects/components/ProjectC
import Rating from '../../../../components/ui/Rating';
import { formatMeasure } from '../../../../helpers/measures';
import { getMetricName } from '../../../overview/utils';
import { getProjectUrl } from '../../../../helpers/urls';
import { getProjectUrl, getBaseUrl } from '../../../../helpers/urls';
import './FeaturedProjects.css';

interface Props {
projects: FeaturedProject[];
}

interface State {
loading: boolean;
reversing: boolean;
slides: Array<{
order: number;
project: Project;
project: FeaturedProject;
}>;
sliding: boolean;
translate: number;
viewable: boolean;
}

export default class FeaturedProjects extends React.PureComponent<{}, State> {
export default class FeaturedProjects extends React.PureComponent<Props, State> {
container?: HTMLElement | null;
mounted = false;

constructor(props: {}) {
constructor(props: Props) {
super(props);
this.state = {
loading: true,
reversing: false,
slides: [],
slides: this.orderProjectsFromProps(),
sliding: false,
translate: 0,
viewable: false
@@ -69,7 +68,12 @@ export default class FeaturedProjects extends React.PureComponent<{}, State> {
componentDidMount() {
this.mounted = true;
document.addEventListener('scroll', this.handleScroll, true);
this.fetchProjects();
}

componentDidUpdate(prevProps: Props) {
if (prevProps.projects !== this.props.projects) {
this.setState({ slides: this.orderProjectsFromProps() });
}
}

componentWillUnmount() {
@@ -80,30 +84,24 @@ export default class FeaturedProjects extends React.PureComponent<{}, State> {
handleScroll = () => {
if (this.container) {
const rect = this.container.getBoundingClientRect();
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
const windowHeight =
window.innerHeight ||
(document.documentElement ? document.documentElement.clientHeight : 0);
if (rect.top <= windowHeight && rect.top + rect.height >= 0) {
this.setState({ viewable: true });
}
}
};

fetchProjects = () => {
requestFeaturedProjects()
.then(projects =>
// Move the last element at the begining to properly display the carousel animations
this.setState({
loading: false,
slides: [projects.pop(), ...projects].map((project: Project, id) => {
return {
order: id,
project
};
})
})
)
.catch(() => {
/* Fail silently */
});
orderProjectsFromProps = () => {
const { projects } = this.props;
// Last element should be put at the begining for proper carousel animation
return [projects.pop(), ...projects].map((project: FeaturedProject, id) => {
return {
order: id,
project
};
});
};

handlePrevClick = () => {
@@ -137,46 +135,35 @@ export default class FeaturedProjects extends React.PureComponent<{}, State> {
};

render() {
const { loading, reversing, sliding, viewable } = this.state;
const { reversing, sliding, viewable } = this.state;
return (
<div
className="sc-featured-projects sc-big-spacer-bottom"
ref={node => (this.container = node)}>
{!loading && (
<button
className="js-prev sc-project-button"
onClick={this.handlePrevClick}
type="button">
<ChevronLeftIcon className="spacer-left" size={32} />
</button>
)}
<button className="js-prev sc-project-button" onClick={this.handlePrevClick} type="button">
<img alt="" src={`${getBaseUrl()}/images/sonarcloud/chevron-left.svg`} />
</button>

<div className="sc-featured-projects-container">
<div
className={classNames('sc-featured-projects-inner', {
reversing,
ready: !sliding,
loading
ready: !sliding
})}>
{loading && <DeferredSpinner />}
{!loading &&
this.state.slides.map(slide => (
<ProjectCard
key={slide.project.key}
order={slide.order}
project={slide.project}
viewable={viewable}
/>
))}
{this.state.slides.map(slide => (
<ProjectCard
key={slide.project.key}
order={slide.order}
project={slide.project}
viewable={viewable}
/>
))}
</div>
</div>
{!loading && (
<button
className="js-next sc-project-button"
onClick={this.handleNextClick}
type="button">
<ChevronRightIcon className="spacer-left" size={32} />
</button>
)}

<button className="js-next sc-project-button" onClick={this.handleNextClick} type="button">
<img alt="" src={`${getBaseUrl()}/images/sonarcloud/chevron-right.svg`} />
</button>
</div>
);
}
@@ -184,7 +171,7 @@ export default class FeaturedProjects extends React.PureComponent<{}, State> {

interface ProjectCardProps {
order: number;
project: Project;
project: FeaturedProject;
viewable: boolean;
}

@@ -193,39 +180,38 @@ export function ProjectCard({ project, order, viewable }: ProjectCardProps) {
<div className="sc-project-card-container" style={{ order }}>
<Link className="sc-project-card" to={getProjectUrl(project.key)}>
<div className="sc-project-card-header">
{project.organization && (
<>
<OrganizationAvatar
className="no-border big-spacer-bottom"
organization={project.organization}
/>
<p className="sc-project-card-limited" title={project.organization.name}>
{project.organization.name}
</p>
</>
)}
<h5 className="sc-project-card-limited spacer-bottom" title={project.name}>
<OrganizationAvatar
className="no-border spacer-bottom"
organization={{
name: project.organizationName,
avatar: project.avatarUrl || undefined
}}
/>
<p className="sc-project-card-limited" title={project.organizationName}>
{project.organizationName}
</p>
<h5 className="sc-project-card-limited big-spacer-bottom" title={project.name}>
{project.name}
</h5>
<Level level={project.measures['alert_status']} />
<Level level={project.gateStatus} />
</div>
<ul className="sc-project-card-measures">
<ProjectIssues
measures={project.measures}
metric="bugs"
ratingMetric="reliability_rating"
metric={project.bugs}
metricKey="bugs"
ratingMetric={project.reliabilityRating}
viewable={viewable}
/>
<ProjectIssues
measures={project.measures}
metric="vulnerabilities"
ratingMetric="security_rating"
metric={project.vulnerabilities}
metricKey="vulnerabilities"
ratingMetric={project.securityRating}
viewable={viewable}
/>
<ProjectIssues
measures={project.measures}
metric="code_smells"
ratingMetric="sqale_rating"
metric={project.codeSmells}
metricKey="code_smells"
ratingMetric={project.maintainabilityRating}
viewable={viewable}
/>
<li>
@@ -237,7 +223,7 @@ export function ProjectCard({ project, order, viewable }: ProjectCardProps) {
decimals={1}
delay={0}
duration={4}
end={parseFloat(project.measures['coverage'])}
end={project.coverage}
suffix="%">
{(data: { countUpRef?: React.RefObject<HTMLHeadingElement> }) => (
<h6 className="display-inline-block big-spacer-right" ref={data.countUpRef}>
@@ -246,7 +232,7 @@ export function ProjectCard({ project, order, viewable }: ProjectCardProps) {
)}
</CountUp>
)}
<CoverageRating value={project.measures['coverage']} />
<CoverageRating value={project.coverage} />
</div>
</li>
<li>
@@ -258,7 +244,7 @@ export function ProjectCard({ project, order, viewable }: ProjectCardProps) {
decimals={1}
delay={0}
duration={4}
end={parseFloat(project.measures['duplicated_lines_density'])}
end={project.duplications}
suffix="%">
{(data: { countUpRef?: React.RefObject<HTMLHeadingElement> }) => (
<h6 className="display-inline-block big-spacer-right" ref={data.countUpRef}>
@@ -267,15 +253,15 @@ export function ProjectCard({ project, order, viewable }: ProjectCardProps) {
)}
</CountUp>
)}
<DuplicationsRating value={Number(project.measures['duplicated_lines_density'])} />
<DuplicationsRating value={project.duplications} />
</div>
</li>
</ul>
<div className="sc-mention text-left big-spacer-top">
{formatMeasure(project.measures['ncloc'], 'SHORT_INT')} lines of code /{' '}
{formatMeasure(project.ncloc, 'SHORT_INT')} lines of code /{' '}
<ProjectCardLanguagesContainer
className="display-inline-block"
distribution={project.measures['ncloc_language_distribution']}
distribution={project.languages.join(';')}
/>
</div>
</Link>
@@ -284,20 +270,22 @@ export function ProjectCard({ project, order, viewable }: ProjectCardProps) {
}

interface ProjectIssues {
measures: { [key: string]: string };
metric: string;
ratingMetric: string;
metricKey: string;
metric: number;
ratingMetric: number;
viewable: boolean;
}

export function ProjectIssues({ measures, metric, ratingMetric, viewable }: ProjectIssues) {
const value = parseFloat(formatMeasure(measures[metric], 'SHORT_INT'));
export function ProjectIssues({ metric, metricKey, ratingMetric, viewable }: ProjectIssues) {
const formattedString = formatMeasure(metric, 'SHORT_INT');
const value = parseFloat(formattedString.slice(0, -1));
const suffix = formattedString.substr(-1);
return (
<li>
<span>{getMetricName(metric)}</span>
<span>{getMetricName(metricKey)}</span>
<div>
{viewable && (
<CountUp delay={0} duration={4} end={value}>
<CountUp delay={0} duration={4} end={value} suffix={suffix}>
{(data: { countUpRef?: React.RefObject<HTMLHeadingElement> }) => (
<h6 className="display-inline-block big-spacer-right" ref={data.countUpRef}>
0
@@ -305,7 +293,7 @@ export function ProjectIssues({ measures, metric, ratingMetric, viewable }: Proj
)}
</CountUp>
)}
<Rating value={measures[ratingMetric]} />
<Rating value={ratingMetric} />
</div>
</li>
);

+ 25
- 20
server/sonar-web/src/main/js/apps/about/sonarcloud/components/Languages.tsx Datei anzeigen

@@ -26,25 +26,27 @@ interface State {
}

const LANGUAGES = [
{ name: 'Java', file: 'java.svg' },
{ name: 'JavaScript', file: 'js.svg' },
{ name: 'TypeScript', file: 'ts.svg' },
{ name: 'C#', file: 'csharp.svg' },
{ name: 'Python', file: 'python.svg' },
{ name: 'C++', file: 'c-c-plus-plus.svg' },
{ name: 'Go', file: 'go.svg' },
{ name: 'Kotlin', file: 'kotlin.svg' },
{ name: 'Ruby', file: 'ruby.svg' },
{ name: 'ABAP', file: 'abap.svg' },
{ name: 'Flex', file: 'flex.svg' },
{ name: 'HTML', file: 'html5.svg' },
{ name: 'Objective-C', file: 'obj-c.svg' },
{ name: 'PHP', file: 'php.svg' },
{ name: 'Swift', file: 'swift.svg' },
{ name: 'T-SQL', file: 't-sql.svg' },
{ name: 'PL/SQL', file: 'pl-sql.svg' },
{ name: 'VB', file: 'vb.svg' },
{ name: 'XML', file: 'xml.svg' }
{ name: 'Java', file: 'java.svg', width: 39 },
{ name: 'JavaScript', file: 'js.svg', width: 60 },
{ name: 'TypeScript', file: 'ts.svg', width: 100 },
{ name: 'C#', file: 'csharp.svg', width: 60 },
{ name: 'Python', file: 'python.svg', width: 42 },
{ name: 'C++', file: 'c-c-plus-plus.svg', width: 53 },
{ name: 'Go', file: 'go.svg', width: 91 },
{ name: 'Kotlin', file: 'kotlin.svg', width: 42 },
{ name: 'Ruby', file: 'ruby.svg', width: 43 },
{ name: 'ABAP', file: 'abap.svg', width: 52 },
{ name: 'Flex', file: 'flex.svg', width: 40 },
{ name: 'CSS', file: 'css.svg', width: 40 },
{ name: 'HTML', file: 'html5.svg', width: 40 },
{ name: 'Objective-C', file: 'obj-c.svg', width: 60 },
{ name: 'PHP', file: 'php.svg', width: 57 },
{ name: 'Scala', file: 'scala.svg', width: 30 },
{ name: 'Swift', file: 'swift.svg', width: 40 },
{ name: 'T-SQL', file: 't-sql.svg', width: 53 },
{ name: 'PL/SQL', file: 'pl-sql.svg', width: 65 },
{ name: 'VB', file: 'vb.svg', width: 55 },
{ name: 'XML', file: 'xml.svg', width: 67 }
];

export class Languages extends React.PureComponent<{}, State> {
@@ -94,12 +96,15 @@ export class Languages extends React.PureComponent<{}, State> {
<img
alt={language.name}
src={`${getBaseUrl()}/images/languages/${language.file}`}
style={{ width: language.width + 'px' }}
/>
</li>
))}
{!open && (
<li>
<h3>…</h3>
<a className="show-more" href="#" onClick={this.handleOpenClick}>
</a>
</li>
)}
</ul>

+ 1
- 1
server/sonar-web/src/main/js/apps/about/sonarcloud/components/LoginButtons.css Datei anzeigen

@@ -21,7 +21,7 @@
.sc-login-button {
display: inline-block;
background-color: var(--sonarcloudBlack100);
border: 1px solid var(--sonarcloudBlack300);
border: 1px solid var(--sonarcloudBlack300) !important;
color: var(--sonarcloudBlack800);
margin: 10px 12px auto auto;
font-size: 18px;

+ 56
- 22
server/sonar-web/src/main/js/apps/about/sonarcloud/components/NavBars.css Datei anzeigen

@@ -30,19 +30,23 @@
top: -100px;
}

.navbar-inner {
position: relative;
}

.top-navbar {
height: 60px;
line-height: 60px;
}

.top-navbar a,
.navbar a {
border-bottom: none;
.top-navbar img {
height: 48px;
vertical-align: middle;
margin-top: 12px;
}

.top-navbar img,
.navbar img {
height: 50px;
height: 40px;
vertical-align: middle;
}

@@ -51,11 +55,21 @@
float: right;
}

.top-navbar ul {
margin-top: 10px;
}

.top-navbar ul li,
.navbar ul li {
display: inline-block;
margin: 0 0 0 30px;
line-height: 30px;
border-color: #fff;
transition: all 0.2s ease;
}

.navbar ul li {
line-height: 54px;
}

.top-navbar ul li a,
@@ -63,40 +77,60 @@
font-family: var(--sonarcloudFontFamily);
color: var(--sonarcloudBlack800);
font-weight: 700;
display: inline-block;
}

.navbar ul li:hover {
border-bottom: 2px solid var(--sonarcloudOrange500);
.navbar ul li.outline {
line-height: 30px;
}

.top-navbar ul li a {
color: #fff;
}

.top-navbar ul li:hover {
.top-navbar ul li.outline a,
.navbar ul li.outline a {
height: 30px;
border: 1px solid var(--sonarcloudBlack800);
padding: 0 10px;
border-radius: 3px;
}

.top-navbar ul li.outline a {
border: 1px solid #fff;
}

.top-navbar ul li a.active,
.top-navbar ul li a:hover {
border-bottom: 2px solid #fff;
}

.navbar ul li a.active,
.navbar ul li a:hover {
border-bottom: 2px solid var(--sonarcloudOrange500);
color: var(--sonarcloudOrange500);
}

.top-navbar ul li.outline:hover,
.navbar ul li.outline:hover {
border-bottom: none;
.top-navbar ul li.outline a:hover,
.navbar ul li.outline a:hover {
border-bottom-width: 1px;
}

.navbar ul li.outline:hover a {
border-color: var(--sonarcloudOrange500);
.top-navbar ul li.outline:hover a {
background: #fff;
color: var(--sonarcloudOrange500);
}

.top-navbar ul li.outline a,
.navbar ul li.outline a {
border: 1px solid var(--sonarcloudBlack800);
padding: 6px 10px;
border-radius: 4px;
.navbar ul li.outline:hover a {
border-color: var(--sonarcloudOrange500);
}

.top-navbar ul li a {
color: #fff;
.sc-page .top-navbar a,
.sc-page .navbar a {
border-bottom: 2px solid rgba(255, 255, 255, 0);
transition: border-color 0.2s ease;
}

.top-navbar ul li.outline a {
border: 1px solid #fff;
.sc-page .navbar-limited > a {
border: none !important;
}

+ 19
- 11
server/sonar-web/src/main/js/apps/about/sonarcloud/components/NavBars.tsx Datei anzeigen

@@ -23,12 +23,16 @@ import { getBaseUrl } from '../../../../helpers/urls';
import NavBar from '../../../../components/nav/NavBar';
import './NavBars.css';

interface Props {
onPricingPage?: boolean;
}

interface State {
top: number;
}

export class FixedNavBar extends React.PureComponent<{}, State> {
constructor(props: {}) {
export class FixedNavBar extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
this.state = { top: -100 };
this.handleScroll = throttle(this.handleScroll, 10);
@@ -43,7 +47,10 @@ export class FixedNavBar extends React.PureComponent<{}, State> {
}

handleScroll = () => {
if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) {
const scrollTop =
document.body.scrollTop ||
(document.documentElement ? document.documentElement.scrollTop : 0);
if (scrollTop > 100) {
this.setState({ top: 0 });
} else {
this.setState({ top: -100 });
@@ -53,31 +60,33 @@ export class FixedNavBar extends React.PureComponent<{}, State> {
render() {
return (
<NavBar height={60} top={this.state.top}>
<NavBarLinks />
<NavBarLinks onPricingPage={this.props.onPricingPage} />
</NavBar>
);
}
}

interface TopNavBarProps {
onPricingPage?: boolean;
whiteLogo?: boolean;
}

export function TopNavBar({ whiteLogo }: TopNavBarProps) {
export function TopNavBar({ onPricingPage, whiteLogo }: TopNavBarProps) {
return (
<div className="top-navbar">
<div className="navbar-limited">
<NavBarLinks whiteLogo={whiteLogo} />
<NavBarLinks onPricingPage={onPricingPage} whiteLogo={whiteLogo} />
</div>
</div>
);
}

interface NavBarLinksProps {
onPricingPage?: boolean;
whiteLogo?: boolean;
}

function NavBarLinks({ whiteLogo }: NavBarLinksProps) {
function NavBarLinks({ onPricingPage, whiteLogo }: NavBarLinksProps) {
return (
<>
<a href={`${getBaseUrl()}/`}>
@@ -88,10 +97,9 @@ function NavBarLinks({ whiteLogo }: NavBarLinksProps) {
</a>
<ul>
<li>
<a href={`${getBaseUrl()}/about/pricing`}>Pricing</a>
</li>
<li>
<a href={`${getBaseUrl()}/explore/projects`}>Explore</a>
<a className={onPricingPage ? 'active' : ''} href={`${getBaseUrl()}/about/pricing`}>
Pricing
</a>
</li>
<li className="outline">
<a href={`${getBaseUrl()}/sessions/new`}>Log in</a>

+ 8
- 3
server/sonar-web/src/main/js/apps/about/sonarcloud/components/Statistics.css Datei anzeigen

@@ -24,7 +24,7 @@
}

.sc-stat-card {
flex: 0 0 240px;
flex: 0 0 244px;
display: flex;
align-items: center;
border: 1px solid var(--sonarcloudBlack300);
@@ -33,10 +33,15 @@

.sc-stat-icon {
background-color: var(--sonarcloudBlack200);
padding: 32px 16px;
padding: 32px 20px;
}

.sc-stat-content {
padding: 0 16px;
padding: 0 20px;
text-align: left;
}

.sc-page .sc-stat-content span {
font-family: var(--sonarcloudFontFamily);
font-weight: 500;
}

+ 6
- 4
server/sonar-web/src/main/js/apps/about/sonarcloud/components/Statistics.tsx Datei anzeigen

@@ -72,7 +72,9 @@ export class StatisticCard extends React.PureComponent<StatisticCardProps, Stati
handleScroll = () => {
if (this.container) {
const rect = this.container.getBoundingClientRect();
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
const windowHeight =
window.innerHeight ||
(document.documentElement ? document.documentElement.clientHeight : 0);
if (rect.top <= windowHeight && rect.top + rect.height >= 0) {
this.setState({ viewable: true });
}
@@ -85,9 +87,9 @@ export class StatisticCard extends React.PureComponent<StatisticCardProps, Stati
const value = parseFloat(formattedString.slice(0, -1));
const suffix = formattedString.substr(-1);
return (
<div className="sc-stat-card" ref={node => (this.container = node)}>
<div className="sc-stat-card sc-big-spacer-top" ref={node => (this.container = node)}>
<div className="sc-stat-icon">
<img alt="" height={32} src={`${getBaseUrl()}/images/sonarcloud/${statistic.icon}.svg`} />
<img alt="" height={28} src={`${getBaseUrl()}/images/sonarcloud/${statistic.icon}.svg`} />
</div>
<div className="sc-stat-content">
{this.state.viewable && (
@@ -97,7 +99,7 @@ export class StatisticCard extends React.PureComponent<StatisticCardProps, Stati
)}
</CountUp>
)}
<span className="sc-medium-weight">{statistic.text}</span>
<span>{statistic.text}</span>
</div>
</div>
);

+ 101
- 61
server/sonar-web/src/main/js/apps/about/sonarcloud/components/__tests__/FeaturedProjects-test.tsx Datei anzeigen

@@ -20,80 +20,120 @@
import * as React from 'react';
import { shallow } from 'enzyme';
import FeaturedProjects, { ProjectCard, ProjectIssues } from '../FeaturedProjects';
import { requestFeaturedProjects } from '../../utils';
import { click, waitAndUpdate } from '../../../../../helpers/testUtils';
import { click } from '../../../../../helpers/testUtils';

jest.mock('../../utils', () => ({
requestFeaturedProjects: jest.fn(() =>
Promise.resolve([
{
key: 'foo',
measures: { coverage: '20', foo: '15' },
name: 'Foo',
organization: { name: 'Foo', avatar: '' }
},
{
key: 'bar',
measures: { bar: '20', foo: '15' },
name: 'Bar',
organization: { name: 'Bar', avatar: '' }
},
{
key: 'baz',
measures: { bar: '20', foo: '15' },
name: 'Baz',
organization: { name: 'Baz', avatar: '' }
},
{
key: 'foobar',
measures: { bar: '20', foo: '15' },
name: 'Foobar',
organization: { name: 'Foobar', avatar: '' }
}
])
)
}));

const PROJECT = {
key: 'foo',
measures: { bar: '20', foo: '15' },
name: 'Foo',
organization: { name: 'Foo', avatar: '' }
};

beforeEach(() => {
(requestFeaturedProjects as jest.Mock<any>).mockClear();
});
const PROJECTS = [
{
key: 'sonarsource-jfrog.simple-js-php-project',
avatarUrl: null,
organizationKey: 'sonarsource-jfrog',
organizationName: 'SonarSource & JFrog',
name: 'Simple JS & PHP project',
bugs: 0,
codeSmells: 7,
coverage: 9.7,
duplications: 56.2,
gateStatus: 'OK',
languages: ['js', 'php'],
maintainabilityRating: 1,
ncloc: 324,
reliabilityRating: 1,
securityRating: 1,
vulnerabilities: 0
},
{
key: 'example-js',
avatarUrl: null,
organizationKey: 'autoscan',
organizationName: 'AutoScan',
name: 'example-js',
bugs: 13,
codeSmells: 5,
coverage: 0,
duplications: 0,
gateStatus: 'OK',
languages: ['go', 'js', 'php', 'py'],
maintainabilityRating: 1,
ncloc: 80,
reliabilityRating: 1,
securityRating: 1,
vulnerabilities: 0
},
{
key: 'example-js-2',
avatarUrl: null,
organizationKey: 'autoscan',
organizationName: 'AutoScan',
name: 'example-js',
bugs: 13,
codeSmells: 5,
coverage: 0,
duplications: 0,
gateStatus: 'OK',
languages: ['go', 'js', 'php', 'py'],
maintainabilityRating: 1,
ncloc: 80,
reliabilityRating: 1,
securityRating: 1,
vulnerabilities: 0
},
{
key: 'example-js-3',
avatarUrl: null,
organizationKey: 'autoscan',
organizationName: 'AutoScan',
name: 'example-js',
bugs: 13,
codeSmells: 5,
coverage: 0,
duplications: 0,
gateStatus: 'OK',
languages: ['go', 'js', 'php', 'py'],
maintainabilityRating: 1,
ncloc: 80,
reliabilityRating: 1,
securityRating: 1,
vulnerabilities: 0
},
{
key: 'example-js-4',
avatarUrl: null,
organizationKey: 'autoscan',
organizationName: 'AutoScan',
name: 'example-js',
bugs: 13,
codeSmells: 5,
coverage: 0,
duplications: 0,
gateStatus: 'OK',
languages: ['go', 'js', 'php', 'py'],
maintainabilityRating: 1,
ncloc: 80,
reliabilityRating: 1,
securityRating: 1,
vulnerabilities: 0
}
];

it('should render ProjectIssues correctly', () => {
expect(
shallow(
<ProjectIssues
measures={{ bar: '20', foo: '15' }}
metric="foo"
ratingMetric="bar"
viewable={false}
/>
)
shallow(<ProjectIssues metric={15} metricKey="foo" ratingMetric={20} viewable={false} />)
).toMatchSnapshot();
});

it('should render ProjectCard correctly', () => {
expect(shallow(<ProjectCard order={1} project={PROJECT} viewable={false} />)).toMatchSnapshot();
expect(
shallow(<ProjectCard order={1} project={PROJECTS[0]} viewable={false} />)
).toMatchSnapshot();
});

it('should render correctly', async () => {
const wrapper = shallow(<FeaturedProjects />);
await waitAndUpdate(wrapper);
it('should render correctly', () => {
const wrapper = shallow(<FeaturedProjects projects={PROJECTS} />);
expect(wrapper).toMatchSnapshot();
});

it('should cycle through projects', async () => {
const wrapper = shallow(<FeaturedProjects />);
expect(wrapper.find('DeferredSpinner')).toHaveLength(1);

await waitAndUpdate(wrapper);

it('should cycle through projects', () => {
const wrapper = shallow<FeaturedProjects>(<FeaturedProjects projects={PROJECTS} />);
expect(wrapper.state().slides.map((slide: any) => slide.order)).toEqual([0, 1, 2, 3]);

click(wrapper.find('.js-next'));

+ 159
- 98
server/sonar-web/src/main/js/apps/about/sonarcloud/components/__tests__/__snapshots__/FeaturedProjects-test.tsx.snap Datei anzeigen

@@ -18,7 +18,7 @@ exports[`should render ProjectCard correctly 1`] = `
"pathname": "/dashboard",
"query": Object {
"branch": undefined,
"id": "foo",
"id": "sonarsource-jfrog.simple-js-php-project",
},
}
}
@@ -26,65 +26,50 @@ exports[`should render ProjectCard correctly 1`] = `
<div
className="sc-project-card-header"
>
<React.Fragment>
<OrganizationAvatar
className="no-border big-spacer-bottom"
organization={
Object {
"avatar": "",
"name": "Foo",
}
<OrganizationAvatar
className="no-border spacer-bottom"
organization={
Object {
"avatar": undefined,
"name": "SonarSource & JFrog",
}
/>
<p
className="sc-project-card-limited"
title="Foo"
>
Foo
</p>
</React.Fragment>
}
/>
<p
className="sc-project-card-limited"
title="SonarSource & JFrog"
>
SonarSource & JFrog
</p>
<h5
className="sc-project-card-limited spacer-bottom"
title="Foo"
className="sc-project-card-limited big-spacer-bottom"
title="Simple JS & PHP project"
>
Foo
Simple JS & PHP project
</h5>
<Level />
<Level
level="OK"
/>
</div>
<ul
className="sc-project-card-measures"
>
<ProjectIssues
measures={
Object {
"bar": "20",
"foo": "15",
}
}
metric="bugs"
ratingMetric="reliability_rating"
metric={0}
metricKey="bugs"
ratingMetric={1}
viewable={false}
/>
<ProjectIssues
measures={
Object {
"bar": "20",
"foo": "15",
}
}
metric="vulnerabilities"
ratingMetric="security_rating"
metric={0}
metricKey="vulnerabilities"
ratingMetric={1}
viewable={false}
/>
<ProjectIssues
measures={
Object {
"bar": "20",
"foo": "15",
}
}
metric="code_smells"
ratingMetric="sqale_rating"
metric={7}
metricKey="code_smells"
ratingMetric={1}
viewable={false}
/>
<li>
@@ -92,7 +77,9 @@ exports[`should render ProjectCard correctly 1`] = `
overview.metric.coverage
</span>
<div>
<CoverageRating />
<CoverageRating
value={9.7}
/>
</div>
</li>
<li>
@@ -101,7 +88,7 @@ exports[`should render ProjectCard correctly 1`] = `
</span>
<div>
<DuplicationsRating
value={NaN}
value={56.2}
/>
</div>
</li>
@@ -109,10 +96,12 @@ exports[`should render ProjectCard correctly 1`] = `
<div
className="sc-mention text-left big-spacer-top"
>
324
lines of code /
<Connect(ProjectCardLanguages)
className="display-inline-block"
distribution="js;php"
/>
</div>
</Link>
@@ -126,7 +115,7 @@ exports[`should render ProjectIssues correctly 1`] = `
</span>
<div>
<Rating
value="20"
value={20}
/>
</div>
</li>
@@ -141,9 +130,9 @@ exports[`should render correctly 1`] = `
onClick={[Function]}
type="button"
>
<ChevronLeftIcon
className="spacer-left"
size={32}
<img
alt=""
src="/images/sonarcloud/chevron-left.svg"
/>
</button>
<div
@@ -153,77 +142,149 @@ exports[`should render correctly 1`] = `
className="sc-featured-projects-inner ready"
>
<ProjectCard
key="foobar"
key="example-js-4"
order={0}
project={
Object {
"key": "foobar",
"measures": Object {
"bar": "20",
"foo": "15",
},
"name": "Foobar",
"organization": Object {
"avatar": "",
"name": "Foobar",
},
"avatarUrl": null,
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"key": "example-js-4",
"languages": Array [
"go",
"js",
"php",
"py",
],
"maintainabilityRating": 1,
"name": "example-js",
"ncloc": 80,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0,
}
}
viewable={false}
/>
<ProjectCard
key="foo"
key="sonarsource-jfrog.simple-js-php-project"
order={1}
project={
Object {
"key": "foo",
"measures": Object {
"coverage": "20",
"foo": "15",
},
"name": "Foo",
"organization": Object {
"avatar": "",
"name": "Foo",
},
"avatarUrl": null,
"bugs": 0,
"codeSmells": 7,
"coverage": 9.7,
"duplications": 56.2,
"gateStatus": "OK",
"key": "sonarsource-jfrog.simple-js-php-project",
"languages": Array [
"js",
"php",
],
"maintainabilityRating": 1,
"name": "Simple JS & PHP project",
"ncloc": 324,
"organizationKey": "sonarsource-jfrog",
"organizationName": "SonarSource & JFrog",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0,
}
}
viewable={false}
/>
<ProjectCard
key="bar"
key="example-js"
order={2}
project={
Object {
"key": "bar",
"measures": Object {
"bar": "20",
"foo": "15",
},
"name": "Bar",
"organization": Object {
"avatar": "",
"name": "Bar",
},
"avatarUrl": null,
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"key": "example-js",
"languages": Array [
"go",
"js",
"php",
"py",
],
"maintainabilityRating": 1,
"name": "example-js",
"ncloc": 80,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0,
}
}
viewable={false}
/>
<ProjectCard
key="baz"
key="example-js-2"
order={3}
project={
Object {
"key": "baz",
"measures": Object {
"bar": "20",
"foo": "15",
},
"name": "Baz",
"organization": Object {
"avatar": "",
"name": "Baz",
},
"avatarUrl": null,
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"key": "example-js-2",
"languages": Array [
"go",
"js",
"php",
"py",
],
"maintainabilityRating": 1,
"name": "example-js",
"ncloc": 80,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0,
}
}
viewable={false}
/>
<ProjectCard
key="example-js-3"
order={4}
project={
Object {
"avatarUrl": null,
"bugs": 13,
"codeSmells": 5,
"coverage": 0,
"duplications": 0,
"gateStatus": "OK",
"key": "example-js-3",
"languages": Array [
"go",
"js",
"php",
"py",
],
"maintainabilityRating": 1,
"name": "example-js",
"ncloc": 80,
"organizationKey": "autoscan",
"organizationName": "AutoScan",
"reliabilityRating": 1,
"securityRating": 1,
"vulnerabilities": 0,
}
}
viewable={false}
@@ -235,9 +296,9 @@ exports[`should render correctly 1`] = `
onClick={[Function]}
type="button"
>
<ChevronRightIcon
className="spacer-left"
size={32}
<img
alt=""
src="/images/sonarcloud/chevron-right.svg"
/>
</button>
</div>

+ 3
- 5
server/sonar-web/src/main/js/apps/about/sonarcloud/components/__tests__/__snapshots__/Statistics-test.tsx.snap Datei anzeigen

@@ -19,23 +19,21 @@ exports[`should render 1`] = `

exports[`should render StatisticCard 1`] = `
<div
className="sc-stat-card"
className="sc-stat-card sc-big-spacer-top"
>
<div
className="sc-stat-icon"
>
<img
alt=""
height={32}
height={28}
src="/images/sonarcloud/stat-icon.svg"
/>
</div>
<div
className="sc-stat-content"
>
<span
className="sc-medium-weight"
>
<span>
my stat
</span>
</div>

+ 61
- 20
server/sonar-web/src/main/js/apps/about/sonarcloud/new_style.css Datei anzeigen

@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
@import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700');
@import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900');

.sc-page,
.sc-page span,
@@ -40,6 +40,7 @@
.sc-page h1 {
line-height: 62px;
font-size: 60px;
font-weight: 900;
}

.sc-page h2 {
@@ -67,6 +68,18 @@
font-size: 21px;
}

.sc-page p {
line-height: 21px;
}

.sc-page a {
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
}

.sc-page a:hover {
border-bottom: 1px solid #fff;
}

.sc-section {
position: relative;
max-width: 1040px;
@@ -216,12 +229,12 @@
}

.sc-with-icon img {
height: 14px;
height: 16px;
}

.sc-with-inline-icon img {
max-height: 18px;
padding: 0 4px;
max-height: 21px;
padding: 0 6px;
}

.sc-functionality-container {
@@ -229,30 +242,30 @@
}

.sc-languages-container {
padding: 90px 0 0;
padding: 130px 0 0;
background-color: var(--sonarcloudBlack800);
margin-bottom: 90px;
box-sizing: border-box;
}

.sc-languages-list {
display: flex;
flex-wrap: wrap;
margin-left: 40px;
margin-bottom: -40px;
margin-left: 120px;
transition: height 0.3s ease;
margin-bottom: 10px;
}

.sc-languages-list > li {
display: inline-block;
text-align: center;
margin: 0 0 45px 80px;
height: 60px;
width: 60px;
margin: 0 0 45px 0;
line-height: 60px;
width: 140px;
}

.sc-languages-list > li img {
height: 100%;
width: 100%;
vertical-align: middle;
}

.sc-languages-container h3,
@@ -269,6 +282,23 @@
font-size: 32px;
}

.sc-page a.show-more {
display: inline-block;
font-family: var(--sonarcloudFontFamily);
color: #fff;
font-weight: 700;
line-height: 33px;
font-size: 36px;
border: none;
border-radius: 50%;
height: 50px;
width: 50px;
}

.sc-page a.show-more:hover {
background: var(--sonarcloudBlack700);
}

.sc-pricing-free {
font-family: var(--sonarcloudFontFamily);
box-sizing: border-box;
@@ -294,6 +324,11 @@
padding: 10px 10px 10px 32px;
}

.sc-pricing-privacy ul li,
.sc-pricing-privacy em {
color: #fff;
}

.sc-pricing-free ul li em {
font-weight: 700;
font-style: normal;
@@ -308,12 +343,7 @@
width: 350px;
right: -70px;
top: -20px;
padding: 50px 40px;
}

.sc-pricing-privacy ul li,
.sc-pricing-privacy em {
color: #fff;
padding: 60px 40px 40px;
}

.sc-pricing-privacy ul {
@@ -322,7 +352,6 @@

.sc-pricing-privacy a {
color: #fff;
border-bottom: 1px solid #fff;
}

.sc-pricing-privacy .starts-at {
@@ -342,6 +371,7 @@ a.sc-orange-button {
border-radius: 4px;
height: 44px;
line-height: 44px;
box-shadow: none;
}

a.sc-orange-button:hover {
@@ -352,11 +382,22 @@ a.sc-orange-button:hover {
.pricing-section .faq-title {
font-family: var(--sonarcloudFontFamily);
font-size: 21px;
padding-bottom: 18px;
padding-bottom: 10px;
}

.pricing-section p {
font-size: 15px;
margin-bottom: 35px;
}

.pricing-section p a {
color: var(--sonarcloudOrange500);
border-bottom: 1px solid rgba(253, 106, 0, 0.3);
}

.pricing-section p a:hover {
color: var(--sonarcloudOrange700);
border-bottom: 1px solid var(--sonarcloudOrange700);
}

table.loc-price th {

+ 25
- 108
server/sonar-web/src/main/js/apps/about/sonarcloud/utils.ts Datei anzeigen

@@ -18,117 +18,34 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

export interface Project {
export interface FeaturedProject {
key: string;
measures: { [key: string]: string };
avatarUrl: string | null;
organizationKey: string;
organizationName: string;
name: string;
organization?: { avatar: string; name: string };
bugs: number;
codeSmells: number;
coverage: number;
duplications: number;
gateStatus: string;
languages: string[];
maintainabilityRating: number;
ncloc: number;
reliabilityRating: number;
securityRating: number;
vulnerabilities: number;
}

// TODO Get this from an external source
const PROJECTS = [
{
key: 'org.hibernate.search.v6poc:hibernate-search-parent',
name: 'Hibernate Search 6 POC Parent POM',
measures: {
bugs: '39',
reliability_rating: '1',
vulnerabilities: '5',
security_rating: '2',
code_smells: '1',
sqale_rating: '1.0',
coverage: '89.9',
duplicated_lines_density: '1.1',
ncloc: '336726',
ncloc_language_distribution: 'java=175123;js=26382'
},
organization: {
avatar: '',
name: 'Hibernate'
}
},
{
key: 'com.github.sdorra:web-resources',
name: 'Web Resources',
measures: {
bugs: '39',
reliability_rating: '1',
vulnerabilities: '5',
security_rating: '2',
code_smells: '1',
sqale_rating: '1.0',
coverage: '89.9',
duplicated_lines_density: '1.1',
ncloc: '336726',
ncloc_language_distribution: 'java=175123;js=26382'
},
organization: {
avatar: '',
name: 'sdorra-github'
}
},
{
key: 'vyos:vyos-1x',
name: 'vyos-1x',
measures: {
bugs: '39',
reliability_rating: '1',
vulnerabilities: '5',
security_rating: '2',
code_smells: '1',
sqale_rating: '1.0',
coverage: '89.9',
duplicated_lines_density: '1.1',
ncloc: '336726',
ncloc_language_distribution: 'java=175123;js=26382'
},
organization: {
avatar: '',
name: 'vyos'
}
},
{
key: 'sonarlint-visualstudio',
name: 'SonarLint for Visual Studio',
measures: {
bugs: '39',
reliability_rating: '1',
vulnerabilities: '5',
security_rating: '2',
code_smells: '1',
sqale_rating: '1.0',
coverage: '89.9',
duplicated_lines_density: '1.1',
ncloc: '336726',
ncloc_language_distribution: 'java=175123;js=26382'
},
organization: {
avatar: '',
name: 'sonarsource'
}
},
{
key: 'sample-1',
name: 'Dummy project',
measures: {
bugs: '39',
reliability_rating: '1',
vulnerabilities: '5',
security_rating: '2',
code_smells: '1',
sqale_rating: '1.0',
coverage: '89.9',
duplicated_lines_density: '1.1',
ncloc: '336726',
ncloc_language_distribution: 'java=175123;js=26382'
},
organization: {
avatar: '',
name: 'sonarsource'
}
}
];
export interface HomepageData {
generatedAt: string;
publicProjects: number;
publicLoc: number;
rules: number;
featuredProjects: FeaturedProject[];
newPullRequests7d: number;
}

export function requestFeaturedProjects(): Promise<Project[]> {
return Promise.resolve(PROJECTS);
export function requestHomepageData(): Promise<HomepageData> {
return fetch('/json/homepage.json').then(response => response.json());
}

+ 1
- 1
sonar-plugin-api/src/main/java/org/sonar/api/web/ServletFilter.java Datei anzeigen

@@ -142,7 +142,7 @@ public abstract class ServletFilter implements Filter {
public static class Builder {
private static final String WILDCARD_CHAR = "*";
private static final Collection<String> STATIC_RESOURCES = unmodifiableList(asList(
"*.css", "*.css.map", "*.ico", "*.png", "*.jpg", "*.jpeg", "*.gif", "*.svg", "*.js", "*.js.map", "*.pdf",
"*.css", "*.css.map", "*.ico", "*.png", "*.jpg", "*.jpeg", "*.gif", "*.svg", "*.js", "*.js.map", "*.pdf", "/json/*",
"/static/*", "/robots.txt", "/favicon.ico", "/apple-touch-icon*", "/mstile*"));

private final Set<String> inclusions = new LinkedHashSet<>();

+ 5
- 6
sonar-plugin-api/src/test/java/org/sonar/api/web/ServletFilterTest.java Datei anzeigen

@@ -19,10 +19,8 @@
*/
package org.sonar.api.web;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.junit.Rule;
@@ -239,6 +237,7 @@ public class ServletFilterTest {
"*.js",
"*.js.map",
"*.pdf",
"/json/*",
"/static/*",
"/robots.txt",
"/favicon.ico",
@@ -265,10 +264,10 @@ public class ServletFilterTest {
return UrlPattern.create("/fake");
}

public void init(FilterConfig filterConfig) throws ServletException {
public void init(FilterConfig filterConfig) {
}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
}

public void destroy() {
@@ -276,10 +275,10 @@ public class ServletFilterTest {
}

private static class DefaultFilter extends ServletFilter {
public void init(FilterConfig filterConfig) throws ServletException {
public void init(FilterConfig filterConfig) {
}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
}

public void destroy() {

Laden…
Abbrechen
Speichern