* 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' fieldtags/7.5
@@ -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}") | |||
} |
@@ -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); | |||
} |
@@ -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); | |||
} |
@@ -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(); |
@@ -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); | |||
/** |
@@ -95,4 +95,12 @@ | |||
pb.uuid <> 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 >= #{sinceDate, jdbcType=BIGINT} | |||
</select> | |||
</mapper> |
@@ -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"/> |
@@ -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); | |||
} | |||
} |
@@ -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 +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 +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 +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> |
@@ -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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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> |
@@ -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 +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 +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 +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 +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 +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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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 | |||
} | |||
] | |||
} |
@@ -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'); |
@@ -139,6 +139,7 @@ module.exports = { | |||
sonarcloudOrange700: '#db5700', | |||
sonarcloudBlack100: '#ffffff', | |||
sonarcloudBlack200: '#f9f9fb', | |||
sonarcloudBlack250: '#e6e8ea', | |||
sonarcloudBlack300: '#cfd3d7', | |||
sonarcloudBlack500: '#8a8c8f', | |||
sonarcloudBlack700: '#434447', |
@@ -55,7 +55,7 @@ const routes = [ | |||
}, | |||
{ | |||
path: 'vsts', | |||
component: lazyLoad(() => import('./sonarcloud/VSTS')) | |||
component: lazyLoad(() => import('./sonarcloud/AzureDevOps')) | |||
} | |||
] | |||
} |
@@ -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 }) => ( |
@@ -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> |
@@ -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> |
@@ -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" |
@@ -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(); |
@@ -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> |
@@ -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; | |||
} |
@@ -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> | |||
); |
@@ -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> |
@@ -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; |
@@ -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; | |||
} |
@@ -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> |
@@ -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; | |||
} |
@@ -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> | |||
); |
@@ -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')); |
@@ -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> |
@@ -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> |
@@ -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 { |
@@ -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()); | |||
} |
@@ -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<>(); |
@@ -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() { |