This commit is contained in:
CNERC-SD-010\kyu
2025-02-12 17:01:12 +09:00
parent 507d541a2d
commit 435829e28e
3056 changed files with 3547802 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# Eclipse IDE #
/.settings/
/.classpath
/.project
/bin/
/tmp/
/target/
/.factorypath
/build/
# IntelliJ IDEA #
.idea/
*.iws
*.iml
*.ipr
/out/
# NetBeans IDE #
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
# VS Code #
.vscode/
# Maven
log/
**/target/
# Gradle
.gradle
**/build/
# Other common build directories
out/
# macOS specific
.DS_Store
# Windows specific
Thumbs.db
+15
View File
@@ -0,0 +1,15 @@
FROM nexus.172-26-10-182.nip.io:5000/openjdk-17:latest
ENV TZ=Asia/Seoul
RUN mkdir -p /apigw-app
WORKDIR /apigw-app
ADD ./US_API_GW.jar /apigw-app/US_API_GW.jar
RUN chmod +x /apigw-app/US_API_GW.jar
EXPOSE 8080
ENTRYPOINT java -jar US_API_GW.jar
+158
View File
@@ -0,0 +1,158 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version><!-- 이건 스프링부트 버전입니다 -->
<relativePath />
</parent>
<groupId>egov</groupId>
<artifactId>US_API_GW</artifactId>
<version>1.4.592</version>
<name>US_API_GW</name>
<description>MSA Sample Project</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2021.0.8</spring-cloud.version>
</properties>
<repositories>
<repository>
<id>mvn2s</id>
<url>https://repo1.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>egovframe</id>
<url>https://maven.egovframe.go.kr/maven/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.egovframe.rte</groupId>
<artifactId>org.egovframe.rte.fdl.crypto</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.4</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.12.4</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.12.4</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>US_API_GW</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,20 @@
package egovframework.msa.sample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.function.client.WebClient;
@SpringBootApplication
public class GatewayServerApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServerApplication.class, args);
}
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
@@ -0,0 +1,460 @@
package egovframework.msa.sample.config;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.crypto.SecretKey;
import org.egovframe.rte.fdl.cryptography.impl.ARIACipher;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.UriUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@Configuration
@Getter
@Slf4j
public class GatewayJwtProvider {
private static final String CRYPTO_ALGORITHM = "SHA-256";
private static final String CRYPTO_SALT = "035e35d21d529f4dcbe998beb4367ed3";
private static final String ROLE_GRANTED = "O";
@Value("${token.accessSecret}")
private String accessSecret;
@Value("${token.refreshSecret}")
private String refreshSecret;
@Value("${token.accessExpiration}")
private String accessExpiration;
@Value("${token.refreshExpiration}")
private String refreshExpiration;
@Value("${json.role.path}")
private String roleJsonPath;
@Value("${json.statTarget.path}")
private String statTargetPath;
public SecretKey getSigningKey(String secret) {
byte[] keyBytes = Decoders.BASE64.decode(secret);
return Keys.hmacShaKeyFor(keyBytes);
}
public int accessValidateToken(String token) {
try {
accessExtractClaims(token);
return 200;
} catch (MalformedJwtException | UnsupportedJwtException | IllegalArgumentException e) {
log.error("GatewayJwtProvider.accessValidateToken Invalid Access Token: {}", token, e);
return 400;
} catch (ExpiredJwtException e) {
log.error("GatewayJwtProvider.accessValidateToken Expired Access Token: {}", token, e);
return 401;
}
}
public int refreshValidateToken(String token) {
try {
refreshExtractClaims(token);
return 200;
} catch (MalformedJwtException | UnsupportedJwtException | IllegalArgumentException e) {
log.error("GatewayJwtProvider.refreshValidateToken Invalid Access Token: {}", token, e);
return 400;
} catch (ExpiredJwtException e) {
log.error("GatewayJwtProvider.refreshValidateToken Expired Access Token: {}", token, e);
return 401;
}
}
public Claims accessExtractClaims(String token) {
SecretKey key = getSigningKey(this.accessSecret);
return Jwts.parser().verifyWith(key).build().parseSignedClaims(token).getPayload();
}
public Claims refreshExtractClaims(String token) {
SecretKey key = getSigningKey(this.refreshSecret);
return Jwts.parser().verifyWith(key).build().parseSignedClaims(token).getPayload();
}
public String extractUserId(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("userId")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("userId").toString()), StandardCharsets.UTF_8);
}
public String extractUserNm(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("userNm")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("userNm").toString()), StandardCharsets.UTF_8);
}
public String extractAuthId(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("authId")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("authId").toString()), StandardCharsets.UTF_8);
}
public String extractAuthNm(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("authNm")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("authNm").toString()), StandardCharsets.UTF_8);
}
public String extractDeptCd(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("deptCd")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("deptCd").toString()), StandardCharsets.UTF_8);
}
public String extractDeptNm(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("deptNm")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("deptNm").toString()), StandardCharsets.UTF_8);
}
public String extractParntsDeptCd(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("parntsDeptCd")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("parntsDeptCd").toString()), StandardCharsets.UTF_8);
}
public String extractParntsDeptNm(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("parntsDeptNm")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("parntsDeptNm").toString()), StandardCharsets.UTF_8);
}
public String extractParntsRealWorkDeptCd(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("parntsRealWorkDeptCd")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("parntsRealWorkDeptCd").toString()), StandardCharsets.UTF_8);
}
public String extractRealWorkDeptCd(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("realWorkDeptCd")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("realWorkDeptCd").toString()), StandardCharsets.UTF_8);
}
public String extractRealWorkDeptNm(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("realWorkDeptNm")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("realWorkDeptNm").toString()), StandardCharsets.UTF_8);
}
public String extractWorkSttusCd(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("workSttusCd")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("workSttusCd").toString()), StandardCharsets.UTF_8);
}
public String extractWorkSttusNm(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("workSttusNm")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("workSttusNm").toString()), StandardCharsets.UTF_8);
}
public String extractUserSeCd(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("userSeCd")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("userSeCd").toString()), StandardCharsets.UTF_8);
}
public String extractAuthPgrmList(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("authPgrmList")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("authPgrmList").toString()), StandardCharsets.UTF_8);
}
public String extractDeptList(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("deptList")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("deptList").toString()), StandardCharsets.UTF_8);
}
public String extractPswdChngDt(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("pswdChngDt")) ?
"" : UriUtils.encode(decrypt(accessExtractClaims(token).get("pswdChngDt").toString()), StandardCharsets.UTF_8);
}
public String extractLoginDt(String token) {
return ObjectUtils.isEmpty(accessExtractClaims(token).get("loginDt")) ?
"" : UriUtils.encode(accessExtractClaims(token).get("loginDt").toString(), StandardCharsets.UTF_8);
}
public String refreshExtractPswdChngDt(String token) {
return ObjectUtils.isEmpty(refreshExtractClaims(token).get("pswdChngDt")) ?
"" : UriUtils.encode(refreshExtractClaims(token).get("pswdChngDt").toString(), StandardCharsets.UTF_8);
}
public String refreshExtractAuthId(String token) {
return ObjectUtils.isEmpty(refreshExtractClaims(token).get("authId")) ?
"" : UriUtils.encode(decrypt(refreshExtractClaims(token).get("authId").toString()), StandardCharsets.UTF_8);
}
public Map<String, String> getUserAgent(ServerWebExchange exchange) {
String userAgent = exchange.getRequest().getHeaders().getFirst("User-Agent");
Map<String, String> parsedData = new HashMap<>();
parsedData.put("browser", "");
parsedData.put("version", "");
parsedData.put("os", "");
parsedData.put("device", "");
if (userAgent == null) {
return parsedData;
}
// 브라우저와 버전을 추출
if (userAgent.contains("Firefox")) {
parsedData.put("browser", "Firefox");
String version = userAgent.substring(userAgent.indexOf("Firefox/") + "Firefox/".length()).split(" ")[0];
parsedData.put("version", version);
} else if (userAgent.contains("Chrome") && userAgent.contains("Safari")) {
parsedData.put("browser", "Chrome");
String version = userAgent.substring(userAgent.indexOf("Chrome/") + "Chrome/".length()).split(" ")[0];
parsedData.put("version", version);
} else if (userAgent.contains("Safari") && userAgent.contains("Version")) {
parsedData.put("browser", "Safari");
String version = userAgent.substring(userAgent.indexOf("Version/") + "Version/".length()).split(" ")[0];
parsedData.put("version", version);
} else if (userAgent.contains("MSIE")) {
parsedData.put("browser", "Internet Explorer");
String version = userAgent.substring(userAgent.indexOf("MSIE ") + "MSIE ".length()).split(" ")[0];
parsedData.put("version", version);
} else if (userAgent.contains("Trident")) {
parsedData.put("browser", "Internet Explorer");
String version = userAgent.substring(userAgent.indexOf("rv:") + "rv:".length()).split("\\)")[0];
parsedData.put("version", version);
}
// 운영 체제를 추출
if (userAgent.contains("Windows NT")) {
String osVersion = userAgent.substring(userAgent.indexOf("Windows NT") + "Windows NT ".length()).split(";")[0];
parsedData.put("os", "Windows NT " + osVersion);
} else if (userAgent.contains("Mac OS X")) {
String osVersion = userAgent.substring(userAgent.indexOf("Mac OS X") + "Mac OS X ".length()).split("\\)")[0];
parsedData.put("os", "Mac OS X " + osVersion);
} else if (userAgent.contains("Linux")) {
parsedData.put("os", "Linux");
}
// 장치 유형을 추출 (간단히 모바일과 데스크톱으로 구분)
if (userAgent.contains("Mobi") || userAgent.contains("Android")) {
parsedData.put("device", "MOB");
} else {
parsedData.put("device", "PC");
}
return parsedData;
}
public String getCurrentDate() {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return dateFormat.format(date);
}
public String getClientIp() {
InetAddress address;
try {
address = InetAddress.getLocalHost();
return address.getHostAddress();
} catch (UnknownHostException e) {
log.error("GatewayJwtProvider.getClientIp Client Ip Invalid", e);
return "0.0.0.0";
}
}
public String decrypt(String s) {
byte[] decryptBaseByte = Base64.getDecoder().decode(s);
ARIACipher cipher = new ARIACipher();
cipher.setPassword(CRYPTO_SALT);
byte[] decryptByte = cipher.decrypt(decryptBaseByte);
return new String(decryptByte, StandardCharsets.UTF_8);
}
public ServerHttpRequest headerSetting(ServerWebExchange exchange, String accessToken) {
return exchange.getRequest().mutate()
.headers(httpHeaders -> {
httpHeaders.set("X-CONECT-SE-CD", getUserAgent(exchange).get("device"));
httpHeaders.set("X-CONECT-DT", getCurrentDate());
httpHeaders.set("X-CONECT-IP", getClientIp());
httpHeaders.set("X-MAC-ADRS", "");
httpHeaders.set("X-USER-ID", extractUserId(accessToken));
httpHeaders.set("X-USER-NM", extractUserNm(accessToken));
httpHeaders.set("X-AUTH-ID", extractAuthId(accessToken));
httpHeaders.set("X-DEPT-CD", extractDeptCd(accessToken));
httpHeaders.set("X-PARNTS-DEPT-CD", extractParntsDeptCd(accessToken));
httpHeaders.set("X-PARNTS-REAL-WORK-DEPT-CD", extractParntsRealWorkDeptCd(accessToken));
httpHeaders.set("X-REAL-WORK-DEPT-CD", extractRealWorkDeptCd(accessToken));
httpHeaders.set("X-USER-SE-CD", extractUserSeCd(accessToken));
httpHeaders.set("X-AUTH-PGRM", extractAuthPgrmList(accessToken));
httpHeaders.set("X-DEPT-LIST", extractDeptList(accessToken));
})
.build();
}
public void expandedLogSetting(ServerWebExchange exchange, String accessToken) {
StringBuilder sb = new StringBuilder();
sb.append("userIdLog=");
sb.append(UriUtils.decode(extractUserId(accessToken), StandardCharsets.UTF_8));
sb.append(",userNmLog=");
sb.append(UriUtils.decode(extractUserNm(accessToken), StandardCharsets.UTF_8));
sb.append(",authIdLog=");
sb.append(UriUtils.decode(extractAuthId(accessToken), StandardCharsets.UTF_8));
sb.append(",authNmLog=");
sb.append(UriUtils.decode(extractAuthNm(accessToken), StandardCharsets.UTF_8));
sb.append(",deptCdLog=");
sb.append(UriUtils.decode(extractRealWorkDeptCd(accessToken), StandardCharsets.UTF_8));
sb.append(",deptNmLog=");
sb.append(UriUtils.decode(extractRealWorkDeptNm(accessToken), StandardCharsets.UTF_8));
sb.append(",conectSeCdLog=");
sb.append(UriUtils.decode(getUserAgent(exchange).get("device"), StandardCharsets.UTF_8));
sb.append(",conectDtLog=");
sb.append(UriUtils.decode(getCurrentDate(), StandardCharsets.UTF_8));
sb.append(",conectIpLog=");
sb.append(UriUtils.decode(getClientIp(), StandardCharsets.UTF_8));
sb.append(",parntsRealWorkDeptCdLog=");
sb.append(UriUtils.decode(extractParntsRealWorkDeptCd(accessToken), StandardCharsets.UTF_8));
sb.append(",realWorkDeptCdLog=");
sb.append(UriUtils.decode(extractRealWorkDeptCd(accessToken), StandardCharsets.UTF_8));
sb.append(",realWorkDeptNmLog=");
sb.append(UriUtils.decode(extractRealWorkDeptNm(accessToken), StandardCharsets.UTF_8));
sb.append(",workSttusCdLog=");
sb.append(UriUtils.decode(extractWorkSttusCd(accessToken), StandardCharsets.UTF_8));
sb.append(",workSttusNmLog=");
sb.append(UriUtils.decode(extractWorkSttusNm(accessToken), StandardCharsets.UTF_8));
sb.append(",loginDtLog=");
sb.append(UriUtils.decode(extractLoginDt(accessToken), StandardCharsets.UTF_8));
log.debug("AuthGatewayFilterFactory tokenInfo -- {}", sb);
}
public void logSetting(ServerWebExchange exchange, String accessToken) {
StringBuilder sb = new StringBuilder();
sb.append("userIdLog=");
sb.append(UriUtils.decode(extractUserId(accessToken), StandardCharsets.UTF_8));
sb.append(",userNmLog=");
sb.append(UriUtils.decode(extractUserNm(accessToken), StandardCharsets.UTF_8));
sb.append(",deptNmLog=");
sb.append(UriUtils.decode(extractRealWorkDeptNm(accessToken), StandardCharsets.UTF_8));
sb.append(",conectSeCdLog=");
sb.append(UriUtils.decode(getUserAgent(exchange).get("device"), StandardCharsets.UTF_8));
sb.append(",conectDtLog=");
sb.append(UriUtils.decode(getCurrentDate(), StandardCharsets.UTF_8));
log.debug("AuthGatewayFilterFactory tokenInfo -- {}", sb);
}
public String getCookie(ServerHttpRequest request, String coookieName) {
String cookieValue = "";
MultiValueMap<String, HttpCookie> cookies = request.getCookies();
HttpCookie sessionIdCookie = cookies.getFirst(coookieName);
if (sessionIdCookie != null) {
cookieValue = sessionIdCookie.getValue();
}
return cookieValue;
}
public Boolean getJsonPgrmRoleList(String path, String authId) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, String>> list;
Resource resource = new ClassPathResource(roleJsonPath);
if (!resource.exists()) {
log.error("BackGatewayFilterFactory classPath 경로가 잘못되었거나 경로에 파일이 존재하지 않습니다.");
return false;
}
try (InputStream inputStream = resource.getInputStream()) {
list = objectMapper.readValue(inputStream, new TypeReference<List<Map<String, String>>>() {});
} catch (IOException e) {
log.error("GatewayJwtProvider getJsonPgrmRoleList ERROR " + e);
return false;
}
// 특정 URL에 해당하는 항목 찾기
Optional<Map<String, String>> result = list.stream()
.filter(map -> path.equals(map.get("URL")))
.findFirst();
// 결과 체크 및 authId 값 검사
if (result.isPresent()) {
Map<String, String> map = result.get();
String roleValue = map.get(authId);
log.debug(roleValue);
return ROLE_GRANTED.equals(roleValue);
}
return false;
}
public String getParntsDeptNm(String accessToken) {
if (ObjectUtils.isEmpty(accessToken)) {
return "";
}
String deptNm = "";
String extractedRealWorkDeptNm = extractRealWorkDeptNm(accessToken);
if (!ObjectUtils.isEmpty(extractedRealWorkDeptNm)) {
deptNm = UriUtils.decode(extractRealWorkDeptNm(accessToken), StandardCharsets.UTF_8);
}
return extractBetween(deptNm, "서울특별시 ", " ");
}
private static String extractBetween(String input, String start, String end) {
String patternStr = Pattern.quote(start) + "(.*?)" + Pattern.quote(end);
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
} else { // // NOSONAR -- 공백이 없는 경우 문자열의 끝까지 추출
patternStr = Pattern.quote(start) + "(.*)";
pattern = Pattern.compile(patternStr);
matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
}
public String generateHash(String data) {
StringBuilder sb = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance(CRYPTO_ALGORITHM);
byte[] bytes = md.digest(data.getBytes(StandardCharsets.UTF_8));
for (byte b : bytes) {
sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
} catch (NoSuchAlgorithmException e) { // NOSONAR --
sb.setLength(0);
}
return sb.toString();
}
}
@@ -0,0 +1,49 @@
package egovframework.msa.sample.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.header.XFrameOptionsServerHttpHeadersWriter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
@Configuration
@EnableWebFluxSecurity
public class GatewaySecurityConfig {
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http.csrf().disable()
.cors().and()
.formLogin().disable()
.httpBasic().disable()
.authorizeExchange()
.pathMatchers(HttpMethod.PUT, "/**").authenticated()
.pathMatchers(HttpMethod.DELETE, "/**").authenticated()
.pathMatchers(HttpMethod.PATCH, "/**").authenticated()
.pathMatchers(HttpMethod.HEAD, "/**").authenticated()
.pathMatchers(HttpMethod.OPTIONS, "/**").authenticated()
.pathMatchers(HttpMethod.TRACE, "/**").authenticated()
.anyExchange().permitAll().and()
.headers(headers -> headers.frameOptions(frameOptions -> frameOptions.mode(XFrameOptionsServerHttpHeadersWriter.Mode.SAMEORIGIN)));
return http.build();
}
@Bean
public CorsWebFilter corsWebFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 내부망 및 외부망 도메인 허용
config.addAllowedOriginPattern("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
@@ -0,0 +1,128 @@
package egovframework.msa.sample.controller;
import java.util.List;
import java.util.Locale;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import egovframework.msa.sample.config.GatewayJwtProvider;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
public class GatewayController {
private static final String ACCESS_TOKEN = "at";
private static final String REFRESH_TOKEN = "rt";
private final GatewayJwtProvider gatewayJwtProvider;
public GatewayController(GatewayJwtProvider gatewayJwtProvider) {
this.gatewayJwtProvider = gatewayJwtProvider;
}
@GetMapping("/ercs-main")
public String getErcsMain(ServerHttpRequest request, ServerHttpResponse response, Model model) {
boolean isMobi = isMobile(request);
model.addAttribute("isMobi", isMobi);
return "ercs/ercsMain";
}
@GetMapping("/menu.do")
public String getErcsMenu(ServerHttpRequest request, ServerHttpResponse resopnse, Model model) {
boolean isMobi = isMobile(request);
model.addAttribute("isMobi", isMobi);
return "ercs/menu";
}
@GetMapping("/header.do")
public String getErcsHeader() {
return "ercs/header";
}
@GetMapping("/")
public String index(ServerHttpRequest request, ServerHttpResponse response, Model model) {
boolean isMobi = isMobile(request);
//String redirectLoginUrl = isMobi ? "/auth/mobLogin.do" : "/auth/login.do";
String accessToken = gatewayJwtProvider.getCookie(request, ACCESS_TOKEN);
String refreshToken = gatewayJwtProvider.getCookie(request, REFRESH_TOKEN);
// 엑세스토큰이 있는 경우
if (!ObjectUtils.isEmpty(accessToken)) {
String pswdChngDt = gatewayJwtProvider.extractPswdChngDt(accessToken);
log.debug("GatewayController pswdChngDt = {}", pswdChngDt);
if (ObjectUtils.isEmpty(pswdChngDt)) {
String refreshPswdChngDt = gatewayJwtProvider.refreshExtractPswdChngDt(refreshToken);
log.debug("GatewayController pswdChngDt = {}", refreshPswdChngDt);
if (ObjectUtils.isEmpty(refreshPswdChngDt)) {
model.addAttribute("loginErrorMsg", "비정상적인 접근입니다. 비밀번호를 변경해주세요.");
}
return "redirect:/auth/pswdChange.do";
}
// 액세스토큰이 없는 경우
} else {
// refreshToken도 없음
if (ObjectUtils.isEmpty(refreshToken)) {
return "redirect:/auth/login.do";
} else { // refreshToken 있음
String pswdChngDt = gatewayJwtProvider.refreshExtractPswdChngDt(refreshToken);
if (ObjectUtils.isEmpty(pswdChngDt)) {
model.addAttribute("loginErrorMsg", "비정상적인 접근입니다. 비밀번호를 변경해주세요.");
return "redirect:/auth/pswdChange.do";
}
}
}
model.addAttribute("isMobi", isMobi);
return "index";
}
private static boolean isMobile(ServerHttpRequest request) {
List<String> userAgent = request.getHeaders().get("User-Agent");
String userAgentString = "";
if (ObjectUtils.isEmpty(userAgent)) {
return false;
} else {
userAgentString = userAgent.toString().toUpperCase(Locale.ENGLISH);;
}
if (userAgentString.indexOf("MOBI") > -1) {
return true;
} else {
return false;
}
}
@GetMapping("/error")
public String error(@RequestParam String url, @RequestParam String status, Model model) {
log.debug("GatewayController error url >>> {}", url);
log.debug("GatewayController error status >>> {}", status);
model.addAttribute("url", url);
model.addAttribute("status", status);
return "error";
}
@GetMapping("/captcha")
public String captcha(@RequestParam(required = false, defaultValue = "") String pod, Model model) {
log.debug("capcha");
model.addAttribute("pod", pod);
return "captcha";
}
}
@@ -0,0 +1,273 @@
package egovframework.msa.sample.filter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.UriUtils;
import egovframework.msa.sample.config.GatewayJwtProvider;
import egovframework.msa.sample.token.GatewayToken;
import egovframework.msa.sample.token.GatewayTokenService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
@Slf4j
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
@Value("${auth.host}")
private String authHost;
private final WebClient.Builder webClientBuilder;
private final GatewayJwtProvider gatewayJwtProvider;
private final GatewayTokenService gatewayTokenService;
private String accessToken;
private String refreshToken;
public AuthGatewayFilterFactory(WebClient.Builder webClientBuilder, GatewayJwtProvider gatewayJwtProvider, GatewayTokenService gatewayTokenService) {
super(Config.class);
this.webClientBuilder = webClientBuilder;
this.gatewayJwtProvider = gatewayJwtProvider;
this.gatewayTokenService = gatewayTokenService;
}
/**
* AuthGatewayFilter 시작
* application.yml 에 route filter를 적용한 url은 모두 해당 필터에 걸림
*
* 토큰 검증 흐름
* 1. AccessToken Null 체크
* 2. RefreshToken Null 체크
* 3. AccessToken 검증
* 4. RefreshToken 검증
*/
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
String path = exchange.getRequest().getURI().getPath();
// 특정 경로 필터링 예외 처리
if (path.contains("/bsi_ui/com") || path.contains("/bsi_ui/css") || path.contains("/bsi_ui/js") || path.contains("/bsi_ui/fonts")
|| path.contains("/bsi_ui/img") || path.contains("/adi_ui/com") || path.contains("/adi_ui/images")
|| path.contains("/gis_ui/img") || path.contains("/gis_ui/js") || path.contains("/gis_ui/css")
|| path.contains("/dsr_ui/css") || path.contains("/dsr_ui/fonts")
|| path.contains("/dsr_ui/gis") || path.contains("/dsr_ui/img") || path.contains("/dsr_ui/js")
|| path.contains("/dsr_ui/kendo") || path.contains("/opt_ui/js") || path.contains("/opt_ui/img")
|| path.contains("/opt_ui/*.svg") || path.contains("/opt_ui/favicon.ico") || path.contains("/adi/images")
|| path.contains("/dictionary.json") || path.contains(".svg")) {
return chain.filter(exchange);
}
// 쿠키에서 accessToken, refreshToken 가져오기
accessToken = gatewayJwtProvider.getCookie(exchange.getRequest(), "at");
refreshToken = gatewayJwtProvider.getCookie(exchange.getRequest(), "rt");
if (ObjectUtils.isEmpty(accessToken)) { // 1. AccessToken 이 없을 경우
if (ObjectUtils.isEmpty(refreshToken)) { // 1.1 RefreshToken 도 없으면 401 에러
return onError(exchange);
}
// 1.2 RefreshToken 로컬 검증 (형식, 만료여부 등)
if (gatewayJwtProvider.refreshValidateToken(refreshToken) == 400 || gatewayJwtProvider.refreshValidateToken(refreshToken) == 401) {
// 1.2.1 refreshToken 로컬 검증 유효하지 않으면 401 에러
return onError(exchange);
} else { // NOSONAR
// 1.2.2 refreshToken 로컬 검증 유효하면 서버 검증
String refreshTokenValidateUrl = authHost + "/auth/validateRefreshToken.do";
String tokenRecreateUrl = authHost + "/auth/recreateToken.do";
return webClientBuilder.build().get()
.uri(refreshTokenValidateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Boolean.class)
.flatMap(isValid -> { // 1.2.2.1 refreshToken 서버 검증
if (Boolean.TRUE.equals(isValid)) { // 1.2.2.1.1 refreshToken 서버 검증 성공 시 accessToken 재발급
return webClientBuilder.build().post()
.uri(tokenRecreateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Map.class)
.flatMap(response -> {
String newAt = (String) response.get("at");
String newRt = (String) response.get("rt");
// 쿠키에 accessToken 추가
ResponseCookie accessTokenCookie = ResponseCookie.from("at", newAt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(accessTokenCookie);
// refreshToken 도 있으면 refreshToken 도 쿠키에 추가
if (!ObjectUtils.isEmpty(newRt)) {
log.debug("시스템관리자는 리프레시토큰 쿠키에 추가 됨 {}", newRt);
ResponseCookie refreshTokenCookie = ResponseCookie.from("rt", newRt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getRefreshExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(refreshTokenCookie);
}
// 여기서 헤더 셋팅
gatewayJwtProvider.logSetting(exchange, newAt);
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, newAt);
//return chain.filter(exchange);
return chain.filter(exchange.mutate().request(request).build());
});
} else { // 1.2.2.1.2 refreshToken 서버 검증 실패 401 에러
return onError(exchange);
}
});
}
}
// 2. AcessToken 이 유효하지 않은 경우 (형식, 키, 만료여부 등)
if (gatewayJwtProvider.accessValidateToken(accessToken) == 400 || gatewayJwtProvider.accessValidateToken(accessToken) == 401) { // NOSONAR
// 2.1 RefreshToken null 체크
if (ObjectUtils.isEmpty(refreshToken)) {
return onError(exchange);
}
// 2.2 RefreshToken 로컬 검증 (형식, 키, 만료여부 등)
if (gatewayJwtProvider.refreshValidateToken(refreshToken) == 400 || gatewayJwtProvider.refreshValidateToken(refreshToken) == 401) {
// 2.2.1 RefreshToken 로컬 검증 실패시
return onError(exchange);
} else { // 2.2.2 RefreshToken 로컬 검증 성공시
String refreshTokenValidateUrl = authHost + "/auth/validateRefreshToken.do";
String tokenRecreateUrl = authHost + "/auth/recreateToken.do";
return webClientBuilder.build().get()
.uri(refreshTokenValidateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Boolean.class)
.flatMap(isValid -> { // 2.2.2.1 refreshToken 서버 검증
if (Boolean.TRUE.equals(isValid)) { // 2.2.2.1.1 refreshToken 서버 검증 성공 시 accessToken 재발급
return webClientBuilder.build().post()
.uri(tokenRecreateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Map.class)
.flatMap(response -> {
String newAt = (String) response.get("at");
String newRt = (String) response.get("rt");
// 쿠키에 accessToken 추가
ResponseCookie accessTokenCookie = ResponseCookie.from("at", newAt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(accessTokenCookie);
// refreshToken 도 있으면 refreshToken 도 쿠키에 추가
if (!ObjectUtils.isEmpty(newRt)) { // NOSONAR
log.debug("시스템관리자는 리프레시토큰 쿠키에 추가 됨 {}", newRt);
ResponseCookie refreshTokenCookie = ResponseCookie.from("rt", newRt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getRefreshExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(refreshTokenCookie);
}
// 여기서 헤더 셋팅
gatewayJwtProvider.logSetting(exchange, newAt);
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, newAt);
//return chain.filter(exchange);
return chain.filter(exchange.mutate().request(request).build());
});
} else { // 2.2.2.1.2 refreshToken 서버 검증 실패 시 401 에러
return onError(exchange);
}
});
}
} else { // 3. AccessToken 이 유효한 경우 사용자 정보 추출 및 토큰 검증
String username = UriUtils.decode(gatewayJwtProvider.extractUserId(accessToken), StandardCharsets.UTF_8);
GatewayToken gatewayToken = gatewayTokenService.findToken(username);
if (gatewayToken == null) {
return onError(exchange);
}
// 3.1 RefreshToken 일치 여부 확인
if (refreshToken.equals(gatewayToken.getRefreshToken())) { // 3.1.1 클라이언트 쿠키속 refreshToken 과 일치하면 사용자 정보 추출 및 헤더 셋팅
gatewayJwtProvider.logSetting(exchange, accessToken);
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, accessToken);
return chain.filter(exchange.mutate().request(request).build());
} else { // 3.1.2 클라이언트 쿠키속 refreshToken 과 일치하지 않으면 401 에러
return onError(exchange);
}
}
};
}
@Data
public static class Config {}
private static Mono<Void> onError(ServerWebExchange exchange) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
// accessToken 쿠키 삭제
ResponseCookie deleteAccessTokenCookie = ResponseCookie.from("at", "")
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge(0) // 쿠키 즉시 삭제
.build();
response.addCookie(deleteAccessTokenCookie);
// refreshToken 쿠키 삭제
ResponseCookie deleteRefreshTokenCookie = ResponseCookie.from("rt", "")
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge(0) // 쿠키 즉시 삭제
.build();
response.addCookie(deleteRefreshTokenCookie);
DataBuffer buffer = response.bufferFactory().wrap("The requested token is invalid.".getBytes(StandardCharsets.UTF_8));
return response.writeWith(Mono.just(buffer));
}
private static boolean isLocalhost(ServerHttpRequest request) {
String host = request.getURI().getHost();
return "localhost".equals(host);
}
}
@@ -0,0 +1,295 @@
package egovframework.msa.sample.filter;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.util.UriUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import egovframework.msa.sample.config.GatewayJwtProvider;
import egovframework.msa.sample.token.GatewayToken;
import egovframework.msa.sample.token.GatewayTokenService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class BackGatewayFilterFactory extends AbstractGatewayFilterFactory<BackGatewayFilterFactory.Config> {
@Value("${auth.host}")
private String authHost;
private final WebClient.Builder webClientBuilder;
private final GatewayJwtProvider gatewayJwtProvider;
private final GatewayTokenService gatewayTokenService;
private String accessToken;
private String refreshToken;
public BackGatewayFilterFactory(WebClient.Builder webClientBuilder, GatewayJwtProvider gatewayJwtProvider, GatewayTokenService gatewayTokenService) {
super(Config.class);
this.webClientBuilder = webClientBuilder;
this.gatewayJwtProvider = gatewayJwtProvider;
this.gatewayTokenService = gatewayTokenService;
}
@Data
public static class Config {}
/**
* BackGatewayFilter 시작
*/
@Override
public GatewayFilter apply(Config config) {
log.debug("BackGatewayFilterFactory Filter Start");
return (exchange, chain) -> {
String path = exchange.getRequest().getURI().getPath();
if (path.endsWith("/health") || path.endsWith("/info") || path.contains("/bsi/files/downloadNotice.do") ||
path.contains("/bsi/stats/insertMenuStats.do") || path.contains("/dsr_ui/css") || path.contains("/dsr_ui/fonts")
|| path.contains(".svg")) {
return chain.filter(exchange);
}
// 쿠키에서 accessToken, refreshToken 가져오기
accessToken = gatewayJwtProvider.getCookie(exchange.getRequest(), "at");
refreshToken = gatewayJwtProvider.getCookie(exchange.getRequest(), "rt");
if (ObjectUtils.isEmpty(accessToken)) { // NOSONAR -- 1. AccessToken 이 없을 경우
log.debug("AuthGatewayFilterFactory accessToken null...");
if (ObjectUtils.isEmpty(refreshToken)) { // 1.1 RefreshToken 도 없으면 401 에러
log.debug("AuthGatewayFilterFactory refreshToken null...");
return onError(exchange.getResponse());
}
// 1.2 RefreshToken 로컬 검증 (형식, 만료여부 등)
if (gatewayJwtProvider.refreshValidateToken(refreshToken) == 400 || gatewayJwtProvider.refreshValidateToken(refreshToken) == 401) { // NOSONAR --
// 1.2.1 refreshToken 로컬 검증 유효하지 않으면 401 에러
log.debug("AuthGatewayFilterFactory refreshToken local invalid...");
return onError(exchange.getResponse());
} else { // NOSONAR
log.debug("AuthGatewayFilterFactory refreshToken local validate SUCCESS");
// 1.2.2 refreshToken 로컬 검증 유효하면 서버 검증
String refreshTokenValidateUrl = authHost + "/auth/validateRefreshToken.do";
String tokenRecreateUrl = authHost + "/auth/recreateToken.do";
return webClientBuilder.build().get()
.uri(refreshTokenValidateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Boolean.class)
.flatMap(isValid -> { // 1.2.2.1 refreshToken 서버 검증
log.debug("AuthGatewayFilterFactory refreshToken server validate isValid >>> {}", isValid);
if (Boolean.TRUE.equals(isValid)) { // NOSONAR -- 1.2.2.1.1 refreshToken 서버 검증 성공 시 accessToken 재발급
return webClientBuilder.build().post()
.uri(tokenRecreateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Map.class)
.flatMap(response -> {
String newAt = (String) response.get("at");
String newRt = (String) response.get("rt");
// 쿠키에 accessToken 추가
ResponseCookie accessTokenCookie = ResponseCookie.from("at", newAt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(accessTokenCookie);
// refreshToken 도 있으면 refreshToken 도 쿠키에 추가
if (!ObjectUtils.isEmpty(newRt)) { // NOSONAR -- 리팩토리 예정
log.debug("시스템관리자는 리프레시토큰 쿠키에 추가 됨 {}", newRt);
ResponseCookie refreshTokenCookie = ResponseCookie.from("rt", newRt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getRefreshExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(refreshTokenCookie);
}
String tokenAuthId = gatewayJwtProvider.extractAuthId(newAt);
boolean hasPermission = checkPermission(path, tokenAuthId);
if (!hasPermission) {
log.debug("권한 없는 사용자 접근 발생 -- 403 에러 반환");
return onError(exchange.getResponse());
}
// 여기서 헤더 셋팅
//gatewayJwtProvider.logSetting(exchange, token);
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, newAt);
return chain.filter(exchange.mutate().request(request).build());
});
} else { // 1.2.2.1.2 refreshToken 서버 검증 실패 401 에러
return onError(exchange.getResponse());
}
});
}
}
// 2. AcessToken 이 유효하지 않은 경우 (형식, 키, 만료여부 등)
if (gatewayJwtProvider.accessValidateToken(accessToken) == 400 || gatewayJwtProvider.accessValidateToken(accessToken) == 401) { // NOSONAR
log.debug("AuthGatewayFilterFactory accessToken invalid...");
// 2.1 RefreshToken null 체크
if (ObjectUtils.isEmpty(refreshToken)) {
log.debug("AuthGatewayFilterFactory refreshToken null...");
return onError(exchange.getResponse());
}
// 2.2 RefreshToken 로컬 검증 (형식, 키, 만료여부 등)
if (gatewayJwtProvider.refreshValidateToken(refreshToken) == 400 || gatewayJwtProvider.refreshValidateToken(refreshToken) == 401) {
log.debug("AuthGatewayFilterFactory refreshToken local invalid..."); // 2.2.1 RefreshToken 로컬 검증 실패시
return onError(exchange.getResponse());
} else { // 2.2.2 RefreshToken 로컬 검증 성공시
log.debug("AuthGatewayFilterFactory refreshToken local validate SUCCESS");
String refreshTokenValidateUrl = authHost + "/auth/validateRefreshToken.do";
String tokenRecreateUrl = authHost + "/auth/recreateToken.do";
return webClientBuilder.build().get()
.uri(refreshTokenValidateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Boolean.class)
.flatMap(isValid -> { // 2.2.2.1 refreshToken 서버 검증
log.debug("AuthGatewayFilterFactory refresh accessToken isvalid >>> {}", isValid);
if (Boolean.TRUE.equals(isValid)) { // 2.2.2.1.1 refreshToken 서버 검증 성공 시 accessToken 재발급
return webClientBuilder.build().post()
.uri(tokenRecreateUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(Map.class)
.flatMap(response -> {
String newAt = (String) response.get("at");
String newRt = (String) response.get("rt");
// 쿠키에 accessToken 추가
ResponseCookie accessTokenCookie = ResponseCookie.from("at", newAt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(accessTokenCookie);
// refreshToken 도 있으면 refreshToken 도 쿠키에 추가
if (!ObjectUtils.isEmpty(newRt)) { // NOSONAR -- 리팩토리 예정
log.debug("시스템관리자는 리프레시토큰 쿠키에 추가 됨 {}", newRt);
ResponseCookie refreshTokenCookie = ResponseCookie.from("rt", newRt)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getRefreshExpiration())) / 1000 + 10)
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(refreshTokenCookie);
}
String tokenAuthId = gatewayJwtProvider.extractAuthId(newAt);
boolean hasPermission = checkPermission(path, tokenAuthId);
if (!hasPermission) {
log.debug("권한 없는 사용자 접근 발생 -- 403 에러 반환");
return onError(exchange.getResponse());
}
// 여기서 헤더 셋팅
//gatewayJwtProvider.logSetting(exchange, token);
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, newAt);
return chain.filter(exchange.mutate().request(request).build());
});
} else { // 2.2.2.1.2 refreshToken 서버 검증 실패 시 401 에러
return onError(exchange.getResponse());
}
});
}
} else { // 3. AccessToken 이 유효한 경우 사용자 정보 추출 및 토큰 검증
String username = UriUtils.decode(gatewayJwtProvider.extractUserId(accessToken), StandardCharsets.UTF_8);
String tokenAuthId = gatewayJwtProvider.extractAuthId(accessToken);
log.debug("AuthGatewayFilterFactory username >>> {}", username);
log.debug("AuthGatewayFilterFactory tokenAuthId >>> {}", tokenAuthId);
GatewayToken gatewayToken = gatewayTokenService.findToken(username);
if (gatewayToken == null) {
return onError(exchange.getResponse());
}
boolean hasPermission = checkPermission(path, tokenAuthId);
if (!hasPermission) {
log.debug("권한 없는 사용자 접근 발생 -- 403 에러 반환");
return onError(exchange.getResponse());
}
// 3.1 RefreshToken 일치 여부 확인
if (refreshToken.equals(gatewayToken.getRefreshToken())) { // 3.1.1 클라이언트 쿠키속 refreshToken 과 일치하면 사용자 정보 추출 및 헤더 셋팅
//gatewayJwtProvider.logSetting(exchange, accessToken);
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, accessToken);
log.debug("AuthGatewayFilterFactory headerSetting Complete >>>>>>> {}", request);
return chain.filter(exchange.mutate().request(request).build());
} else { // 3.1.2 클라이언트 쿠키속 refreshToken 과 일치하지 않으면 401 에러
return onError(exchange.getResponse());
}
}
};
}
/**
* @methodName : onError
* @author : wb_10_park1
* @date : 2024.11.11
* @description : 403 에러 반환 메서드
* @param response
* @return
*/
private static Mono<Void> onError(ServerHttpResponse response) {
response.setStatusCode(HttpStatus.FORBIDDEN);
response.getHeaders().setContentType(MediaType.TEXT_PLAIN);
response.getHeaders().add("Content-Type", "text/plain; charset=UTF-8");
DataBuffer buffer = response.bufferFactory().wrap("NOT ALLOWED -- You are sending a wrong and dangerous request or you do not have access..".getBytes(StandardCharsets.UTF_8));
return response.writeWith(Mono.just(buffer));
}
private static boolean isLocalhost(ServerHttpRequest request) {
String host = request.getURI().getHost();
return "localhost".equals(host);
}
private boolean checkPermission(String path, String authId) {
boolean hasPermission;
try {
hasPermission = gatewayJwtProvider.getJsonPgrmRoleList(path, authId);
log.debug("checkPermission hasPermission 결과 ===== {} : {} : {}", path, authId, hasPermission);
} catch (JsonProcessingException e) {
log.debug("checkPermission JsonPrecessingException == > ", e);
return false;
}
return hasPermission;
}
}
@@ -0,0 +1,255 @@
package egovframework.msa.sample.filter;
import java.nio.charset.StandardCharsets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.server.ServerWebExchange;
import egovframework.msa.sample.config.GatewayJwtProvider;
import egovframework.msa.sample.token.GatewayToken;
import egovframework.msa.sample.token.GatewayTokenService;
import lombok.Data;
import reactor.core.publisher.Mono;
@Component
public class FrontGatewayFilterFactory extends AbstractGatewayFilterFactory<FrontGatewayFilterFactory.Config> {
@Value("${auth.host}")
private String authHost;
@Data
public static class Config {}
private final WebClient.Builder webClientBuilder;
private final GatewayJwtProvider gatewayJwtProvider;
private final GatewayTokenService gatewayTokenService;
private String accessToken;
private String refreshToken;
public FrontGatewayFilterFactory(WebClient.Builder webClientBuilder, GatewayJwtProvider gatewayJwtProvider, GatewayTokenService gatewayTokenService) {
super(Config.class);
this.webClientBuilder = webClientBuilder;
this.gatewayJwtProvider = gatewayJwtProvider;
this.gatewayTokenService = gatewayTokenService;
}
/** @methodName : apply
* @author : wb_10_park1
* @date : 2024.08.22
* @description : 게이트웨이 프론트엔드 필터 적용 메서드
* @param exchange
* @return
*
* 액세스 토큰을 검증하고, 레디스 서버에서 refreshToken 을 검증한다.
*
* 1. AccessToken 이 null 인경우
* 2. AccessToken 이 유효하지 않은 경우 (형식, 키, 만료여부 등)
* 3. AccessToken 이 유효한 경우
*/
@Override
public GatewayFilter apply(Config config) {
String recreateAccessTokenUrl = authHost + "/auth/recreateAccessToken.do";
return (exchange, chain) -> {
String path = exchange.getRequest().getURI().getPath();
// 특정 경로 필터링 예외 처리
if (path.contains("/bsi_ui/com") || path.contains("/bsi_ui/css") || path.contains("/bsi_ui/js")
|| path.contains("/bsi_ui/img") || path.contains("/adi_ui/com") || path.contains("/adi_ui/images")
|| path.contains("/gis_ui/img") || path.contains("/gis_ui/js") || path.contains("/gis_ui/css")
|| path.contains("/dsr_ui/css") || path.contains("/dsr_ui/fonts")
|| path.contains("/dsr_ui/gis") || path.contains("/dsr_ui/img") || path.contains("/dsr_ui/js")
|| path.contains("/dsr_ui/kendo") || path.contains("/opt_ui/js") || path.contains("/opt_ui/img")
|| path.contains("/opt_ui/*.svg") || path.contains("/opt_ui/favicon.ico") || path.contains("/adi/images")
|| path.contains("/dictionary.json") || path.contains(".svg")) {
return chain.filter(exchange);
}
/*********************************************/
/* 토큰 검증 & 재발급 */
/*********************************************/
// 쿠키에서 accessToken, refreshToken 가져오기
accessToken = gatewayJwtProvider.getCookie(exchange.getRequest(), "at");
// redis 조회 데이터
String tokenKey = gatewayJwtProvider.generateHash(accessToken);
String username = gatewayTokenService.findTokenById(tokenKey);
/* 1. AccessToken 이 null 인 경우 */
if (ObjectUtils.isEmpty(accessToken)) {
// 1-1. redis 토큰 검증
if (ObjectUtils.isEmpty(username)) {
return onError(exchange);
}
GatewayToken gatewayToken = gatewayTokenService.findToken(username);
if (ObjectUtils.isEmpty(gatewayToken)) {
return onError(exchange);
}
refreshToken = gatewayToken.getRefreshToken();
// 1-2. accessToken 재발급 & refreshToken 연장
return webClientBuilder.build().get()
.uri(recreateAccessTokenUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(String.class)
.flatMap(token -> {
ResponseCookie cookie = ResponseCookie.from("at", token)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10) // NOSONAR -- 6시간 + 10초
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(cookie);
// 여기서 헤더 셋팅
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, token);
return chain.filter(exchange.mutate().request(request).build());
});
}
/* 2. AccessToken 이 유효하지 않은 경우 (형식, 키, 만료여부 등) */
if (gatewayJwtProvider.accessValidateToken(accessToken) == 400) {
// 2-1. redis 토큰 검증
if (ObjectUtils.isEmpty(username)) {
return onError(exchange);
}
GatewayToken gatewayToken = gatewayTokenService.findToken(username);
if (ObjectUtils.isEmpty(gatewayToken)) {
return onError(exchange);
}
refreshToken = gatewayToken.getRefreshToken();
// 2-2. accessToken 재발급 & refreshToken 연장
return webClientBuilder.build().get()
.uri(recreateAccessTokenUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(String.class)
.flatMap(token -> {
ResponseCookie cookie = ResponseCookie.from("at", token)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10) // NOSONAR -- 6시간 + 10초
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(cookie);
// 여기서 헤더 셋팅
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, token);
return chain.filter(exchange.mutate().request(request).build());
});
}
/* 3. AccessToken 이 유효한 경우 */
if (gatewayJwtProvider.accessValidateToken(accessToken) == 200) {
// 3-1. redis 토큰 검증
if (ObjectUtils.isEmpty(username)) {
return onError(exchange);
}
GatewayToken gatewayToken = gatewayTokenService.findToken(username);
if (ObjectUtils.isEmpty(gatewayToken)) {
return onError(exchange);
}
refreshToken = gatewayToken.getRefreshToken();
// 3-2. accessToken 재발급 & refreshToken 연장
return webClientBuilder.build().get()
.uri(recreateAccessTokenUrl)
.header("rt", refreshToken)
.retrieve()
.bodyToMono(String.class)
.flatMap(token -> {
ResponseCookie cookie = ResponseCookie.from("at", token)
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge((Long.parseLong(gatewayJwtProvider.getAccessExpiration())) / 1000 + 10) // NOSONAR -- 6시간 + 10초
.sameSite("Strict")
.build();
exchange.getResponse().addCookie(cookie);
// 여기서 헤더 셋팅
ServerHttpRequest request = gatewayJwtProvider.headerSetting(exchange, token);
return chain.filter(exchange.mutate().request(request).build());
});
}
return chain.filter(exchange);
};
}
/**
* @methodName : onError
* @author : wb_10_park1
* @date : 2024.08.22
* @description : 에러 메서드
* @param exchange
* @return
*/
private static Mono<Void> onError(ServerWebExchange exchange) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
// accessToken 쿠키 삭제
ResponseCookie deleteAccessTokenCookie = ResponseCookie.from("at", "")
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge(0) // NOSONAR -- 쿠키 즉시 삭제
.build();
response.addCookie(deleteAccessTokenCookie);
// refreshToken 쿠키 삭제
ResponseCookie deleteRefreshTokenCookie = ResponseCookie.from("rt", "")
.httpOnly(true)
.secure(!isLocalhost(exchange.getRequest()))
.path("/")
.maxAge(0) // NOSONAR -- 쿠키 즉시 삭제
.build();
response.addCookie(deleteRefreshTokenCookie);
DataBuffer buffer = response.bufferFactory().wrap("The requested token is invalid".getBytes(StandardCharsets.UTF_8));
return response.writeWith(Mono.just(buffer));
}
/**
* @methodName : isLocalhost
* @author : wb_10_park1
* @date : 2024.08.22
* @description : 로컬 호스트 여부 확인
* @param request
* @return
*/
private static boolean isLocalhost(ServerHttpRequest request) {
String host = request.getURI().getHost();
return "localhost".equals(host);
}
}
@@ -0,0 +1,51 @@
package egovframework.msa.sample.filter.global;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.ResponseCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class InterGatewayFilterFactory implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String extIp = exchange.getRequest().getHeaders().getFirst("X-External-IP");
boolean extState = Boolean.parseBoolean(exchange.getRequest().getHeaders().getFirst("X-External-Request"));
log.debug("##### InterGatewayFilterFactory extIp >>> {}", extIp);
log.debug("##### InterGatewayFilterFactory extState >>> {}", extState);
// 헤더값을 수정하여 로그인 검증서버로 넘기기
ServerHttpRequest modifiedRequest = exchange.getRequest().mutate()
.header("X-External-IP", extIp)
.header("X-External-Request", String.valueOf(extState))
.build();
// 외부 접근시
if (extState) {
ServerHttpResponse response = exchange.getResponse();
ResponseCookie cookie = ResponseCookie.from("exReq", "true")
.path("/")
.httpOnly(true)
.secure(true)
.build();
response.addCookie(cookie);
}
return chain.filter(exchange.mutate().request(modifiedRequest).build());
}
@Override
public int getOrder() {
return -1;
}
}
@@ -0,0 +1,164 @@
package egovframework.msa.sample.filter.global;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.UriUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.msa.sample.config.GatewayJwtProvider;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
/**
* @packageName : egovframework.msa.sample.filter
* @fileName : LogFilter.java
* @author : wb_10_park1
* @date : 2024.08.14
* @description :
*<pre>
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2024.08.14 wb_10_park1 최초 생성
* </pre>
*/
@Slf4j
@Component
public class LogFilter implements GlobalFilter {
@Value("${json.statTarget.path}")
private String statTargetPath;
@Value("${bsi.backend.host}")
private String bsiBackendHost;
private final GatewayJwtProvider gatewayJwtProvider;
private final WebClient.Builder webClientBuilder;
private String accessToken;
private String parntsDeptNm;
private String userId;
public LogFilter(GatewayJwtProvider gatewayJwtProvider, WebClient.Builder webClientBuilder) {
this.gatewayJwtProvider = gatewayJwtProvider;
this.webClientBuilder = webClientBuilder;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).doFinally(signalType -> {
String responsePath = exchange.getRequest().getURI().getPath();
String statusCode = exchange.getResponse().getStatusCode() != null
? exchange.getResponse().getStatusCode().toString()
: "NON";
accessToken = gatewayJwtProvider.getCookie(exchange.getRequest(), "at");
if (ObjectUtils.isEmpty(accessToken)) {
logResponse("UNKNOWN", "UNKNOWN", responsePath, statusCode);
} else {
handleAccessToken(accessToken, responsePath, statusCode);
}
});
}
private void handleAccessToken(String accessToken, String responsePath, String statusCode) {
String validateAccessToken = Integer.toString(gatewayJwtProvider.accessValidateToken(accessToken));
if ("200".equals(validateAccessToken)) {
String extractedDeptNm = gatewayJwtProvider.getParntsDeptNm(accessToken);
String extractedUserId = gatewayJwtProvider.extractUserId(accessToken);
if (!ObjectUtils.isEmpty(extractedDeptNm) && !ObjectUtils.isEmpty(extractedUserId)) {
parntsDeptNm = extractedDeptNm;
userId = UriUtils.decode(extractedUserId, StandardCharsets.UTF_8);
logResponse(userId, parntsDeptNm, responsePath, statusCode);
processStats(responsePath, accessToken);
}
}
}
private void logResponse(String userId, String parntsDeptNm, String responsePath, String statusCode) {
log.info("내부망 RESPONSE TRACE LOG -- traceUrl={},traceStatus={},traceId={},traceParntsDept={},traceTime={}",
responsePath, statusCode, userId, parntsDeptNm,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
}
private void processStats(String responsePath, String accessToken) {
Resource resource = new ClassPathResource(statTargetPath);
if (!resource.exists()) {
log.error("로그 필터 classPath 경로 오류");
} else {
try (InputStream inputStream = resource.getInputStream()) {
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, String>> list = objectMapper.readValue(inputStream, new TypeReference<List<Map<String, String>>>() {
});
Optional<Map<String, String>> result = list.stream()
.filter(map -> responsePath.equals(map.get("URL")))
.findFirst();
result.ifPresent(map -> processResult(map, accessToken));
} catch (IOException e) {
log.error("LogFilter IOException --- " + e);
}
}
}
private void processResult(Map<String, String> map, String accessToken) {
String url = map.get("URL");
String menu = map.get("PARNTS_MENU");
String deptCd = UriUtils.decode(
gatewayJwtProvider.extractParntsRealWorkDeptCd(accessToken),
StandardCharsets.UTF_8
);
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = now.format(formatter);
log.info("내부망 RESPONSE TRACE LOG -- traceUrl={},traceStatus={},traceId={},traceParntsDept={},traceTime={}",
url, deptCd, userId, parntsDeptNm,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
Map<String, String> requestBody = Map.of(
"url", url,
"menuNm", menu,
"deptCd", deptCd
);
String menuStatsUrl = bsiBackendHost + "/bsi/stats/insertMenuStats.do";
webClientBuilder.build().post()
.uri(menuStatsUrl)
.body(BodyInserters.fromValue(requestBody))
.retrieve()
.bodyToMono(Void.class)
.subscribe(response -> log.info("이용률 통계 insert API 성공"),
error -> log.error("이용률 통계 insert API 실패", error));
}
}
@@ -0,0 +1,70 @@
package egovframework.msa.sample.token;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration
@EnableRedisRepositories("egovframework.msa.sample.token")
public class GatewayRedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(this.host);
redisStandaloneConfiguration.setPort(this.port);
redisStandaloneConfiguration.setPassword(this.password);
return new LettuceConnectionFactory(redisStandaloneConfiguration);
}
@Bean
public RedisTemplate<String, GatewayToken> authRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, GatewayToken> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(GatewayToken.class));
return template;
}
@Bean
public RedisTemplate<String, String> tokenRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1L))
.disableCachingNullValues();
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(cacheConfig)
.build();
}
}
@@ -0,0 +1,22 @@
package egovframework.msa.sample.token;
import org.springframework.data.redis.core.RedisHash;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@RedisHash("Token")
public class GatewayToken {
private String username;
//private String tokenKey;
private String refreshToken;
private String regDate;
private String userNm;
private String realWorkDeptCd;
private String clsfNm;
private String lastCUDdate;
}
@@ -0,0 +1,51 @@
package egovframework.msa.sample.token;
import java.util.HashSet;
import java.util.Set;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Service;
@Service
public class GatewayTokenService {
private final RedisTemplate<String, GatewayToken> authRedisTemplate;
private final RedisTemplate<String, String> tokenRedisTemplate;
public GatewayTokenService(RedisTemplate<String, GatewayToken> authRedisTemplate,
RedisTemplate<String, String> tokenRedisTemplate) {
this.authRedisTemplate = authRedisTemplate;
this.tokenRedisTemplate = tokenRedisTemplate;
}
@Cacheable(value="Token", key="#username")
public GatewayToken findToken(String username) {
return authRedisTemplate.opsForValue().get(username);
}
@Cacheable(value="TokenKey", key="#tokenKey")
public String findTokenById(String tokenKey) {
return tokenRedisTemplate.opsForValue().get(tokenKey) != null ? tokenRedisTemplate.opsForValue().get(tokenKey) : "";
}
public long getKeyCount() {
Set<String> keys = new HashSet<>();
Cursor<byte[]> cursor = authRedisTemplate.getConnectionFactory().getConnection().scan(ScanOptions.scanOptions().match("*").build()); // NOSONAR
while (cursor.hasNext()) {
keys.add(new String(cursor.next())); // NOSONAR
}
return keys.size();
}
public Set<String> getAllKeys() {
Set<String> keys = new HashSet<>();
Cursor<byte[]> cursor = authRedisTemplate.getConnectionFactory().getConnection().scan(ScanOptions.scanOptions().match("*").build()); // NOSONAR
while (cursor.hasNext()) {
keys.add(new String(cursor.next())); // NOSONAR
}
return keys;
}
}
+228
View File
@@ -0,0 +1,228 @@
server:
port: 80
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
spring:
main:
web-application-type: reactive
application:
name: api-gw
#redis:
#host: ${redis.host:redis-primary-0.redis-headless.api-gw.svc.cluster.local}
#port: ${redis.port:6379}
#password: ${redis.password:Thqkd119!@}
redis:
host: 172.26.10.46
port: 30079
password: Thqkd119!@
cloud:
gateway:
httpclient:
pool:
max-idle-time: 1000
# default-filters:
# - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials
#
# globalcors:
# cors-Configurations:
# '[/**]':
# allowedOrigins:
# - "https://api-gw-ext.210-90-169-94.nip.io" # 외부망 경로
# - '${private.cloud.gateway.url}'
# - '${auth.server.url}'
# - 'https://sb-dev.172-26-10-182.nip.io'
# allowCredentials: true
# allowedHeaders: '*'
# allowedMethods:
# - GET
# - POST
# - PUT
# - DELETE
routes:
# openapi.seoul.go.kr
- id: openapi_pmisPjtPhoto_route
uri: http://openapi.seoul.go.kr:8088/647264687153656f3531414f656375/xml/pmisPjtPhoto/**
predicates:
- Path=/647264687153656f3531414f656375/xml/pmisPjtPhoto/**
# 인증서버
- id: author_route
uri: http://localhost:8090
predicates:
- Path=/auth/**
# 기준정보
- id: bsi_file_route
uri: ${bsi.backend.server.url:lb://bsi-backend}
predicates:
- Path=/bsi/files/**
filters:
- RewritePath=/bsi/files/(?<segment>.*), /bsi/files/${segment}
- id: bsi_ui_route
uri: ${bsi.frontend.server.url:lb://bsi-frontend}
predicates:
- Path=/bsi_ui/**
filters:
- RewritePath=/bsi_ui/(?<segment>.*), /bsi_ui/${segment}
- name: Auth
- id: bsi_route
uri: http://localhost:8085
predicates:
- Path=/bsi/**
filters:
- RewritePath=/bsi/(?<segment>.*), /bsi/${segment}
- name: Back
#재난정보
- id: dsr_ui_route
uri: http://localhost:8081
predicates:
- Path=/dsr_ui/**
filters:
- RewritePath=/dsr_ui/(?<segment>.*), /dsr_ui/${segment}
- name: Auth
- id: dsr_route
uri: http://localhost:8082
predicates:
- Path=/dsr/**
filters:
- RewritePath=/dsr/(?<segment>.*), /dsr/${segment}
- name: Back
# 작전현장
- id: opt_ui_route
uri: ${opt.frontend.server.url:lb://opt-frontend}
predicates:
- Path=/opt_ui/**
filters:
- RewritePath=/opt_ui/(?<segment>.*), /opt_ui/${segment}
- name: Auth
- id: opt_route
uri: ${opt.backend.server.url:lb://opt-backend}
predicates:
- Path=/opt/**
filters:
- RewritePath=/opt/(?<segment>.*), /opt/${segment}
- name: Back
# 부가정보
- id: adi_ui_route
uri: http://localhost:8083
predicates:
- Path=/adi_ui/**
filters:
- RewritePath=/adi_ui/(?<segment>.*), /adi_ui/${segment}
- name: Auth
- id: adi_route
uri: http://localhost:8084
predicates:
- Path=/adi/**
filters:
- RewritePath=/adi/(?<segment>.*), /adi/${segment}
- name: Back
# 지리정보(GIS)
- id: gis_ui_route
uri: ${gis.frontend.server.url:lb://gis-frontend}
predicates:
- Path=/gis_ui/**
filters:
- RewritePath=/gis_ui/(?<segment>.*), /gis_ui/${segment}
- name: Auth
- id: gis_route
uri: ${gis.backend.server.url:lb://gis-backend}
predicates:
- Path=/gis/**
filters:
- RewritePath=/gis/(?<segment>.*), /gis/${segment}
- name: Back
# 연계
- id: wad_route
uri: ${wad.backend.server.url:lb://wad-backend}
predicates:
- Path=/wad/**
# 긴통단 지휘통제
- id: dnc_ui_route
# uri: ${dnc.frontend.server.url:lb://dnc-frontend}
uri: http://localhost:8080
predicates:
- Path=/dnc_ui/**
filters:
- RewritePath=/dnc_ui/(?<segment>.*), /dnc_ui/${segment}
- id: dnc_route
# uri: ${dnc.backend.server.url:lb://dnc-backend}
uri: http://localhost:8081
predicates:
- Path=/dnc/**
filters:
- RewritePath=/dnc/(?<segment>.*), /dnc/${segment}
#auth:
#host: ${auth.server.url:lb://auth-server}
auth:
host: http://localhost:8090
#bsi:
# backend:
# host: ${bsi.backend.server.url:lb://bsi-backend}
bsi:
backend:
host: http://localhost:8085
token:
accessSecret: ${access.token.secret:BA2E0C5454AC60E5C04D4D241D2022AB6085855446BF223089B509967ABFA1CF}
refreshSecret: ${refresh.token.secret:BA2E0C5454AC60E5C04D4D241D2022AB6085855446BF223089B509967ABFA1CF}
dataSecret: ${data.secret:BA2E0C5454AC60E5C04D4D241D2022AB6085855446BF223089B509967ABFA1CF}
accessExpiration: 43200000 # TTL (millisecond, 12 hours)
refreshExpiration: 86400000 # TTL (millisecond, 24 hours)
#accessExpiration: 300000 # TTL (millisecond, 15 minutes)
#refreshExpiration: 1800000 # TTL (millisecond, 30 minutes)
logging:
level:
org.springframework.web: DEBUG
egovframework.msa.sample: DEBUG
org.thymeleaf: DEBUG
management:
endpoints:
web:
base-path: /
#json:
# role:
# path: classpath:/static/role.json
# dictionary:
# path: classpath:/static/dictionary.json
# statTarget:
# path: classpath:/static/statTarget.json
json:
role:
path: /static/role.json
dictionary:
path: /static/dictionary.json
statTarget:
path: /static/statTarget.json
+191
View File
@@ -0,0 +1,191 @@
server:
port: 8080
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
spring:
main:
web-application-type: reactive
application:
name: api-gw
redis:
host: ${redis.host:redis-primary-0.redis-headless.api-gw.svc.cluster.local}
port: ${redis.port:6379}
password: ${redis.password:Thqkd119!@}
cloud:
gateway:
httpclient:
pool:
max-idle-time: 1000
# default-filters:
# - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials
#
# globalcors:
# cors-Configurations:
# '[/**]':
# allowedOrigins:
# - "https://api-gw-ext.210-90-169-94.nip.io" # 외부망 경로
# - '${private.cloud.gateway.url}'
# - '${auth.server.url}'
# - 'https://sb-dev.172-26-10-182.nip.io'
# allowCredentials: true
# allowedHeaders: '*'
# allowedMethods:
# - GET
# - POST
# - PUT
# - DELETE
routes:
# openapi.seoul.go.kr
- id: openapi_pmisPjtPhoto_route
uri: http://openapi.seoul.go.kr:8088/647264687153656f3531414f656375/xml/pmisPjtPhoto/**
predicates:
- Path=/647264687153656f3531414f656375/xml/pmisPjtPhoto/**
# 인증서버
- id: author_route
uri: ${auth.server.url:lb://auth-server}
predicates:
- Path=/auth/**
# 기준정보
- id: bsi_file_route
uri: ${bsi.backend.server.url:lb://bsi-backend}
predicates:
- Path=/bsi/files/**
filters:
- RewritePath=/bsi/files/(?<segment>.*), /bsi/files/${segment}
- id: bsi_ui_route
uri: ${bsi.frontend.server.url:lb://bsi-frontend}
predicates:
- Path=/bsi_ui/**
filters:
- RewritePath=/bsi_ui/(?<segment>.*), /bsi_ui/${segment}
- name: Auth
- id: bsi_route
uri: ${bsi.backend.server.url:lb://bsi-backend}
predicates:
- Path=/bsi/**
filters:
- RewritePath=/bsi/(?<segment>.*), /bsi/${segment}
- name: Back
#재난정보
- id: dsr_ui_route
uri: ${dsr.frontend.server.url:lb://dsr-frontend}
predicates:
- Path=/dsr_ui/**
filters:
- RewritePath=/dsr_ui/(?<segment>.*), /dsr_ui/${segment}
- name: Auth
- id: dsr_route
uri: ${dsr.backend.server.url:lb://dsr-backend}
predicates:
- Path=/dsr/**
filters:
- RewritePath=/dsr/(?<segment>.*), /dsr/${segment}
- name: Back
# 작전현장
- id: opt_ui_route
uri: ${opt.frontend.server.url:lb://opt-frontend}
predicates:
- Path=/opt_ui/**
filters:
- RewritePath=/opt_ui/(?<segment>.*), /opt_ui/${segment}
- name: Auth
- id: opt_route
uri: ${opt.backend.server.url:lb://opt-backend}
predicates:
- Path=/opt/**
filters:
- RewritePath=/opt/(?<segment>.*), /opt/${segment}
- name: Back
# 부가정보
- id: adi_ui_route
uri: ${adi.frontend.server.url:lb://adi-frontend}
predicates:
- Path=/adi_ui/**
filters:
- RewritePath=/adi_ui/(?<segment>.*), /adi_ui/${segment}
- name: Auth
- id: adi_route
uri: ${adi.backend.server.url:lb://adi-backend}
predicates:
- Path=/adi/**
filters:
- RewritePath=/adi/(?<segment>.*), /adi/${segment}
- name: Back
# 지리정보(GIS)
- id: gis_ui_route
uri: ${gis.frontend.server.url:lb://gis-frontend}
predicates:
- Path=/gis_ui/**
filters:
- RewritePath=/gis_ui/(?<segment>.*), /gis_ui/${segment}
- name: Auth
- id: gis_route
uri: ${gis.backend.server.url:lb://gis-backend}
predicates:
- Path=/gis/**
filters:
- RewritePath=/gis/(?<segment>.*), /gis/${segment}
- name: Back
# 연계
- id: wad_route
uri: ${wad.backend.server.url:lb://wad-backend}
predicates:
- Path=/wad/**
auth:
host: ${auth.server.url:lb://auth-server}
bsi:
backend:
host: ${bsi.backend.server.url:lb://bsi-backend}
token:
accessSecret: ${access.token.secret:BA2E0C5454AC60E5C04D4D241D2022AB6085855446BF223089B509967ABFA1CF}
refreshSecret: ${refresh.token.secret:BA2E0C5454AC60E5C04D4D241D2022AB6085855446BF223089B509967ABFA1CF}
dataSecret: ${data.secret:BA2E0C5454AC60E5C04D4D241D2022AB6085855446BF223089B509967ABFA1CF}
accessExpiration: 43200000 # TTL (millisecond, 12 hours)
refreshExpiration: 86400000 # TTL (millisecond, 24 hours)
#accessExpiration: 300000 # TTL (millisecond, 15 minutes)
#refreshExpiration: 1800000 # TTL (millisecond, 30 minutes)
logging:
level:
org.springframework.web: DEBUG
egovframework.msa.sample: DEBUG
org.thymeleaf: DEBUG
management:
endpoints:
web:
base-path: /
json:
role:
path: classpath:/static/role.json
dictionary:
path: classpath:/static/dictionary.json
statTarget:
path: classpath:/static/statTarget.json
+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="java.sql" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="egovframework" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="org.egovframe" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>
<!-- log SQL with timing information, post execution -->
<Logger name="jdbc.sqltiming" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Root level="INFO">
<AppenderRef ref="console" level="INFO"/>
</Root>
</Loggers>
</Configuration>
+330
View File
@@ -0,0 +1,330 @@
@charset "utf-8";
@import url(//fonts.googleapis.com/earlyaccess/nanumgothic.css);
/* base */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video
{margin:0; padding:0; border:0;}
/* Common */
img,fieldset{border:0;}
ul,ol,li{list-style:none;}
em,address{font-style:normal;}
img{vertical-align:top;}
hr {display: none;}
h1,h2,h3,h4,h5,h6{font-size:100%;}
table{border-collapse:collapse; border-spacing:0; width:100%;}
/* default */
.fl-L{float:left !important;}
.fl-R{float:right !important;}
.fl-N{float:none !important;}
.align-L{text-align:left !important;}
.align-C{text-align:center !important;}
.align-R{text-align:right !important;}
.align-J{ text-align:justify !important;}
.align-T{vertical-align:top !important;}
.align-M{vertical-align:middle !important;}
.align-B{vertical-align:bottom !important;}
/* hidden 적용 */
#accessibility {position:fixed !important;top:0; left:0; width:100%; text-align:center; z-index:9999;}
#accessibility h1{position:absolute; top:0; left:-9999px; height:1px; width:1px; overflow:hidden; font-size:0; text-align:left; line-height:0; z-index:-99;}
#accessibility a{display:block; height:1px; width:1px; margin-bottom:-1px; overflow:hidden; text-align:center; color:#000; white-space:nowrap;}
#accessibility a:focus,
#accessibility a:active {height:auto; width:100%; padding:5px; margin-bottom:10px; background:#FFFFCC; position:absolute; top:0;}
.hidden, legend{position:absolute; left:-9999px;top:-9999px;overflow:hidden; height:0; width:0; font-size:0; visibility:hidden; text-align:left;}
caption{overflow:hidden; height:0; width:0; font-size:0; visibility:hidden; text-align:left; text-indent:-99999px; line-height:0;}
.none{display:none;}
select{border:1px solid #d2d2d2;color:#555;height:23px;padding:1px;font-family:"나눔고딕", "nanum gothic","돋움",Dotum,arial,sans-serif; font-size:1em}
textarea{width:95%;border:1px solid #d2d2d2; font-family:"나눔고딕", "nanum gothic","돋움",Dotum,arial,sans-serif; line-height:150%;}
input[type="file"]{border:0px solid #d2d2d2;color:#555;}
input[type="image"]{border:0;width:auto;height:auto;}
input[type="checkbox"],input[type="radio"],.checkbox{border:0;vertical-align:middle;width:13px;height:13px;margin:2px 2px 2px 5px;padding:0}
input, button { font-family:"나눔고딕", "nanum gothic","돋움",Dotum,arial,sans-serif;}
button {cursor: pointer; }
.clearfix{*zoom:1;}
.clearfix:after{content:"";display:block;clear:both;height:0;}
/* clear 적용 */
.clear {clear:both;}
/* html5 블럭인식 */
section, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, summary, caption, ul, li{display: block;}
/* font 설정 */
body{font-family:"나눔고딕", "nanum gothic","돋움",Dotum,arial,sans-serif; font-size:12px; color:#444;}
.bold{font-weight:bold;}
.bigfont {font-size:13px; line-height:200%;}
.txt_red {color:#c00 !important;}
.txt_blue {color:#2009c4!important;}
/* width size */
.w0{width:0 !important;}
.w1{width:1% !important;}
.w2{width:2% !important;}
.w3{width:3% !important;}
.w4{width:4% !important;}
.w5{width:5% !important;}
.w6{width:6% !important;}
.w7{width:7% !important;}
.w8{width:8% !important;}
.w9{width:9% !important;}
.w10{width:10% !important;}
.w11{width:11% !important;}
.w12{width:12% !important;}
.w13{width:13% !important;}
.w14{width:14% !important;}
.w15{width:15% !important;}
.w16{width:16% !important;}
.w17{width:17% !important;}
.w18{width:18% !important;}
.w19{width:19% !important;}
.w20{width:20% !important;}
.w21{width:21% !important;}
.w22{width:22% !important;}
.w23{width:23% !important;}
.w24{width:24% !important;}
.w25{width:25% !important;}
.w26{width:26% !important;}
.w27{width:27% !important;}
.w28{width:28% !important;}
.w29{width:29% !important;}
.w30{width:30% !important;}
.w31{width:31% !important;}
.w32{width:32% !important;}
.w33{width:33% !important;}
.w34{width:34% !important;}
.w35{width:35% !important;}
.w36{width:36% !important;}
.w37{width:37% !important;}
.w38{width:38% !important;}
.w39{width:39% !important;}
.w40{width:40% !important;}
.w45{width:45% !important;}
.w50{width:50% !important;}
.w55{width:55% !important;}
.w60{width:60% !important;}
.w65{width:65% !important;}
.w69{width:69% !important;}
.w70{width:70% !important;}
.w75{width:75% !important;}
.w80{width:80% !important;}
.w85{width:85% !important;}
.w90{width:90% !important;}
.w91{width:91% !important;}
.w92{width:92% !important;}
.w93{width:93% !important;}
.w94{width:94% !important;}
.w95{width:95% !important;}
.w96{width:96% !important;}
.w97{width:97% !important;}
.w98{width:98% !important;}
.w99{width:99% !important;}
.w100{width:100% !important;}
.wx5{width:5px !important;}
.wx10{width:10px !important;}
.wx15{width:15px !important;}
.wx20{width:20px !important;}
.wx25{width:25px !important;}
.wx30{width:30px !important;}
.wx35{width:35px !important;}
.wx40{width:40px !important;}
.wx45{width:45px !important;}
.wx50{width:50px !important;}
.wx55{width:55px !important;}
.wx60{width:60px !important;}
.wx65{width:65px !important;}
.wx70{width:70px !important;}
.wx75{width:75px !important;}
.wx80{width:80px !important;}
.wx85{width:85px !important;}
.wx90{width:90px !important;}
.wx95{width:95px !important;}
.wx100{width:100px !important;}
.wx110{width:110px !important;}
.wx115{width:115px !important;}
.wx120{width:120px !important;}
.wx125{width:125px !important;}
.wx130{width:130px !important;}
.wx135{width:135px !important;}
.wx140{width:140px !important;}
.wx145{width:145px !important;}
.wx150{width:150px !important;}
.wx155{width:155px !important;}
.wx160{width:160px !important;}
.wx165{width:165px !important;}
.wx170{width:170px !important;}
.wx175{width:175px !important;}
.wx180{width:180px !important;}
.wx185{width:185px !important;}
.wx190{width:190px !important;}
.wx195{width:195px !important;}
.wx200{width:200px !important;}
.wx210{width:210px !important;}
.wx220{width:220px !important;}
.wx224{width:224px !important;}
.wx230{width:230px !important;}
.wx240{width:240px !important;}
.wx250{width:250px !important;}
.wx260{width:260px !important;}
.wx270{width:270px !important;}
.wx280{width:280px !important;}
.wx290{width:290px !important;}
.wx300{width:300px !important;}
.wx310{width:310px !important;}
.wx320{width:320px !important;}
.wx330{width:330px !important;}
.wx340{width:340px !important;}
.wx350{width:350px !important;}
.wx360{width:360px !important;}
.wx370{width:370px !important;}
.wx380{width:380px !important;}
.wx390{width:390px !important;}
.wx400{width:400px !important;}
.wx500{width:500px !important;}
.wx510{width:510px !important;}
.wx520{width:520px !important;}
.wx525{width:525px !important;}
.wx580{width:580px !important;}
/* padding */
.p1{padding:1px; !important;}
.ptb40{padding-top:40px !important;padding-bottom:40px !important;}
.pb0{padding-bottom:0 !important;}
.pb5{padding-bottom:5px !important;}
.pb10{padding-bottom:10px !important;}
.pb15{padding-bottom:15px !important;}
.pb20{padding-bottom:20px !important;}
.pb25{padding-bottom:25px !important;}
.pb30{padding-bottom:30px !important;}
.pb35{padding-bottom:35px !important;}
.pb40{padding-bottom:40px !important;}
.pb45{padding-bottom:45px !important;}
.pb46{padding-bottom:46px !important;}
.pb50{padding-bottom:50px !important;}
.pb60{padding-bottom:60px !important;}
.pb70{padding-bottom:70px !important;}
.pb80{padding-bottom:80px !important;}
.pb90{padding-bottom:90px !important;}
.pb100{padding-bottom:100px !important;}
.pb110{padding-bottom:110px !important;}
.pb120{padding-bottom:120px !important;}
.pb130{padding-bottom:130px !important;}
.pb140{padding-bottom:140px !important;}
.pb150{padding-bottom:150px !important;}
.pt6{padding-top:6px !important;}
.pt10{padding-top:10px !important;}
.pt20{padding-top:20px !important;}
.pt30{padding-top:30px !important;}
.pl20{padding-left:22px !important;}
.pl35{padding-left:35px !important;}
/* margin */
.mg0{margin:0 !important;}
.mb0{margin-bottom:0px !important;}
.mb1{margin-bottom:1px !important;}
.mb2{margin-bottom:2px !important;}
.mb3{margin-bottom:3px !important;}
.mb4{margin-bottom:4px !important;}
.mb5{margin-bottom:5px !important;}
.mb6{margin-bottom:6px !important;}
.mb7{margin-bottom:7px !important;}
.mb8{margin-bottom:8px !important;}
.mb9{margin-bottom:9px !important;}
.mb10{margin-bottom:10px !important;}
.mb11{margin-bottom:11px !important;}
.mb12{margin-bottom:12px !important;}
.mb13{margin-bottom:13px !important;}
.mb14{margin-bottom:14px !important;}
.mb15{margin-bottom:15px !important;}
.mb16{margin-bottom:16px !important;}
.mb17{margin-bottom:17px !important;}
.mb18{margin-bottom:18px !important;}
.mb19{margin-bottom:19px !important;}
.mb20{margin-bottom:20px !important;}
.mb21{margin-bottom:21px !important;}
.mb22{margin-bottom:22px !important;}
.mb23{margin-bottom:23px !important;}
.mb24{margin-bottom:24px !important;}
.mb25{margin-bottom:25px !important;}
.mb26{margin-bottom:26px !important;}
.mb27{margin-bottom:27px !important;}
.mb28{margin-bottom:28px !important;}
.mb29{margin-bottom:29px !important;}
.mb30{margin-bottom:30px !important;}
.mb31{margin-bottom:31px !important;}
.mb32{margin-bottom:32px !important;}
.mb33{margin-bottom:33px !important;}
.mb34{margin-bottom:34px !important;}
.mb35{margin-bottom:35px !important;}
.mb36{margin-bottom:36px !important;}
.mb37{margin-bottom:37px !important;}
.mb38{margin-bottom:38px !important;}
.mb39{margin-bottom:39px !important;}
.mb40{margin-bottom:40px !important;}
.mb45{margin-bottom:45px !important;}
.mb50{margin-bottom:50px !important;}
.mb53{margin-bottom:53px !important;}
.mb55{margin-bottom:55px !important;}
.mb60{margin-bottom:60px !important;}
.mb65{margin-bottom:65px !important;}
.mb70{margin-bottom:70px !important;}
.mb75{margin-bottom:75px !important;}
.mb80{margin-bottom:80px !important;}
.mb85{margin-bottom:85px !important;}
.mb90{margin-bottom:90px !important;}
.mb95{margin-bottom:95px !important;}
.mb100{margin-bottom:100px !important;}
.mr0{margin-right:0 !important;}
.mr6{margin-right:6px !important;}
.mr7{margin-right:7px !important;}
.mr15{margin-right:15px !important;}
.mt-25{margin-top:-25px !important;}
.mt0{margin-top:0px !important;}
.mt5{margin-top:5px !important;}
.mt10{margin-top:10px !important;}
.mt15{margin-top:15px !important;}
.mt18{margin-top:18px !important;}
.mt20{margin-top:20px !important;}
.mt25{margin-top:25px !important;}
.mt30{margin-top:30px !important;}
.mt40{margin-top:40px !important;}
.mt60{margin-top:60px !important;}
.mt200{margin-top:200px !important;}
.ml164{margin-left:164px !important;}
.ml50{margin-left:50px !important;}
.ml30{margin-left:30px !important;}
.ml28{margin-left:28px !important;}
.ml20{margin-left:20px !important;}
.ml19{margin-left:19px !important;}
.ml18{margin-left:18px !important;}
.ml11{margin-left:11px !important;}
.ml10{margin-left:10px !important;}
.ml9{margin-left:9px !important;}
.ml7{margin-left:7px !important;}
.ml5{margin-left:5px !important;}
.ml2{margin-left:2px !important;}
.ml1{margin-left:1px !important;}
File diff suppressed because it is too large Load Diff
+95
View File
@@ -0,0 +1,95 @@
{
"passwords":[
"!@#$AHmeD",
"$$Awojide",
"01Brandon$",
"12345Aa*",
"123@abcA",
"123abcA!",
"123qweC!",
"20yuvi91Z!",
"2r3F8ebF#",
"72Logan!",
"8469939912M@c",
"@Pr0ject",
"A1!?*hind",
"AAbc123!@#",
"Ac%%19!?",
"Amy#1sameer",
"AupaAlaves.",
"Austin6!",
"Avadhesh67@",
"B24318c*",
"Barca123#",
"Bell!@#",
"Boogaboo7!",
"Costy2014!",
"Coxa1974@",
"Diit25!@",
"Doraray@",
"FACEbook1234@",
"FAIZbls92@",
"Fine@flies",
"Fv$$indi@",
"Getme$in",
"Gtl123$",
"Hlubkojxwb@",
"Ichangeditagain.",
"India123#",
"Jansen1!",
"Jitendra0143$$$$",
"Joeljoy789@",
"Kath@28kapli",
"Kutty0220@",
"Man_143@kumar",
"Manith@123#",
"Meer1234%^&*",
"Munde88kesye*",
"Navpreet@",
"P@$$w0rd",
"P@ssw0rd",
"P@ssword",
"Pa$$W0rd",
"Padden666!",
"Passwd@12#",
"Payal1404...",
"Pizza2014!",
"Portal2014*",
"Power123@",
"Pr0Metr!c",
"Qwert123@#",
"Qwerty1@",
"Renuga123$",
"Ruth@lav.me",
"S%23_wAimon_24%A",
"S@lut1ons",
"STprow21**",
"Sab2189@in",
"Shansdivs1!",
"Singhsukhr@j",
"Sm@had1k",
"Smile$%#",
"Swetha123*",
"Tasleem123**",
"Test123$",
"Th3.r1rs",
"VlorianVeliu9!",
"acjk361mz@T",
"aloksaini@123A",
"amanindian1@E",
"b_deviney@yahoo.comHappyeft0nes",
"cc9e@10QIEb@",
"emie93@UTeM",
"gOPI232$",
"hUSSEIN.",
"ja1ja1hanum@N",
"m@nN08love",
"premium@ASCII",
"zC.n",
"qkek",
"skfk",
"love",
"tkrhk",
"Tkrhk"
]
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,21 @@
/* Error: Undefined mixin.
* ,
* 190 | / @include size-medium {
* 191 | | font-size: var(--wb-button--mobile-font-size-#{$unit});
* 192 | \ }
* '
* source/dist/scss/common/mixins/_utils.scss 190:2 btn-size()
* source/dist/scss/component/_button.scss 68:3 button-size-variable()
* source/dist/scss/component/_button.scss 254:2 @import
* source/dist/scss/component/component.scss 6:9 root stylesheet */
body::before {
font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
"Droid Sans Mono", monospace, monospace;
white-space: pre;
display: block;
padding: 1em;
margin-bottom: 1em;
border-bottom: 2px solid black;
content: "Error: Undefined mixin.\a \2577 \a 190 \2502 \250c @include size-medium {\a 191 \2502 \2502 font-size: var(--wb-button--mobile-font-size-#{$unit});\a 192 \2502 \2514 }\a \2575 \a source/dist/scss/common/mixins/_utils.scss 190:2 btn-size()\a source/dist/scss/component/_button.scss 68:3 button-size-variable()\a source/dist/scss/component/_button.scss 254:2 @import\a source/dist/scss/component/component.scss 6:9 root stylesheet";
}
@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../../../source/dist/scss/component/component.css"],"names":[],"mappings":";AACA;AACA;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACI;EACI;EACR;EACI;EACI;EACR;EACA;EACI;EACI;EACR;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACQ;;;AAGV;EACE;;;AAGF;EACE;EACQ;;;AAGV;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;AACA;EACE;;;AAEF","file":"component.css"}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+22
View File
@@ -0,0 +1,22 @@
/* Error: Undefined mixin.
* ,
* 190 | / @include size-medium {
* 191 | | font-size: var(--wb-button--mobile-font-size-#{$unit});
* 192 | \ }
* '
* source/dist/scss/common/mixins/_utils.scss 190:2 btn-size()
* source/dist/scss/component/_button.scss 68:3 button-size-variable()
* source/dist/scss/component/_button.scss 254:2 @import
* source/dist/scss/component/component.scss 6:9 @import
* source/dist/scss/component/output.scss 7:10 root stylesheet */
body::before {
font-family: "Source Code Pro", "SF Mono", Monaco, Inconsolata, "Fira Mono",
"Droid Sans Mono", monospace, monospace;
white-space: pre;
display: block;
padding: 1em;
margin-bottom: 1em;
border-bottom: 2px solid black;
content: "Error: Undefined mixin.\a \2577 \a 190 \2502 \250c @include size-medium {\a 191 \2502 \2502 font-size: var(--wb-button--mobile-font-size-#{$unit});\a 192 \2502 \2514 }\a \2575 \a source/dist/scss/common/mixins/_utils.scss 190:2 btn-size()\a source/dist/scss/component/_button.scss 68:3 button-size-variable()\a source/dist/scss/component/_button.scss 254:2 @import\a source/dist/scss/component/component.scss 6:9 @import\a source/dist/scss/component/output.scss 7:10 root stylesheet";
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../../source/dist/scss/reset.scss"],"names":[],"mappings":"AAAA;AAEA;AACA;EACE;EACA;;;AAGF;EACE;EACA;;;AAIF;AACA;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AACA;EACE;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;;AAGF;AACA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;AACA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AACA;EACE;;;AAGF;AACA;EACE;;;AAGF;EACE;;;AAGF;AAEE;EACE;;;AAIJ;EACE;;;AAIF;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAO;;;AACP;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AAGT;EAAO;;;AACP;EAAW;;;AACX;EAAW;;;AACX;EAAY;;;AACZ;EAAc;;;AACd;EAAS;;;AACT;EAAY;;;AACZ;EAAe;;;AACf;EAAY;;;AAGZ;EAAgB;;;AAChB;EAAc;;;AACd;EAAiB;;;AACjB;EAAkB;;;AAClB;EAAiB;;;AACjB;EAAiB;;;AAGjB;EAAc;;;AACd;EAAY;;;AACZ;EAAe;;;AACf;EAAiB;;;AACjB;EAAgB;;;AAGhB;EAAY;;;AACZ;EAAa;;;AACb;EAAW;;;AACX;EAAc;;;AACd;EAAe;;;AAGf;EAAe;;;AAGf;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AAET;EACE;;;AAGF;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAe;;;AACf;EAAe;;;AACf;EAAe;;;AAEf;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AACd;EAAc;;;AAEd;EAAgB;;;AAChB;EAAgB;;;AAChB;EAAsB;;;AACtB;EAAsB;;;AAEtB;EAAiB;;;AACjB;EAAe;;;AAEf;EAAiB;;;AACjB;EAAe","file":"reset.css"}
Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="12" height="24" viewBox="0 0 12 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.45199 6.57999L3.51299 5.51999L9.29199 11.297C9.38514 11.3896 9.45907 11.4996 9.50952 11.6209C9.55997 11.7421 9.58594 11.8722 9.58594 12.0035C9.58594 12.1348 9.55997 12.2648 9.50952 12.3861C9.45907 12.5073 9.38514 12.6174 9.29199 12.71L3.51299 18.49L2.45299 17.43L7.87699 12.005L2.45199 6.57999Z" fill="#6D7882"/>
</svg>

After

Width:  |  Height:  |  Size: 428 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.4125 8.5L5.525 6.80467L4.0875 7.75061L3.5 6.75553L5.05 6.00614L3.5 5.24447L4.0875 4.24939L5.525 5.19533L5.4125 3.5H6.5875L6.475 5.19533L7.9125 4.24939L8.5 5.24447L6.95 6.00614L8.5 6.75553L7.9125 7.75061L6.475 6.80467L6.5875 8.5H5.4125Z" fill="#DE3412"/>
</svg>

After

Width:  |  Height:  |  Size: 369 B

+3
View File
@@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.252 18.6842C13.9173 18.6842 13.6827 18.5171 13.2895 18.1485L10.2595 15.3864L4.60948 15.3946C2.11484 15.4032 0.775551 14.0135 0.775551 11.561V5.14925C0.775551 2.69675 2.11484 1.31567 4.60912 1.31567H15.3905C17.8763 1.31567 19.2241 2.68817 19.2241 5.14925V11.561C19.2241 14.0217 17.8766 15.3946 15.3905 15.3864H14.997V17.8221C14.997 18.341 14.7209 18.6842 14.252 18.6842ZM9.94126 9.79496C10.3766 9.79496 10.6277 9.53532 10.6445 9.09174L10.753 4.95674C10.7698 4.49603 10.4266 4.16996 9.94948 4.16996C9.48091 4.16996 9.11269 4.5046 9.12912 4.96496L9.25484 9.09174C9.27162 9.54389 9.51412 9.79496 9.94126 9.79496ZM9.94126 12.8753C10.4184 12.8753 10.8788 12.4903 10.8788 11.971C10.8788 11.4517 10.4266 11.0675 9.94126 11.0675C9.44734 11.0675 9.00376 11.4439 9.00376 11.971C9.00376 12.4985 9.45591 12.8753 9.94126 12.8753Z" fill="#DE3412"/>
</svg>

After

Width:  |  Height:  |  Size: 950 B

+10
View File
@@ -0,0 +1,10 @@
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2244_15248)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M34.0636 7.83696V9.99689C34.0636 10.1904 33.93 10.353 33.7401 10.3904L32.5745 10.6202L31.735 12.6463L32.3968 13.6332C32.5046 13.7939 32.4842 14.0033 32.3474 14.1402L30.82 15.6675C30.6832 15.8043 30.4738 15.8248 30.313 15.717L29.3261 15.0552L27.3 15.8946L27.0702 17.0603C27.0327 17.2501 26.8702 17.3837 26.6767 17.3837H25.581L23.0316 12.968C23.7733 13.4387 24.6531 13.7114 25.5966 13.7114C28.2446 13.7114 30.3912 11.5648 30.3912 8.91693C30.3912 6.26904 28.2446 4.12239 25.5966 4.12239C22.9487 4.12239 20.8021 6.26898 20.8021 8.91693C20.8021 8.983 20.8038 9.04868 20.8064 9.11409L19.703 7.20285C19.5059 6.86132 19.2681 6.55904 18.9974 6.30006L19.4583 5.18748L18.7965 4.20062C18.6887 4.03992 18.7092 3.83047 18.846 3.69361L20.3733 2.16633C20.5102 2.02954 20.7196 2.00908 20.8803 2.11686L21.8671 2.77866L23.8932 1.93929L24.1231 0.77366C24.1605 0.583805 24.323 0.450195 24.5166 0.450195H26.6766C26.8701 0.450195 27.0327 0.583805 27.0701 0.77366L27.3 1.93929L29.3261 2.77866L30.3129 2.11686C30.4737 2.00908 30.683 2.02954 30.82 2.16633L32.3473 3.69361C32.4842 3.83047 32.5045 4.03992 32.3968 4.20062L31.735 5.18748L32.5744 7.21361L33.74 7.44344C33.9299 7.48089 34.0635 7.64339 34.0635 7.83696H34.0636ZM25.5968 12.5065C26.0307 12.5065 26.3824 12.1548 26.3824 11.7209C26.3824 11.287 26.0307 10.9352 25.5968 10.9352C25.1629 10.9352 24.8111 11.287 24.8111 11.7209C24.8111 12.1548 25.1629 12.5065 25.5968 12.5065ZM25.5968 10.0975C25.9121 10.0975 26.1678 9.84183 26.1678 9.5264V5.8983C26.1678 5.58293 25.9121 5.32727 25.5968 5.32727C25.2814 5.32727 25.0257 5.58293 25.0257 5.8983V9.5264C25.0257 9.84177 25.2814 10.0975 25.5968 10.0975ZM31.2359 29.0374C31.7882 29.9941 31.7882 31.0891 31.2359 32.0457C30.6835 33.0023 29.7352 33.5499 28.6306 33.5499H3.95497C2.85037 33.5499 1.90202 33.0023 1.34972 32.0457C0.797488 31.0891 0.797488 29.994 1.34972 29.0374L13.6875 7.66769C14.2398 6.71104 15.1882 6.16352 16.2928 6.16352C17.3974 6.16352 18.3457 6.71104 18.898 7.66769L31.2359 29.0374ZM21.9941 20.1354C21.651 19.4656 21.2679 18.8187 20.8004 17.787C20.522 17.1726 20.3466 16.5912 20.3648 16.0763C19.1544 17.4823 19.824 18.7393 19.3191 20.2547C19.0185 17.3783 15.3982 15.1449 18.572 11.8525C12.1866 13.4098 14.3974 17.5602 13.5688 20.1606C12.6918 22.9128 10.7283 19.5372 11.8636 16.6187C10.449 17.8213 9.43196 20.3466 9.31097 22.7532C9.01028 28.7338 12.5061 31.0691 16.5444 31.0869C19.7357 31.0869 22.7243 29.1906 23.2235 25.9137C23.5098 24.0347 22.8673 21.8404 21.994 20.1354H21.9941ZM18.454 23.2841C17.4302 22.5815 16.4154 22.2188 16.5156 20.3255C14.9211 21.2748 14.8902 22.8084 15.2627 24.1117C15.6134 25.3392 14.5219 25.9423 13.6143 25.1019C13.1493 24.6713 12.821 23.964 12.7164 23.4634C12.4953 24.0179 12.3633 24.6565 12.3305 25.309C12.1678 28.5448 14.125 29.9066 16.4542 29.9066C17.39 29.8929 18.1959 29.6357 18.8785 29.1625C21.041 27.6632 20.4985 24.687 18.454 23.2841Z" fill="#CDD1D5"/>
</g>
<defs>
<clipPath id="clip0_2244_15248">
<rect width="34" height="34" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2244_15254)">
<path d="M26.4007 31.8751H4.57031V4.01652H9.00784V4.84507C9.00784 5.43183 9.48351 5.90757 10.0703 5.90757H19.8382C20.425 5.90757 20.9007 5.43183 20.9007 4.84507V4.01652H25.3382V11.9199C25.3382 12.5066 25.8139 12.9824 26.4007 12.9824C26.9875 12.9824 27.4632 12.5066 27.4632 11.9199V2.95402C27.4632 2.36725 26.9875 1.89152 26.4007 1.89152H20.9007V1.0625C20.9007 0.475734 20.425 0 19.8382 0H10.0703C9.48351 0 9.00784 0.475734 9.00784 1.0625V1.89152H3.50781C2.92098 1.89152 2.44531 2.36725 2.44531 2.95402V32.9376C2.44531 33.5244 2.92098 34.0001 3.50781 34.0001H26.4007C26.9875 34.0001 27.4632 33.5244 27.4632 32.9376C27.4632 32.3509 26.9875 31.8751 26.4007 31.8751ZM11.1328 2.125H18.7757V3.78257H11.1328V2.125ZM22.4576 12.6451H13.9594C13.3725 12.6451 12.8969 12.1693 12.8969 11.5826C12.8969 10.9958 13.3725 10.5201 13.9594 10.5201H22.4577C23.0445 10.5201 23.5202 10.9958 23.5202 11.5826C23.5202 12.1693 23.0445 12.6451 22.4576 12.6451ZM11.4619 10.1083C11.4619 9.52153 10.9862 9.04579 10.3994 9.04579H7.45088C6.86405 9.04579 6.38838 9.52153 6.38838 10.1083V13.0568C6.38838 13.6436 6.86405 14.1193 7.45088 14.1193H10.3994C10.9862 14.1193 11.4619 13.6436 11.4619 13.0568V10.1083ZM9.33689 11.9944H8.51338V11.1709H9.33689V11.9944ZM20.3486 19.6722H13.9593C13.3725 19.6722 12.8968 19.1965 12.8968 18.6097C12.8968 18.0229 13.3725 17.5472 13.9593 17.5472H20.3486C20.9355 17.5472 21.4111 18.0229 21.4111 18.6097C21.4111 19.1965 20.9355 19.6722 20.3486 19.6722ZM11.4619 17.1355C11.4619 16.5487 10.9862 16.073 10.3994 16.073H7.45088C6.86405 16.073 6.38838 16.5487 6.38838 17.1355V20.084C6.38838 20.6708 6.86405 21.1465 7.45088 21.1465H10.3994C10.9862 21.1465 11.4619 20.6708 11.4619 20.084V17.1355ZM9.33689 19.0215H8.51338V18.1979H9.33689V19.0215ZM17.9331 24.5747C18.5199 24.5747 18.9956 25.0504 18.9956 25.6372C18.9956 26.224 18.5199 26.6997 17.9331 26.6997H13.9593C13.3725 26.6997 12.8968 26.224 12.8968 25.6372C12.8968 25.0504 13.3725 24.5747 13.9593 24.5747H17.9331ZM10.3994 23.1005H7.45088C6.86405 23.1005 6.38838 23.5762 6.38838 24.163V27.1115C6.38838 27.6982 6.86405 28.174 7.45088 28.174H10.3994C10.9862 28.174 11.4619 27.6982 11.4619 27.1115V24.163C11.4619 23.5761 10.9862 23.1005 10.3994 23.1005ZM9.33689 26.049H8.51338V25.2255H9.33689V26.049ZM26.4005 21.7567C23.0072 21.7567 20.2466 24.5176 20.2466 27.9111C20.2466 28.5598 20.5437 29.7574 22.5331 30.4898C23.5712 30.872 24.9447 31.0825 26.4007 31.0825C27.8567 31.0825 29.2302 30.8721 30.2683 30.4898C32.2577 29.7574 32.5548 28.5598 32.5548 27.9111C32.5548 24.5176 29.7941 21.7567 26.4005 21.7567ZM29.5341 28.4957C28.737 28.7891 27.595 28.9574 26.4007 28.9574C25.2065 28.9574 24.0644 28.7891 23.2673 28.4957C22.5838 28.244 22.3716 27.9791 22.3716 27.911C22.3716 25.6892 24.1789 23.8817 26.4005 23.8817C28.6223 23.8817 30.4298 25.6892 30.4298 27.911C30.4298 27.9791 30.2176 28.244 29.5341 28.4957ZM22.9852 17.6717C22.9852 19.5552 24.5173 21.0875 26.4006 21.0875C28.284 21.0875 29.8164 19.5552 29.8164 17.6717C29.8164 15.7884 28.2841 14.2563 26.4006 14.2563C24.5173 14.2563 22.9852 15.7884 22.9852 17.6717ZM27.6913 17.6717C27.6913 18.3834 27.1122 18.9625 26.4005 18.9625C25.689 18.9625 25.1101 18.3834 25.1101 17.6717C25.1101 16.9602 25.689 16.3813 26.4005 16.3813C27.1122 16.3813 27.6913 16.9602 27.6913 17.6717Z" fill="#F4F5F6"/>
</g>
<defs>
<clipPath id="clip0_2244_15254">
<rect width="34" height="34" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

+19
View File
@@ -0,0 +1,19 @@
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2244_15260)">
<path d="M25.9489 17.6696V6.23321C25.9489 5.25442 25.1247 4.43018 24.1459 4.43018H22.3944H16.7792H11.2156H5.65196H3.84893C2.87014 4.43018 2.0459 5.25442 2.0459 6.23321V30.6514C2.0459 31.6302 2.87014 32.4544 3.84893 32.4544H24.0944C25.1247 32.4544 25.8974 31.6302 25.8974 30.6514V25.7059" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M22.3428 6.74844V1.54541" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.7793 6.74844V1.54541" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.2158 6.74844V1.54541" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.65234 6.74844V1.54541" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.68262 17.4636H20.6947" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.68262 12.5696H20.6947" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.68262 22.3574H16.0584" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.68262 27.2515H15.7493" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32.1307 19.5242L24.8671 26.7878L19.0459 28.6424L20.8489 22.8212L28.1126 15.5575C29.2459 14.4242 30.9974 14.4242 32.1307 15.5575C32.6974 16.1242 32.955 16.8454 32.955 17.5666C32.955 18.2878 32.6974 19.009 32.1307 19.5242Z" stroke="#F4F5F6" stroke-width="2.09952" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_2244_15260">
<rect width="34" height="34" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+14
View File
@@ -0,0 +1,14 @@
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2244_15279)">
<path d="M30.25 1.0625H4.75C3.62323 1.06379 2.54297 1.51198 1.74622 2.30872C0.949476 3.10547 0.501294 4.18573 0.5 5.3125L0.5 28.6875C0.501294 29.8143 0.949476 30.8945 1.74622 31.6913C2.54297 32.488 3.62323 32.9362 4.75 32.9375H30.25C31.3768 32.9362 32.457 32.488 33.2538 31.6913C34.0505 30.8945 34.4987 29.8143 34.5 28.6875V5.3125C34.4987 4.18573 34.0505 3.10547 33.2538 2.30872C32.457 1.51198 31.3768 1.06379 30.25 1.0625ZM32.375 28.6875C32.375 29.2511 32.1511 29.7916 31.7526 30.1901C31.3541 30.5886 30.8136 30.8125 30.25 30.8125H4.75C4.18641 30.8125 3.64591 30.5886 3.2474 30.1901C2.84888 29.7916 2.625 29.2511 2.625 28.6875V5.3125C2.625 4.74891 2.84888 4.20841 3.2474 3.8099C3.64591 3.41138 4.18641 3.1875 4.75 3.1875H30.25C30.8136 3.1875 31.3541 3.41138 31.7526 3.8099C32.1511 4.20841 32.375 4.74891 32.375 5.3125V28.6875Z" fill="#F4F5F6"/>
<path d="M11.125 8.5H23.875C24.1568 8.5 24.427 8.38806 24.6263 8.1888C24.8256 7.98954 24.9375 7.71929 24.9375 7.4375C24.9375 7.15571 24.8256 6.88546 24.6263 6.6862C24.427 6.48694 24.1568 6.375 23.875 6.375H11.125C10.8432 6.375 10.573 6.48694 10.3737 6.6862C10.1744 6.88546 10.0625 7.15571 10.0625 7.4375C10.0625 7.71929 10.1744 7.98954 10.3737 8.1888C10.573 8.38806 10.8432 8.5 11.125 8.5Z" fill="#F4F5F6"/>
<path d="M6.875 8.5C7.4618 8.5 7.9375 8.0243 7.9375 7.4375C7.9375 6.8507 7.4618 6.375 6.875 6.375C6.2882 6.375 5.8125 6.8507 5.8125 7.4375C5.8125 8.0243 6.2882 8.5 6.875 8.5Z" fill="#F4F5F6"/>
<path d="M28.125 8.5C28.7118 8.5 29.1875 8.0243 29.1875 7.4375C29.1875 6.8507 28.7118 6.375 28.125 6.375C27.5382 6.375 27.0625 6.8507 27.0625 7.4375C27.0625 8.0243 27.5382 8.5 28.125 8.5Z" fill="#F4F5F6"/>
<path d="M26 24.7031H13.2287C13.2657 24.7004 13.2955 24.7031 13.3331 24.6989C15.807 24.5807 18.1994 23.7776 20.2434 22.379C21.8696 21.2011 23.1704 19.6297 24.0237 17.812L25.0505 19.8658C25.1391 20.0423 25.275 20.1907 25.443 20.2944C25.6111 20.3981 25.8047 20.4531 26.0021 20.4531C26.1667 20.4535 26.3292 20.4151 26.4762 20.3411C26.601 20.2788 26.7124 20.1924 26.8038 20.087C26.8953 19.9816 26.9651 19.8592 27.0092 19.7268C27.0534 19.5944 27.071 19.4546 27.0611 19.3154C27.0512 19.1762 27.014 19.0403 26.9516 18.9155L24.8266 14.6655C24.8208 14.654 24.81 14.6476 24.8038 14.6366C24.7628 14.5699 24.7144 14.508 24.6595 14.4521C24.624 14.4048 24.5847 14.3605 24.542 14.3195C24.4884 14.2825 24.4315 14.2503 24.372 14.2235C24.3102 14.185 24.2444 14.1531 24.1759 14.1283C24.1634 14.1245 24.1546 14.1147 24.1415 14.1113C24.0905 14.1047 24.0392 14.102 23.9878 14.1032C23.9139 14.0911 23.8389 14.0872 23.7641 14.0915C23.6914 14.1032 23.6202 14.1226 23.5516 14.1493C23.5004 14.159 23.45 14.1727 23.4009 14.1901L19.1509 16.3151C18.8988 16.4411 18.7071 16.6621 18.618 16.9295C18.5288 17.1969 18.5495 17.4887 18.6755 17.7408C18.8016 17.9929 19.0226 18.1846 19.2899 18.2737C19.5573 18.3629 19.8491 18.3422 20.1012 18.2161L21.882 17.3258C21.1934 18.6419 20.2092 19.7806 19.0066 20.6524C17.2729 21.8185 15.2522 22.4861 13.165 22.5824C12.8095 22.6102 12.4888 22.6162 12.1875 22.6157V13.0156C12.1875 12.7338 12.0756 12.4636 11.8763 12.2643C11.677 12.0651 11.4068 11.9531 11.125 11.9531C10.8432 11.9531 10.573 12.0651 10.3737 12.2643C10.1744 12.4636 10.0625 12.7338 10.0625 13.0156V25.7656C10.0625 26.0474 10.1744 26.3177 10.3737 26.5169C10.573 26.7162 10.8432 26.8281 11.125 26.8281H26C26.2818 26.8281 26.552 26.7162 26.7513 26.5169C26.9506 26.3177 27.0625 26.0474 27.0625 25.7656C27.0625 25.4838 26.9506 25.2136 26.7513 25.0143C26.552 24.8151 26.2818 24.7031 26 24.7031Z" fill="#F4F5F6"/>
</g>
<defs>
<clipPath id="clip0_2244_15279">
<rect width="34" height="34" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

+16
View File
@@ -0,0 +1,16 @@
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2244_15290)">
<path d="M25.2913 33.9999C20.214 33.9999 16.083 29.8689 16.083 24.7916C16.083 19.7143 20.214 15.5833 25.2913 15.5833C30.3687 15.5833 34.4997 19.7143 34.4997 24.7916C34.4997 29.8689 30.3687 33.9999 25.2913 33.9999ZM25.2913 17.7083C21.3856 17.7083 18.208 20.8858 18.208 24.7916C18.208 28.6973 21.3856 31.8749 25.2913 31.8749C29.1971 31.8749 32.3747 28.6973 32.3747 24.7916C32.3747 20.8858 29.1971 17.7083 25.2913 17.7083Z" fill="#F4F5F6"/>
<path d="M25.292 29.7501C24.7055 29.7501 24.2295 29.2741 24.2295 28.6876V23.7292C24.2295 23.1427 24.7055 22.6667 25.292 22.6667C25.8785 22.6667 26.3545 23.1427 26.3545 23.7292V28.6876C26.3545 29.2741 25.8785 29.7501 25.292 29.7501Z" fill="#F4F5F6"/>
<path d="M25.292 21.9583C25.8788 21.9583 26.3545 21.4826 26.3545 20.8958C26.3545 20.3089 25.8788 19.8333 25.292 19.8333C24.7052 19.8333 24.2295 20.3089 24.2295 20.8958C24.2295 21.4826 24.7052 21.9583 25.292 21.9583Z" fill="#F4F5F6"/>
<path d="M12.1875 29.75H4.39583C2.24675 29.75 0.5 28.0032 0.5 25.8542V3.89583C0.5 1.74675 2.24675 0 4.39583 0H19.2708C21.4199 0 23.1667 1.74675 23.1667 3.89583V11.6875C23.1667 12.274 22.6907 12.75 22.1042 12.75C21.5177 12.75 21.0417 12.274 21.0417 11.6875V3.89583C21.0417 2.91975 20.2469 2.125 19.2708 2.125H4.39583C3.41975 2.125 2.625 2.91975 2.625 3.89583V25.8542C2.625 26.8302 3.41975 27.625 4.39583 27.625H12.1875C12.774 27.625 13.25 28.101 13.25 28.6875C13.25 29.274 12.774 29.75 12.1875 29.75Z" fill="#F4F5F6"/>
<path d="M14.3125 18.4166C13.726 18.4166 13.25 17.9406 13.25 17.3541V8.14575C13.25 7.55925 13.726 7.08325 14.3125 7.08325H17.8542C18.4407 7.08325 18.9167 7.55925 18.9167 8.14575V14.5208C18.9167 15.1073 18.4407 15.5833 17.8542 15.5833C17.2677 15.5833 16.7917 15.1073 16.7917 14.5208V9.20825H15.375V17.3541C15.375 17.9406 14.899 18.4166 14.3125 18.4166Z" fill="#F4F5F6"/>
<path d="M9.35417 21.25H5.8125C5.226 21.25 4.75 20.774 4.75 20.1875V13.8125C4.75 13.226 5.226 12.75 5.8125 12.75H9.35417C9.94067 12.75 10.4167 13.226 10.4167 13.8125V20.1875C10.4167 20.774 9.94067 21.25 9.35417 21.25ZM6.875 19.125H8.29167V14.875H6.875V19.125Z" fill="#F4F5F6"/>
<path d="M12.1872 21.25H4.39551C3.80901 21.25 3.33301 20.774 3.33301 20.1875C3.33301 19.601 3.80901 19.125 4.39551 19.125H12.1872C12.7737 19.125 13.2497 19.601 13.2497 20.1875C13.2497 20.774 12.7737 21.25 12.1872 21.25Z" fill="#F4F5F6"/>
</g>
<defs>
<clipPath id="clip0_2244_15290">
<rect width="34" height="34" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg width="35" height="34" viewBox="0 0 35 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2244_15330)">
<path d="M33.9787 20.196C33.5891 19.5174 32.7235 19.2822 32.0449 19.6761L30.6608 20.4737C29.8038 19.55 28.6874 18.8785 27.4181 18.5881V17C27.4181 16.218 26.7848 15.5833 26.0014 15.5833C25.218 15.5833 24.5847 16.218 24.5847 17V18.5881C23.3154 18.8785 22.1977 19.5486 21.342 20.4737L19.9579 19.6761C19.2793 19.2837 18.4123 19.5188 18.0242 20.196C17.6332 20.8746 17.8669 21.7402 18.5441 22.1297L19.9367 22.9316C19.7539 23.5238 19.6278 24.14 19.6278 24.7917C19.6278 25.4433 19.7539 26.0596 19.9367 26.6517L18.5441 27.4536C17.8655 27.8432 17.6318 28.7102 18.0242 29.3873C18.2862 29.8421 18.7623 30.0971 19.2524 30.0971C19.4918 30.0971 19.7355 30.0362 19.9579 29.9072L21.342 29.1097C22.1991 30.0333 23.3154 30.7048 24.5847 30.9952V32.5833C24.5847 33.3667 25.218 34 26.0014 34C26.7848 34 27.4181 33.3667 27.4181 32.5833V30.9952C28.6874 30.7048 29.8052 30.0347 30.6608 29.1097L32.0449 29.9072C32.2673 30.0362 32.511 30.0971 32.7504 30.0971C33.2406 30.0971 33.718 29.8421 33.9787 29.3873C34.3697 28.7087 34.1359 27.8432 33.4587 27.4536L32.0662 26.6517C32.2489 26.0596 32.375 25.4433 32.375 24.7917C32.375 24.14 32.2489 23.5238 32.0662 22.9316L33.4587 22.1297C34.1373 21.7402 34.3711 20.8732 33.9787 20.196ZM26 28.3333C24.0464 28.3333 22.4583 26.7452 22.4583 24.7917C22.4583 22.8381 24.0464 21.25 26 21.25C27.9536 21.25 29.5417 22.8381 29.5417 24.7917C29.5417 26.7452 27.9536 28.3333 26 28.3333ZM27.4167 2.83333H18.1687C17.9505 2.83333 17.7309 2.78092 17.5368 2.68458L13.0644 0.447667C12.4779 0.154417 11.8206 0 11.1647 0H7.58333C3.67758 0 0.5 3.17758 0.5 7.08333V24.0833C0.5 27.9891 3.67758 31.1667 7.58333 31.1667H13.25C14.0334 31.1667 14.6667 30.5334 14.6667 29.75C14.6667 28.9666 14.0334 28.3333 13.25 28.3333H7.58333C5.24017 28.3333 3.33333 26.4265 3.33333 24.0833V11.3333H31.6667V15.5833C31.6667 16.3653 32.2999 17 33.0833 17C33.8667 17 34.5 16.3653 34.5 15.5833V9.91667C34.5 6.01092 31.3224 2.83333 27.4167 2.83333ZM3.33333 7.08333C3.33333 4.74017 5.24017 2.83333 7.58333 2.83333H11.1647C11.3828 2.83333 11.6024 2.88575 11.7965 2.98208L16.2675 5.21758C16.854 5.51083 17.5113 5.66525 18.1672 5.66525H27.4153C29.2598 5.66525 30.8181 6.85383 31.4046 8.49858H3.33333V7.08333Z" fill="#F4F5F6"/>
</g>
<defs>
<clipPath id="clip0_2244_15330">
<rect width="34" height="34" fill="white" transform="translate(0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1,5 @@
<svg width="4" height="16" viewBox="0 0 4 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="2" cy="2" r="2" fill="#DE3412"/>
<circle cx="2" cy="8" r="2" fill="#346FB2"/>
<circle cx="2" cy="14" r="2" fill="#228738"/>
</svg>

After

Width:  |  Height:  |  Size: 237 B

+7
View File
@@ -0,0 +1,7 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Frame 27">
<g id="person">
<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M16.0007 4.41743C13.6246 4.41743 11.306 5.14812 9.35932 6.51044C7.4126 7.87276 5.93192 9.80079 5.11805 12.0331C4.30418 14.2654 4.19648 16.694 4.80958 18.9896C5.3108 20.8663 6.27395 22.5799 7.60239 23.9784C8.0639 22.4005 8.96383 20.9747 10.2106 19.8743C11.0188 19.161 11.9446 18.6093 12.9381 18.2381C12.6625 18.0497 12.4031 17.835 12.1637 17.5956C11.1463 16.5782 10.5747 15.1982 10.5747 13.7593C10.5747 12.3204 11.1463 10.9405 12.1637 9.92305C13.1812 8.9056 14.5611 8.334 16 8.334C17.4389 8.334 18.8188 8.9056 19.8363 9.92305C20.8537 10.9405 21.4253 12.3204 21.4253 13.7593C21.4253 15.1982 20.8537 16.5782 19.8363 17.5956C19.5969 17.835 19.3374 18.0497 19.0619 18.2381C20.0554 18.6093 20.9812 19.161 21.7894 19.8743C23.0364 20.9749 23.9365 22.4011 24.3979 23.9795C25.7269 22.5808 26.6904 20.8668 27.1917 18.9896C27.8048 16.694 27.6971 14.2654 26.8833 12.0331C26.0694 9.80079 24.5887 7.87276 22.642 6.51044C20.6953 5.14812 18.3767 4.41743 16.0007 4.41743ZM24.3934 26.0364C24.4029 26.0292 24.4122 26.0217 24.4214 26.014C26.4754 24.2867 27.9485 21.9695 28.641 19.3767C29.3334 16.7838 29.2118 14.0407 28.2925 11.5193C27.3733 8.99791 25.7008 6.82021 23.502 5.28148C21.3032 3.74275 18.6844 2.91743 16.0007 2.91743C13.3169 2.91743 10.6981 3.74275 8.49929 5.28148C6.30048 6.82021 4.62806 8.99791 3.70879 11.5193C2.78952 14.0407 2.66789 16.7838 3.36037 19.3767C4.05274 21.9691 5.52544 24.2859 7.57887 26.0131C9.93392 28.0012 12.918 29.0892 16 29.0833C19.0699 29.0891 22.0427 28.0097 24.3934 26.0364ZM23.1309 25.1294C22.8389 23.5337 22.019 22.0776 20.7969 20.999C19.4724 19.83 17.7666 19.1848 16.0001 19.1847M23.1309 25.1294C21.1004 26.7217 18.5899 27.5885 16.0015 27.5833H15.9985C13.4101 27.5885 10.8996 26.7217 8.86904 25.1294C9.16106 23.5337 9.981 22.0776 11.2031 20.999C12.5276 19.83 14.2335 19.1848 16.0001 19.1847M16.0001 17.6847C14.959 17.6847 13.9605 17.2711 13.2244 16.535C12.4882 15.7988 12.0747 14.8004 12.0747 13.7593C12.0747 12.7183 12.4882 11.7198 13.2244 10.9837C13.9605 10.2476 14.9589 9.834 16 9.834C17.0411 9.834 18.0395 10.2476 18.7756 10.9837C19.5118 11.7198 19.9253 12.7183 19.9253 13.7593C19.9253 14.8004 19.5118 15.7988 18.7756 16.535C18.0395 17.2711 17.0411 17.6847 16.0001 17.6847Z" fill="#58616A" style="fill:#58616A;fill:color(display-p3 0.3451 0.3804 0.4157);fill-opacity:1;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 95 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.3 MiB

File diff suppressed because it is too large Load Diff
+875
View File
@@ -0,0 +1,875 @@
@import "tokens";
.flex{
display: flex;
}
.d-block{
display: block !important;
}
/* Body 스크롤 비활성화 */
.no-scroll {
overflow: hidden;
height: 100%;
}
/* Content 스크롤 활성화 */
.scrollable {
overflow-y: auto;
scroll-behavior: smooth; /* 부드러운 스크롤 */
-webkit-overflow-scrolling: touch; /* iOS 스크롤 동작 개선 */
}
.w-100{
width:100%;
}
.justify-end{
justify-content: end;
}
.gap-2{
gap: .5rem;
}
.btn-wrap .k-button{
min-width: 9.375rem !important;
}
.k-input-flat, .k-dropdownlist {
border-bottom: 1px solid #cdcdcd !important;
min-height: 2.1875rem;
}
.k-input-md .k-input-inner, .k-picker-md .k-input-inner{
max-height: 9.375rem;
width:100%;
border:none;
padding: $tb-figma-semantic-padding-metric-3
}
.wrap {
align-items: flex-start;
background-color: $tb-figma-primitive-color-light-gray-color-0-1;
display: flex;
flex-direction: column;
position: relative;
row-gap: $tb-figma-spacing-w-bspacing-0;
width: 100%;
height:100%;
}
.k-static{
position: static !important;
}
.wrap .alarm {
border : .0625rem solid $tb-figma-primitive-color-light-danger-color-50-1;
border-radius: $tb-figma-spacing-w-bspacing-3;
align-items: center;
box-sizing: border-box;
column-gap: $tb-figma-spacing-w-bspacing-2;
display: flex;
justify-content: center;
padding: $tb-figma-spacing-w-bspacing-3;
position: absolute;
right: 32px;
top: 82px;
}
.wrap .text {
font-weight: 700;
line-height: 150%;
text-align: center;
font-size: 1.2rem;
}
.wrap .Container {
align-items: flex-start;
align-self: stretch;
column-gap: $tb-figma-spacing-w-bspacing-0;
display: grid;
grid-template-columns: 90px 1fr;
height: 100%;
padding-bottom: 50px;
}
.wrap .Content {
align-items: flex-start;
align-self: stretch;
box-sizing: border-box;
display: flex;
flex: 1 0 0;
flex-direction: column;
padding: $tb-figma-spacing-w-bspacing-9 $tb-figma-spacing-w-bspacing-8;
row-gap: $tb-figma-spacing-w-bspacing-7;
}
.wrap .Section {
align-items: flex-start;
align-self: stretch;
display: flex;
flex-direction: column;
row-gap: $tb-figma-spacing-w-bspacing-4;
}
.wrap .tit-import{
color: $tb-figma-primitive-color-light-danger-color-60-1;
font-weight: 700;
line-height: 18px;
position: absolute;
right:0;
}
.wrap .frame-3465198-1 {
align-items: flex-start;
display: flex;
flex-direction: column;
row-gap: 2px;
}
.wrap .grid-area {
align-items: flex-start;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-secondary-color-10-1;
background-image: none;
border-bottom-left-radius: $tb-figma-spacing-w-bspacing-4;
border-bottom-right-radius: $tb-figma-spacing-w-bspacing-4;
border-top-left-radius: $tb-figma-spacing-w-bspacing-4;
border-top-right-radius: $tb-figma-spacing-w-bspacing-4;
box-sizing: border-box;
display: flex;
flex-direction: column;
padding-bottom: $tb-figma-spacing-w-bspacing-6;
padding-left: $tb-figma-spacing-w-bspacing-7;
padding-right: $tb-figma-spacing-w-bspacing-7;
padding-top: $tb-figma-spacing-w-bspacing-8;
row-gap: $tb-figma-spacing-w-bspacing-5;
}
.ico-title-be{
width: .5rem !important;
height: 1.5rem !important;
}
.wrap .grid {
align-items: flex-start;
align-self: stretch;
background-image: none;
border-bottom-left-radius: $tb-figma-spacing-w-bspacing-3;
border-bottom-right-radius: $tb-figma-spacing-w-bspacing-3;
border-top-left-radius: $tb-figma-spacing-w-bspacing-3;
border-top-right-radius: $tb-figma-spacing-w-bspacing-3;
display: flex;
flex-direction: column;
min-height: 360px;
overflow: hidden;
row-gap: $tb-figma-spacing-kendo-spacing-0-1;
.k-grid.k-grid-md{
background-color: transparent;
border:none;
.k-grid-pager{
background: none;
border:none;
justify-content: center;
}
}
}
.wrap .header-row {
align-items: flex-start;
align-self: stretch;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
}
.wrap .header-cell-7 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
width: 100px;
}
.wrap .base-grid-header-cell-7 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
width: 100px;
}
.wrap .content-7 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-21 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell-6 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
}
.wrap .base-grid-header-cell-6 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
}
.wrap .content-6 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-20 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell-5 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
width: 150px;
}
.wrap .base-grid-header-cell-5 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
width: 150px;
}
.wrap .content-5 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-19 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell-4 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
width: 150px;
}
.wrap .base-grid-header-cell-4 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
width: 150px;
}
.wrap .content-4 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-18 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell-3 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
width: 250px;
}
.wrap .base-grid-header-cell-3 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
width: 250px;
}
.wrap .content-3 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-17 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell-2 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
}
.wrap .base-grid-header-cell-2 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
}
.wrap .content-2 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-16 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell-1 {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
width: 170px;
}
.wrap .base-grid-header-cell-1 {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
flex: 1 0 0;
height: 40px;
justify-content: center;
width: 170px;
}
.wrap .content-1 {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-15 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .header-cell {
align-items: flex-start;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
width: 53px;
}
.wrap .base-grid-header-cell {
align-items: center;
align-self: stretch;
background-color: $tb-figma-primitive-color-light-graphic-color-50-2;
background-image: none;
border-bottom-left-radius: $tb-figma-border-radii-border-radius-null;
border-bottom-right-radius: $tb-figma-border-radii-border-radius-null;
border-right-color: $tb-figma-primitive-color-light-gray-color-40-1;
border-right-style: solid;
border-right-width: 1px;
border-top-left-radius: $tb-figma-border-radii-border-radius-null;
border-top-right-radius: $tb-figma-border-radii-border-radius-null;
box-sizing: border-box;
column-gap: $tb-figma-spacing-kendo-spacing-0-1;
display: flex;
height: 40px;
justify-content: center;
padding-left: $tb-figma-spacing-w-bspacing-5;
padding-right: $tb-figma-spacing-w-bspacing-5;
width: 53px;
}
.wrap .content {
align-items: center;
column-gap: $tb-figma-spacing-kendo-spacing-1-2;
display: flex;
height: 28px;
min-height: 28px;
}
.wrap .text-14 {
color: $tb-figma-primitive-color-light-gray-color-5-1;
font-family: "Pretendard GOV";
font-feature-settings: "liga" off, "clig" off;
font-size: 13px;
font-weight: 700;
line-height: 28px;
text-align: center;
}
.wrap .column-num {
align-items: flex-start;
column-gap: $tb-figma-spacing-w-bspacing-1;
display: flex;
}
.wrap .frame-3465173 {
align-items: flex-start;
column-gap: $tb-figma-spacing-w-bspacing-1;
display: flex;
}
.wrap .text-13 {
align-items: center;
box-sizing: border-box;
column-gap: 10px;
display: flex;
justify-content: center;
padding-left: 1px;
padding-right: 1px;
}
.wrap .caption-10 {
color: $tb-figma-primitive-color-light-gray-color-90-1;
font-family: "Pretendard GOV";
font-size: 13px;
font-weight: 400;
line-height: 150%;
text-align: center;
}
.wrap .text-12 {
align-items: center;
box-sizing: border-box;
column-gap: 10px;
display: flex;
justify-content: center;
padding-left: 1px;
padding-right: 1px;
}
.column-num .num {
color: $tb-figma-primitive-color-light-danger-color-50-1;
}
.k-radio{
width: 1.8rem !important;
height: 1.8rem !important;
}
.wrap .cont-area {
align-items: flex-start;
align-self: stretch;
border-bottom-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-bottom-left-radius: $tb-figma-spacing-w-bspacing-4;
border-bottom-right-radius: $tb-figma-spacing-w-bspacing-4;
border-bottom-style: solid;
border-bottom-width: 1px;
border-left-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-left-style: solid;
border-left-width: 1px;
border-right-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-right-style: solid;
border-right-width: 1px;
border-top-color: $tb-figma-primitive-color-light-gray-color-30-1;
border-top-left-radius: $tb-figma-spacing-w-bspacing-4;
border-top-right-radius: $tb-figma-spacing-w-bspacing-4;
border-top-style: solid;
border-top-width: 1px;
box-sizing: border-box;
display: flex;
flex-direction: column;
padding-bottom: $tb-figma-spacing-w-bspacing-6;
padding-left: $tb-figma-spacing-w-bspacing-7;
padding-right: $tb-figma-spacing-w-bspacing-7;
padding-top: $tb-figma-spacing-w-bspacing-8;
row-gap: $tb-figma-spacing-w-bspacing-5;
}
.wrap .form-sec {
align-items: flex-start;
align-self: stretch;
display: flex;
flex-direction: column;
row-gap: $tb-figma-spacing-w-bspacing-3;
}
.wrap .label {
color: $tb-figma-primitive-color-light-gray-color-70-1;
font-weight: 700;
}
.wrap .area-title {
position: relative;
width: 100%;
align-items: center;
column-gap: $tb-figma-spacing-w-bspacing-2;
display: flex;
}
.wrap .h-6-title {
color: $tb-figma-primitive-color-light-gray-color-100-1;
font-size: 21px;
font-weight: 700;
line-height: 150%;
text-align: center;
}
.wrap .title {
align-items: center;
align-self: stretch;
column-gap: $tb-figma-spacing-w-bspacing-4;
display: flex;
}
.wrap .h-5-title{
color: $tb-figma-primitive-color-light-gray-color-100-1;
font-size: 25px;
font-weight: 700;
line-height: 150%;
text-align: center;
}
.wrap .h-7-title {
align-items: center;
column-gap: 10px;
display: flex;
justify-content: center;
font-size: 2rem;
font-weight: 800;
color:$tb-figma-primitive-color-high-contrast-gray-color-50;
}
.wrap .head {
align-items: flex-start;
background-color: #fff;
border-bottom-left-radius: $tb-figma-spacing-w-bspacing-0;
border-bottom-right-radius: $tb-figma-spacing-w-bspacing-0;
border-top-left-radius: $tb-figma-spacing-w-bspacing-0;
border-top-right-radius: $tb-figma-spacing-w-bspacing-0;
display: flex;
justify-content: space-evenly;
width: 100%;
position: sticky;
top: 0;
z-index: 9;
}
.wrap .header {
@extend %tb-effects-figma-effects-shadow-y-12;
align-items: center;
border-bottom-left-radius: $tb-figma-spacing-w-bspacing-0;
border-bottom-right-radius: $tb-figma-spacing-w-bspacing-0;
border-top-left-radius: $tb-figma-spacing-w-bspacing-0;
border-top-right-radius: $tb-figma-spacing-w-bspacing-0;
box-sizing: border-box;
display: flex;
flex: 1 0 0;
justify-content: space-between;
padding-bottom: $tb-figma-spacing-w-bspacing-4;
padding-left: $tb-figma-spacing-w-bspacing-4;
padding-right: $tb-figma-spacing-w-bspacing-4;
padding-top: $tb-figma-spacing-w-bspacing-4;
width: 100%;
}
.wrap .user-info-container {
align-items: center;
column-gap: $tb-figma-spacing-w-bspacing-3;
display: flex;
}
.wrap .button-group {
align-items: center;
column-gap: $tb-figma-spacing-w-bspacing-3;
display: grid;
grid-template-columns: 1fr 1fr;
}
.wrap .text-2 {
align-items: center;
border-bottom-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-bottom-left-radius: $tb-figma-semantic-radius-small-1-1;
border-bottom-right-radius: $tb-figma-semantic-radius-small-1-1;
border-bottom-style: solid;
border-bottom-width: 1px;
border-left-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-left-style: solid;
border-left-width: 1px;
border-right-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-right-style: solid;
border-right-width: 1px;
border-top-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-top-left-radius: $tb-figma-semantic-radius-small-1-1;
border-top-right-radius: $tb-figma-semantic-radius-small-1-1;
border-top-style: solid;
border-top-width: 1px;
box-sizing: border-box;
column-gap: 10px;
display: flex;
justify-content: center;
max-width: 110px;
min-width: 100px;
padding-bottom: $tb-figma-spacing-w-bspacing-3;
padding-left: $tb-figma-spacing-w-bspacing-3;
padding-right: $tb-figma-spacing-w-bspacing-3;
padding-top: $tb-figma-spacing-w-bspacing-3;
}
.wrap .logout-text {
color: $tb-figma-primitive-color-light-gray-color-60-2;
font-size: 15px;
font-weight: 700;
line-height: 150%;
}
.wrap .text-1 {
align-items: center;
border-bottom-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-bottom-left-radius: $tb-figma-semantic-radius-small-1-1;
border-bottom-right-radius: $tb-figma-semantic-radius-small-1-1;
border-bottom-style: solid;
border-bottom-width: 1px;
border-left-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-left-style: solid;
border-left-width: 1px;
border-right-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-right-style: solid;
border-right-width: 1px;
border-top-color: $tb-figma-primitive-color-light-gray-color-50-3;
border-top-left-radius: $tb-figma-semantic-radius-small-1-1;
border-top-right-radius: $tb-figma-semantic-radius-small-1-1;
border-top-style: solid;
border-top-width: 1px;
box-sizing: border-box;
column-gap: 10px;
display: flex;
justify-content: center;
max-width: 110px;
min-width: 100px;
padding-bottom: $tb-figma-spacing-w-bspacing-3;
padding-left: $tb-figma-spacing-w-bspacing-3;
padding-right: $tb-figma-spacing-w-bspacing-3;
padding-top: $tb-figma-spacing-w-bspacing-3;
}
.wrap .mobile-text {
color: $tb-figma-primitive-color-light-gray-color-60-2;
font-size: 15px;
font-weight: 700;
line-height: 150%;
}
.head-user{
display: flex;
align-items: center;
gap: $tb-figma-spacing-w-bspacing-2;
margin-right: $tb-figma-spacing-w-bspacing-4;
}
.wrap .text {
align-items: center;
border-radius: $tb-figma-spacing-w-bspacing-4;
box-sizing: border-box;
display: flex;
justify-content: center;
padding-left: $tb-figma-spacing-w-bspacing-2;
i{
color:var(--wb-color-light-point-50);
}
}
.wrap .text-group {
align-items: center;
column-gap: $tb-figma-spacing-w-bspacing-2;
display: flex;
}
.wrap .name {
color: $tb-figma-primitive-color-light-primary-color-50-4;
font-size: 15px;
font-weight: 700;
line-height: 150%;
}
.wrap .department {
color: $tb-figma-primitive-color-light-gray-color-95-1;
font-size: 15px;
font-weight: 700;
line-height: 150%;
}
.wrap .proicons-person-circle {
height: 32px;
overflow: hidden;
width: 32px;
}
.wrap .logo-container {
height: 49px;
position: relative;
width: 341px;
}
.wrap .mask-group {
flex-shrink: 0;
height: 47px;
left: 0px;
position: absolute;
top: 2px;
width: 341px;
}
.wrap .image {
flex-shrink: 0;
height: 44px;
left: 6px;
position: absolute;
top: 0px;
width: 335px;
}
.wrap .system-name {
color: $tb-figma-primitive-color-light-primary-color-95-2;
font-size: 20px;
font-weight: 700;
left: 60px;
line-height: 150%;
position: absolute;
top: 0px;
}
+929
View File
@@ -0,0 +1,929 @@
// Compatible with @progress/kendo-theme-default v.10.0.0
$tb-figma-primitive-number-metric-5: 8px;
$tb-figma-primitive-number-metric-3: 4px;
$tb-kendo-input-border-width: 1px;
$tb-figma-mode-border-width-static-medium: 2px;
$tb-figma-mode-border-width-static-regular: 1px;
$tb-figma-mode-border-width-variable-medium: 3px;
$tb-figma-mode-border-width-variable-regular: 2px;
$tb-figma-mode-shadow-blur-3: 16px;
$tb-figma-mode-shadow-blur-4: 24px;
$tb-figma-mode-shadow-y-3: 8px;
$tb-figma-mode-shadow-y-4: 16px;
$tb-figma-primitive-number-metric-0: 0px;
$tb-figma-primitive-number-metric-1: 1px;
$tb-figma-primitive-number-metric-10: 24px;
$tb-figma-primitive-number-metric-11: 28px;
$tb-figma-primitive-number-metric-12: 32px;
$tb-figma-primitive-number-metric-13: 36px;
$tb-figma-primitive-number-metric-14: 40px;
$tb-figma-primitive-number-metric-15: 44px;
$tb-figma-primitive-number-metric-16: 48px;
$tb-figma-primitive-number-metric-17: 56px;
$tb-figma-primitive-number-metric-18: 64px;
$tb-figma-primitive-number-metric-19: 72px;
$tb-figma-primitive-number-metric-2: 2px;
$tb-figma-primitive-number-metric-20: 80px;
$tb-figma-primitive-number-metric-21: 96px;
$tb-figma-primitive-number-metric-4: 6px;
$tb-figma-primitive-number-metric-6: 10px;
$tb-figma-primitive-number-metric-7: 12px;
$tb-figma-primitive-number-metric-8: 16px;
$tb-figma-primitive-number-metric-9: 20px;
$tb-figma-primitive-number-max: 1000px;
$tb-figma-primitive-typo-letter-spacing-metric-0: 0px;
$tb-figma-primitive-typo-letter-spacing-metric-1: 1px;
$tb-figma-responsive-font-size-body-large: 19px;
$tb-figma-responsive-font-size-body-medium: 17px;
$tb-figma-responsive-font-size-body-small: 15px;
$tb-figma-responsive-font-size-body-xsmall: 13px;
$tb-figma-responsive-font-size-display-large: 60px;
$tb-figma-responsive-font-size-display-medium: 44px;
$tb-figma-responsive-font-size-display-small: 36px;
$tb-figma-responsive-font-size-heading-large: 32px;
$tb-figma-responsive-font-size-heading-medium: 24px;
$tb-figma-responsive-font-size-heading-small: 19px;
$tb-figma-responsive-font-size-heading-xlarge: 40px;
$tb-figma-responsive-font-size-heading-xsmall: 17px;
$tb-figma-responsive-font-size-heading-xxsmall: 15px;
$tb-figma-responsive-font-size-label-large: 19px;
$tb-figma-responsive-font-size-label-medium: 17px;
$tb-figma-responsive-font-size-label-small: 15px;
$tb-figma-responsive-font-size-label-xsmall: 13px;
$tb-figma-responsive-font-size-navigation-depth-medium: 17px;
$tb-figma-responsive-font-size-navigation-depth-medium-bold: 17px;
$tb-figma-responsive-font-size-navigation-depth-small: 15px;
$tb-figma-responsive-font-size-navigation-depth-small-bold: 15px;
$tb-figma-responsive-font-size-navigation-title-medium: 24px;
$tb-figma-responsive-font-size-navigation-title-small: 19px;
$tb-figma-border-radii-border-radius-full: 9999px;
$tb-figma-spacing-kendo-spacing-1-1: 4px;
$tb-figma-spacing-kendo-spacing-0-1: 0px;
$tb-figma-primitive-number-metric-3-1: 4px;
$tb-figma-primitive-number-metric-5-1: 8px;
$tb-figma-size-space-metric-100: 4px;
$tb-figma-spacing-kendo-spacing-1-2: 12px;
$tb-figma-spacing-kendo-spacing-15: 6px;
$tb-figma-spacing-kendo-spacing-2-1: 8px;
$tb-figma-spacing-kendo-spacing-2-2: 8px;
$tb-figma-spacing-kendo-spacing-7: 28px;
$tb-figma-spacing-kendo-spacing-0-2: 0px;
$tb-figma-spacing-w-bspacing-0: 0px;
$tb-figma-spacing-w-bspacing-1: 2px;
$tb-figma-spacing-w-bspacing-11: 56px;
$tb-figma-spacing-w-bspacing-2: 4px;
$tb-figma-spacing-w-bspacing-3: 8px;
$tb-figma-spacing-w-bspacing-4: 12px;
$tb-figma-spacing-w-bspacing-5: 16px;
$tb-figma-spacing-w-bspacing-6: 20px;
$tb-figma-spacing-w-bspacing-7: 24px;
$tb-figma-spacing-w-bspacing-8: 32px;
$tb-figma-spacing-w-bspacing-9: 40px;
$tb-figma-typography-letter-spacing-null-6: 1.25px;
$tb-figma-semantic-padding-metric-3: $tb-figma-primitive-number-metric-5;
$tb-kendo-button-padding-x: $tb-figma-semantic-padding-metric-3;
$tb-kendo-button-padding-y: $tb-figma-primitive-number-metric-3;
$tb-figma-responsive-gap-layout-breadcrumb-h-1: $tb-figma-primitive-number-metric-14;
$tb-figma-responsive-gap-layout-contents-footer: $tb-figma-primitive-number-metric-18;
$tb-figma-responsive-gap-layout-contents-right: $tb-figma-primitive-number-metric-14;
$tb-figma-responsive-gap-layout-h-1-h-2: $tb-figma-primitive-number-metric-16;
$tb-figma-responsive-gap-layout-h-2-h-2: $tb-figma-primitive-number-metric-20;
$tb-figma-responsive-gap-layout-h-2-h-3: $tb-figma-primitive-number-metric-14;
$tb-figma-responsive-gap-layout-h-3-h-3: $tb-figma-primitive-number-metric-18;
$tb-figma-responsive-gap-layout-h-3-h-4: $tb-figma-primitive-number-metric-10;
$tb-figma-responsive-gap-layout-h-4-h-4: $tb-figma-primitive-number-metric-14;
$tb-figma-responsive-gap-layout-h-4-h-5: $tb-figma-primitive-number-metric-8;
$tb-figma-responsive-gap-layout-h-5-h-5: $tb-figma-primitive-number-metric-12;
$tb-figma-responsive-gap-layout-header-breadcrumb: $tb-figma-primitive-number-metric-10;
$tb-figma-responsive-gap-layout-image-text-large: $tb-figma-primitive-number-metric-12;
$tb-figma-responsive-gap-layout-image-text-medium: $tb-figma-primitive-number-metric-10;
$tb-figma-responsive-gap-layout-image-text-small: $tb-figma-primitive-number-metric-9;
$tb-figma-responsive-gap-layout-left-contents: $tb-figma-primitive-number-metric-18;
$tb-figma-responsive-gap-layout-text-text-large: $tb-figma-primitive-number-metric-9;
$tb-figma-responsive-gap-layout-text-text-medium: $tb-figma-primitive-number-metric-8;
$tb-figma-responsive-gap-layout-text-text-small: $tb-figma-primitive-number-metric-7;
$tb-figma-responsive-gap-layout-title-body-large: $tb-figma-primitive-number-metric-10;
$tb-figma-responsive-gap-layout-title-body-medium: $tb-figma-primitive-number-metric-9;
$tb-figma-responsive-gap-layout-title-body-small: $tb-figma-primitive-number-metric-8;
$tb-figma-responsive-padding-card-large: $tb-figma-primitive-number-metric-14;
$tb-figma-responsive-padding-card-medium: $tb-figma-primitive-number-metric-12;
$tb-figma-responsive-padding-card-small: $tb-figma-primitive-number-metric-10;
$tb-figma-responsive-padding-card-xsmall: $tb-figma-primitive-number-metric-8;
$tb-figma-semantic-gap-metric-1: $tb-figma-primitive-number-metric-2;
$tb-figma-semantic-gap-metric-10: $tb-figma-primitive-number-metric-16;
$tb-figma-semantic-gap-metric-11: $tb-figma-primitive-number-metric-18;
$tb-figma-semantic-gap-metric-12: $tb-figma-primitive-number-metric-20;
$tb-figma-semantic-gap-metric-2: $tb-figma-primitive-number-metric-3;
$tb-figma-semantic-gap-metric-3: $tb-figma-primitive-number-metric-5;
$tb-figma-semantic-gap-metric-4: $tb-figma-primitive-number-metric-7;
$tb-figma-semantic-gap-metric-5: $tb-figma-primitive-number-metric-8;
$tb-figma-semantic-gap-metric-6: $tb-figma-primitive-number-metric-9;
$tb-figma-semantic-gap-metric-7: $tb-figma-primitive-number-metric-10;
$tb-figma-semantic-gap-metric-8: $tb-figma-primitive-number-metric-12;
$tb-figma-semantic-gap-metric-9: $tb-figma-primitive-number-metric-14;
$tb-figma-semantic-padding-metric-1: $tb-figma-primitive-number-metric-2;
$tb-figma-semantic-padding-metric-10: $tb-figma-primitive-number-metric-14;
$tb-figma-semantic-padding-metric-2: $tb-figma-primitive-number-metric-3;
$tb-figma-semantic-padding-metric-4: $tb-figma-primitive-number-metric-6;
$tb-figma-semantic-padding-metric-5: $tb-figma-primitive-number-metric-7;
$tb-figma-semantic-padding-metric-6: $tb-figma-primitive-number-metric-8;
$tb-figma-semantic-padding-metric-7: $tb-figma-primitive-number-metric-9;
$tb-figma-semantic-padding-metric-8: $tb-figma-primitive-number-metric-10;
$tb-figma-semantic-padding-metric-9: $tb-figma-primitive-number-metric-12;
$tb-figma-semantic-radius-large-1: $tb-figma-primitive-number-metric-6;
$tb-figma-semantic-radius-large-2: $tb-figma-primitive-number-metric-6;
$tb-figma-semantic-radius-max: $tb-figma-primitive-number-max;
$tb-figma-semantic-radius-medium-1: $tb-figma-primitive-number-metric-4;
$tb-figma-semantic-radius-medium-2: $tb-figma-primitive-number-metric-4;
$tb-figma-semantic-radius-medium-3: $tb-figma-primitive-number-metric-5;
$tb-figma-semantic-radius-medium-4: $tb-figma-primitive-number-metric-5;
$tb-figma-semantic-radius-small-1: $tb-figma-primitive-number-metric-3;
$tb-figma-semantic-radius-small-2: $tb-figma-primitive-number-metric-3;
$tb-figma-semantic-radius-small-3: $tb-figma-primitive-number-metric-3;
$tb-figma-semantic-radius-xlarge-1: $tb-figma-primitive-number-metric-7;
$tb-figma-semantic-radius-xlarge-2: $tb-figma-primitive-number-metric-7;
$tb-figma-semantic-radius-xsmall-1: $tb-figma-primitive-number-metric-2;
$tb-figma-semantic-radius-xsmall-2: $tb-figma-primitive-number-metric-2;
$tb-figma-semantic-radius-xsmall-3: $tb-figma-primitive-number-metric-2;
$tb-figma-semantic-size-height-metric-1: $tb-figma-primitive-number-metric-5;
$tb-figma-semantic-size-height-metric-10: $tb-figma-primitive-number-metric-19;
$tb-figma-semantic-size-height-metric-11: $tb-figma-primitive-number-metric-20;
$tb-figma-semantic-size-height-metric-2: $tb-figma-primitive-number-metric-8;
$tb-figma-semantic-size-height-metric-3: $tb-figma-primitive-number-metric-9;
$tb-figma-semantic-size-height-metric-4: $tb-figma-primitive-number-metric-10;
$tb-figma-semantic-size-height-metric-5: $tb-figma-primitive-number-metric-12;
$tb-figma-semantic-size-height-metric-6: $tb-figma-primitive-number-metric-14;
$tb-figma-semantic-size-height-metric-7: $tb-figma-primitive-number-metric-16;
$tb-figma-semantic-size-height-metric-8: $tb-figma-primitive-number-metric-17;
$tb-figma-semantic-size-height-metric-9: $tb-figma-primitive-number-metric-18;
$tb-figma-border-radii-border-radius-md: $tb-figma-spacing-kendo-spacing-1-1;
$tb-figma-border-radii-border-radius-null: $tb-figma-spacing-kendo-spacing-0-1;
$tb-figma-semantic-radius-medium-3-1: $tb-figma-primitive-number-metric-5-1;
$tb-figma-semantic-radius-small-1-1: $tb-figma-primitive-number-metric-3-1;
$tb-on-app-surface: #3d3d3d;
$tb-surface-alt: #ffffff;
$tb-border: rgba(0, 0, 0, 0.08);
$tb-figma-primitive-color-high-contrast-primary-color-50: #256ef4;
$tb-figma-primitive-color-high-contrast-primary-color-60: #0b50d0;
$tb-figma-primitive-color-high-contrast-gray-color-5: #f4f5f6;
$tb-figma-primitive-color-high-contrast-gray-color-90: #1e2124;
$tb-on-primary: #ffffff;
$tb-error: #f31700;
$tb-figma-primitive-color-high-contrast-gray-color-50: #6d7882;
$tb-base: #f5f5f5;
$tb-figma-primitive-color-light-primary-color-10: #d8e5fd;
$tb-figma-primitive-color-light-gray-color-50: #6d7882;
$tb-figma-primitive-color-high-contrast-gray-color-30: #b1b8be;
$tb-figma-primitive-color-high-contrast-primary-color-70: #083891;
$tb-app-surface: #ffffff;
$tb-kendo-scrollview-navigation-color: white;
$tb-figma-primitive-color-light-gray-color-20: #cdd1d5;
$tb-figma-primitive-color-light-alpha-white-0: rgba(255, 255, 255, 0);
$tb-figma-primitive-color-light-primary-color-50: #256ef4;
$tb-figma-primitive-color-light-primary-color-5: #ecf2fe;
$tb-figma-primitive-color-light-secondary-color-70: #063a74;
$tb-figma-primitive-color-light-secondary-color-5: #eef2f7;
$tb-figma-primitive-color-light-gray-color-0: #ffffff;
$tb-figma-primitive-color-light-secondary-color-10: #d6e0eb;
$tb-figma-primitive-color-high-contrast-alpha-white-10: rgba(255, 255, 255, 0.1);
$tb-figma-primitive-color-light-alpha-white-100: #ffffff;
$tb-figma-primitive-color-high-contrast-alpha-white-25: rgba(255, 255, 255, 0.25);
$tb-figma-primitive-color-light-alpha-white-50: rgba(255, 255, 255, 0.5);
$tb-figma-primitive-color-light-alpha-white-75: rgba(255, 255, 255, 0.75);
$tb-figma-primitive-color-light-alpha-black-0: rgba(0, 0, 0, 0);
$tb-figma-primitive-color-light-alpha-black-10: rgba(0, 0, 0, 0.1);
$tb-figma-primitive-color-light-alpha-black-100: #000000;
$tb-figma-primitive-color-light-alpha-black-25: rgba(0, 0, 0, 0.25);
$tb-figma-primitive-color-light-alpha-black-50: rgba(0, 0, 0, 0.5);
$tb-figma-primitive-color-light-alpha-black-75: rgba(0, 0, 0, 0.75);
$tb-figma-mode-color-alpha-shadow-1: rgba(0, 0, 0, 0.12);
$tb-figma-mode-color-alpha-shadow-2: rgba(0, 0, 0, 0.2);
$tb-figma-mode-color-alpha-shadow-3: rgba(0, 0, 0, 0.4);
$tb-figma-primitive-color-light-gray-color-10: #e6e8ea;
$tb-figma-primitive-color-light-gray-color-5: #f4f5f6;
$tb-figma-primitive-color-light-gray-color-90: #1e2124;
$tb-figma-primitive-color-light-danger-color-50: #de3412;
$tb-figma-primitive-color-light-danger-color-10: #fcdfd9;
$tb-figma-primitive-color-light-gray-color-30: #b1b8be;
$tb-figma-primitive-color-light-gray-color-60: #58616a;
$tb-figma-primitive-color-light-information-color-50: #0b78cb;
$tb-figma-primitive-color-light-information-color-10: #d3ebfd;
$tb-figma-primitive-color-light-point-color-50: #d63d4a;
$tb-figma-primitive-color-light-point-color-10: #f5d6d9;
$tb-figma-primitive-color-light-success-color-50: #228738;
$tb-figma-primitive-color-light-success-color-10: #d8eedd;
$tb-figma-primitive-color-light-warning-color-50: #9e6a00;
$tb-figma-primitive-color-light-warning-color-10: #ffe0a3;
$tb-figma-primitive-color-light-primary-color-60: #0b50d0;
$tb-figma-primitive-color-light-primary-color-70: #083891;
$tb-figma-primitive-color-light-primary-color-20: #b1cefb;
$tb-figma-primitive-color-light-gray-color-40: #8a949e;
$tb-figma-primitive-color-light-danger-color-5: #fdefec;
$tb-figma-primitive-color-light-information-color-5: #e7f4fe;
$tb-figma-mode-color-element-logo-text: #ffffff;
$tb-figma-primitive-color-light-point-color-5: #fbeff0;
$tb-figma-primitive-color-light-success-color-5: #eaf6ec;
$tb-figma-primitive-color-light-warning-color-30: #ffb114;
$tb-figma-primitive-color-light-warning-color-5: #fff3db;
$tb-figma-primitive-color-light-graphic-color-50: #61758f;
$tb-figma-primitive-color-light-graphic-color-70: #39506c;
$tb-figma-primitive-color-light-graphic-color-90: #223a58;
$tb-figma-primitive-color-light-graphic-color-30: #98acc5;
$tb-figma-primitive-color-light-graphic-color-10: #e5ecf9;
$tb-figma-primitive-color-high-contrast-point-color-20: #ebadb2;
$tb-figma-primitive-color-high-contrast-point-color-40: #d65c66;
$tb-figma-primitive-color-high-contrast-point-color-70: #7a1f26;
$tb-figma-primitive-color-light-gray-color-80: #33363d;
$tb-figma-primitive-color-light-gray-color-70: #464c53;
$tb-figma-primitive-color-light-secondary-color-80: #052b57;
$tb-figma-mode-color-link-visited: #c49ff9;
$tb-figma-primitive-color-light-gray-color-95: #131416;
$tb-figma-primitive-color-light-danger-color-60: #bd2c0f;
$tb-figma-primitive-color-light-information-color-60: #096ab3;
$tb-figma-primitive-color-light-point-color-60: #ab2b36;
$tb-figma-primitive-color-light-success-color-60: #267337;
$tb-figma-primitive-color-light-warning-color-60: #8a5c00;
$tb-figma-primitive-color-high-contrast-alpha-black-0: rgba(0, 0, 0, 0);
$tb-figma-primitive-color-high-contrast-alpha-black-10: rgba(0, 0, 0, 0.1);
$tb-figma-primitive-color-high-contrast-alpha-black-100: #000000;
$tb-figma-primitive-color-high-contrast-alpha-black-25: rgba(0, 0, 0, 0.25);
$tb-figma-primitive-color-high-contrast-alpha-black-50: rgba(0, 0, 0, 0.5);
$tb-figma-primitive-color-high-contrast-alpha-black-75: rgba(0, 0, 0, 0.75);
$tb-figma-primitive-color-high-contrast-alpha-white-0: rgba(255, 255, 255, 0);
$tb-figma-primitive-color-high-contrast-alpha-white-100: #ffffff;
$tb-figma-primitive-color-high-contrast-alpha-white-50: rgba(255, 255, 255, 0.5);
$tb-figma-primitive-color-high-contrast-alpha-white-75: rgba(255, 255, 255, 0.75);
$tb-figma-primitive-color-high-contrast-danger-color-10: #fcdfd9;
$tb-figma-primitive-color-high-contrast-danger-color-20: #f7afa1;
$tb-figma-primitive-color-high-contrast-danger-color-30: #f48771;
$tb-figma-primitive-color-high-contrast-danger-color-40: #f05f42;
$tb-figma-primitive-color-high-contrast-danger-color-5: #fdefec;
$tb-figma-primitive-color-high-contrast-danger-color-50: #de3412;
$tb-figma-primitive-color-high-contrast-danger-color-60: #bd2c0f;
$tb-figma-primitive-color-high-contrast-danger-color-70: #8a240f;
$tb-figma-primitive-color-high-contrast-danger-color-80: #5c180a;
$tb-figma-primitive-color-high-contrast-danger-color-90: #390d05;
$tb-figma-primitive-color-high-contrast-danger-color-95: #260903;
$tb-figma-primitive-color-high-contrast-graphic-color-10: #e5ecf9;
$tb-figma-primitive-color-high-contrast-graphic-color-30: #98acc5;
$tb-figma-primitive-color-high-contrast-graphic-color-50: #61758f;
$tb-figma-primitive-color-high-contrast-graphic-color-70: #39506c;
$tb-figma-primitive-color-high-contrast-graphic-color-90: #223a58;
$tb-figma-primitive-color-high-contrast-gray-color-0: #ffffff;
$tb-figma-primitive-color-high-contrast-gray-color-10: #e6e8ea;
$tb-figma-primitive-color-high-contrast-gray-color-100: #000000;
$tb-figma-primitive-color-high-contrast-gray-color-20: #cdd1d5;
$tb-figma-primitive-color-high-contrast-gray-color-40: #8a949e;
$tb-figma-primitive-color-high-contrast-gray-color-60: #58616a;
$tb-figma-primitive-color-high-contrast-gray-color-70: #464c53;
$tb-figma-primitive-color-high-contrast-gray-color-80: #33363d;
$tb-figma-primitive-color-high-contrast-gray-color-95: #131416;
$tb-figma-primitive-color-high-contrast-information-color-10: #d3ebfd;
$tb-figma-primitive-color-high-contrast-information-color-20: #9ed2fa;
$tb-figma-primitive-color-high-contrast-information-color-30: #5fb5f7;
$tb-figma-primitive-color-high-contrast-information-color-40: #2098f3;
$tb-figma-primitive-color-high-contrast-information-color-5: #e7f4fe;
$tb-figma-primitive-color-high-contrast-information-color-50: #0b78cb;
$tb-figma-primitive-color-high-contrast-information-color-60: #096ab3;
$tb-figma-primitive-color-high-contrast-information-color-70: #085691;
$tb-figma-primitive-color-high-contrast-information-color-80: #053961;
$tb-figma-primitive-color-high-contrast-information-color-90: #03253f;
$tb-figma-primitive-color-high-contrast-information-color-95: #021a2c;
$tb-figma-primitive-color-high-contrast-point-color-10: #f5d6d9;
$tb-figma-primitive-color-high-contrast-point-color-30: #e0858c;
$tb-figma-primitive-color-high-contrast-point-color-5: #fbeff0;
$tb-figma-primitive-color-high-contrast-point-color-50: #d63d4a;
$tb-figma-primitive-color-high-contrast-point-color-60: #ab2b36;
$tb-figma-primitive-color-high-contrast-point-color-80: #521419;
$tb-figma-primitive-color-high-contrast-point-color-90: #310c0f;
$tb-figma-primitive-color-high-contrast-point-color-95: #21080a;
$tb-figma-primitive-color-high-contrast-primary-color-10: #d8e5fd;
$tb-figma-primitive-color-high-contrast-primary-color-20: #b1cefb;
$tb-figma-primitive-color-high-contrast-primary-color-30: #86aff9;
$tb-figma-primitive-color-high-contrast-primary-color-40: #4c87f6;
$tb-figma-primitive-color-high-contrast-primary-color-5: #ecf2fe;
$tb-figma-primitive-color-high-contrast-primary-color-80: #052561;
$tb-figma-primitive-color-high-contrast-primary-color-90: #03163a;
$tb-figma-primitive-color-high-contrast-primary-color-95: #020f27;
$tb-figma-primitive-color-high-contrast-secondary-color-10: #d5ebf1;
$tb-figma-primitive-color-high-contrast-secondary-color-20: #abd8e3;
$tb-figma-primitive-color-high-contrast-secondary-color-30: #75c0d1;
$tb-figma-primitive-color-high-contrast-secondary-color-40: #3d9fb8;
$tb-figma-primitive-color-high-contrast-secondary-color-5: #edf6f8;
$tb-figma-primitive-color-high-contrast-secondary-color-50: #268097;
$tb-figma-primitive-color-high-contrast-secondary-color-60: #1f687a;
$tb-figma-primitive-color-high-contrast-secondary-color-70: #17505e;
$tb-figma-primitive-color-high-contrast-secondary-color-80: #113b45;
$tb-figma-primitive-color-high-contrast-secondary-color-90: #0e3139;
$tb-figma-primitive-color-high-contrast-secondary-color-95: #091f25;
$tb-figma-primitive-color-high-contrast-success-color-10: #d8eedd;
$tb-figma-primitive-color-high-contrast-success-color-20: #a9dab4;
$tb-figma-primitive-color-high-contrast-success-color-30: #7ec88e;
$tb-figma-primitive-color-high-contrast-success-color-40: #3fa654;
$tb-figma-primitive-color-high-contrast-success-color-5: #eaf6ec;
$tb-figma-primitive-color-high-contrast-success-color-50: #228738;
$tb-figma-primitive-color-high-contrast-success-color-60: #267337;
$tb-figma-primitive-color-high-contrast-success-color-70: #285d33;
$tb-figma-primitive-color-high-contrast-success-color-80: #1f4727;
$tb-figma-primitive-color-high-contrast-success-color-90: #122b18;
$tb-figma-primitive-color-high-contrast-success-color-95: #0e2012;
$tb-figma-primitive-color-high-contrast-warning-color-10: #ffe0a3;
$tb-figma-primitive-color-high-contrast-warning-color-20: #ffc95c;
$tb-figma-primitive-color-high-contrast-warning-color-30: #ffb114;
$tb-figma-primitive-color-high-contrast-warning-color-40: #c78500;
$tb-figma-primitive-color-high-contrast-warning-color-5: #fff3db;
$tb-figma-primitive-color-high-contrast-warning-color-50: #9e6a00;
$tb-figma-primitive-color-high-contrast-warning-color-60: #8a5c00;
$tb-figma-primitive-color-high-contrast-warning-color-70: #614100;
$tb-figma-primitive-color-high-contrast-warning-color-80: #422c00;
$tb-figma-primitive-color-high-contrast-warning-color-90: #2e1f00;
$tb-figma-primitive-color-high-contrast-warning-color-95: #241800;
$tb-figma-primitive-color-light-alpha-white-10: rgba(255, 255, 255, 0.1);
$tb-figma-primitive-color-light-alpha-white-25: rgba(255, 255, 255, 0.25);
$tb-figma-primitive-color-light-danger-color-20: #f7afa1;
$tb-figma-primitive-color-light-danger-color-30: #f48771;
$tb-figma-primitive-color-light-danger-color-40: #f05f42;
$tb-figma-primitive-color-light-danger-color-70: #8a240f;
$tb-figma-primitive-color-light-danger-color-80: #5c180a;
$tb-figma-primitive-color-light-danger-color-90: #390d05;
$tb-figma-primitive-color-light-danger-color-95: #260903;
$tb-figma-primitive-color-light-gray-color-100: #000000;
$tb-figma-primitive-color-light-information-color-20: #9ed2fa;
$tb-figma-primitive-color-light-information-color-30: #5fb5f7;
$tb-figma-primitive-color-light-information-color-40: #2098f3;
$tb-figma-primitive-color-light-information-color-70: #085691;
$tb-figma-primitive-color-light-information-color-80: #053961;
$tb-figma-primitive-color-light-information-color-90: #03253f;
$tb-figma-primitive-color-light-information-color-95: #021a2c;
$tb-figma-primitive-color-light-point-color-20: #ebadb2;
$tb-figma-primitive-color-light-point-color-30: #e0858c;
$tb-figma-primitive-color-light-point-color-40: #d65c66;
$tb-figma-primitive-color-light-point-color-70: #7a1f26;
$tb-figma-primitive-color-light-point-color-80: #521419;
$tb-figma-primitive-color-light-point-color-90: #310c0f;
$tb-figma-primitive-color-light-point-color-95: #21080a;
$tb-figma-primitive-color-light-primary-color-30: #86aff9;
$tb-figma-primitive-color-light-primary-color-40: #4c87f6;
$tb-figma-primitive-color-light-primary-color-80: #052561;
$tb-figma-primitive-color-light-primary-color-90: #03163a;
$tb-figma-primitive-color-light-primary-color-95: #020f27;
$tb-figma-primitive-color-light-secondary-color-20: #bacbde;
$tb-figma-primitive-color-light-secondary-color-30: #90b0d5;
$tb-figma-primitive-color-light-secondary-color-40: #6b96c7;
$tb-figma-primitive-color-light-secondary-color-50: #346fb2;
$tb-figma-primitive-color-light-secondary-color-60: #1c589c;
$tb-figma-primitive-color-light-secondary-color-90: #031f3f;
$tb-figma-primitive-color-light-secondary-color-95: #02162c;
$tb-figma-primitive-color-light-success-color-20: #a9dab4;
$tb-figma-primitive-color-light-success-color-30: #7ec88e;
$tb-figma-primitive-color-light-success-color-40: #3fa654;
$tb-figma-primitive-color-light-success-color-70: #285d33;
$tb-figma-primitive-color-light-success-color-80: #1f4727;
$tb-figma-primitive-color-light-success-color-90: #122b18;
$tb-figma-primitive-color-light-success-color-95: #0e2012;
$tb-figma-primitive-color-light-warning-color-20: #ffc95c;
$tb-figma-primitive-color-light-warning-color-40: #c78500;
$tb-figma-primitive-color-light-warning-color-70: #614100;
$tb-figma-primitive-color-light-warning-color-80: #422c00;
$tb-figma-primitive-color-light-warning-color-90: #2e1f00;
$tb-figma-primitive-color-light-warning-color-95: #241800;
$tb-figma-colors-gray: linear-gradient(180deg, rgba(255, 255, 255, 0) 25%, #f4f5f6 100%);
$tb-figma-colors-secondary: linear-gradient(180deg, rgba(255, 255, 255, 0) 25%, #eef2f7 100%);
$tb-figma-colors-white: linear-gradient(180deg, rgba(255, 255, 255, 0.25) 25%, #ffffff 100%);
$tb-figma-primitive-color-light-alpha-white-10-1: rgba(255, 255, 255, 0.1);
$tb-figma-primitive-color-light-danger-color-50-1: #de3412;
$tb-figma-primitive-color-light-danger-color-60-1: #bd2c0f;
$tb-figma-primitive-color-light-graphic-color-50-2: #61758f;
$tb-figma-primitive-color-light-gray-color-0-1: #ffffff;
$tb-figma-primitive-color-light-gray-color-100-1: #000000;
$tb-figma-primitive-color-light-gray-color-20-1: #cdd1d5;
$tb-figma-primitive-color-light-gray-color-30-1: #b1b8be;
$tb-figma-primitive-color-light-gray-color-40-1: #8a949e;
$tb-figma-primitive-color-light-gray-color-5-1: #f4f5f6;
$tb-figma-primitive-color-light-gray-color-50-3: #6d7882;
$tb-figma-primitive-color-light-gray-color-60-2: #58616a;
$tb-figma-primitive-color-light-gray-color-70-1: #464c53;
$tb-figma-primitive-color-light-gray-color-90-1: #1e2124;
$tb-figma-primitive-color-light-gray-color-95-1: #131416;
$tb-figma-primitive-color-light-primary-color-50-4: #256ef4;
$tb-figma-primitive-color-light-primary-color-60-3: #0b50d0;
$tb-figma-primitive-color-light-primary-color-80-1: #052561;
$tb-figma-primitive-color-light-primary-color-95-2: #020f27;
$tb-figma-primitive-color-light-secondary-color-10-1: #d6e0eb;
$tb-figma-primitive-color-light-secondary-color-80-2: #052b57;
$tb-figma-tailwindcss-blue-color-600: #2563eb;
$tb-figma-mode-color-button-primary-fill: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-primary: $tb-figma-mode-color-button-primary-fill;
$tb-figma-mode-color-button-primary-fill-hover: $tb-figma-primitive-color-high-contrast-primary-color-60;
$tb-primary-hover: $tb-figma-mode-color-button-primary-fill-hover;
$tb-kendo-button-bg: $tb-figma-primitive-color-high-contrast-gray-color-5;
$tb-kendo-button-text: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-base-on-surface: $tb-figma-primitive-color-high-contrast-gray-color-50;
$tb-kendo-chip-outline-hover-text: $tb-base;
$tb-kendo-chip-outline-selected-text: $tb-kendo-chip-outline-hover-text;
$tb-primary-subtle: $tb-figma-primitive-color-light-primary-color-10;
$tb-kendo-input-text: $tb-figma-primitive-color-light-gray-color-50;
$tb-kendo-input-border: $tb-figma-primitive-color-high-contrast-gray-color-30;
$tb-kendo-input-hover-border: $tb-figma-primitive-color-high-contrast-gray-color-5;
$tb-kendo-input-flat-border: $tb-kendo-input-border;
$tb-kendo-input-invalid-border: $tb-error;
$tb-kendo-listbox-text: $tb-on-app-surface;
$tb-kendo-panelbar-item-selected-text: $tb-on-primary;
$tb-figma-mode-color-button-primary-fill-pressed: $tb-figma-primitive-color-high-contrast-primary-color-70;
$tb-primary-active: $tb-figma-mode-color-button-primary-fill-pressed;
$tb-kendo-splitter-border: $tb-border;
$tb-on-base: $tb-base-on-surface;
$tb-figma-disabled: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-primary: $tb-figma-primitive-color-high-contrast-alpha-black-0;
$tb-figma-primary-active: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-primary-hover: $tb-figma-primitive-color-high-contrast-primary-color-95;
$tb-figma-primary-pressed: $tb-figma-primitive-color-high-contrast-primary-color-90;
$tb-figma-primary-selected: $tb-figma-primitive-color-high-contrast-primary-color-95;
$tb-figma-secondary: $tb-figma-primitive-color-light-alpha-black-0;
$tb-figma-secondary-active: $tb-figma-primitive-color-high-contrast-secondary-color-60;
$tb-figma-secondary-hover: $tb-figma-primitive-color-high-contrast-secondary-color-95;
$tb-figma-secondary-on: $tb-figma-primitive-color-high-contrast-alpha-black-0;
$tb-figma-secondary-on-hover: $tb-figma-primitive-color-high-contrast-gray-color-100;
$tb-figma-secondary-on-pressed: $tb-figma-primitive-color-high-contrast-secondary-color-90;
$tb-figma-secondary-on-selected: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-secondary-pressed: $tb-figma-primitive-color-high-contrast-secondary-color-90;
$tb-figma-secondary-selected: $tb-figma-primitive-color-high-contrast-secondary-color-95;
$tb-figma-white: $tb-figma-primitive-color-light-gray-color-100;
$tb-figma-mode-color-alpha-base-0: $tb-figma-primitive-color-light-alpha-black-0;
$tb-figma-mode-color-alpha-base-10: $tb-figma-primitive-color-high-contrast-alpha-black-10;
$tb-figma-mode-color-alpha-base-100: $tb-figma-primitive-color-high-contrast-alpha-black-100;
$tb-figma-mode-color-alpha-base-25: $tb-figma-primitive-color-high-contrast-alpha-black-25;
$tb-figma-mode-color-alpha-base-50: $tb-figma-primitive-color-high-contrast-alpha-black-50;
$tb-figma-mode-color-alpha-base-75: $tb-figma-primitive-color-high-contrast-alpha-black-75;
$tb-figma-mode-color-alpha-inverse-0: $tb-figma-primitive-color-high-contrast-alpha-white-0;
$tb-figma-mode-color-alpha-inverse-10: $tb-figma-primitive-color-high-contrast-alpha-black-25;
$tb-figma-mode-color-alpha-inverse-100: $tb-figma-primitive-color-high-contrast-alpha-white-100;
$tb-figma-mode-color-alpha-inverse-25: $tb-figma-primitive-color-high-contrast-alpha-white-25;
$tb-figma-mode-color-alpha-inverse-50: $tb-figma-primitive-color-high-contrast-alpha-white-50;
$tb-figma-mode-color-alpha-inverse-75: $tb-figma-primitive-color-high-contrast-alpha-white-75;
$tb-figma-mode-color-background-dim: $tb-figma-primitive-color-high-contrast-alpha-black-75;
$tb-figma-mode-color-background-gray-subtle: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-background-gray-subtler: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-background-inverse: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-figma-mode-color-background-white: $tb-figma-primitive-color-high-contrast-gray-color-100;
$tb-figma-mode-color-border-danger: $tb-figma-primitive-color-high-contrast-danger-color-50;
$tb-figma-mode-color-border-danger-light: $tb-figma-primitive-color-high-contrast-danger-color-90;
$tb-figma-mode-color-border-disabled: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-border-gray: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-border-gray-dark: $tb-figma-primitive-color-high-contrast-gray-color-40;
$tb-figma-mode-color-border-gray-darker: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-figma-mode-color-border-gray-light: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-mode-color-border-information: $tb-figma-primitive-color-high-contrast-information-color-50;
$tb-figma-mode-color-border-information-light: $tb-figma-primitive-color-high-contrast-information-color-90;
$tb-figma-mode-color-border-inverse: $tb-figma-primitive-color-high-contrast-gray-color-100;
$tb-figma-mode-color-border-point: $tb-figma-primitive-color-high-contrast-point-color-50;
$tb-figma-mode-color-border-point-light: $tb-figma-primitive-color-high-contrast-point-color-90;
$tb-figma-mode-color-border-primary: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-border-primary-light: $tb-figma-primitive-color-high-contrast-primary-color-90;
$tb-figma-mode-color-border-secondary: $tb-figma-primitive-color-high-contrast-secondary-color-60;
$tb-figma-mode-color-border-secondary-light: $tb-figma-primitive-color-high-contrast-secondary-color-90;
$tb-figma-mode-color-border-success: $tb-figma-primitive-color-high-contrast-success-color-50;
$tb-figma-mode-color-border-success-light: $tb-figma-primitive-color-high-contrast-success-color-90;
$tb-figma-mode-color-border-transparency: $tb-figma-primitive-color-high-contrast-alpha-white-25;
$tb-figma-mode-color-border-warning: $tb-figma-primitive-color-high-contrast-warning-color-50;
$tb-figma-mode-color-border-warning-light: $tb-figma-primitive-color-high-contrast-warning-color-90;
$tb-figma-mode-color-button-disabled-border: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-button-disabled-fill: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-mode-color-button-secondary-border: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-button-secondary-fill: $tb-figma-primitive-color-high-contrast-primary-color-95;
$tb-figma-mode-color-button-secondary-fill-hover: $tb-figma-primitive-color-high-contrast-primary-color-90;
$tb-figma-mode-color-button-secondary-fill-pressed: $tb-figma-primitive-color-high-contrast-primary-color-80;
$tb-figma-mode-color-button-tertiary-border: $tb-figma-primitive-color-high-contrast-gray-color-40;
$tb-figma-mode-color-button-tertiary-fill: $tb-figma-primitive-color-high-contrast-alpha-black-0;
$tb-figma-mode-color-button-tertiary-fill-hover: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-button-tertiary-fill-pressed: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-mode-color-button-text-border: $tb-figma-primitive-color-high-contrast-alpha-white-50;
$tb-figma-mode-color-button-text-fill: $tb-figma-primitive-color-high-contrast-alpha-black-0;
$tb-figma-mode-color-button-text-fill-hover: $tb-figma-primitive-color-high-contrast-secondary-color-95;
$tb-figma-mode-color-button-text-fill-pressed: $tb-figma-primitive-color-high-contrast-secondary-color-90;
$tb-figma-mode-color-divider-error: $tb-figma-primitive-color-high-contrast-danger-color-50;
$tb-figma-mode-color-divider-gray: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-divider-gray-dark: $tb-figma-primitive-color-high-contrast-gray-color-50;
$tb-figma-mode-color-divider-gray-darker: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-figma-mode-color-divider-gray-light: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-mode-color-divider-inverse: $tb-figma-primitive-color-high-contrast-gray-color-100;
$tb-figma-mode-color-divider-point: $tb-figma-primitive-color-high-contrast-point-color-50;
$tb-figma-mode-color-divider-primary: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-divider-primary-light: $tb-figma-primitive-color-high-contrast-primary-color-90;
$tb-figma-mode-color-divider-secondary: $tb-figma-primitive-color-high-contrast-secondary-color-60;
$tb-figma-mode-color-divider-secondary-light: $tb-figma-primitive-color-high-contrast-secondary-color-90;
$tb-figma-mode-color-element-danger: $tb-figma-primitive-color-high-contrast-danger-color-50;
$tb-figma-mode-color-element-danger-lighter: $tb-figma-primitive-color-high-contrast-danger-color-95;
$tb-figma-mode-color-element-disabled-dark: $tb-figma-primitive-color-high-contrast-gray-color-60;
$tb-figma-mode-color-element-disabled-light: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-mode-color-element-gray: $tb-figma-primitive-color-high-contrast-gray-color-50;
$tb-figma-mode-color-element-gray-dark: $tb-figma-primitive-color-high-contrast-gray-color-40;
$tb-figma-mode-color-element-gray-light: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-element-gray-lighter: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-element-information: $tb-figma-primitive-color-high-contrast-information-color-50;
$tb-figma-mode-color-element-information-lighter: $tb-figma-primitive-color-high-contrast-information-color-95;
$tb-figma-mode-color-element-inverse: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-element-inverse-static: $tb-figma-primitive-color-high-contrast-gray-color-0;
$tb-figma-mode-color-element-point: $tb-figma-primitive-color-high-contrast-point-color-50;
$tb-figma-mode-color-element-point-light: $tb-figma-primitive-color-high-contrast-point-color-90;
$tb-figma-mode-color-element-point-lighter: $tb-figma-primitive-color-high-contrast-point-color-95;
$tb-figma-mode-color-element-primary: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-element-primary-light: $tb-figma-primitive-color-high-contrast-primary-color-90;
$tb-figma-mode-color-element-primary-lighter: $tb-figma-primitive-color-high-contrast-primary-color-95;
$tb-figma-mode-color-element-secondary: $tb-figma-primitive-color-high-contrast-secondary-color-60;
$tb-figma-mode-color-element-secondary-light: $tb-figma-primitive-color-high-contrast-secondary-color-90;
$tb-figma-mode-color-element-secondary-lighter: $tb-figma-primitive-color-high-contrast-secondary-color-95;
$tb-figma-mode-color-element-success: $tb-figma-primitive-color-high-contrast-success-color-50;
$tb-figma-mode-color-element-success-lighter: $tb-figma-primitive-color-high-contrast-success-color-95;
$tb-figma-mode-color-element-warning: $tb-figma-primitive-color-high-contrast-warning-color-30;
$tb-figma-mode-color-element-warning-lighter: $tb-figma-primitive-color-high-contrast-warning-color-95;
$tb-figma-mode-color-graphic-blue: $tb-figma-primitive-color-high-contrast-graphic-color-50;
$tb-figma-mode-color-graphic-blue-dark: $tb-figma-primitive-color-high-contrast-graphic-color-70;
$tb-figma-mode-color-graphic-blue-darker: $tb-figma-primitive-color-high-contrast-graphic-color-90;
$tb-figma-mode-color-graphic-blue-subtle: $tb-figma-primitive-color-high-contrast-graphic-color-30;
$tb-figma-mode-color-graphic-blue-subtler: $tb-figma-primitive-color-high-contrast-graphic-color-10;
$tb-figma-mode-color-graphic-brand: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-graphic-red: $tb-figma-primitive-color-high-contrast-point-color-20;
$tb-figma-mode-color-graphic-red-dark: $tb-figma-primitive-color-high-contrast-point-color-40;
$tb-figma-mode-color-graphic-red-darker: $tb-figma-primitive-color-high-contrast-point-color-70;
$tb-figma-mode-color-graphic-red-subtle: $tb-figma-primitive-color-high-contrast-point-color-10;
$tb-figma-mode-color-graphic-red-subtler: $tb-figma-primitive-color-high-contrast-point-color-5;
$tb-figma-mode-color-icon-danger: $tb-figma-primitive-color-high-contrast-danger-color-20;
$tb-figma-mode-color-icon-danger-static: $tb-figma-primitive-color-high-contrast-danger-color-50;
$tb-figma-mode-color-icon-disabled: $tb-figma-primitive-color-high-contrast-gray-color-60;
$tb-figma-mode-color-icon-disabled-on: $tb-figma-primitive-color-high-contrast-gray-color-50;
$tb-figma-mode-color-icon-gray: $tb-figma-primitive-color-high-contrast-gray-color-5;
$tb-figma-mode-color-icon-gray-fill: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-icon-gray-light: $tb-figma-primitive-color-high-contrast-gray-color-20;
$tb-figma-mode-color-icon-gray-static: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-figma-mode-color-icon-information: $tb-figma-primitive-color-high-contrast-information-color-20;
$tb-figma-mode-color-icon-information-static: $tb-figma-primitive-color-high-contrast-information-color-50;
$tb-figma-mode-color-icon-inverse: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-icon-inverse-static: $tb-figma-primitive-color-high-contrast-gray-color-0;
$tb-figma-mode-color-icon-point: $tb-figma-primitive-color-high-contrast-point-color-20;
$tb-figma-mode-color-icon-point-static: $tb-figma-primitive-color-high-contrast-point-color-50;
$tb-figma-mode-color-icon-primary: $tb-figma-primitive-color-high-contrast-primary-color-20;
$tb-figma-mode-color-icon-primary-static: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-icon-secondary: $tb-figma-primitive-color-high-contrast-secondary-color-20;
$tb-figma-mode-color-icon-secondary-static: $tb-figma-primitive-color-high-contrast-secondary-color-80;
$tb-figma-mode-color-icon-success: $tb-figma-primitive-color-high-contrast-success-color-20;
$tb-figma-mode-color-icon-success-static: $tb-figma-primitive-color-high-contrast-success-color-50;
$tb-figma-mode-color-icon-warning: $tb-figma-primitive-color-high-contrast-warning-color-20;
$tb-figma-mode-color-icon-warning-static: $tb-figma-primitive-color-high-contrast-warning-color-50;
$tb-figma-mode-color-input-border: $tb-figma-primitive-color-high-contrast-gray-color-40;
$tb-figma-mode-color-input-border-active: $tb-figma-primitive-color-high-contrast-primary-color-50;
$tb-figma-mode-color-input-border-disabled: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-input-border-error: $tb-figma-primitive-color-high-contrast-danger-color-50;
$tb-figma-mode-color-input-surface: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-input-surface-disabled: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-link-default: $tb-figma-primitive-color-high-contrast-primary-color-30;
$tb-figma-mode-color-link-hover: $tb-figma-primitive-color-high-contrast-primary-color-20;
$tb-figma-mode-color-link-pressed: $tb-figma-primitive-color-high-contrast-primary-color-10;
$tb-figma-mode-color-surface-danger-subtler: $tb-figma-primitive-color-high-contrast-danger-color-95;
$tb-figma-mode-color-surface-disabled: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-surface-gray-subtle: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-surface-gray-subtler: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-surface-information-subtler: $tb-figma-primitive-color-high-contrast-information-color-95;
$tb-figma-mode-color-surface-inverse: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-figma-mode-color-surface-inverse-static: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-surface-point-subtler: $tb-figma-primitive-color-high-contrast-point-color-95;
$tb-figma-mode-color-surface-primary-subtler: $tb-figma-primitive-color-high-contrast-primary-color-95;
$tb-figma-mode-color-surface-secondary-subtler: $tb-figma-primitive-color-high-contrast-secondary-color-95;
$tb-figma-mode-color-surface-success-subtler: $tb-figma-primitive-color-high-contrast-success-color-95;
$tb-figma-mode-color-surface-warning-subtler: $tb-figma-primitive-color-high-contrast-warning-color-95;
$tb-figma-mode-color-surface-white: $tb-figma-primitive-color-high-contrast-gray-color-100;
$tb-figma-mode-color-surface-white-static: $tb-figma-primitive-color-high-contrast-gray-color-0;
$tb-figma-mode-color-surface-white-subtle: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-surface-white-subtler: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-text-basic: $tb-figma-primitive-color-high-contrast-gray-color-5;
$tb-figma-mode-color-text-basic-inverse: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-text-bolder: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-figma-mode-color-text-bolder-inverse: $tb-figma-primitive-color-high-contrast-gray-color-95;
$tb-figma-mode-color-text-danger: $tb-figma-primitive-color-high-contrast-danger-color-20;
$tb-figma-mode-color-text-disabled: $tb-figma-primitive-color-high-contrast-gray-color-60;
$tb-figma-mode-color-text-disabled-on: $tb-figma-primitive-color-high-contrast-gray-color-50;
$tb-figma-mode-color-text-information: $tb-figma-primitive-color-high-contrast-information-color-20;
$tb-figma-mode-color-text-inverse-static: $tb-figma-primitive-color-high-contrast-gray-color-0;
$tb-figma-mode-color-text-point: $tb-figma-primitive-color-high-contrast-point-color-20;
$tb-figma-mode-color-text-primary: $tb-figma-primitive-color-high-contrast-primary-color-20;
$tb-figma-mode-color-text-secondary: $tb-figma-primitive-color-high-contrast-secondary-color-20;
$tb-figma-mode-color-text-static: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-figma-mode-color-text-subtle: $tb-figma-primitive-color-high-contrast-gray-color-20;
$tb-figma-mode-color-text-subtle-inverse: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-figma-mode-color-text-success: $tb-figma-primitive-color-high-contrast-success-color-20;
$tb-figma-mode-color-text-warning: $tb-figma-primitive-color-high-contrast-warning-color-20;
$tb-primary-subtle-hover: $tb-figma-primitive-color-high-contrast-information-color-20;
$tb-primary-subtle-active: $tb-figma-primitive-color-high-contrast-primary-color-30;
$tb-primary-emphasis: $tb-figma-primitive-color-high-contrast-primary-color-30;
$tb-primary-on-subtle: $tb-figma-primitive-color-high-contrast-primary-color-70;
$tb-primary-on-surface: $tb-figma-primitive-color-high-contrast-primary-color-40;
$tb-secondary-subtle: $tb-figma-primitive-color-high-contrast-gray-color-5;
$tb-secondary-subtle-hover: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-secondary-subtle-active: $tb-figma-primitive-color-high-contrast-gray-color-20;
$tb-secondary: $tb-figma-primitive-color-high-contrast-gray-color-50;
$tb-secondary-hover: $tb-figma-primitive-color-high-contrast-gray-color-60;
$tb-secondary-active: $tb-figma-primitive-color-high-contrast-gray-color-70;
$tb-secondary-emphasis: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-secondary-on-subtle: $tb-figma-primitive-color-high-contrast-gray-color-80;
$tb-on-secondary: $tb-figma-primitive-color-high-contrast-gray-color-0;
$tb-secondary-on-surface: $tb-figma-primitive-color-high-contrast-gray-color-90;
$tb-tertiary-subtle: $tb-figma-primitive-color-high-contrast-graphic-color-30;
$tb-tertiary-subtle-hover: $tb-figma-primitive-color-high-contrast-graphic-color-30;
$tb-tertiary-subtle-active: $tb-figma-primitive-color-high-contrast-graphic-color-50;
$tb-tertiary: $tb-figma-primitive-color-high-contrast-gray-color-10;
$tb-tertiary-hover: $tb-figma-primitive-color-high-contrast-gray-color-20;
$tb-tertiary-active: $tb-figma-primitive-color-high-contrast-gray-color-30;
$tb-tertiary-emphasis: $tb-figma-primitive-color-high-contrast-graphic-color-10;
$tb-tertiary-on-subtle: $tb-figma-primitive-color-high-contrast-graphic-color-70;
$tb-on-tertiary: $tb-figma-primitive-color-high-contrast-gray-color-100;
$tb-tertiary-on-surface: $tb-figma-primitive-color-high-contrast-graphic-color-30;
$tb-kendo-font-family: inherit;
$tb-kendo-font-size: 14px;
$tb-kendo-font-weight-normal: 400;
$tb-kendo-line-height: 1.4285714286;
$enable-gradients: true;
$tb-typography: (
kendo-default-typography: (
font-family: 'inherit',
font-size: 14px,
font-weight: 400,
line-height: 1.4285714286,
),
figma-typography-body-large: (
font-family: 'Pretendard GOV',
font-size: 19px,
font-weight: normal,
line-height: 150%,
),
figma-typography-body-large-bold: (
font-family: 'Pretendard GOV',
font-size: 19px,
font-weight: bold,
line-height: 150%,
),
figma-typography-body-medium: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: normal,
line-height: 150%,
),
figma-typography-body-medium-bold: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: bold,
line-height: 150%,
),
figma-typography-body-small: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: normal,
line-height: 150%,
),
figma-typography-body-small-bold: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: bold,
line-height: 150%,
),
figma-typography-body-xsmall: (
font-family: 'Pretendard GOV',
font-size: 13px,
font-weight: normal,
line-height: 150%,
),
figma-typography-body-xsmall-bold: (
font-family: 'Pretendard GOV',
font-size: 13px,
font-weight: bold,
line-height: 150%,
),
figma-typography-display-large: (
font-family: 'Pretendard GOV',
font-size: 60px,
font-weight: bold,
line-height: 150%,
letter-spacing: 1px,
),
figma-typography-display-medium: (
font-family: 'Pretendard GOV',
font-size: 44px,
font-weight: bold,
line-height: 150%,
letter-spacing: 1px,
),
figma-typography-display-small: (
font-family: 'Pretendard GOV',
font-size: 36px,
font-weight: bold,
line-height: 150%,
letter-spacing: 1px,
),
figma-typography-heading-large: (
font-family: 'Pretendard GOV',
font-size: 32px,
font-weight: bold,
line-height: 150%,
letter-spacing: 1px,
),
figma-typography-heading-medium: (
font-family: 'Pretendard GOV',
font-size: 24px,
font-weight: bold,
line-height: 150%,
),
figma-typography-heading-small: (
font-family: 'Pretendard GOV',
font-size: 19px,
font-weight: bold,
line-height: 150%,
),
figma-typography-heading-xlarge: (
font-family: 'Pretendard GOV',
font-size: 40px,
font-weight: bold,
line-height: 150%,
letter-spacing: 1px,
),
figma-typography-heading-xsmall: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: bold,
line-height: 150%,
),
figma-typography-heading-xxsmall: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: bold,
line-height: 150%,
),
figma-typography-label-large: (
font-family: 'Pretendard GOV',
font-size: 19px,
font-weight: normal,
line-height: 150%,
),
figma-typography-label-medium: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: normal,
line-height: 150%,
),
figma-typography-label-small: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: normal,
line-height: 150%,
),
figma-typography-label-xsmall: (
font-family: 'Pretendard GOV',
font-size: 13px,
font-weight: normal,
line-height: 150%,
),
figma-typography-navigation-depth-medium: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: normal,
line-height: 150%,
),
figma-typography-navigation-depth-medium-bold: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: bold,
line-height: 150%,
),
figma-typography-navigation-depth-small: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: normal,
line-height: 150%,
),
figma-typography-navigation-depth-small-bold: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: bold,
line-height: 150%,
),
figma-typography-navigation-title-medium: (
font-family: 'Pretendard GOV',
font-size: 24px,
font-weight: bold,
line-height: 150%,
),
figma-typography-navigation-title-small: (
font-family: 'Pretendard GOV',
font-size: 19px,
font-weight: bold,
line-height: 150%,
),
figma-typography-underline-large: (
font-family: 'Pretendard GOV',
font-size: 19px,
font-weight: normal,
line-height: 150%,
text-decoration-line: underline,
),
figma-typography-underline-medium: (
font-family: 'Pretendard GOV',
font-size: 17px,
font-weight: normal,
line-height: 150%,
text-decoration-line: underline,
),
figma-typography-underline-small: (
font-family: 'Pretendard GOV',
font-size: 15px,
font-weight: normal,
line-height: 150%,
text-decoration-line: underline,
),
figma-typography-underline-xsmall: (
font-family: 'Pretendard GOV',
font-size: 13px,
font-weight: normal,
line-height: 150%,
text-decoration-line: underline,
),
figma-typography-base-text-md-default-body-2-grid-grid-cell-text: (
font-family: 'Roboto',
font-size: 14px,
font-weight: normal,
line-height: 28px,
),
);
@mixin typography-classes ($typography) {
@each $selector, $property in $typography {
&-#{$selector} {
@each $propName, $propValue in $property {
#{$propName}: #{$propValue};
}
} &-#{$selector}-important {
@each $propName, $propValue in $property {
#{$propName}: $propValue !important;
}
}
}
}
$tb-effects: (
tb-internal-none-effects: (
box-shadow: (none), filter: (none), backdrop-filter: (none), ),
figma-effects-shadow-1: (
box-shadow: (0px 0px 2px 0 rgba(0, 0, 0, 0.05000000074505806), 0px 1px 2px 0 rgba(0, 0, 0, 0.05000000074505806)), ),
figma-effects-shadow-2: (
box-shadow: (0px 4px 8px 0 rgba(0, 0, 0, 0.07999999821186066), 0px 0px 2px 0 rgba(0, 0, 0, 0.05000000074505806)), ),
figma-effects-shadow-3: (
box-shadow: (0px 8px 16px 0 rgba(0, 0, 0, 0.11999999731779099), 0px 0px 2px 0 rgba(0, 0, 0, 0.07999999821186066)), ),
figma-effects-shadow-4: (
box-shadow: (0px 16px 24px 0 rgba(0, 0, 0, 0.11999999731779099), 0px 0px 2px 0 rgba(0, 0, 0, 0.07999999821186066)), ),
figma-effects-shadow-out: (
box-shadow: (0px 4px 5px 0 rgba(0, 0, 0, 0.07999999821186066)), ),
figma-effects-shadow-y-12: (
box-shadow: (0px 4px 15px 0 rgba(0, 0, 0, 0.10000000149011612)), ),
);
@mixin tb-effect($effect-name, $default: null) {
$effect: map-get($tb-effects, $effect-name);
@if $effect != null {
@if map-has-key($effect, box-shadow) {
box-shadow: map-get($effect, box-shadow);
}
@if map-has-key($effect, filter) {
filter: map-get($effect, filter);
}
@if map-has-key($effect, backdrop-filter) {
backdrop-filter: map-get($effect, backdrop-filter);
}
} @else if $default != null {
@warn "Warning: Effect #{$effect-name} not found. Applying default.";
box-shadow: $default;
} @else {
@error "Error: Effect #{$effect-name} not found in \$tb-effects map.";
}
}
@mixin effects-classes ($effects) {
@each $selector, $property in $effects {
&-#{$selector} {
@each $propName, $propValue in $property {
#{$propName}: $propValue;
}
} &-#{$selector}-important {
@each $propName, $propValue in $property {
#{$propName}: $propValue !important;
}
}
}
}
%tb-typography {
@include typography-classes($tb-typography);
}
%tb-effects {
@include effects-classes($tb-effects);
}
@@ -0,0 +1,143 @@
//사이즈 정의
@mixin dropdown-size-variable() {
--wb-dropdown--menu-radius: var(--wb-radius-medium4);
--wb-dropdown--menu-padding: var(--wb-padding-3);
--wb-dropdown--menu-margin-top: var(--wb-padding-6);
--wb-dropdown--menu-gap: var(--wb-gap-3);
--wb-dropdown--list-item-radius: var(--wb-radius-medium2);
--wb-dropdown--list-item-height: var(--wb-size-height-7);
--wb-dropdown--list-item-pc-font-size: var(--wb-pc-font-size-navigation-depth-medium);
--wb-dropdown--list-item-mobile-font-size: var(--wb-mobile-font-size-navigation-depth-medium);
}
//컬러 정의
@mixin dropdown-color-variable($mode: light) {
--wb-dropdown--menu-color-border: var(--wb-#{$mode}-color-border-gray-light);
--wb-dropdown--menu-color-surface: var(--wb-#{$mode}-color-surface-white-subtler);
--wb-dropdown--menu-color-alpha-shadow: 0 0 0.2rem 0 var(--wb-#{$mode}-color-alpha-shadow1), 0 0.4rem 0.8rem 0 var(--wb-#{$mode}-color-alpha-shadow2);
--wb-dropdown--list-item-color-action-hover: var(--wb-#{$mode}-color-action-secondary-hover);
--wb-dropdown--list-item-color-action-pressed: var(--wb-#{$mode}-color-action-secondary-pressed);
--wb-dropdown--list-item-color-action-selected: var(--wb-#{$mode}-color-action-secondary-selected);
--wb-dropdown--list-item-color-text-selected: var(--wb-#{$mode}-color-text-secondary);
}
//모드 설정
$mode-setting: light;
/* wb-drop-wrap */
.wb-drop-wrap {
@include dropdown-size-variable();
@include dropdown-color-variable(#{$mode-setting});
display: inline-flex;
position: relative;
.drop-menu {
@include position($t: 100%, $l: 50%);
display: none;
z-index: 6;
min-width: 13rem;
border-radius: var(--wb-dropdown--menu-radius);
padding: var(--wb-dropdown--menu-padding);
margin-top: var(--wb-dropdown--menu-margin-top);
background-color: var(--wb-dropdown--menu-color-surface);
border: 0.1rem solid var(--wb-dropdown--menu-color-border);
box-shadow: var(--wb-dropdown--menu-color-alpha-shadow);
transform: translateX(-50%);
&::before {
@include pseudo();
@include square(1.2rem);
@include position($b: 100%, $l: 50%);
display: block;
margin-bottom: -0.5rem;
margin-left: -0.6rem;
transform: rotate(-135deg);
background-color: var(--wb-dropdown--menu-color-surface);
border: 0.1rem solid var(--wb-dropdown--menu-color-border);
border-top-color: transparent;
border-left-color: transparent;
}
.drop-in {
// @include flex-layout($fd: column, $ai: flex-start);
gap: var(--wb-dropdown--menu-gap);
position: relative;
z-index: 1;
}
.drop-top {
width: 100%;
padding: var(--wb-padding-3) var(--wb-padding-6);
border-bottom: 0.1rem solid var(--wb-dropdown--menu-color-border);
}
.drop-bottom {
// @include flex-layout($jc: center);
width: 100%;
padding: var(--wb-padding-3) 0;
border-top: 0.1rem solid var(--wb-dropdown--menu-color-border);
}
.drop-list {
width: 100%;
.item-link {
// @include flex-layout($jc: flex-start, $ai: center);
width: 100%;
gap: var(--wb-gap-3);
padding: 0 var(--wb-padding-6);
font-size: var(--wb-dropdown--list-item-pc-font-size);
border-radius: var(--wb-dropdown--list-item-radius);
height: var(--wb-dropdown--list-item-height);
background-color: var(--wb-dropdown--menu-color-surface);
.ico-go {
@include svg-icon($size: var(--wb-icon--size-medium), $mode: #{$mode-setting});
}
&:hover {
background-color: var(--wb-dropdown--list-item-color-action-hover);
}
&:active {
background-color: var(--wb-dropdown--list-item-color-action-pressed);
}
&.active {
font-weight: var(--wb-font-weight-bold);
color: var(--wb-dropdown--list-item-color-text-selected);
background-color: var(--wb-dropdown--list-item-color-action-selected);
}
}
}
}
&.drop-left {
.drop-menu {
left: 0;
right: unset;
transform: none;
&::before {
left: 2.4rem;
margin-left: 0;
}
}
}
&.drop-right {
.drop-menu {
left: unset;
right: 0;
transform: none;
&::before {
left: unset;
right: 2.4rem;
}
}
}
}
//고대비모드
@include color-mode($mode: high-contrast) {
//모드 설정
$mode-setting: high-contrast;
/* wb-drop-wrap */
.wb-drop-wrap {
@include dropdown-color-variable(#{$mode-setting});
.drop-list {
.item-link {
.ico-go {
@include svg-icon($size: var(--wb-icon--size-medium), $mode: #{$mode-setting});
}
}
}
}
}
@@ -0,0 +1,4 @@
@import "mixins/breakpoints";
@import "mixins/utils";
@import "mixins/icons";
@import "mixins/form";
@@ -0,0 +1,3 @@
//@use 'sass:map';
//scss variables 모음
@import "variables_for_code";
+50
View File
@@ -0,0 +1,50 @@
.svg-icon {
&.ico-angle { //꺽쇠모양
@include icon-set(ico-angle, pure);
//disabled (for selectbox)
&.disabled {
@include icon-set(ico_angle_disabled, $effect: pure);
}
//default: down
&.up {
transform: rotate(180deg);
}
&.left {
transform: rotate(90deg);
}
&.right {
transform: rotate(-90deg);
}
}
&.ico-user{
@include icon-set(ico-user, pure);
}
&.ico-mark {
@include icon-set(ico-mark, pure);
}
&.ico-title-be {
@include icon-set(ico-title-be, pure);
}
&.ico-menu01 {
@include icon-set(ico-menu01, pure);
}
&.ico-menu02 {
@include icon-set(ico-menu02, pure);
}
&.ico-menu03 {
@include icon-set(ico-menu03, pure);
}
&.ico-menu04 {
@include icon-set(ico-menu04, pure);
}
&.ico-menu05 {
@include icon-set(ico-menu05, pure);
}
&.ico-menu06 {
@include icon-set(ico-menu06, pure);
}
&.ico-menu07 {
@include icon-set(ico-menu07, pure);
}
}
@@ -0,0 +1,7 @@
//@use 'sass:map';
//*** mixin
//mixin
@import "group_mixins";
+115
View File
@@ -0,0 +1,115 @@
@import "../tokens";
.menu{
height:100%;
background-color: $tb-figma-primitive-color-light-secondary-color-80-2;
.menu-container {
align-items: flex-start;
align-self: stretch;
background-image: none;
column-gap: 10px;
display: flex;
align-items: center;
background-image: none;
box-sizing: border-box;
flex-direction: column;
padding-bottom: $tb-figma-spacing-w-bspacing-8;
padding-top: $tb-figma-spacing-w-bspacing-8;
row-gap: $tb-figma-spacing-w-bspacing-7;
}
}
.group {
left: 15.58px;
position: absolute;
top: 15.58px;
}
.menu-item-container {
position: relative;
align-items: center;
border-bottom-left-radius: $tb-figma-semantic-radius-medium-3-1;
border-bottom-right-radius: $tb-figma-semantic-radius-medium-3-1;
border-top-left-radius: $tb-figma-semantic-radius-medium-3-1;
border-top-right-radius: $tb-figma-semantic-radius-medium-3-1;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: center;
padding-bottom: $tb-figma-spacing-w-bspacing-4;
padding-left: $tb-figma-spacing-w-bspacing-2;
padding-right: $tb-figma-spacing-w-bspacing-2;
padding-top: $tb-figma-spacing-w-bspacing-4;
row-gap: $tb-figma-spacing-w-bspacing-0;
&.active .menu-sub {
display: block;
opacity: 1;
}
&:hover{
background-color: $tb-figma-primitive-color-light-alpha-white-10;
}
&:focus{
background-color: $tb-figma-primitive-color-light-alpha-white-25;
}
.menu-sub{
position: absolute;
top:0;
right: -234px;
background: #fff;
@include tb-effect('figma-effects-shadow-3');
border-radius: 0 $tb-figma-spacing-w-bspacing-2 $tb-figma-spacing-w-bspacing-2 0;
padding: $tb-figma-spacing-w-bspacing-7;
z-index: 9;
width: 21.875rem;
display: none;
transition: max-height 0.3s ease, opacity 0.3s ease;
opacity: 0;
.container{
display: grid;
grid-template-columns: repeat(auto-fill, minmax(45%, auto));
gap: $tb-figma-semantic-padding-metric-5;
li{
display: flex;
flex-direction: column;
gap: $tb-figma-semantic-gap-metric-3;
flex: 1 1 50%;
.element-2-depth{
border: 1px solid $tb-figma-primitive-color-light-primary-color-30;
border-radius: $tb-figma-spacing-w-bspacing-2;
text-align: center;
padding: $tb-figma-spacing-w-bspacing-2;
font-weight: 600;
}
ul{
li{
a{
text-align: center;
&:hover{
color: $tb-figma-primitive-color-light-primary-color-60-3
}
&:focus{
color: $tb-figma-primitive-color-light-primary-color-80
}
}
~li{
margin-top: $tb-figma-semantic-gap-metric-3;
}
}
}
}
}
}
}
.wrap .element-1-depth {
align-items: center;
display: flex;
flex-direction: column;
row-gap: 8px;
}
.wrap .menu-item-text {
color: $tb-figma-primitive-color-light-gray-color-30-1;
font-size: 15px;
font-weight: 700;
line-height: 150%;
text-align: center;
}
@@ -0,0 +1,49 @@
// Spacing (4의 배수)
$spacing-0: 0;
$spacing-4: 0.25rem;
$spacing-8: 0.5rem;
$spacing-12: 0.75rem;
$spacing-16: 1rem;
$spacing-20: 1.25rem;
$spacing-24: 1.5rem;
$spacing-28: 1.75rem;
$spacing-32: 2rem;
$spacing-36: 2.25rem;
$spacing-40: 2.5rem;
$spacing-44: 2.75rem;
$spacing-48: 3rem;
$spacing-52: 3.25rem;
$spacing-56: 3.5rem;
$spacing-60: 3.75rem;
$spacing-64: 4rem;
// Font Size (4의 배수)
$font-12: 0.75rem;
$font-16: 1rem;
$font-14: 0.875rem;
$font-18: 1.125rem;
$font-20: 1.25rem;
$font-24: 1.5rem;
$font-28: 1.75rem;
$font-32: 2rem;
$font-36: 2.25rem;
$font-40: 2.5rem;
// Border Radius (4의 배수)
$radius-4: 0.25rem;
$radius-8: 0.5rem;
$radius-12: 0.75rem;
$radius-16: 1rem;
$radius-20: 1.25rem;
$radius-24: 1.5rem;
$radius-28: 1.75rem;
$radius-32: 2rem;
// Line Height (4의 배수)
$line-16: 1rem;
$line-20: 1.25rem;
$line-24: 1.5rem;
$line-28: 1.75rem;
$line-32: 2rem;
$line-36: 2.25rem;
$line-40: 2.5rem;
+2
View File
@@ -0,0 +1,2 @@
//*** path setting
$url: "../.." !default; //img
+318
View File
@@ -0,0 +1,318 @@
/* reset */
//모드 설정
$mode-setting: light;
html, body {
position: relative;
width: 100%;
height: 100%;
font-family: var(--wb-font-family-base);
color: var(--wb-#{$mode-setting}-color-text-basic);
font-weight: var(--wb-font-weight-regular);
line-height: var(--wb-line-height-base);
word-break: keep-all;
word-wrap: break-word;
-webkit-tap-highlight-color : transparent;
scroll-behavior: smooth;
}
html {
font-size: var(--wb-font-size-base);
}
body {
background-color: var(--wb-#{$mode-setting}-color-background-white);
font-size: var(--wb-pc-font-size-body-xsmall);
overflow-x: hidden;
}
//시스템 고대비모드 켜도 우리 style 적용되도록
* {
//forced-color-adjust: none;
}
//고대비모드
@include color-mode(high-contrast) {
//모드 설정
$mode-setting: high-contrast;
html, body {
color: var(--wb-#{$mode-setting}-color-text-basic);
}
body {
background-color: var(--wb-#{$mode-setting}-color-background-white);
}
}
*:focus {
//@include focus();
outline: 0.2rem solid var(--wb-light-color-border-inverse);
outline-offset: 0;
box-shadow: var(--wb-box-shadow-outline);
transition: outline 0s, box-shadow 0s !important;
}
::-moz-selection {
background: var(--wb-color-light-secondary-50);
color: var(--wb-color-light-gray-0);
}
::selection {
background: var(--wb-color-light-secondary-50);
color: var(--wb-color-light-gray-0);
}
body,
div,
p,
h1,
h2,
h3,
h4,
h5,
h6,
ul,
ol,
li,
dl,
dt,
dd,
table,
th,
td,
form,
fieldset,
legend,
input,
textarea,
a,
button,
select,
ul,
li,
span,
em,
label,
:before,
:after {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-text-size-adjust: none;
font-family: inherit;
line-height: var(--wb-line-height-base);
letter-spacing: inherit;
}
pre {
font-family: inherit;
}
input,
textarea,
a,
button,
select,
span,
label,
:before,
:after {
font: {
size: inherit;
weight: inherit;
}
}
h1,
h2,
h3,
h4,
h5,
h6,
strong {
font-weight: var(--wb-font-weight-bold);
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section {
display: block;
margin: 0;
padding: 0;
box-sizing: border-box;
}
img,
fieldset {
border: 0
}
fieldset {
min-width: 100%;
}
img {
max-width: 100%;
vertical-align: top;
}
ul,
ol {
list-style: none;
}
em,
address,
i {
font-style: normal;
}
a,
button {
transition: var(--wb-transition-base);
}
a,
a:hover,
a:active,
a:focus {
color: inherit;
text-decoration: none;
}
button,
input[type="submit"],
input[type="button"] {
overflow: visible;
margin: 0;
background-color: transparent;
border: none;
-webkit-appearance: button;
cursor: pointer;
font: inherit;
color: inherit;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
textarea {
resize: none;
}
label {
cursor: pointer;
}
select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
input[type="text"],
input[type="tel"],
input[type="password"],
input[type="file"],
input[type="number"],
input[type="email"],
input[type="date"],
input[type="search"],
textarea {
-webkit-box-shadow: none;
box-shadow: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
-webkit-tap-highlight-color: transparent;
}
input[type="number"] {
-moz-appearance: textfield;
margin: 0;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type='text']::-ms-clear {
display: none;
}
caption {
position: static !important;
margin: 0 !important;
}
table {
table-layout: fixed;
max-width: none;
width: auto;
min-width: 100%;
border-collapse: collapse;
}
[role="button"] {
cursor: pointer;
}
.img img {
min-width: 100%;
max-width: 100%;
}
.img.bg-img {
background-size: cover;
}
.blind,
hr,
.sr-only,
legend,
caption {
@include sr-only;
}
.hide {
display: none !important;
}
.show {
display: block !important;
}
.al {
text-align: left !important;
}
.ac {
text-align: center !important;
}
.ar {
text-align: right !important;
}
.underline {
@include underline();
}
.break-all {
word-break: break-all;
}
//svg icon
.svg-icon {
@include svg-icon();
&.pure {
@include svg-icon($effect: pure);
}
}
.inner {
max-width: var(--wb-contents-wrap-size);
padding-left: var(--wb-contents-padding-x);
padding-right: var(--wb-contents-padding-x);
}
//responsive mobile
@include size-medium {
body {
font-size: var(--wb-mobile-font-size-body-medium);
}
.pc-only {
display: none !important;
}
.pc-only.read {
@include sr-only;
}
.mob-line {
display: block;
line-height: inherit;
}
}
+65
View File
@@ -0,0 +1,65 @@
@import "group_variables";
//모드 설정
$mode-setting: light;
:root {
//* PRIMITIVE *
--wb-font-family-base: var(--wb-typo-font-type);
--wb-font-size-base: #{$font-size-base};
//line heights
@each $type, $value in $font-line-heights {
--wb-line-height-#{$type}: #{$value};
}
//letter spacings
@each $type, $value in $font-letter-spacings {
--wb-letter-spacing-#{$type}: #{$value};
}
//font weight
@each $type, $value in $font-weights {
--wb-font-weight-#{$type}: #{$value};
}
//transition
--wb-transition-base: #{$transition-base};
--wb-transition-fade: #{$transition-fade};
--wb-transition-collapse: #{$transition-collapse};
--wb-transition-collapse-width: #{$transition-collapse-width};
//contents size
--wb-contents-size: #{$contents-size};
--wb-contents-padding-x: #{$contents-padding-x-pc};
--wb-contents-wrap-size: #{$contents-wrap-size};
//box shadow (only for focus outline)
--wb-box-shadow-outline: 0 0 0 0.4rem var(--wb-#{$mode-setting}-color-border-primary);
--wb-box-shadow-outline-inset: inset 0 0 0 0.2rem var(--wb-#{$mode-setting}-color-border-primary);
//screen zoom sizes
@each $type, $value in $screen-zoom-sizes {
--wb-zoom-#{$type}: #{$value};
}
//text underline offset
--wb-font-underline-offset: #{$font-underline-offset-default};
//svg icon size
@each $size, $value in $icon-sizes {
--wb-icon--size-#{$size}: #{$value};
}
}
//고대비모드
@include color-mode($mode: high-contrast) {
//모드 설정
$mode-setting: high-contrast;
:root {
//box shadow (only for focus outline)
--wb-box-shadow-outline: 0 0 0 0.4rem var(--wb-#{$mode-setting}-color-border-primary);
--wb-box-shadow-outline-inset: inset 0 0 0 0.2rem var(--wb-#{$mode-setting}-color-border-primary);
}
}
@@ -0,0 +1,69 @@
//CONTENTS MAX WIDTH
$contents-size: 1200px !default;
$contents-padding-x-pc: 28px !default;
$contents-padding-x-mobile: 16px !default;
$contents-wrap-size: $contents-size + ($contents-padding-x-pc * 2) !default;
//BREAK POINTS
$breakpoint-small: 360px !default;
$breakpoint-medium: 768px !default;
$breakpoint-large: 1024px !default;
$breakpoint-xlarge: 1280px !default;
$breakpoint-xxlarge: 1440px !default;
//TYPO CUSTOM
$font-family-base: "Pretendard GOV", sans-serif !default;
$font-size-base: 62.5% !default; //10px 1rem으로 설정
$font-letter-spacings: (
none: var(--wb-typo-letter-spacing-0),
wide: var(--wb-typo-letter-spacing-1),
) !default;
//font weight
$font-weight-regular: 400 !default;
$font-weight-bold: 700 !default;
$font-weights: (
regular: $font-weight-regular,
bold: $font-weight-bold,
) !default;
//line height style
$font-line-height-none: 1 !default;
$font-line-height-base: 1.5 !default;
$font-line-heights: (
none: $font-line-height-none,
base: $font-line-height-base,
) !default;
//TYPO UNDERLINE OFFESET
$font-underline-offset-default: 0.3rem !default;
//IMG BACKGROUND URL
$url: "../../img" !default;
//TRANSITION
$transition-base: .4s ease-in-out !default;
$transition-fade: opacity .4s linear !default;
$transition-collapse: max-height .4s ease !default;
$transition-collapse-width: width .4s ease !default;
//SVG ICON SIZE
$icon-sizes: (
xsmall: var(--wb-size-height-2),
small: var(--wb-size-height-2),
medium: var(--wb-size-height-3),
large: var(--wb-size-height-4),
xlarge: var(--wb-size-height-4),
) !default;
//SCREEN ZOOM
$screen-zoom-sizes: (
small: 0.9,
medium: 1,
large: 1.1,
xlarge: 1.3,
xxlarge: 1.5,
) !default;
/////////////////////////////////// variable group setting ///////////////////////////////////////////////////
@@ -0,0 +1,782 @@
:root {
/* PRIMITIVE */
--wb-color-light-primary-5: #ecf2fe;
--wb-color-light-primary-10: #d8e5fd;
--wb-color-light-primary-20: #b1cefb;
--wb-color-light-primary-30: #86aff9;
--wb-color-light-primary-40: #4c87f6;
--wb-color-light-primary-50: #256ef4;
--wb-color-light-primary-60: #0b50d0;
--wb-color-light-primary-70: #083891;
--wb-color-light-primary-80: #052561;
--wb-color-light-primary-90: #03163a;
--wb-color-light-primary-95: #020f27;
--wb-color-light-secondary-5: #eef2f7;
--wb-color-light-secondary-10: #d6e0eb;
--wb-color-light-secondary-20: #bacbde;
--wb-color-light-secondary-30: #90b0d5;
--wb-color-light-secondary-40: #6b96c7;
--wb-color-light-secondary-50: #346fb2;
--wb-color-light-secondary-60: #1c589c;
--wb-color-light-secondary-70: #063a74;
--wb-color-light-secondary-80: #052b57;
--wb-color-light-secondary-90: #031f3f;
--wb-color-light-secondary-95: #02162c;
--wb-color-light-gray-0: #ffffff;
--wb-color-light-gray-5: #f4f5f6;
--wb-color-light-gray-10: #e6e8ea;
--wb-color-light-gray-20: #cdd1d5;
--wb-color-light-gray-30: #b1b8be;
--wb-color-light-gray-40: #8a949e;
--wb-color-light-gray-50: #6d7882;
--wb-color-light-gray-60: #58616a;
--wb-color-light-gray-70: #464c53;
--wb-color-light-gray-80: #33363d;
--wb-color-light-gray-90: #1e2124;
--wb-color-light-gray-95: #131416;
--wb-color-light-gray-100: #000000;
--wb-color-light-alpha-black100: #000000;
--wb-color-light-alpha-black75: #000000bf;
--wb-color-light-alpha-black50: #00000080;
--wb-color-light-alpha-black25: #00000040;
--wb-color-light-alpha-black10: #0000001a;
--wb-color-light-alpha-black0: #00000000;
--wb-color-light-alpha-white100: #ffffff;
--wb-color-light-alpha-white75: #ffffffbf;
--wb-color-light-alpha-white50: #ffffff80;
--wb-color-light-alpha-white25: #ffffff40;
--wb-color-light-alpha-white10: #ffffff1a;
--wb-color-light-alpha-white0: #ffffff00;
--wb-color-light-danger-5: #fdefec;
--wb-color-light-danger-10: #fcdfd9;
--wb-color-light-danger-20: #f7afa1;
--wb-color-light-danger-30: #f48771;
--wb-color-light-danger-40: #f05f42;
--wb-color-light-danger-50: #de3412;
--wb-color-light-danger-60: #bd2c0f;
--wb-color-light-danger-70: #8a240f;
--wb-color-light-danger-80: #5c180a;
--wb-color-light-danger-90: #390d05;
--wb-color-light-danger-95: #260903;
--wb-color-light-information-5: #e7f4fe;
--wb-color-light-information-10: #d3ebfd;
--wb-color-light-information-20: #9ed2fa;
--wb-color-light-information-30: #5fb5f7;
--wb-color-light-information-40: #2098f3;
--wb-color-light-information-50: #0b78cb;
--wb-color-light-information-60: #096ab3;
--wb-color-light-information-70: #085691;
--wb-color-light-information-80: #053961;
--wb-color-light-information-90: #03253f;
--wb-color-light-information-95: #021a2c;
--wb-color-light-warning-5: #fff3db;
--wb-color-light-warning-10: #ffe0a3;
--wb-color-light-warning-20: #ffc95c;
--wb-color-light-warning-30: #ffb114;
--wb-color-light-warning-40: #c78500;
--wb-color-light-warning-50: #9e6a00;
--wb-color-light-warning-60: #8a5c00;
--wb-color-light-warning-70: #614100;
--wb-color-light-warning-80: #422c00;
--wb-color-light-warning-90: #2e1f00;
--wb-color-light-warning-95: #241800;
--wb-color-light-success-5: #eaf6ec;
--wb-color-light-success-10: #d8eedd;
--wb-color-light-success-20: #a9dab4;
--wb-color-light-success-30: #7ec88e;
--wb-color-light-success-40: #3fa654;
--wb-color-light-success-50: #228738;
--wb-color-light-success-60: #267337;
--wb-color-light-success-70: #285d33;
--wb-color-light-success-80: #1f4727;
--wb-color-light-success-90: #122b18;
--wb-color-light-success-95: #0e2012;
--wb-color-light-point-5: #fbeff0;
--wb-color-light-point-10: #f5d6d9;
--wb-color-light-point-20: #ebadb2;
--wb-color-light-point-30: #e0858c;
--wb-color-light-point-40: #d65c66;
--wb-color-light-point-50: #d63d4a;
--wb-color-light-point-60: #ab2b36;
--wb-color-light-point-70: #7a1f26;
--wb-color-light-point-80: #521419;
--wb-color-light-point-90: #310c0f;
--wb-color-light-point-95: #21080a;
--wb-color-light-graphic-10: #e5ecf9;
--wb-color-light-graphic-30: #98acc5;
--wb-color-light-graphic-50: #61758f;
--wb-color-light-graphic-70: #39506c;
--wb-color-light-graphic-90: #223a58;
--wb-color-high-contrast-gray-0: #ffffff;
--wb-color-high-contrast-gray-5: #f4f5f6;
--wb-color-high-contrast-gray-10: #e6e8ea;
--wb-color-high-contrast-gray-20: #cdd1d5;
--wb-color-high-contrast-gray-30: #b1b8be;
--wb-color-high-contrast-gray-40: #8a949e;
--wb-color-high-contrast-gray-50: #6d7882;
--wb-color-high-contrast-gray-60: #58616a;
--wb-color-high-contrast-gray-70: #464c53;
--wb-color-high-contrast-gray-80: #33363d;
--wb-color-high-contrast-gray-90: #1e2124;
--wb-color-high-contrast-gray-95: #131416;
--wb-color-high-contrast-gray-100: #000000;
--wb-color-high-contrast-primary-5: #ecf2fe;
--wb-color-high-contrast-primary-10: #d8e5fd;
--wb-color-high-contrast-primary-20: #b1cefb;
--wb-color-high-contrast-primary-30: #86aff9;
--wb-color-high-contrast-primary-40: #4c87f6;
--wb-color-high-contrast-primary-50: #256ef4;
--wb-color-high-contrast-primary-60: #0b50d0;
--wb-color-high-contrast-primary-70: #083891;
--wb-color-high-contrast-primary-80: #052561;
--wb-color-high-contrast-primary-90: #03163a;
--wb-color-high-contrast-primary-95: #020f27;
--wb-color-high-contrast-secondary-5: #edf6f8;
--wb-color-high-contrast-secondary-10: #d5ebf1;
--wb-color-high-contrast-secondary-20: #abd8e3;
--wb-color-high-contrast-secondary-30: #75c0d1;
--wb-color-high-contrast-secondary-40: #3d9fb8;
--wb-color-high-contrast-secondary-50: #268097;
--wb-color-high-contrast-secondary-60: #1f687a;
--wb-color-high-contrast-secondary-70: #17505e;
--wb-color-high-contrast-secondary-80: #113b45;
--wb-color-high-contrast-secondary-90: #0e3139;
--wb-color-high-contrast-secondary-95: #091f25;
--wb-color-high-contrast-point-5: #fbeff0;
--wb-color-high-contrast-point-10: #f5d6d9;
--wb-color-high-contrast-point-20: #ebadb2;
--wb-color-high-contrast-point-30: #e0858c;
--wb-color-high-contrast-point-40: #d65c66;
--wb-color-high-contrast-point-50: #d63d4a;
--wb-color-high-contrast-point-60: #ab2b36;
--wb-color-high-contrast-point-70: #7a1f26;
--wb-color-high-contrast-point-80: #521419;
--wb-color-high-contrast-point-90: #310c0f;
--wb-color-high-contrast-point-95: #21080a;
--wb-color-high-contrast-danger-5: #fdefec;
--wb-color-high-contrast-danger-10: #fcdfd9;
--wb-color-high-contrast-danger-20: #f7afa1;
--wb-color-high-contrast-danger-30: #f48771;
--wb-color-high-contrast-danger-40: #f05f42;
--wb-color-high-contrast-danger-50: #de3412;
--wb-color-high-contrast-danger-60: #bd2c0f;
--wb-color-high-contrast-danger-70: #8a240f;
--wb-color-high-contrast-danger-80: #5c180a;
--wb-color-high-contrast-danger-90: #390d05;
--wb-color-high-contrast-danger-95: #260903;
--wb-color-high-contrast-warning-5: #fff3db;
--wb-color-high-contrast-warning-10: #ffe0a3;
--wb-color-high-contrast-warning-20: #ffc95c;
--wb-color-high-contrast-warning-30: #ffb114;
--wb-color-high-contrast-warning-40: #c78500;
--wb-color-high-contrast-warning-50: #9e6a00;
--wb-color-high-contrast-warning-60: #8a5c00;
--wb-color-high-contrast-warning-70: #614100;
--wb-color-high-contrast-warning-80: #422c00;
--wb-color-high-contrast-warning-90: #2e1f00;
--wb-color-high-contrast-warning-95: #241800;
--wb-color-high-contrast-success-5: #eaf6ec;
--wb-color-high-contrast-success-10: #d8eedd;
--wb-color-high-contrast-success-20: #a9dab4;
--wb-color-high-contrast-success-30: #7ec88e;
--wb-color-high-contrast-success-40: #3fa654;
--wb-color-high-contrast-success-50: #228738;
--wb-color-high-contrast-success-60: #267337;
--wb-color-high-contrast-success-70: #285d33;
--wb-color-high-contrast-success-80: #1f4727;
--wb-color-high-contrast-success-90: #122b18;
--wb-color-high-contrast-success-95: #0e2012;
--wb-color-high-contrast-information-5: #e7f4fe;
--wb-color-high-contrast-information-10: #d3ebfd;
--wb-color-high-contrast-information-20: #9ed2fa;
--wb-color-high-contrast-information-30: #5fb5f7;
--wb-color-high-contrast-information-40: #2098f3;
--wb-color-high-contrast-information-50: #0b78cb;
--wb-color-high-contrast-information-60: #096ab3;
--wb-color-high-contrast-information-70: #085691;
--wb-color-high-contrast-information-80: #053961;
--wb-color-high-contrast-information-90: #03253f;
--wb-color-high-contrast-information-95: #021a2c;
--wb-color-high-contrast-alpha-black100: #000000;
--wb-color-high-contrast-alpha-black75: #000000bf;
--wb-color-high-contrast-alpha-black50: #00000080;
--wb-color-high-contrast-alpha-black25: #00000040;
--wb-color-high-contrast-alpha-black10: #0000001a;
--wb-color-high-contrast-alpha-black0: #00000000;
--wb-color-high-contrast-alpha-white100: #ffffff;
--wb-color-high-contrast-alpha-white75: #ffffffbf;
--wb-color-high-contrast-alpha-white50: #ffffff80;
--wb-color-high-contrast-alpha-white25: #ffffff40;
--wb-color-high-contrast-alpha-white10: #ffffff1a;
--wb-color-high-contrast-alpha-white0: #ffffff00;
--wb-color-high-contrast-graphic-10: #e5ecf9;
--wb-color-high-contrast-graphic-30: #98acc5;
--wb-color-high-contrast-graphic-50: #61758f;
--wb-color-high-contrast-graphic-70: #39506c;
--wb-color-high-contrast-graphic-90: #223a58;
--wb-typo-font-type: Pretendard GOV;
--wb-typo-font-weight-regular: Regular;
--wb-typo-font-weight-bold: Bold;
--wb-typo-letter-spacing-0: 0rem;
--wb-typo-letter-spacing-1: 0.1rem;
--wb-number-0: 0rem;
--wb-number-1: 0.1rem;
--wb-number-2: 0.2rem;
--wb-number-3: 0.4rem;
--wb-number-4: 0.6rem;
--wb-number-5: 0.8rem;
--wb-number-6: 1rem;
--wb-number-7: 1.2rem;
--wb-number-8: 1.6rem;
--wb-number-9: 2rem;
--wb-number-10: 2.4rem;
--wb-number-11: 2.8rem;
--wb-number-12: 3.2rem;
--wb-number-13: 3.6rem;
--wb-number-14: 4rem;
--wb-number-15: 4.4rem;
--wb-number-16: 4.8rem;
--wb-number-17: 5.6rem;
--wb-number-18: 6.4rem;
--wb-number-19: 7.2rem;
--wb-number-20: 8rem;
--wb-number-21: 9.6rem;
--wb-number-max: 100rem;
/* MODE-LIGHT */
--wb-light-color-surface-gray-subtler: var(--wb-color-light-gray-5);
--wb-light-color-surface-gray-subtle: var(--wb-color-light-gray-10);
--wb-light-color-surface-disabled: var(--wb-color-light-gray-20);
--wb-light-color-surface-primary-subtler: var(--wb-color-light-primary-5);
--wb-light-color-surface-secondary-subtler: var(--wb-color-light-secondary-5);
--wb-light-color-surface-danger-subtler: var(--wb-color-light-danger-5);
--wb-light-color-surface-warning-subtler: var(--wb-color-light-warning-5);
--wb-light-color-surface-success-subtler: var(--wb-color-light-success-5);
--wb-light-color-surface-information-subtler: var(--wb-color-light-information-5);
--wb-light-color-surface-point-subtler: var(--wb-color-light-point-5);
--wb-light-color-surface-white: var(--wb-color-light-gray-0);
--wb-light-color-surface-inverse: var(--wb-color-light-gray-90);
--wb-light-color-surface-white-static: var(--wb-color-light-gray-0);
--wb-light-color-surface-inverse-static: var(--wb-color-light-gray-90);
--wb-light-color-surface-white-subtle: var(--wb-color-light-gray-0);
--wb-light-color-surface-white-subtler: var(--wb-color-light-gray-0);
--wb-light-color-border-gray-light: var(--wb-color-light-gray-20);
--wb-light-color-border-gray: var(--wb-color-light-gray-30);
--wb-light-color-border-secondary-light: var(--wb-color-light-secondary-10);
--wb-light-color-border-danger-light: var(--wb-color-light-danger-10);
--wb-light-color-border-danger: var(--wb-color-light-danger-50);
--wb-light-color-border-warning-light: var(--wb-color-light-warning-10);
--wb-light-color-border-warning: var(--wb-color-light-warning-50);
--wb-light-color-border-success-light: var(--wb-color-light-success-10);
--wb-light-color-border-success: var(--wb-color-light-success-50);
--wb-light-color-border-information-light: var(--wb-color-light-information-10);
--wb-light-color-border-information: var(--wb-color-light-information-50);
--wb-light-color-border-gray-dark: var(--wb-color-light-gray-60);
--wb-light-color-border-primary: var(--wb-color-light-primary-50);
--wb-light-color-border-disabled: var(--wb-color-light-gray-30);
--wb-light-color-border-gray-darker: var(--wb-color-light-gray-90);
--wb-light-color-border-secondary: var(--wb-color-light-secondary-70);
--wb-light-color-border-inverse: var(--wb-color-light-gray-0);
--wb-light-color-border-transparency: var(--wb-color-light-alpha-black0);
--wb-light-color-border-primary-light: var(--wb-color-light-primary-10);
--wb-light-color-border-point: var(--wb-color-light-point-50);
--wb-light-color-border-point-light: var(--wb-color-light-point-10);
--wb-light-color-divider-gray-light: var(--wb-color-light-gray-20);
--wb-light-color-divider-gray: var(--wb-color-light-gray-40);
--wb-light-color-divider-gray-dark: var(--wb-color-light-gray-50);
--wb-light-color-divider-primary: var(--wb-color-light-primary-50);
--wb-light-color-divider-secondary-light: var(--wb-color-light-secondary-10);
--wb-light-color-divider-secondary: var(--wb-color-light-secondary-70);
--wb-light-color-divider-error: var(--wb-color-light-danger-50);
--wb-light-color-divider-primary-light: var(--wb-color-light-primary-10);
--wb-light-color-divider-inverse: var(--wb-color-light-gray-0);
--wb-light-color-divider-gray-darker: var(--wb-color-light-gray-90);
--wb-light-color-divider-point: var(--wb-color-light-point-50);
--wb-light-color-text-bolder: var(--wb-color-light-gray-95);
--wb-light-color-text-subtle: var(--wb-color-light-gray-70);
--wb-light-color-text-disabled: var(--wb-color-light-gray-40);
--wb-light-color-text-disabled-on: var(--wb-color-light-gray-50);
--wb-light-color-text-primary: var(--wb-color-light-primary-60);
--wb-light-color-text-secondary: var(--wb-color-light-secondary-80);
--wb-light-color-text-danger: var(--wb-color-light-danger-60);
--wb-light-color-text-warning: var(--wb-color-light-warning-60);
--wb-light-color-text-success: var(--wb-color-light-success-60);
--wb-light-color-text-information: var(--wb-color-light-information-60);
--wb-light-color-text-basic: var(--wb-color-light-gray-90);
--wb-light-color-text-point: var(--wb-color-light-point-60);
--wb-light-color-text-bolder-inverse: var(--wb-color-light-gray-0);
--wb-light-color-text-basic-inverse: var(--wb-color-light-gray-0);
--wb-light-color-text-subtle-inverse: var(--wb-color-light-gray-30);
--wb-light-color-text-inverse-static: var(--wb-color-light-gray-0);
--wb-light-color-text-static: var(--wb-color-light-gray-90);
--wb-light-color-icon-gray: var(--wb-color-light-gray-80);
--wb-light-color-icon-gray-fill: var(--wb-color-light-gray-20);
--wb-light-color-icon-inverse: var(--wb-color-light-gray-0);
--wb-light-color-icon-primary: var(--wb-color-light-primary-50);
--wb-light-color-icon-secondary: var(--wb-color-light-secondary-80);
--wb-light-color-icon-point: var(--wb-color-light-point-50);
--wb-light-color-icon-danger: var(--wb-color-light-danger-50);
--wb-light-color-icon-warning: var(--wb-color-light-warning-50);
--wb-light-color-icon-success: var(--wb-color-light-success-50);
--wb-light-color-icon-information: var(--wb-color-light-information-50);
--wb-light-color-icon-gray-light: var(--wb-color-light-gray-70);
--wb-light-color-icon-disabled: var(--wb-color-light-gray-40);
--wb-light-color-icon-disabled-on: var(--wb-color-light-gray-50);
--wb-light-color-icon-inverse-static: var(--wb-color-light-gray-0);
--wb-light-color-icon-primary-static: var(--wb-color-light-primary-50);
--wb-light-color-icon-secondary-static: var(--wb-color-light-secondary-80);
--wb-light-color-icon-point-static: var(--wb-color-light-point-50);
--wb-light-color-icon-danger-static: var(--wb-color-light-danger-50);
--wb-light-color-icon-warning-static: var(--wb-color-light-warning-50);
--wb-light-color-icon-success-static: var(--wb-color-light-success-50);
--wb-light-color-icon-information-static: var(--wb-color-light-information-50);
--wb-light-color-icon-gray-static: var(--wb-color-light-gray-80);
--wb-light-color-link-default: var(--wb-color-light-primary-50);
--wb-light-color-link-hover: var(--wb-color-light-primary-60);
--wb-light-color-link-pressed: var(--wb-color-light-primary-70);
--wb-light-color-link-visited: #5917b8;
--wb-light-color-button-primary-fill: var(--wb-color-light-primary-50);
--wb-light-color-button-primary-fill-hover: var(--wb-color-light-primary-60);
--wb-light-color-button-primary-fill-pressed: var(--wb-color-light-primary-70);
--wb-light-color-button-secondary-fill: var(--wb-color-light-primary-5);
--wb-light-color-button-secondary-fill-hover: var(--wb-color-light-primary-10);
--wb-light-color-button-secondary-fill-pressed: var(--wb-color-light-primary-20);
--wb-light-color-button-secondary-border: var(--wb-color-light-primary-50);
--wb-light-color-button-tertiary-fill: var(--wb-color-light-alpha-white0);
--wb-light-color-button-tertiary-fill-hover: var(--wb-color-light-gray-5);
--wb-light-color-button-tertiary-fill-pressed: var(--wb-color-light-gray-10);
--wb-light-color-button-tertiary-border: var(--wb-color-light-gray-60);
--wb-light-color-button-disabled-fill: var(--wb-color-light-gray-20);
--wb-light-color-button-text-fill-hover: var(--wb-color-light-secondary-5);
--wb-light-color-button-text-fill-pressed: var(--wb-color-light-secondary-10);
--wb-light-color-button-text-fill: var(--wb-color-light-alpha-white0);
--wb-light-color-button-text-border: var(--wb-color-light-alpha-black0);
--wb-light-color-button-disabled-border: var(--wb-color-light-gray-30);
--wb-light-color-background-white: var(--wb-color-light-gray-0);
--wb-light-color-background-inverse: var(--wb-color-light-gray-90);
--wb-light-color-background-gray-subtler: var(--wb-color-light-gray-5);
--wb-light-color-background-gray-subtle: var(--wb-color-light-gray-10);
--wb-light-color-background-dim: var(--wb-color-light-alpha-black75);
--wb-light-color-element-disabled-light: var(--wb-color-light-gray-20);
--wb-light-color-element-disabled-dark: var(--wb-color-light-gray-40);
--wb-light-color-element-gray-lighter: var(--wb-color-light-gray-5);
--wb-light-color-element-gray-light: var(--wb-color-light-gray-10);
--wb-light-color-element-gray: var(--wb-color-light-gray-50);
--wb-light-color-element-primary-lighter: var(--wb-color-light-primary-5);
--wb-light-color-element-primary-light: var(--wb-color-light-primary-10);
--wb-light-color-element-primary: var(--wb-color-light-primary-50);
--wb-light-color-element-secondary-lighter: var(--wb-color-light-secondary-5);
--wb-light-color-element-secondary-light: var(--wb-color-light-secondary-10);
--wb-light-color-element-secondary: var(--wb-color-light-secondary-70);
--wb-light-color-element-point-lighter: var(--wb-color-light-point-5);
--wb-light-color-element-point-light: var(--wb-color-light-point-10);
--wb-light-color-element-point: var(--wb-color-light-point-50);
--wb-light-color-element-danger-lighter: var(--wb-color-light-danger-5);
--wb-light-color-element-danger: var(--wb-color-light-danger-50);
--wb-light-color-element-warning-lighter: var(--wb-color-light-warning-5);
--wb-light-color-element-warning: var(--wb-color-light-warning-30);
--wb-light-color-element-success-lighter: var(--wb-color-light-success-5);
--wb-light-color-element-success: var(--wb-color-light-success-50);
--wb-light-color-element-information-lighter: var(--wb-color-light-information-5);
--wb-light-color-element-information: var(--wb-color-light-information-50);
--wb-light-color-element-inverse: var(--wb-color-light-gray-0);
--wb-light-color-element-gray-dark: var(--wb-color-light-gray-60);
--wb-light-color-element-inverse-static: var(--wb-color-light-gray-0);
--wb-light-color-action-white: var(--wb-color-light-gray-0);
--wb-light-color-action-primary: var(--wb-color-light-alpha-white0);
--wb-light-color-action-primary-hover: var(--wb-color-light-primary-5);
--wb-light-color-action-primary-pressed: var(--wb-color-light-primary-10);
--wb-light-color-action-secondary: var(--wb-color-light-alpha-white0);
--wb-light-color-action-secondary-hover: var(--wb-color-light-secondary-5);
--wb-light-color-action-secondary-pressed: var(--wb-color-light-secondary-10);
--wb-light-color-action-secondary-selected: var(--wb-color-light-secondary-5);
--wb-light-color-action-secondary-on: var(--wb-color-light-alpha-white0);
--wb-light-color-action-secondary-on-hover: var(--wb-color-light-gray-0);
--wb-light-color-action-secondary-on-pressed: var(--wb-color-light-secondary-10);
--wb-light-color-action-secondary-on-selected: var(--wb-color-light-gray-0);
--wb-light-color-action-secondary-active: var(--wb-color-light-secondary-70);
--wb-light-color-action-primary-active: var(--wb-color-light-primary-50);
--wb-light-color-action-disabled: var(--wb-color-light-gray-20);
--wb-light-color-action-primary-selected: var(--wb-color-light-primary-5);
--wb-light-color-input-border: var(--wb-color-light-gray-60);
--wb-light-color-input-border-disabled: var(--wb-color-light-gray-30);
--wb-light-color-input-border-active: var(--wb-color-light-primary-50);
--wb-light-color-input-border-error: var(--wb-color-light-danger-50);
--wb-light-color-input-surface: var(--wb-color-light-gray-0);
--wb-light-color-input-surface-disabled: var(--wb-color-light-gray-20);
--wb-light-color-graphic-blue-subtler: var(--wb-color-light-graphic-10);
--wb-light-color-graphic-blue-subtle: var(--wb-color-light-graphic-30);
--wb-light-color-graphic-blue: var(--wb-color-light-graphic-50);
--wb-light-color-graphic-blue-dark: var(--wb-color-light-graphic-70);
--wb-light-color-graphic-blue-darker: var(--wb-color-light-graphic-90);
--wb-light-color-graphic-red-subtler: var(--wb-color-light-point-5);
--wb-light-color-graphic-red-subtle: var(--wb-color-light-point-10);
--wb-light-color-graphic-red: var(--wb-color-high-contrast-point-20);
--wb-light-color-graphic-red-dark: var(--wb-color-high-contrast-point-40);
--wb-light-color-graphic-red-darker: var(--wb-color-high-contrast-point-70);
--wb-light-color-graphic-brand: var(--wb-color-light-primary-50);
--wb-light-color-alpha-base100: var(--wb-color-light-alpha-white100);
--wb-light-color-alpha-base50: var(--wb-color-light-alpha-white50);
--wb-light-color-alpha-base25: var(--wb-color-high-contrast-alpha-white25);
--wb-light-color-alpha-base0: var(--wb-color-light-alpha-white0);
--wb-light-color-alpha-inverse100: var(--wb-color-light-alpha-black100);
--wb-light-color-alpha-inverse50: var(--wb-color-light-alpha-black50);
--wb-light-color-alpha-inverse25: var(--wb-color-light-alpha-black25);
--wb-light-color-alpha-inverse0: var(--wb-color-light-alpha-black0);
--wb-light-color-alpha-base75: var(--wb-color-light-alpha-white75);
--wb-light-color-alpha-inverse75: var(--wb-color-light-alpha-black75);
--wb-light-color-alpha-inverse10: var(--wb-color-light-alpha-black10);
--wb-light-color-alpha-base10: var(--wb-color-high-contrast-alpha-white10);
--wb-light-color-alpha-shadow1: #0000000d;
--wb-light-color-alpha-shadow2: #00000014;
--wb-light-color-alpha-shadow3: #0000001f;
--wb-light-border-width-variable-regular: 0.1rem;
--wb-light-border-width-variable-medium: 0.2rem;
--wb-light-border-width-static-regular: 0.1rem;
--wb-light-border-width-static-medium: 0.2rem;
/* MODE-HIGH-CONTRAST */
--wb-high-contrast-color-surface-gray-subtler: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-surface-gray-subtle: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-surface-disabled: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-surface-primary-subtler: var(--wb-color-high-contrast-primary-95);
--wb-high-contrast-color-surface-secondary-subtler: var(--wb-color-high-contrast-secondary-95);
--wb-high-contrast-color-surface-danger-subtler: var(--wb-color-high-contrast-danger-95);
--wb-high-contrast-color-surface-warning-subtler: var(--wb-color-high-contrast-warning-95);
--wb-high-contrast-color-surface-success-subtler: var(--wb-color-high-contrast-success-95);
--wb-high-contrast-color-surface-information-subtler: var(--wb-color-high-contrast-information-95);
--wb-high-contrast-color-surface-point-subtler: var(--wb-color-high-contrast-point-95);
--wb-high-contrast-color-surface-white: var(--wb-color-high-contrast-gray-100);
--wb-high-contrast-color-surface-inverse: var(--wb-color-high-contrast-gray-10);
--wb-high-contrast-color-surface-white-static: var(--wb-color-high-contrast-gray-0);
--wb-high-contrast-color-surface-inverse-static: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-surface-white-subtle: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-surface-white-subtler: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-border-gray-light: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-border-gray: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-border-secondary-light: var(--wb-color-high-contrast-secondary-90);
--wb-high-contrast-color-border-danger-light: var(--wb-color-high-contrast-danger-90);
--wb-high-contrast-color-border-danger: var(--wb-color-high-contrast-danger-50);
--wb-high-contrast-color-border-warning-light: var(--wb-color-high-contrast-warning-90);
--wb-high-contrast-color-border-warning: var(--wb-color-high-contrast-warning-50);
--wb-high-contrast-color-border-success-light: var(--wb-color-high-contrast-success-90);
--wb-high-contrast-color-border-success: var(--wb-color-high-contrast-success-50);
--wb-high-contrast-color-border-information-light: var(--wb-color-high-contrast-information-90);
--wb-high-contrast-color-border-information: var(--wb-color-high-contrast-information-50);
--wb-high-contrast-color-border-gray-dark: var(--wb-color-high-contrast-gray-40);
--wb-high-contrast-color-border-primary: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-border-disabled: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-border-gray-darker: var(--wb-color-high-contrast-gray-10);
--wb-high-contrast-color-border-secondary: var(--wb-color-high-contrast-secondary-60);
--wb-high-contrast-color-border-inverse: var(--wb-color-high-contrast-gray-100);
--wb-high-contrast-color-border-transparency: var(--wb-color-high-contrast-alpha-white25);
--wb-high-contrast-color-border-primary-light: var(--wb-color-high-contrast-primary-90);
--wb-high-contrast-color-border-point: var(--wb-color-high-contrast-point-50);
--wb-high-contrast-color-border-point-light: var(--wb-color-high-contrast-point-90);
--wb-high-contrast-color-divider-gray-light: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-divider-gray: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-divider-gray-dark: var(--wb-color-high-contrast-gray-50);
--wb-high-contrast-color-divider-primary: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-divider-secondary-light: var(--wb-color-high-contrast-secondary-90);
--wb-high-contrast-color-divider-secondary: var(--wb-color-high-contrast-secondary-60);
--wb-high-contrast-color-divider-error: var(--wb-color-high-contrast-danger-50);
--wb-high-contrast-color-divider-primary-light: var(--wb-color-high-contrast-primary-90);
--wb-high-contrast-color-divider-inverse: var(--wb-color-high-contrast-gray-100);
--wb-high-contrast-color-divider-gray-darker: var(--wb-color-high-contrast-gray-10);
--wb-high-contrast-color-divider-point: var(--wb-color-high-contrast-point-50);
--wb-high-contrast-color-text-bolder: var(--wb-color-high-contrast-gray-10);
--wb-high-contrast-color-text-subtle: var(--wb-color-high-contrast-gray-20);
--wb-high-contrast-color-text-disabled: var(--wb-color-high-contrast-gray-60);
--wb-high-contrast-color-text-disabled-on: var(--wb-color-high-contrast-gray-50);
--wb-high-contrast-color-text-primary: var(--wb-color-high-contrast-primary-20);
--wb-high-contrast-color-text-secondary: var(--wb-color-high-contrast-secondary-20);
--wb-high-contrast-color-text-danger: var(--wb-color-high-contrast-danger-20);
--wb-high-contrast-color-text-warning: var(--wb-color-high-contrast-warning-20);
--wb-high-contrast-color-text-success: var(--wb-color-high-contrast-success-20);
--wb-high-contrast-color-text-information: var(--wb-color-high-contrast-information-20);
--wb-high-contrast-color-text-basic: var(--wb-color-high-contrast-gray-5);
--wb-high-contrast-color-text-point: var(--wb-color-high-contrast-point-20);
--wb-high-contrast-color-text-bolder-inverse: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-text-basic-inverse: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-text-subtle-inverse: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-text-inverse-static: var(--wb-color-high-contrast-gray-0);
--wb-high-contrast-color-text-static: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-icon-gray: var(--wb-color-high-contrast-gray-5);
--wb-high-contrast-color-icon-gray-fill: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-icon-inverse: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-icon-primary: var(--wb-color-high-contrast-primary-20);
--wb-high-contrast-color-icon-secondary: var(--wb-color-high-contrast-secondary-20);
--wb-high-contrast-color-icon-point: var(--wb-color-high-contrast-point-20);
--wb-high-contrast-color-icon-danger: var(--wb-color-high-contrast-danger-20);
--wb-high-contrast-color-icon-warning: var(--wb-color-high-contrast-warning-20);
--wb-high-contrast-color-icon-success: var(--wb-color-high-contrast-success-20);
--wb-high-contrast-color-icon-information: var(--wb-color-high-contrast-information-20);
--wb-high-contrast-color-icon-gray-light: var(--wb-color-high-contrast-gray-20);
--wb-high-contrast-color-icon-disabled: var(--wb-color-high-contrast-gray-60);
--wb-high-contrast-color-icon-disabled-on: var(--wb-color-high-contrast-gray-50);
--wb-high-contrast-color-icon-inverse-static: var(--wb-color-high-contrast-gray-0);
--wb-high-contrast-color-icon-primary-static: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-icon-secondary-static: var(--wb-color-high-contrast-secondary-80);
--wb-high-contrast-color-icon-point-static: var(--wb-color-high-contrast-point-50);
--wb-high-contrast-color-icon-danger-static: var(--wb-color-high-contrast-danger-50);
--wb-high-contrast-color-icon-warning-static: var(--wb-color-high-contrast-warning-50);
--wb-high-contrast-color-icon-success-static: var(--wb-color-high-contrast-success-50);
--wb-high-contrast-color-icon-information-static: var(--wb-color-high-contrast-information-50);
--wb-high-contrast-color-icon-gray-static: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-link-default: var(--wb-color-high-contrast-primary-30);
--wb-high-contrast-color-link-hover: var(--wb-color-high-contrast-primary-20);
--wb-high-contrast-color-link-pressed: var(--wb-color-high-contrast-primary-10);
--wb-high-contrast-color-link-visited: #c49ff9;
--wb-high-contrast-color-button-primary-fill: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-button-primary-fill-hover: var(--wb-color-high-contrast-primary-60);
--wb-high-contrast-color-button-primary-fill-pressed: var(--wb-color-high-contrast-primary-70);
--wb-high-contrast-color-button-secondary-fill: var(--wb-color-high-contrast-primary-95);
--wb-high-contrast-color-button-secondary-fill-hover: var(--wb-color-high-contrast-primary-90);
--wb-high-contrast-color-button-secondary-fill-pressed: var(--wb-color-high-contrast-primary-80);
--wb-high-contrast-color-button-secondary-border: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-button-tertiary-fill: var(--wb-color-high-contrast-alpha-black0);
--wb-high-contrast-color-button-tertiary-fill-hover: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-button-tertiary-fill-pressed: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-button-tertiary-border: var(--wb-color-high-contrast-gray-40);
--wb-high-contrast-color-button-disabled-fill: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-button-text-fill-hover: var(--wb-color-high-contrast-secondary-95);
--wb-high-contrast-color-button-text-fill-pressed: var(--wb-color-high-contrast-secondary-90);
--wb-high-contrast-color-button-text-fill: var(--wb-color-high-contrast-alpha-black0);
--wb-high-contrast-color-button-text-border: var(--wb-color-high-contrast-alpha-white50);
--wb-high-contrast-color-button-disabled-border: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-background-white: var(--wb-color-high-contrast-gray-100);
--wb-high-contrast-color-background-inverse: var(--wb-color-high-contrast-gray-10);
--wb-high-contrast-color-background-gray-subtler: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-background-gray-subtle: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-background-dim: var(--wb-color-high-contrast-alpha-black75);
--wb-high-contrast-color-element-disabled-light: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-element-disabled-dark: var(--wb-color-high-contrast-gray-60);
--wb-high-contrast-color-element-gray-lighter: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-element-gray-light: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-element-gray: var(--wb-color-high-contrast-gray-50);
--wb-high-contrast-color-element-primary-lighter: var(--wb-color-high-contrast-primary-95);
--wb-high-contrast-color-element-primary-light: var(--wb-color-high-contrast-primary-90);
--wb-high-contrast-color-element-primary: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-element-secondary-lighter: var(--wb-color-high-contrast-secondary-95);
--wb-high-contrast-color-element-secondary-light: var(--wb-color-high-contrast-secondary-90);
--wb-high-contrast-color-element-secondary: var(--wb-color-high-contrast-secondary-60);
--wb-high-contrast-color-element-point-lighter: var(--wb-color-high-contrast-point-95);
--wb-high-contrast-color-element-point-light: var(--wb-color-high-contrast-point-90);
--wb-high-contrast-color-element-point: var(--wb-color-high-contrast-point-50);
--wb-high-contrast-color-element-danger-lighter: var(--wb-color-high-contrast-danger-95);
--wb-high-contrast-color-element-danger: var(--wb-color-high-contrast-danger-50);
--wb-high-contrast-color-element-warning-lighter: var(--wb-color-high-contrast-warning-95);
--wb-high-contrast-color-element-warning: var(--wb-color-high-contrast-warning-30);
--wb-high-contrast-color-element-success-lighter: var(--wb-color-high-contrast-success-95);
--wb-high-contrast-color-element-success: var(--wb-color-high-contrast-success-50);
--wb-high-contrast-color-element-information-lighter: var(--wb-color-high-contrast-information-95);
--wb-high-contrast-color-element-information: var(--wb-color-high-contrast-information-50);
--wb-high-contrast-color-element-inverse: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-element-gray-dark: var(--wb-color-high-contrast-gray-40);
--wb-high-contrast-color-element-inverse-static: var(--wb-color-high-contrast-gray-0);
--wb-high-contrast-color-action-white: var(--wb-color-light-gray-100);
--wb-high-contrast-color-action-primary: var(--wb-color-high-contrast-alpha-black0);
--wb-high-contrast-color-action-primary-hover: var(--wb-color-high-contrast-primary-95);
--wb-high-contrast-color-action-primary-pressed: var(--wb-color-high-contrast-primary-90);
--wb-high-contrast-color-action-secondary: var(--wb-color-light-alpha-black0);
--wb-high-contrast-color-action-secondary-hover: var(--wb-color-high-contrast-secondary-95);
--wb-high-contrast-color-action-secondary-pressed: var(--wb-color-high-contrast-secondary-90);
--wb-high-contrast-color-action-secondary-selected: var(--wb-color-high-contrast-secondary-95);
--wb-high-contrast-color-action-secondary-on: var(--wb-color-high-contrast-alpha-black0);
--wb-high-contrast-color-action-secondary-on-hover: var(--wb-color-high-contrast-gray-100);
--wb-high-contrast-color-action-secondary-on-pressed: var(--wb-color-high-contrast-secondary-90);
--wb-high-contrast-color-action-secondary-on-selected: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-action-secondary-active: var(--wb-color-high-contrast-secondary-60);
--wb-high-contrast-color-action-primary-active: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-action-disabled: var(--wb-color-high-contrast-gray-80);
--wb-high-contrast-color-action-primary-selected: var(--wb-color-high-contrast-primary-95);
--wb-high-contrast-color-input-border: var(--wb-color-high-contrast-gray-40);
--wb-high-contrast-color-input-border-disabled: var(--wb-color-high-contrast-gray-70);
--wb-high-contrast-color-input-border-active: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-input-border-error: var(--wb-color-high-contrast-danger-50);
--wb-high-contrast-color-input-surface: var(--wb-color-high-contrast-gray-90);
--wb-high-contrast-color-input-surface-disabled: var(--wb-color-high-contrast-gray-95);
--wb-high-contrast-color-graphic-blue-subtler: var(--wb-color-high-contrast-graphic-10);
--wb-high-contrast-color-graphic-blue-subtle: var(--wb-color-high-contrast-graphic-30);
--wb-high-contrast-color-graphic-blue: var(--wb-color-high-contrast-graphic-50);
--wb-high-contrast-color-graphic-blue-dark: var(--wb-color-high-contrast-graphic-70);
--wb-high-contrast-color-graphic-blue-darker: var(--wb-color-high-contrast-graphic-90);
--wb-high-contrast-color-graphic-red-subtler: var(--wb-color-high-contrast-point-5);
--wb-high-contrast-color-graphic-red-subtle: var(--wb-color-high-contrast-point-10);
--wb-high-contrast-color-graphic-red: var(--wb-color-high-contrast-point-20);
--wb-high-contrast-color-graphic-red-dark: var(--wb-color-high-contrast-point-40);
--wb-high-contrast-color-graphic-red-darker: var(--wb-color-high-contrast-point-70);
--wb-high-contrast-color-graphic-brand: var(--wb-color-high-contrast-primary-50);
--wb-high-contrast-color-alpha-base100: var(--wb-color-high-contrast-alpha-black100);
--wb-high-contrast-color-alpha-base50: var(--wb-color-high-contrast-alpha-black50);
--wb-high-contrast-color-alpha-base25: var(--wb-color-high-contrast-alpha-black25);
--wb-high-contrast-color-alpha-base0: var(--wb-color-light-alpha-black0);
--wb-high-contrast-color-alpha-inverse100: var(--wb-color-high-contrast-alpha-white100);
--wb-high-contrast-color-alpha-inverse50: var(--wb-color-high-contrast-alpha-white50);
--wb-high-contrast-color-alpha-inverse25: var(--wb-color-high-contrast-alpha-white25);
--wb-high-contrast-color-alpha-inverse0: var(--wb-color-high-contrast-alpha-white0);
--wb-high-contrast-color-alpha-base75: var(--wb-color-high-contrast-alpha-black75);
--wb-high-contrast-color-alpha-inverse75: var(--wb-color-high-contrast-alpha-white75);
--wb-high-contrast-color-alpha-inverse10: var(--wb-color-high-contrast-alpha-black25);
--wb-high-contrast-color-alpha-base10: var(--wb-color-high-contrast-alpha-black10);
--wb-high-contrast-color-alpha-shadow1: #0000001f;
--wb-high-contrast-color-alpha-shadow2: #00000033;
--wb-high-contrast-color-alpha-shadow3: #00000066;
--wb-high-contrast-border-width-variable-regular: 0.2rem;
--wb-high-contrast-border-width-variable-medium: 0.3rem;
--wb-high-contrast-border-width-static-regular: 0.1rem;
--wb-high-contrast-border-width-static-medium: 0.2rem;
/* RESPONSIVE-PC */
--wb-pc-font-size-display-large: 6rem;
--wb-pc-font-size-display-medium: 4.4rem;
--wb-pc-font-size-display-small: 3.6rem;
--wb-pc-font-size-body-large: 1.9rem;
--wb-pc-font-size-body-medium: 1.7rem;
--wb-pc-font-size-body-small: 1.5rem;
--wb-pc-font-size-body-xsmall: 1.3rem;
--wb-pc-font-size-label-large: 1.9rem;
--wb-pc-font-size-label-medium: 1.7rem;
--wb-pc-font-size-label-small: 1.5rem;
--wb-pc-font-size-label-xsmall: 1.3rem;
--wb-pc-font-size-heading-large: 3.2rem;
--wb-pc-font-size-heading-medium: 2.4rem;
--wb-pc-font-size-heading-small: 1.9rem;
--wb-pc-font-size-heading-xsmall: 1.7rem;
--wb-pc-font-size-heading-xxsmall: 1.5rem;
--wb-pc-font-size-heading-xlarge: 4rem;
--wb-pc-font-size-navigation-title-medium: 2.4rem;
--wb-pc-font-size-navigation-title-small: 1.9rem;
--wb-pc-font-size-navigation-depth-medium-bold: 1.7rem;
--wb-pc-font-size-navigation-depth-medium: 1.7rem;
--wb-pc-font-size-navigation-depth-small-bold: 1.5rem;
--wb-pc-font-size-navigation-depth-small: 1.5rem;
--wb-pc-gap-layout-header-breadcrumb: var(--wb-number-10);
--wb-pc-gap-layout-left-contents: var(--wb-number-18);
--wb-pc-gap-layout-contents-right: var(--wb-number-14);
--wb-pc-gap-layout-h1-h2: var(--wb-number-16);
--wb-pc-gap-layout-h2-h2: var(--wb-number-20);
--wb-pc-gap-layout-h2-h3: var(--wb-number-14);
--wb-pc-gap-layout-h3-h3: var(--wb-number-18);
--wb-pc-gap-layout-h3-h4: var(--wb-number-10);
--wb-pc-gap-layout-h4-h4: var(--wb-number-14);
--wb-pc-gap-layout-h4-h5: var(--wb-number-8);
--wb-pc-gap-layout-h5-h5: var(--wb-number-12);
--wb-pc-gap-layout-title-body-small: var(--wb-number-8);
--wb-pc-gap-layout-title-body-medium: var(--wb-number-9);
--wb-pc-gap-layout-title-body-large: var(--wb-number-10);
--wb-pc-gap-layout-breadcrumb-h1: var(--wb-number-14);
--wb-pc-gap-layout-contents-footer: var(--wb-number-18);
--wb-pc-gap-layout-text-text-large: var(--wb-number-9);
--wb-pc-gap-layout-text-text-medium: var(--wb-number-8);
--wb-pc-gap-layout-text-text-small: var(--wb-number-7);
--wb-pc-gap-layout-image-text-small: var(--wb-number-9);
--wb-pc-gap-layout-image-text-medium: var(--wb-number-10);
--wb-pc-gap-layout-image-text-large: var(--wb-number-12);
--wb-pc-padding-card-large: var(--wb-number-14);
--wb-pc-padding-card-medium: var(--wb-number-12);
--wb-pc-padding-card-small: var(--wb-number-10);
--wb-pc-padding-card-xsmall: var(--wb-number-8);
/* RESPONSIVE-MOBILE */
--wb-mobile-font-size-display-large: 4.4rem;
--wb-mobile-font-size-display-medium: 3.2rem;
--wb-mobile-font-size-display-small: 2.8rem;
--wb-mobile-font-size-body-large: 1.9rem;
--wb-mobile-font-size-body-medium: 1.7rem;
--wb-mobile-font-size-body-small: 1.5rem;
--wb-mobile-font-size-body-xsmall: 1.3rem;
--wb-mobile-font-size-label-large: 1.9rem;
--wb-mobile-font-size-label-medium: 1.7rem;
--wb-mobile-font-size-label-small: 1.5rem;
--wb-mobile-font-size-label-xsmall: 1.3rem;
--wb-mobile-font-size-heading-large: 2.4rem;
--wb-mobile-font-size-heading-medium: 2.2rem;
--wb-mobile-font-size-heading-small: 1.9rem;
--wb-mobile-font-size-heading-xsmall: 1.7rem;
--wb-mobile-font-size-heading-xxsmall: 1.5rem;
--wb-mobile-font-size-heading-xlarge: 2.8rem;
--wb-mobile-font-size-navigation-title-medium: 2.2rem;
--wb-mobile-font-size-navigation-title-small: 1.9rem;
--wb-mobile-font-size-navigation-depth-medium-bold: 1.7rem;
--wb-mobile-font-size-navigation-depth-medium: 1.7rem;
--wb-mobile-font-size-navigation-depth-small-bold: 1.5rem;
--wb-mobile-font-size-navigation-depth-small: 1.5rem;
--wb-mobile-gap-layout-header-breadcrumb: var(--wb-number-8);
--wb-mobile-gap-layout-left-contents: 0rem;
--wb-mobile-gap-layout-contents-right: 0rem;
--wb-mobile-gap-layout-h1-h2: var(--wb-number-12);
--wb-mobile-gap-layout-h2-h2: var(--wb-number-14);
--wb-mobile-gap-layout-h2-h3: var(--wb-number-10);
--wb-mobile-gap-layout-h3-h3: var(--wb-number-12);
--wb-mobile-gap-layout-h3-h4: var(--wb-number-8);
--wb-mobile-gap-layout-h4-h4: var(--wb-number-10);
--wb-mobile-gap-layout-h4-h5: var(--wb-number-7);
--wb-mobile-gap-layout-h5-h5: var(--wb-number-8);
--wb-mobile-gap-layout-title-body-small: var(--wb-number-5);
--wb-mobile-gap-layout-title-body-medium: var(--wb-number-7);
--wb-mobile-gap-layout-title-body-large: var(--wb-number-9);
--wb-mobile-gap-layout-breadcrumb-h1: var(--wb-number-12);
--wb-mobile-gap-layout-contents-footer: var(--wb-number-14);
--wb-mobile-gap-layout-text-text-large: var(--wb-number-8);
--wb-mobile-gap-layout-text-text-medium: var(--wb-number-7);
--wb-mobile-gap-layout-text-text-small: var(--wb-number-6);
--wb-mobile-gap-layout-image-text-small: var(--wb-number-8);
--wb-mobile-gap-layout-image-text-medium: var(--wb-number-9);
--wb-mobile-gap-layout-image-text-large: var(--wb-number-10);
--wb-mobile-padding-card-large: var(--wb-number-10);
--wb-mobile-padding-card-medium: var(--wb-number-10);
--wb-mobile-padding-card-small: var(--wb-number-9);
--wb-mobile-padding-card-xsmall: var(--wb-number-7);
/* SEMANTIC */
--wb-gap-1: var(--wb-number-2);
--wb-gap-2: var(--wb-number-3);
--wb-gap-3: var(--wb-number-5);
--wb-gap-4: var(--wb-number-7);
--wb-gap-5: var(--wb-number-8);
--wb-gap-6: var(--wb-number-9);
--wb-gap-7: var(--wb-number-10);
--wb-gap-8: var(--wb-number-12);
--wb-gap-9: var(--wb-number-14);
--wb-gap-10: var(--wb-number-16);
--wb-gap-11: var(--wb-number-18);
--wb-gap-12: var(--wb-number-20);
--wb-padding-1: var(--wb-number-2);
--wb-padding-2: var(--wb-number-3);
--wb-padding-3: var(--wb-number-5);
--wb-padding-4: var(--wb-number-6);
--wb-padding-5: var(--wb-number-7);
--wb-padding-6: var(--wb-number-8);
--wb-padding-7: var(--wb-number-9);
--wb-padding-8: var(--wb-number-10);
--wb-padding-9: var(--wb-number-12);
--wb-padding-10: var(--wb-number-14);
--wb-size-height-1: var(--wb-number-5);
--wb-size-height-2: var(--wb-number-8);
--wb-size-height-3: var(--wb-number-9);
--wb-size-height-4: var(--wb-number-10);
--wb-size-height-5: var(--wb-number-12);
--wb-size-height-6: var(--wb-number-14);
--wb-size-height-7: var(--wb-number-16);
--wb-size-height-8: var(--wb-number-17);
--wb-size-height-9: var(--wb-number-18);
--wb-size-height-10: var(--wb-number-19);
--wb-size-height-11: var(--wb-number-20);
--wb-radius-xsmall1: var(--wb-number-2);
--wb-radius-xsmall2: var(--wb-number-2);
--wb-radius-xsmall3: var(--wb-number-2);
--wb-radius-small1: var(--wb-number-3);
--wb-radius-small2: var(--wb-number-3);
--wb-radius-small3: var(--wb-number-3);
--wb-radius-medium1: var(--wb-number-4);
--wb-radius-medium2: var(--wb-number-4);
--wb-radius-medium3: var(--wb-number-5);
--wb-radius-medium4: var(--wb-number-5);
--wb-radius-large1: var(--wb-number-6);
--wb-radius-large2: var(--wb-number-6);
--wb-radius-xlarge1: var(--wb-number-7);
--wb-radius-xlarge2: var(--wb-number-7);
--wb-radius-max: var(--wb-number-max);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+13
View File
@@ -0,0 +1,13 @@
//공통
@import "path";
@import "wb_tokens";
@import "include";
@import "root";
@import "icon";
@import "dropdown";
@import "menu";
@import "reset";
@@ -0,0 +1,45 @@
@import "../group_variables";
@mixin size-medium { // 767까지
@media (max-width: ($breakpoint-medium - 1px)) {
@content;
}
}
@mixin size-medium-more { // 768이상
@media (min-width: calc($breakpoint-medium)) {
@content;
}
}
@mixin size-medium-to-large { // 768 ~ 1023
@media (min-width: calc($breakpoint-medium)) and (max-width: ($breakpoint-large - 1px)) {
@content
}
}
//tablet size 이하
@mixin size-large-less { // 1023까지
@media (max-width: ($breakpoint-large - 1px)) {
@content
}
}
//tablet size 이상
@mixin size-large-more { // 1024이상
@media (min-width: calc($breakpoint-large)) {
@content;
}
}
//소형 데스크톱
@mixin size-large-to-xlarge { // 1024 ~ 1279
@media (min-width: calc($breakpoint-large)) and (max-width: calc($breakpoint-xlarge - 1px)) {
@content;
}
}
@mixin size-xlarge { // 1280 이상
@media (min-width: $breakpoint-xlarge) {
@content;
}
}
@@ -0,0 +1,197 @@
@import 'mixin';
// Grid 설정 변수
$prefix: "grid"; // 변수 프리픽스
$grid-columns: 12; // 기본 컬럼
$grid-gutter-width: 1rem; // 기본 컬럼 간격
$grid-breakpoints: ( // 반응형 브레이크포인트
xs: 1200px,
);
$gutters: (sm: 0.5rem, md: 1rem, lg: 2rem); // Gutter 유틸리티
// Grid 클래스 활성화 여부
$enable-grid-classes: true !default; // Grid 클래스를 생성할지 여부
$enable-cssgrid: true !default; // CSS Grid 지원 활성화 여부
// Breakpoint Helper Mixin
@mixin media-breakpoint-up($breakpoint, $breakpoints) {
$value: map-get($breakpoints, $breakpoint);
@if $value != null {
@media (min-width: $value) {
@content;
}
} @else {
@error "Error: Breakpoint '#{$breakpoint}' not found in map.";
}
}
// Row Mixin
@mixin make-row($gutter: $grid-gutter-width) {
--#{$prefix}-gutter-x: #{$gutter};
--#{$prefix}-gutter-y: 0;
display: flex;
flex-wrap: wrap;
margin-left: calc(-0.5 * var(--#{$prefix}-gutter-x));
margin-right: calc(-0.5 * var(--#{$prefix}-gutter-x));
margin-top: calc(-1 * var(--#{$prefix}-gutter-y));
}
// Column Ready Mixin
@mixin make-col-ready() {
box-sizing: border-box;
flex-shrink: 0;
width: 100%;
max-width: 100%;
padding-left: calc(var(--#{$prefix}-gutter-x) / 2);
padding-right: calc(var(--#{$prefix}-gutter-x) / 2);
margin-top: var(--#{$prefix}-gutter-y);
}
// Flexbox Column Mixin
@mixin make-col($size: null, $columns: $grid-columns) {
@if $size == null {
flex: 1 1 0;
max-width: 100%;
} @else if type-of($size) == 'number' and type-of($columns) == 'number' and $columns > 0 {
flex: 0 0 percentage($size / $columns);
max-width: percentage($size / $columns);
} @else {
@error "Error: Invalid $size or $columns value. Received: Size=#{$size}, Columns=#{$columns}";
}
}
// CSS Grid Mixin
@mixin make-cssgrid($columns: $grid-columns) {
display: grid;
grid-template-columns: repeat($columns, 1fr);
gap: var(--#{$prefix}-gutter-x) var(--#{$prefix}-gutter-y);
}
// Generate Columns for Flexbox and Grid
@mixin make-grid-columns($columns: $grid-columns, $breakpoints: $grid-breakpoints) {
@each $breakpoint, $value in $breakpoints {
$infix: if($breakpoint == "xs", "", "-#{$breakpoint}");
@include media-breakpoint-up($breakpoint, $breakpoints) {
// Flexbox Columns
@for $i from 1 through $columns {
.col#{$infix}-#{$i} {
@include make-col($i, $columns);
}
}
// CSS Grid Columns
@for $i from 1 through $columns {
.g-col#{$infix}-#{$i} {
grid-column: span $i;
}
}
// Gutter Utilities
@each $key, $gutter in $gutters {
.g#{$infix}-#{$key} {
--#{$prefix}-gutter-x: #{$gutter};
--#{$prefix}-gutter-y: #{$gutter};
}
}
}
}
}
// Row Styles
.row {
@include make-row();
> * {
@include make-col-ready();
}
}
// Generate All Grid Classes
@if $enable-grid-classes {
@include make-grid-columns();
}
// CSS Grid Container
@if $enable-cssgrid {
.grid {
@include make-cssgrid($grid-columns);
}
}
// Base Styles
.filter {
display: flex;
flex-direction: column;
gap: 2rem; // row 간의 간격 설정
width: 100%;
// Common Input Styles
.sec-input {
@include flex(row, center, start, center);
gap: 1.25rem;
.input-label{
@include flex(row, center, start, center);
font-size: var(--wb-pc-font-size-body-xsmall);
color: var(--wb-color-light-gray-70);
font-weight: var(--wb-typo-font-weight-bold);
text-align: left;
&.w-lg{
flex: 100px 0 0;
}
&.w-m{
flex: 70px 0 0;
}
&.w-auto{
flex: 0;
}
}
.input-group {
display: flex;
align-items: center;
gap: .75rem;
height:100%;
flex: 1;
.input{
width:100%;
height:100%;
input{
font-size: var(--wb-pc-font-size-body-small);
height:100%;
}
span{
@include flex(row, center, start, center);
height:100%;
font-size: var(--wb-pc-font-size-body-small);
color: var(--wb-color-light-gray-70);
border-right: none;
border-left: none;
}
}
}
}
// Button Group Styles
.btn-wrap {
display: flex;
justify-content: flex-end;
gap: 0.5rem;
height:100%;
button {
flex-shrink: 0; // 버튼 크기 고정
flex:1;
}
}
}
.k-list-md .k-list-item, .k-list-md .k-list-optionlabel{
font-size: var(--wb-pc-font-size-body-small);
}
table{
th,td{
font-size: 1.25rem !important
}
}
@@ -0,0 +1,35 @@
//svg img
@mixin svg-icon($size: var(--wb-icon--size-large), $mode: light, $effect: null) {
display: inline-flex;
@include square($size);
background-color: var(--wb-#{$mode}-color-text-basic);
@if ($effect == 'pure') { //mask 효과 없이 디자인된 svg 그대로 사용
background-color: transparent !important;
}
forced-color-adjust: none;
// @media (forced-colors: active) {
// }
}
//svg icon setting
@mixin icon-set ($name, $effect: null) {
-webkit-mask-repeat: no-repeat;
-webkit-mask-position: center center;
-webkit-mask-size: contain;
mask-repeat: no-repeat;
mask-position: center center;
mask-size: contain;
-webkit-mask-image: url(#{$url}/dist/images/#{$name}.svg);
mask-image: url(#{$url}/dist/images/#{$name}.svg);
@if ($effect == 'pure') { //mask 효과 없이 디자인된 svg 그대로 사용
-webkit-mask-image: none;
mask-image: none;
background-image: url(#{$url}/dist/images/#{$name}.svg);
background-color: transparent !important;
background-size: contain;
background-position: center;
background-repeat: no-repeat;
-webkit-mask: none;
mask: none;
}
}
@@ -0,0 +1,150 @@
@mixin resetLayout {
width: 100%;
margin: 0 auto;
box-sizing: border-box;
@content;
}
@mixin flex($direction, $wrap: nowrap, $justify: flex-start, $align: stretch) {
display: flex;
flex-direction: $direction;
flex-wrap: $wrap;
justify-content: $justify;
align-items: $align;
}
@mixin grid($columns, $rows: auto, $flow: row) {
display: grid;
grid-template-columns: $columns;
grid-template-rows: $rows;
grid-auto-flow: $flow;
}
@mixin transition {
transition: all ease 0.3s;
}
@mixin border-radius($radius: 0.75rem) {
border-radius: $radius;
}
@mixin transform($trans, $num) {
transform: #{$trans}(#{$num});
}
// Spacing Utilities
@mixin spacing-utilities {
@each $direction in (t, r, b, l) {
$i: 2; // 초기
@while $i <= 100 {
.m#{$direction}-#{$i} {
margin-#{$direction}: #{$i / 16}rem;
}
.p#{$direction}-#{$i} {
padding-#{$direction}: #{$i / 16}rem;
}
$i: $i + 2; // 루프 증가
}
}
}
@mixin flex-utilities {
.flex {
display: flex;
&-row {
flex-direction: row;
}
&-col {
flex-direction: column;
}
&-wrap {
flex-wrap: wrap;
}
&-nowrap {
flex-wrap: nowrap;
}
&-1 {
flex: 1;
}
&-auto {
flex: auto;
}
&-initial {
flex: initial;
}
&-none {
flex: none;
}
}
// Justify Content Utilities
@each $value, $cssValue in (start: flex-start, end: flex-end, center: center, between: space-between, around: space-around, evenly: space-evenly) {
.justify-#{$value} {
justify-content: #{$cssValue};
}
}
// Align Items Utilities
@each $value in (start, end, center, baseline, stretch) {
.items-#{$value} {
align-items: #{$value};
}
}
// Align Self Utilities
@each $value in (auto, start, end, center, stretch) {
.self-#{$value} {
align-self: #{$value};
}
}
}
// Grid Utilities
@mixin grid-utilities {
.grid {
display: grid;
}
// Grid Columns
@for $i from 1 through 12 {
.grid-cols-#{$i} {
grid-template-columns: repeat(#{$i}, minmax(0, 1fr));
}
}
// Grid Rows
@for $i from 1 through 6 {
.grid-rows-#{$i} {
grid-template-rows: repeat(#{$i}, minmax(0, 1fr));
}
}
.grid-flow-row {
grid-auto-flow: row;
}
.grid-flow-col {
grid-auto-flow: column;
}
.grid-flow-row-dense {
grid-auto-flow: row dense;
}
.grid-flow-col-dense {
grid-auto-flow: column dense;
}
}
@@ -0,0 +1,197 @@
//focus color
//추후삭제
@mixin focus($offset: -.4rem, $color: var(--wb-light-color-border-primary), $alpha: .8) {
box-shadow: var(--wb-box-shadow-outline-inset);
outline-offset: $offset;
}
//flex 확대 축소
@mixin flex-size($shrink, $grow) {
flex-shrink: $shrink;
flex-grow: $grow;
}
//position
@mixin position($p: absolute, $t: null, $b: null, $l: null, $r: null) {
position: $p;
top: $t;
bottom: $b;
left: $l;
right: $r;
}
//square rectangle
@mixin square($w, $h: $w) {
width: $w;
height: $h;
}
//pseudo element wb
@mixin pseudo($c: null) {
@if $c != null {
content: "" + $c + "";
} @else {
content: "";
}
};
// //flex layout
// @mixin flex-layout($d: flex, $ai: flex-start, $jc: flex-start, $fd: row) {
// display: $d;
// align-items: $ai;
// justify-content: $jc;
// flex-direction: $fd;
// }
//group contents
@mixin group-wrap() {
display: flex;
flex-wrap: wrap;
align-items: stretch;
position: relative;
width: 100%;
}
@mixin group() {
flex: 1 1 auto;
position: relative;
width: 1%;
min-width: 0;
}
//flex item equal width
@mixin equal-width() {
flex: 1 1 0px;
min-width: 0;
}
//position 중앙 정렬
@mixin position-center($type: both) {
//좌우중앙
@if ($type == 'x') {
left: 50%;
transform: translateX(-50%)
}
//상하중앙
@else if ($type == 'y') {
top: 50%;
transform: translateY(-50%);
}
//상하좌우중앙
@else if ($type == 'both') {
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%);
}
}
//transform 기준점 중앙 정렬
@mixin transform-origin($x: 50%, $y: 50%) {
transform-origin: $x $y;
}
// **** text attr **** //
//text ellipsis
@mixin ellipsis($line) {
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: $line;
}
//sr-only
@mixin sr-only {
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
}
//reset text : popover/tooltip
@mixin reset-text {
font-size: var(--wb-pc-font-size-body-medium);
font-style: normal;
font-weight: var(--wb-font-weight-regular);
line-height: var(--wb-line-height-base);
text-align: left;
text-decoration: none;
text-shadow: none;
text-transform: none;
letter-spacing: normal;
//word-break: normal;
white-space: normal;
word-spacing: normal;
line-break: auto;
}
//css animation visibility
@mixin visibility($v) {
@if ($v == hidden) {
visibility: hidden;
z-index: -1;
opacity: 0;
}
@else if ($v == visible) {
visibility: visible;
z-index: auto;
opacity: 1;
}
}
// **** scroll **** //
@mixin scrollbar-mode($mode: light) {
&::-webkit-scrollbar-thumb {
background-color: var(--wb-#{$mode}-color-element-secondary-light);
border-radius: .8rem;
}
&::-webkit-scrollbar-track {
background-color: var(--wb-#{$mode}-color-element-secondary-lighter);
}
}
@mixin scrollbar($mode: light) {
$mode-wb: $mode;
&::-webkit-scrollbar {
width: 0.8rem;
}
@include scrollbar-mode(#{$mode-wb});
}
//text underline
@mixin underline($offset: var(--wb-font-underline-offset)) {
text-decoration: underline;
text-underline-offset: $offset;
}
//color mode wb
@mixin color-mode($mode: light) {
[data-wb-mode="#{$mode}"] {
@content;
}
}
//사이즈별 variable
@mixin btn-size($unit) {
//unit value: xsmall small medium larger xlarge
gap: var(--wb-button--gap-#{$unit});
height: var(--wb-button--size-height-#{$unit});
padding: var(--wb-button--padding-y-#{$unit}) var(--wb-button--padding-x-#{$unit});
border-radius: var(--wb-button--radius-#{$unit});
font-size: var(--wb-button--pc-font-size-#{$unit});
font-weight: var(--wb-button--font-weight-#{$unit});
& {
.svg-icon {
@include square(var(--wb-icon--size-#{$unit}));
}
}
}
//고대비모드인경우 border-width가 두꺼워짐
@mixin border-size-mode ($mode: light, $size: regular) {
border-width: var(--wb-#{$mode}-border-width-variable-#{$size});
}
@@ -0,0 +1,586 @@
//사이즈 정의
@mixin button-size-variable() {
//변수 배열 설정
$button-size: (
xsmall: (
size-height: var(--wb-size-height-5),
padding-x: var(--wb-padding-4),
padding-y: 0,
gap: var(--wb-gap-1),
radius: var(--wb-radius-small3),
pc-font-size: var(--wb-pc-font-size-label-small),
mobile-font-size: var(--wb-mobile-font-size-label-small),
font-weight: var(--wb-font-weight-regular),
),
small: (
size-height: var(--wb-size-height-6),
padding-x: var(--wb-padding-5),
padding-y: 0,
gap: var(--wb-gap-1),
radius: var(--wb-radius-medium1),
pc-font-size: var(--wb-pc-font-size-label-small),
mobile-font-size: var(--wb-mobile-font-size-label-small),
font-weight: var(--wb-font-weight-regular),
),
medium: (
size-height: var(--wb-size-height-7),
padding-x: var(--wb-padding-6),
padding-y: 0,
gap: var(--wb-gap-2),
radius: var(--wb-radius-medium2),
pc-font-size: var(--wb-pc-font-size-label-medium),
mobile-font-size: var(--wb-mobile-font-size-label-medium),
font-weight: var(--wb-font-weight-regular),
),
large: (
size-height: var(--wb-size-height-8),
padding-x: var(--wb-padding-7),
padding-y: 0,
gap: var(--wb-gap-2),
radius: var(--wb-radius-medium3),
pc-font-size: var(--wb-pc-font-size-label-large),
mobile-font-size: var(--wb-mobile-font-size-label-large),
font-weight: var(--wb-font-weight-regular),
),
xlarge: (
size-height: var(--wb-size-height-9),
padding-x: var(--wb-padding-8),
padding-y: 0,
gap: var(--wb-gap-2),
radius: var(--wb-radius-medium4),
pc-font-size: var(--wb-pc-font-size-label-large),
mobile-font-size: var(--wb-mobile-font-size-label-large),
font-weight: var(--wb-font-weight-regular),
),
) !default;
//css variable 생성
@each $size, $types in $button-size {
@each $type, $value in $types {
//css variable 생성
--wb-button--#{$type}-#{$size}: #{$value};
}
}
//class 정의
& {
@include btn-size(large);
& {
@each $size, $types in $button-size {
&.#{$size} {
@include btn-size(#{$size});
}
}
}
}
}
//컬러 정의
@mixin button-color-variable($mode) {
//변수 배열 정의
$button-color-variable: (
primary: (
fill: var(--wb-#{$mode}-color-button-primary-fill),
fill-hover: var(--wb-#{$mode}-color-button-primary-fill-hover),
fill-pressed: var(--wb-#{$mode}-color-button-primary-fill-pressed),
fill-disabled: var(--wb-#{$mode}-color-button-disabled-fill),
border: var(--wb-#{$mode}-color-button-primary-fill),
border-disabled: var(--wb-#{$mode}-color-button-disabled-border),
text: var(--wb-#{$mode}-color-text-inverse-static),
text-disabled: var(--wb-#{$mode}-color-text-disabled-on),
),
secondary: (
fill: var(--wb-#{$mode}-color-button-secondary-fill),
fill-hover: var(--wb-#{$mode}-color-button-secondary-fill-hover),
fill-pressed: var(--wb-#{$mode}-color-button-secondary-fill-pressed),
fill-disabled: var(--wb-#{$mode}-color-button-disabled-fill),
border: var(--wb-#{$mode}-color-button-secondary-border),
border-disabled: var(--wb-#{$mode}-color-button-disabled-border),
text: var(--wb-#{$mode}-color-text-primary),
text-disabled: var(--wb-#{$mode}-color-text-disabled-on),
),
tertiary: (
fill: var(--wb-#{$mode}-color-button-tertiary-fill),
fill-hover: var(--wb-#{$mode}-color-button-tertiary-fill-hover),
fill-pressed: var(--wb-#{$mode}-color-button-tertiary-fill-pressed),
fill-disabled: var(--wb-#{$mode}-color-button-disabled-fill),
border: var(--wb-#{$mode}-color-button-tertiary-border),
border-disabled: var(--wb-#{$mode}-color-button-disabled-border),
text: var(--wb-#{$mode}-color-text-basic),
text-disabled: var(--wb-#{$mode}-color-text-disabled-on),
),
text: (
fill: var(--wb-#{$mode}-color-button-text-fill),
fill-hover: var(--wb-#{$mode}-color-button-text-fill-hover),
fill-pressed: var(--wb-#{$mode}-color-button-text-fill-pressed),
fill-disabled: var(--wb-#{$mode}-color-button-text-fill),
border: var(--wb-#{$mode}-color-button-text-border),
border-disabled: var(--wb-#{$mode}-color-border-transparency),
text: var(--wb-#{$mode}-color-text-basic),
text-disabled: var(--wb-#{$mode}-color-text-disabled),
),
link: (
fill: var(--wb-#{$mode}-color-button-text-fill),
fill-hover: var(--wb-#{$mode}-color-button-text-fill),
fill-pressed: var(--wb-#{$mode}-color-button-text-fill),
fill-disabled: var(--wb-#{$mode}-color-button-text-fill),
border: var(--wb-#{$mode}-color-button-text-border),
border-disabled: var(--wb-#{$mode}-color-border-transparency),
text: var(--wb-#{$mode}-color-link-default),
text-disabled: var(--wb-#{$mode}-color-text-disabled),
),
) !default;
//css variable 생성
@each $color, $types in $button-color-variable {
@each $type, $value in $types {
--wb-button--color-#{$color}-#{$type}: #{$value};
}
}
//class 생성
& {
@include btn-color(primary);
& {
//컬러 class
@each $color, $types in $button-color-variable {
&.#{$color} {
@include btn-color(#{$color});
&:not(.icon) {
.svg-icon {
@include btn-color-icon(#{$color});
}
}
&:hover {
@include btn-color-hover(#{$color});
}
&:active,
&:focus {
@include btn-color-pressed(#{$color});
}
&[disabled],
&.disabled {
@include btn-color-disabled(#{$color});
&:not(.icon) {
.svg-icon {
background-color: var(--wb-button--color-#{$color}-text-disabled);
}
}
&:hover {
@include btn-color-disabled(#{$color});
}
}
}
}
}
}
}
/* icon 버튼 사이즈 */
$button-icon-size: (
xsmall: var(--wb-size-height-2),
small: var(--wb-size-height-3),
medium: var(--wb-size-height-4),
large: var(--wb-size-height-5),
xlarge: var(--wb-size-height-6),
) !default;
//text버튼은 높이와 좌우 padding값이 달라 재정의
@mixin btn-text-variable() {
//text버튼은 높이와 좌우 padding값이 달라 재정의
--wb-button--size-height-xsmall: var(--wb-size-height-3);
--wb-button--padding-x-xsmall: var(--wb-padding-1);
--wb-button--padding-y-xsmall: var(--wb-number-0);
--wb-button--size-height-small: var(--wb-size-height-4);
--wb-button--padding-x-small: var(--wb-padding-1);
--wb-button--padding-y-small: var(--wb-number-0);
--wb-button--size-height-medium: var(--wb-size-height-5);
--wb-button--padding-x-medium: var(--wb-padding-1);
--wb-button--padding-y-medium: var(--wb-number-2);
--wb-button--size-height-large: var(--wb-size-height-6);
--wb-button--padding-x-large: var(--wb-padding-1);
--wb-button--padding-y-large: 0.5rem;
--wb-button--size-height-xlarge: var(--wb-size-height-7);
--wb-button--padding-x-xlarge: var(--wb-padding-1);
--wb-button--padding-y-xlarge: 0.9rem;
}
//link버튼은 font size와 좌우 padding값이 달라 재정의
@mixin btn-link-variable() {
--wb-button--pc-font-size-xsmall: var(--wb-pc-font-size-label-small);
--wb-button--mobile-font-size-xsmall: var(--wb-mobile-font-size-label-small);
--wb-button--padding-x-xsmall: var(--wb-padding-1);
--wb-button--pc-font-size-small: var(--wb-pc-font-size-label-small);
--wb-button--mobile-font-size-small: var(--wb-mobile-font-size-label-small);
--wb-button--padding-x-small: var(--wb-padding-1);
--wb-button--pc-font-size-medium: var(--wb-pc-font-size-label-medium);
--wb-button--mobile-font-size-medium: var(--wb-mobile-font-size-label-medium);
--wb-button--padding-x-medium: var(--wb-padding-1);
--wb-button--pc-font-size-large: var(--wb-pc-font-size-label-large);
--wb-button--mobile-font-size-large: var(--wb-mobile-font-size-label-large);
--wb-button--padding-x-large: var(--wb-padding-1);
--wb-button--pc-font-size-xlarge: var(--wb-pc-font-size-label-large);
--wb-button--mobile-font-size-xlarge: var(--wb-mobile-font-size-label-large);
--wb-button--padding-x-xlarge: var(--wb-padding-1);
}
//컬러별 variable
@mixin btn-color($color) {
background-color: var(--wb-button--color-#{$color}-fill);
border-color: var(--wb-button--color-#{$color}-border);
color: var(--wb-button--color-#{$color}-text);
}
@mixin btn-color-hover($color) {
background-color: var(--wb-button--color-#{$color}-fill-hover);
}
@mixin btn-color-pressed($color) {
background-color: var(--wb-button--color-#{$color}-fill-pressed);
}
@mixin btn-color-disabled($color) {
background-color: var(--wb-button--color-#{$color}-fill-disabled);
border-color: var(--wb-button--color-#{$color}-border-disabled);
color: var(--wb-button--color-#{$color}-text-disabled);
}
@mixin btn-color-icon($color) {
background-color: var(--wb-button--color-#{$color}-text);
}
//모드 설정
$mode-setting: light;
.wb-btn {
@include button-size-variable();
}
.wb-btn {
@include button-color-variable(#{$mode-setting});
& {
//기본버튼: primary large
// @include flex-layout($d: inline-flex, $ai: center, $jc: center);
width: auto;
border-style: solid;
cursor: pointer;
white-space: nowrap;
transition: var(--wb-transition-base);
@include border-size-mode(#{$mode-setting});
}
.svg-icon {
@include btn-color-icon(primary);
transition: var(--wb-transition-base);
}
&:hover {
@include btn-color-hover(primary);
}
// &:active,
// &:focus {
// @include btn-color-pressed(primary);
// }
&[disabled],
&.disabled {
@include btn-color-disabled(primary);
cursor: default;
&:hover {
@include btn-color-disabled(primary);
}
}
&.text { //높이를 가짐
@include btn-text-variable();
//large 사이즈 기준 기본 세팅수정
display: inline-block;
height: auto !important;
padding: var(--wb-button--padding-y-large) var(--wb-button--padding-x-large);
text-align: left;
white-space: normal;
&.xsmall {
min-height: var(--wb-button--size-height-xsmall);
padding: var(--wb-button--padding-y-xsmall) var(--wb-button--padding-x-xsmall);
.svg-icon {
margin-bottom: -0.3rem;
}
}
&.small {
padding: var(--wb-button--padding-y-small) var(--wb-button--padding-x-small);
.svg-icon {
margin-bottom: -0.3rem;
}
}
&.medium {
padding: var(--wb-button--padding-y-medium) var(--wb-button--padding-x-medium);
.svg-icon {
margin-bottom: -0.4rem;
}
}
&.large {
padding: var(--wb-button--padding-y-large) var(--wb-button--padding-x-large);
.svg-icon {
margin-bottom: -0.5rem;
}
}
&.xlarge {
padding: var(--wb-button--padding-y-xlarge) var(--wb-button--padding-x-xlarge);
.svg-icon {
margin-bottom: -0.6rem;
}
}
&.h-auto {
height: auto;
padding: var(--wb-padding-1) !important;
}
.svg-icon {
display: inline-block;
margin-bottom: -0.5rem;
}
}
&.link { //링크인 경우 (텍스트 버튼과 비슷해보이지만 높이값 없음)
@include btn-link-variable();
//large 사이즈 기준 기본 세팅수정
display: inline-block;
height: auto !important;
padding: 0 var(--wb-button--padding-x-large);
font-size: var(--wb-button--pc-font-size-large);
text-align: left;
white-space: normal;
@include size-medium {
font-size: var(--wb-button--mobile-font-size-large);
}
&.xsmall {
padding: 0 var(--wb-button--padding-x-xsmall);
font-size: var(--wb-button--pc-font-size-xsmall);
@include size-medium {
font-size: var(--wb-button--mobile-font-size-xsmall);
}
.svg-icon {
margin-bottom: -0.3rem;
}
}
&.small {
padding: 0 var(--wb-button--padding-x-small);
font-size: var(--wb-button--pc-font-size-small);
@include size-medium {
font-size: var(--wb-button--mobile-font-size-small);
}
.svg-icon {
margin-bottom: -0.3rem;
}
}
&.medium {
padding: 0 var(--wb-button--padding-x-medium);
font-size: var(--wb-button--pc-font-size-medium);
@include size-medium {
font-size: var(--wb-button--mobile-font-size-medium);
}
.svg-icon {
margin-bottom: -0.4rem;
}
}
&.large {
padding: 0 var(--wb-button--padding-x-large);
font-size: var(--wb-button--pc-font-size-large);
@include size-medium {
font-size: var(--wb-button--mobile-font-size-large);
}
.svg-icon {
margin-bottom: -0.5rem;
}
}
&.xlarge {
padding: 0 var(--wb-button--padding-x-xlarge);
font-size: var(--wb-button--pc-font-size-xlarge);
@include size-medium {
font-size: var(--wb-button--mobile-font-size-xlarge);
}
.svg-icon {
margin-bottom: -0.6rem;
}
}
&.basic {
$color: var(--wb-#{$mode-setting}-color-text-basic);
color: $color;
@include underline();
text-decoration-color: var(--wb-#{$mode-setting}-color-border-transparency);
.svg-icon {
background-color: $color;
}
&:hover,
&:active,
&:focus {
text-decoration-color: inherit;
}
}
&:hover {
$color: var(--wb-#{$mode-setting}-color-link-hover);
color: $color;
.svg-icon {
background-color: $color;
}
}
&:active,
&:focus {
$color: var(--wb-#{$mode-setting}-color-link-pressed);
color: $color;
.svg-icon {
background-color: $color;
}
}
&:visited {
$color: var(--wb-#{$mode-setting}-color-link-visited);
color: $color;
text-decoration: none;
.svg-icon {
background-color: $color;
}
}
.svg-icon {
display: inline-block;
margin-bottom: -0.5rem;
}
}
/* icon 버튼 (텍스트 없음) */
&.icon {
@each $size, $value in $button-icon-size {
--wb-button--icon-size-#{$size}: #{$value};
}
//기본 세팅
@include square(var(--wb-button--icon-size-medium));
padding: 0 !important;
background-color: transparent;
border-color: var(--wb-#{$mode-setting}-color-border-transparency);
color: inherit;
border: 0;
&:hover,
&:active {
background-color: inherit;
}
& {
@each $size, $value in $button-icon-size {
&.#{$size} {
@include square(var(--wb-button--icon-size-#{$size}));
//icon size
.svg-icon {
@include square(100%);
}
}
}
}
.svg-icon {
background-color: var(--wb-#{$mode-setting}-color-text-basic);
}
&.pure {
.svg-icon {
background-color: transparent;
}
}
//새로고침, 토글 보더 아이콘 버튼 형태
&.border {
background-color: var(--wb-#{$mode-setting}-color-background-white);
border: 0.1rem solid var(--wb-#{$mode-setting}-color-border-gray);
border-radius: var(--wb-radius-max);
//icon size 1.6rem
&.large {
.svg-icon {
@include square(var(--wb-icon--size-xsmall));
}
}
&.xlarge {
.svg-icon {
@include square(var(--wb-icon--size-xlarge));
}
}
&[disabled],
&.disabled {
background-color: var(--wb-#{$mode-setting}-color-button-disabled-fill);
}
}
}
}
//고대비모드
@include color-mode($mode: high-contrast) {
//모드 설정
$mode-setting: high-contrast;
.wb-btn {
@include border-size-mode(#{$mode-setting});
@include button-color-variable(#{$mode-setting});
&.text {
//class명 검토
&.ico-filter {
.num {
color: var(--wb-#{$mode-setting}-color-text-basic-inverse);
background-color: var(--wb-#{$mode-setting}-color-element-primary);
}
}
}
&.link {
&.basic {
$color: var(--wb-#{$mode-setting}-color-text-basic);
color: $color;
&:not(.icon) {
.svg-icon {
background-color: $color;
}
}
}
&:hover {
$color: var(--wb-#{$mode-setting}-color-link-hover);
color: $color;
&:not(.icon) {
.svg-icon {
background-color: $color;
}
}
}
&:active,
&:focus {
$color: var(--wb-#{$mode-setting}-color-link-pressed);
color: $color;
&:not(.icon) {
.svg-icon {
background-color: $color;
}
}
}
&:visited {
$color: var(--wb-#{$mode-setting}-color-link-visited);
color: $color;
&:not(.icon) {
.svg-icon {
background-color: $color;
}
}
}
}
/* icon 버튼 (텍스트 없음) */
&.icon {
background-color: transparent;
border-color: var(--wb-#{$mode-setting}-color-border-transparency);
.svg-icon {
background-color: var(--wb-#{$mode-setting}-color-text-basic);
}
//새로고침, 토글 보더 아이콘 버튼 형태
&.border {
background-color: var(--wb-#{$mode-setting}-color-background-white);
border-color: var(--wb-#{$mode-setting}-color-border-gray);
&[disabled],
&.disabled {
background-color: var(--wb-#{$mode-setting}-color-button-disabled-fill);
}
}
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,44 @@
//only component
//공통
@import "../common/include";
//component
@import "button";
// @import "tab";
// @import "table";
// @import "text_list";
// @import "modal";
// @import "help_panel";
// @import "accordion";
// @import "spinner";
// @import "contextual_help";
// @import "tooltip";
// @import "file_upload";
// @import "coach_mark";
// @import "disclosure";
// @import "skip_link";
// @import "masthead";
// @import "header";
// @import "main_menu";
// @import "footer";
// @import "identifier";
// @import "side_navigation";
// @import "structured_list";
// @import "critical_alerts";
// @import "in_page_navigation";
// @import "carousel";
// @import "pagination";
// @import "breadcrumb";
// @import "step_indicator";
// @import "badge";
// @import "tag";
// @import "form_layout";
// @import "input";
// @import "select";
// @import "form_check";
// @import "form_chip";
// @import "switch";
// @import "calendar";
// @import "resize";
// @import "language_switcher";
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
//component with common setting file
//common
@import "../common/common";
//component
@import "component";
@@ -0,0 +1,9 @@
@use '@progress/kendo-theme-bootstrap/scss/all.scss' as *;
@use 'tokens' as *;
.m-login .wrap-container-group-158{
left: 8px;
position: absolute;
top: 253px;
}
@@ -0,0 +1,474 @@
@use '@progress/kendo-theme-bootstrap/scss/all.scss' as *;
@use 'tokens' as *;
.m-login{
background-color: #ffffff;
background-image: none;
height: 800px;
overflow: hidden;
position: relative;
width: 360px;
}
.m-login .frame-164{
align-items: flex-start;
background-color: #f3f9ff;
background-image: none;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
box-sizing: border-box;
display: flex;
flex-direction: column;
left: 7px;
overflow: hidden;
padding-bottom: 29px;
padding-left: 10px;
padding-right: 39px;
padding-top: 29px;
position: absolute;
row-gap: 10px;
top: 586px;
width: 345px;
}
.m-login .group-169{
height: 146.17px;
position: relative;
width: 320px;
}
.m-login .frame-163{
align-items: flex-start;
background-color: #ffffff;
background-image: none;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
box-sizing: border-box;
display: flex;
flex-direction: column;
left: 0px;
overflow: hidden;
padding-bottom: 15px;
padding-left: 20px;
padding-right: 20px;
padding-top: 15px;
position: absolute;
row-gap: 10px;
top: 101.4px;
width: 320px;
}
.m-login .group-168-2{
height: 14.77px;
position: relative;
width: 275.25px;
}
.m-login .vector-2{
left: 270px;
position: absolute;
top: 0.6px;
}
.m-login .group-167-2{
height: 14.77px;
left: 0px;
position: absolute;
top: 0px;
width: 242px;
}
.m-login .가스계소화설비-안전관리-메뉴얼-및-경고문{
color: #000000;
font-family: NanumSquare;
font-size: font-size-12;
font-style: normal;
font-weight: 400;
left: 24px;
line-height: normal;
position: absolute;
top: 0px;
}
.m-login .group-166-2{
left: 0px;
position: absolute;
top: 0.64px;
}
.m-login .frame-162{
align-items: flex-start;
background-color: #ffffff;
background-image: none;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
box-sizing: border-box;
display: flex;
flex-direction: column;
left: 0px;
overflow: hidden;
padding-bottom: 15px;
padding-left: 20px;
padding-right: 20px;
padding-top: 15px;
position: absolute;
row-gap: 10px;
top: 50.7px;
width: 320px;
}
.m-login .group-168-1{
height: 14.77px;
position: relative;
width: 275.25px;
}
.m-login .vector-1{
left: 270px;
position: absolute;
top: 1.3px;
}
.m-login .group-167-1{
height: 14.77px;
left: 0px;
position: absolute;
top: 0px;
width: 244px;
}
.m-login .제-1-회-위험물-안전관리-우수사례-경진대회{
color: #000000;
font-family: NanumSquare;
font-size: font-size-12;
font-style: normal;
font-weight: 400;
left: 24px;
line-height: normal;
position: absolute;
top: 0px;
}
.m-login .group-166-1{
left: 0px;
position: absolute;
top: 0.64px;
}
.m-login .frame-161{
align-items: flex-start;
background-color: #ffffff;
background-image: none;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
box-sizing: border-box;
display: flex;
flex-direction: column;
left: 0px;
overflow: hidden;
padding-bottom: 15px;
padding-left: 20px;
padding-right: 20px;
padding-top: 15px;
position: absolute;
row-gap: 10px;
top: 0px;
width: 320px;
}
.m-login .group-168{
height: 14.77px;
position: relative;
width: 275.25px;
}
.m-login .group-167{
flex-shrink: 0;
height: 14.77px;
left: 0px;
position: absolute;
top: 0px;
width: 275.25px;
}
.m-login .vector{
left: 270px;
position: absolute;
top: 1px;
}
.m-login .겨울철-화재안전대책-공동주택-정책홍보{
color: #000000;
font-family: NanumSquare;
font-size: font-size-12;
font-style: normal;
font-weight: 400;
left: 24px;
line-height: normal;
position: absolute;
text-align: center;
top: 0px;
}
.m-login .group-166{
left: 0px;
position: absolute;
top: 0.64px;
}
.m-login .소방안전지도{
color: #000000;
font-family: NanumSquare;
font-size: 18px;
font-style: normal;
font-weight: 800;
left: 130px;
line-height: normal;
position: absolute;
top: 201px;
}
.m-login .mask-group-1{
flex-shrink: 0;
height: 180px;
left: 0px;
position: absolute;
top: 0px;
width: 360px;
}
.m-login .group-158{
height: 300.8px;
left: 8px;
position: absolute;
top: 253px;
width: 343.33px;
}
.m-login .frame-165{
align-items: center;
background-color: #ffffff;
background-image: none;
border-bottom-color: #d3d3d3;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom-style: solid;
border-bottom-width: 1px;
border-left-color: #d3d3d3;
border-left-style: solid;
border-left-width: 1px;
border-right-color: #d3d3d3;
border-right-style: solid;
border-right-width: 1px;
border-top-color: #d3d3d3;
border-top-left-radius: 0px;
border-top-right-radius: 0px;
border-top-style: solid;
border-top-width: 1px;
box-sizing: border-box;
display: flex;
flex-direction: column;
left: 0px;
overflow: hidden;
padding-bottom: 39px;
padding-left: 31px;
padding-right: 31px;
padding-top: 39px;
position: absolute;
row-gap: 10px;
top: 66px;
width: 343px;
}
.m-login .frame-158{
align-items: center;
display: flex;
flex-direction: column;
row-gap: 34.8px;
}
.m-login .group-165{
background-color: #002e64;
background-image: none;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
flex-shrink: 0;
height: 50px;
position: relative;
width: 280px;
}
.m-login .로그인{
color: #ffffff;
font-family: NanumSquare;
font-size: font-size-12;
font-style: normal;
font-weight: 800;
left: 124px;
line-height: normal;
position: absolute;
top: 18px;
}
.m-login .group-164{
height: 72px;
position: relative;
width: 280px;
}
.m-login .group-163{
height: 30px;
left: 0px;
position: absolute;
top: 42px;
width: 280px;
}
.m-login .rectangle-22{
border-bottom-color: #d0d0d0;
border-bottom-style: solid;
border-bottom-width: 0.6px;
flex-shrink: 0;
height: 30px;
left: 64.9px;
position: absolute;
top: 0px;
width: 215.1px;
}
.m-login .비밀번호{
color: #1a1a1a;
font-family: NanumSquare;
font-size: 12px;
font-style: normal;
font-weight: 700;
left: 0px;
line-height: normal;
position: absolute;
top: 9px;
width: 46.67px;
}
.m-login .group-162{
height: 30px;
left: 0px;
position: absolute;
top: 0px;
width: 280px;
}
.m-login .rectangle-21{
border-bottom-color: #d0d0d0;
border-bottom-style: solid;
border-bottom-width: 0.6px;
flex-shrink: 0;
height: 30px;
left: 64.9px;
position: absolute;
top: 0px;
width: 215.1px;
}
.m-login .아이디{
color: #1a1a1a;
font-family: NanumSquare;
font-size: 12px;
font-style: normal;
font-weight: 700;
left: 0px;
line-height: normal;
position: absolute;
top: 9px;
width: 35px;
}
.m-login .frame-166{
align-items: flex-start;
display: flex;
left: 0px;
position: absolute;
top: 0px;
}
.m-login .frame-157{
align-items: center;
border-bottom-left-radius: 25px;
border-bottom-right-radius: 25px;
border-top-left-radius: 25px;
border-top-right-radius: 25px;
column-gap: 10px;
display: flex;
height: 66px;
justify-content: center;
width: 114px;
}
.m-login .모바일공무원증-로그인{
color: $tb-figma-gray-color-02;
font-family: NanumSquare;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: normal;
text-align: center;
}
.m-login .frame-156{
align-items: center;
border-bottom-left-radius: 25px;
border-bottom-right-radius: 25px;
border-top-left-radius: 25px;
border-top-right-radius: 25px;
column-gap: 10px;
display: flex;
height: 66px;
justify-content: center;
width: 115px;
}
.m-login .gpki-인중서-로그인{
color: $tb-figma-gray-color-02;
font-family: NanumSquare;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: normal;
text-align: center;
}
.m-login .frame-155{
align-items: center;
background-color: #005dca;
background-image: none;
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
box-sizing: border-box;
column-gap: 10px;
display: flex;
justify-content: center;
padding-bottom: 26px;
padding-top: 26px;
width: 114.33px;
}
.m-login .아이디-로그인{
color: #ffffff;
font-family: NanumSquare;
font-size: 12px;
font-style: normal;
font-weight: 700;
line-height: normal;
}
@@ -0,0 +1,3 @@
@use 'common-styles-overrides' as *;
@use 'login' as *;
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+4
View File
@@ -0,0 +1,4 @@
@import 'tokens';
@import 'overrides';
@import 'page';
@import './componants/output';
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Some files were not shown because too many files have changed in this diff Show More