diff --git a/.gitignore b/.gitignore index 2c9ec0b..f44e616 100644 --- a/.gitignore +++ b/.gitignore @@ -102,4 +102,6 @@ TODO.txt *.lck *.log .claude -*.report.md \ No newline at end of file +*.report.md +*.claude.md +diff diff --git a/email_template/email_common_template.html b/email_template/email_common_template.html new file mode 100644 index 0000000..5d14a50 --- /dev/null +++ b/email_template/email_common_template.html @@ -0,0 +1,260 @@ + + + + + + + 광주은행 API Portal + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/email_template/email_logo_bottom.png b/email_template/email_logo_bottom.png new file mode 100644 index 0000000..d0f80e4 Binary files /dev/null and b/email_template/email_logo_bottom.png differ diff --git a/email_template/email_logo_top.png b/email_template/email_logo_top.png new file mode 100644 index 0000000..43544b9 Binary files /dev/null and b/email_template/email_logo_top.png differ diff --git a/email_template/email_otp_password.html b/email_template/email_otp_password.html new file mode 100644 index 0000000..adecb47 --- /dev/null +++ b/email_template/email_otp_password.html @@ -0,0 +1,255 @@ + + + + + + + 일회용 비밀번호 - 광주은행 API Portal + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/email_template/email_password_changed.html b/email_template/email_password_changed.html new file mode 100644 index 0000000..58213cf --- /dev/null +++ b/email_template/email_password_changed.html @@ -0,0 +1,234 @@ + + + + + + + 비밀번호 변경 완료 안내 - 광주은행 API Portal + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/email_template/email_verification.html b/email_template/email_verification.html new file mode 100644 index 0000000..42bc740 --- /dev/null +++ b/email_template/email_verification.html @@ -0,0 +1,235 @@ + + + + + + + 이메일 인증 - 광주은행 API Portal + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java b/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java index 6b7f9a9..c24f459 100644 --- a/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java +++ b/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/agreements") public class AgreementsController { - public static final String TERMS_AGREEMENTS = "fragment/kbank/terms_agreements"; + public static final String TERMS_AGREEMENTS = "fragment/kjbank/terms_agreements"; private final AgreementsFacade agreementsFacade; diff --git a/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiAjaxController.java b/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiAjaxController.java index c2cec8f..1913452 100644 --- a/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiAjaxController.java +++ b/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiAjaxController.java @@ -4,18 +4,11 @@ package com.eactive.apim.portal.apps.apis.controller; import com.eactive.apim.portal.apps.apis.dto.ApiSpecInfoDto; import com.eactive.apim.portal.apps.apis.service.ApiService; import com.eactive.apim.portal.apps.apiservice.dto.ApiGroupSearch; -import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceApiDTO; import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceDTO; import com.eactive.apim.portal.apps.apiservice.service.ApiServiceService; -import com.eactive.apim.portal.apps.app.dto.ClientDTO; -import com.eactive.apim.portal.apps.app.service.AppServiceFacade; -import com.eactive.apim.portal.common.user.PortalAuthenticatedUser; -import com.eactive.apim.portal.common.util.SecurityUtil; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; @@ -28,11 +21,8 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class ApiAjaxController { - private final static String STG_SERVER = "STG"; - private final ApiService apiService; private final ApiServiceService apiServiceService; - private final AppServiceFacade appServiceFacade; public Map getMainIconsFromServiceDtos(List apiServices) { Map mainIconsMap = new HashMap<>(); @@ -54,53 +44,15 @@ public class ApiAjaxController { Map mainIconsMap = getMainIconsFromServiceDtos(apiServices); List apiSpecInfoDtos = apiService.findApis(); - for (ApiSpecInfoDto spec : apiSpecInfoDtos) { - ApiServiceDTO serviceDTO = mainIconsMap.get(spec.getApiId()); - if (serviceDTO != null) { - String mainIcon = serviceDTO.getMainIcon(); - String service = serviceDTO.getGroupName(); - spec.setMainIcon(mainIcon); - spec.setService(service); - } - } - return apiSpecInfoDtos; - } - - @GetMapping("/for_request_prod") - @Secured("ROLE_API_KEY_REQUEST") - public List apiRequestProd(@ModelAttribute ApiGroupSearch search) { - - List apiServices = apiServiceService.searchApiGroups(search); - Map mainIconsMap = getMainIconsFromServiceDtos(apiServices); - - PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); - - List apikeys = appServiceFacade.getApiKeyList(user.getPortalOrg(), STG_SERVER); - - List apis = apikeys.stream() - .flatMap(client -> client.getApiList().stream()) // flatten all apiLists into a single stream of ApiServiceApiDTO - .distinct() // remove duplicates - .collect(Collectors.toList()); // collect to List - - List apiSpecInfoDtos = new ArrayList<>(); - - apis.forEach(api -> { - ApiSpecInfoDto specInfoDto = new ApiSpecInfoDto(); - specInfoDto.setApiId(api.getApiId()); - specInfoDto.setApiName(api.getApiDesc()); - apiSpecInfoDtos.add(specInfoDto); - }); - - for (ApiSpecInfoDto spec : apiSpecInfoDtos) { - ApiServiceDTO serviceDTO = mainIconsMap.get(spec.getApiId()); - if (serviceDTO != null) { - String mainIcon = serviceDTO.getMainIcon(); - String service = serviceDTO.getGroupName(); - spec.setMainIcon(mainIcon); - spec.setService(service); - } - } - return apiSpecInfoDtos; + // Filter APIs that have matching service information + return apiSpecInfoDtos.stream() + .filter(spec -> mainIconsMap.containsKey(spec.getApiId())) + .peek(spec -> { + ApiServiceDTO serviceDTO = mainIconsMap.get(spec.getApiId()); + spec.setMainIcon(serviceDTO.getMainIcon()); + spec.setService(serviceDTO.getGroupName()); + }) + .collect(java.util.stream.Collectors.toList()); } } diff --git a/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiController.java b/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiController.java index a00e750..649f1a2 100644 --- a/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiController.java +++ b/src/main/java/com/eactive/apim/portal/apps/apis/controller/ApiController.java @@ -1,17 +1,17 @@ package com.eactive.apim.portal.apps.apis.controller; -import com.eactive.apim.portal.apps.apis.dto.ApiSearchData; import com.eactive.apim.portal.apps.apis.dto.ApiSpecInfoDto; import com.eactive.apim.portal.apps.apis.service.ApiSearchFacade; import com.eactive.apim.portal.apps.apis.service.ApiService; import com.eactive.apim.portal.apps.apiservice.dto.ApiGroupSearch; import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceDTO; import com.eactive.apim.portal.apps.apiservice.service.ApiServiceService; - -import java.util.*; - import com.eactive.apim.portal.common.exception.NotFoundException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/src/main/java/com/eactive/apim/portal/apps/app/controller/ApiKeyRestController.java b/src/main/java/com/eactive/apim/portal/apps/app/controller/ApiKeyRestController.java deleted file mode 100644 index 73ff405..0000000 --- a/src/main/java/com/eactive/apim/portal/apps/app/controller/ApiKeyRestController.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.eactive.apim.portal.apps.app.controller; - -import com.eactive.apim.portal.apprequest.entity.AppRequestType; -import com.eactive.apim.portal.apps.apis.dto.ApiSearchData; -import com.eactive.apim.portal.apps.apis.service.ApiSearchFacade; -import com.eactive.apim.portal.apps.app.dto.AppRequestDTO; -import com.eactive.apim.portal.apps.app.dto.ClientDTO; -import com.eactive.apim.portal.apps.app.dto.ClientSimpleDTO; -import com.eactive.apim.portal.apps.app.mapper.CredentialMapper; -import com.eactive.apim.portal.apps.app.service.AppServiceFacade; -import com.eactive.apim.portal.common.dto.ResponseDTO; -import com.eactive.apim.portal.common.user.PortalAuthenticatedUser; -import com.eactive.apim.portal.common.util.EncryptionUtil; -import com.eactive.apim.portal.common.util.SecurityUtil; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.stream.Collectors; -import javax.crypto.BadPaddingException; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; -import org.springframework.security.access.annotation.Secured; -import org.springframework.ui.Model; -import org.springframework.validation.ValidationUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/myapikey") -@RequiredArgsConstructor -@Secured("ROLE_API_KEY_REQUEST") -public class ApiKeyRestController { - - private final static String PROD_SERVER = "PROD"; - private final static String STG_SERVER = "STG"; - - private final AppServiceFacade appServiceFacade; - private final CredentialMapper credentialMapper; - private final EncryptionUtil encryptionUtil; - private final ApiSearchFacade apiSearchFacade; - - @PostMapping("/api_key_request") - public ResponseDTO apiRequest(@RequestBody AppRequestDTO appRequest) { - appRequest.setOrg(SecurityUtil.getUserOrg()); - if (appRequest.getType() == null) { - appRequest.setType(AppRequestType.NEW); - } - AppRequestDTO appRequestDTO = appServiceFacade.createAppRequest(appRequest); - appServiceFacade.beginApproval(appRequestDTO.getApproval().getId()); - return new ResponseDTO(200, "SUCCESS", appRequestDTO.getType().getDescription() + " 신청이 완료되었습니다."); - } - - @PostMapping("/api_key_request_prod") - public ResponseDTO requestProdApiKey(@RequestBody AppRequestDTO appRequest) { - appRequest.setOrg(SecurityUtil.getUserOrg()); - - if (appRequest.getClientId() != null && !appRequest.getClientId().isEmpty()) { - try { - appRequest.setClientId(encryptionUtil.decrypt(appRequest.getClientId())); - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { - return new ResponseDTO(400, "FAILURE", "API 키 정보가 올바르지 않습니다."); - } - appRequest.setType(AppRequestType.PROD_MODIFY); - } else { - appRequest.setType(AppRequestType.PROD_NEW); - } - - AppRequestDTO appRequestDTO = appServiceFacade.createAppRequest(appRequest); - appServiceFacade.beginApproval(appRequestDTO.getApproval().getId()); - - return new ResponseDTO(200, "SUCCESS", appRequestDTO.getType().getDescription() + " 신청이 완료되었습니다."); - } - - @GetMapping("/dev") - public List apiKeyList() { - PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); - List apikeys = appServiceFacade.getApiKeyList(user.getPortalOrg(), STG_SERVER); - - ApiSearchData apiSearchData = apiSearchFacade.loadAllApiData(); - for (ClientDTO apikey : apikeys) { - apikey.getApiList().forEach(api -> { - api.setService(apiSearchData.getServicesByApiId().get(api.getApiId()).getGroupName()); - }); - } - - return apikeys.stream().map(credentialMapper::mapToClientSimpleDTO).collect(Collectors.toList()); - } - - @PostMapping("/prod") - public ClientSimpleDTO apiKeyProdList(@RequestBody AppRequestDTO appRequest) { - PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); - - try { - ClientDTO apiKey = appServiceFacade.getApiKey(user.getPortalOrg().getId(), encryptionUtil.decrypt(appRequest.getClientId()), PROD_SERVER); - ApiSearchData apiSearchData = apiSearchFacade.loadAllApiData(); - apiKey.getApiList().forEach(api -> { - api.setService(apiSearchData.getServicesByApiId().get(api.getApiId()).getGroupName()); - }); - apiKey.setClientid(encryptionUtil.encrypt(apiKey.getClientid())); - return credentialMapper.mapToClientSimpleDTO(apiKey); - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { - return new ClientSimpleDTO(); - } - } -} diff --git a/src/main/java/com/eactive/apim/portal/apps/app/controller/MyAppController.java b/src/main/java/com/eactive/apim/portal/apps/app/controller/MyAppController.java index 1f15bfc..3ad3e63 100644 --- a/src/main/java/com/eactive/apim/portal/apps/app/controller/MyAppController.java +++ b/src/main/java/com/eactive/apim/portal/apps/app/controller/MyAppController.java @@ -1,25 +1,25 @@ package com.eactive.apim.portal.apps.app.controller; +import com.eactive.apim.portal.apprequest.entity.AppRequest; import com.eactive.apim.portal.apps.apis.dto.ApiSpecInfoDto; import com.eactive.apim.portal.apps.apis.service.ApiService; import com.eactive.apim.portal.apps.apiservice.dto.ApiGroupSearch; +import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceApiDTO; import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceDTO; import com.eactive.apim.portal.apps.apiservice.service.ApiServiceService; +import com.eactive.apim.portal.apps.app.dto.ApiKeyRegistrationDTO; import com.eactive.apim.portal.apps.app.dto.AppRequestDTO; import com.eactive.apim.portal.apps.app.dto.ClientDTO; import com.eactive.apim.portal.apps.app.service.AppServiceFacade; import com.eactive.apim.portal.common.user.PortalAuthenticatedUser; import com.eactive.apim.portal.common.util.ApiServiceHelper; -import com.eactive.apim.portal.common.util.EncryptionUtil; import com.eactive.apim.portal.common.util.SecurityUtil; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.HashMap; +import com.eactive.apim.portal.file.service.FileTypeDetector; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import javax.crypto.BadPaddingException; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; +import javax.servlet.http.HttpSession; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; @@ -29,210 +29,320 @@ import org.springframework.data.web.PageableDefault; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.bind.support.SessionStatus; +import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller @RequestMapping("/myapikey") @RequiredArgsConstructor +@SessionAttributes({"apiKeyRegistration", "apiKeyModification"}) public class MyAppController { - private final static String PROD_SERVER = "PROD"; - private final static String STG_SERVER = "STG"; - public static final String API_KEY_LIST = "apps/mypage/apiKeyList"; - public static final String API_KEY_DETAIL = "apps/mypage/apiKeyDetail"; + public static final String APP_REQUEST_DETAIL = "apps/mypage/appRequestDetail"; - public static final String API_KEY_PROD_LIST = "apps/mypage/apiKeyProdList"; - - public static final String API_KEY_PROD_DETAIL = "apps/mypage/apiKeyProdDetail"; + public static final String CREDENTIAL_DETAIL = "apps/mypage/credentialDetail"; public static final String API_KEY_REQUEST_HISTORY = "apps/mypage/apiRequestHistory"; public static final String API_KEY_REQUEST_DETAIL = "apps/mypage/apiRequestDetail"; - public static final String API_KEY_REQUEST_PROD_HISTORY = "apps/mypage/apiRequestProdHistory"; + public static final String API_KEY_REGISTER_STEP1 = "apps/mypage/apiKeyRegisterStep1"; - public static final String API_KEY_REQUEST_PROD_DETAIL = "apps/mypage/apiRequestProdDetail"; + public static final String API_KEY_REGISTER_STEP2 = "apps/mypage/apiKeyRegisterStep2"; + + public static final String API_KEY_REGISTER_STEP3 = "apps/mypage/apiKeyRegisterStep3"; + + public static final String API_KEY_MODIFY_STEP1 = "apps/mypage/apiKeyModifyStep1"; + + public static final String API_KEY_MODIFY_STEP2 = "apps/mypage/apiKeyModifyStep2"; + + public static final String API_KEY_MODIFY_STEP3 = "apps/mypage/apiKeyModifyStep3"; private final AppServiceFacade appServiceFacade; private final ApiServiceService apiServiceService; private final ApiService apiService; - private final EncryptionUtil encryptionUtil; private final ApiServiceHelper apiServiceHelper; + private final FileTypeDetector fileTypeDetector; + private static final long MAX_APP_ICON_BYTES = 2L * 1024 * 1024; // 2MB + + // ========== API Key 조회 및 관리 ========== + + /** + * API Key 목록 페이지를 표시합니다. + * 대기 중인 요청 목록과 승인된 API Key 목록을 함께 보여줍니다. + */ @GetMapping @Secured("ROLE_APP") - public ModelAndView apiKeyList(@PageableDefault Pageable pageable, Model model) { + public ModelAndView apiKeyList(Model model) { PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); - Page apikeys = appServiceFacade.getApiKeyPageForServer(pageable, user.getPortalOrg(), STG_SERVER); - model.addAttribute("apiKeys", apikeys.getContent()); - model.addAttribute("page", apikeys); + List appRequests = appServiceFacade.getPendingApiKeyList(user.getPortalOrg()); + List apikeys = appServiceFacade.getApikeyList(user.getPortalOrg()); + + model.addAttribute("appRequests", appRequests); + model.addAttribute("apiKeys", apikeys); return new ModelAndView(API_KEY_LIST); } - @GetMapping("/api_key_prod_page") + /** + * AppRequest(대기 중인 요청)의 상세 정보를 표시합니다. + * Step 1과 Step 2에서 입력한 모든 정보를 보여줍니다. + * + * @param id AppRequest ID + */ + @GetMapping("/app_request_detail") @Secured("ROLE_APP") - public ModelAndView apiKeyProdList(@PageableDefault Pageable pageable, Model model) { - PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); - Page apikeys = appServiceFacade.getApiKeyPageForServer(pageable, user.getPortalOrg(), PROD_SERVER); - model.addAttribute("apiKeys", apikeys.getContent()); - model.addAttribute("page", apikeys); - return new ModelAndView(API_KEY_PROD_LIST); - } - - @GetMapping("/api_key_prod_detail") - @Secured("ROLE_APP") - public ModelAndView apiKeyProdDetail(@RequestParam(value = "id", required = false) String id, Model model) { - - if(id == null) { - return new ModelAndView("redirect:/myapikey/api_key_prod_page"); - } - ClientDTO apiKey = null; - try { - apiKey = appServiceFacade.getApiKey(SecurityUtil.getPortalAuthenticatedUser().getPortalOrg().getId(), encryptionUtil.decrypt(id), PROD_SERVER); - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { - return new ModelAndView("/"); - } - - if (apiKey == null) { - return new ModelAndView("/"); - } else { - ApiGroupSearch search = new ApiGroupSearch(); - List apiServices = apiServiceService.searchApiGroups(search); - Map mainIconsMap = apiServiceHelper.getMainIconsFromServiceDtos(apiServices); - - apiKey.getApiList().forEach(api -> { - ApiServiceDTO serviceDTO = mainIconsMap.get(api.getApiId()); - api.setService(serviceDTO.getGroupName()); - }); - - model.addAttribute("apiKey", apiKey); - return new ModelAndView(API_KEY_PROD_DETAIL); - } - } - - @GetMapping("/api_key_detail") - @Secured("ROLE_APP") - public ModelAndView apiKeyDetail(@RequestParam(value = "id", required = false) String id, Model model) { - - if(id == null) { + public ModelAndView appRequestDetail(@RequestParam(value = "id", required = false) String id, Model model) { + if (id == null) { return new ModelAndView("redirect:/myapikey"); } - ClientDTO apiKey = appServiceFacade.getApiKey(SecurityUtil.getPortalAuthenticatedUser().getPortalOrg().getId(), id, STG_SERVER); - if (apiKey == null) { - return new ModelAndView("/"); - } else { - ApiGroupSearch search = new ApiGroupSearch(); - List apiServices = apiServiceService.searchApiGroups(search); - Map mainIconsMap = apiServiceHelper.getMainIconsFromServiceDtos(apiServices); + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + AppRequestDTO appRequest = appServiceFacade.getAppRequestById(id, user.getPortalOrg()); - apiKey.getApiList().forEach(api -> { - ApiServiceDTO serviceDTO = mainIconsMap.get(api.getApiId()); - api.setService(serviceDTO.getGroupName()); - }); - - List prodHistory = appServiceFacade.getProdApiRequestHistory(apiKey.getClientid()); - model.addAttribute("apiKey", apiKey); - model.addAttribute("prodhistory", prodHistory); - return new ModelAndView(API_KEY_DETAIL); + if (appRequest == null) { + return new ModelAndView("redirect:/myapikey"); } + + // API 목록 조회 및 설정 + if (!StringUtils.isEmpty(appRequest.getApiList())) { + String[] apiIds = appRequest.getApiList().split(","); + List apiSpecList = new ArrayList<>(); + + for (String apiId : apiIds) { + ApiSpecInfoDto apiSpec = apiService.selectDetail(apiId.trim()); + if (apiSpec != null) { + apiSpecList.add(apiSpec); + } + } + appRequest.setApiSpecList(apiSpecList); + } + + model.addAttribute("appRequest", appRequest); + return new ModelAndView(APP_REQUEST_DETAIL); } + /** + * Credential(승인된 API Key)의 상세 정보를 표시합니다. + * API Key에 연결된 API 목록과 서비스 정보를 함께 보여줍니다. + * + * @param id Client ID + */ + @GetMapping("/credential_detail") + @Secured("ROLE_APP") + public ModelAndView credentialDetail(@RequestParam(value = "id", required = false) String id, Model model) { + if (id == null) { + return new ModelAndView("redirect:/myapikey"); + } + + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + ClientDTO apiKey = appServiceFacade.getApiKey(user.getPortalOrg().getId(), id); + + if (apiKey == null) { + return new ModelAndView("redirect:/myapikey"); + } + + // API 목록에 서비스 정보 추가 + ApiGroupSearch search = new ApiGroupSearch(); + List apiServices = apiServiceService.searchApiGroups(search); + Map mainIconsMap = apiServiceHelper.getMainIconsFromServiceDtos(apiServices); + + apiKey.getApiList().forEach(api -> { + ApiServiceDTO serviceDTO = mainIconsMap.get(api.getApiId()); + if (serviceDTO != null) { + api.setService(serviceDTO.getGroupName()); + } + }); + + model.addAttribute("apiKey", apiKey); + + return new ModelAndView(CREDENTIAL_DETAIL); + } + + /** + * 특정 API Key의 상세 정보를 표시합니다. (기존 메서드 - 하위 호환성 유지) + * API Key에 연결된 API 목록과 서비스 정보를 함께 보여줍니다. + * + * @param id API Key ID + * @deprecated Use {@link #credentialDetail(String, Model)} instead + */ + @GetMapping("/api_key_detail") + @Secured("ROLE_APP") + @Deprecated + public ModelAndView apiKeyDetail(@RequestParam(value = "id", required = false) String id, Model model) { + // 기존 기능 유지를 위해 credentialDetail로 리다이렉트 + return credentialDetail(id, model); + } + + // ========== API Key 요청 관리 ========== + + /** + * API Key 요청을 취소합니다. + * AJAX 요청을 지원하기 위해 @ResponseBody를 사용하여 JSON 응답 반환 + * + * @param id 취소할 요청 ID + * @return 성공/실패 결과를 담은 Map + */ @PostMapping("/api_key_request/cancel") @Secured("ROLE_API_KEY_REQUEST") - public String apiRequestCancel(@RequestParam String id) { - appServiceFacade.cancelApiRequest(id, SecurityUtil.getPortalAuthenticatedUser().getPortalOrg()); - return "redirect:/myapikey/api_key_request/history"; + @org.springframework.web.bind.annotation.ResponseBody + public Map apiRequestCancel(@RequestParam String id) { + Map result = new java.util.HashMap<>(); + + try { + appServiceFacade.cancelApiRequest(id, SecurityUtil.getPortalAuthenticatedUser().getPortalOrg()); + result.put("success", true); + result.put("message", "신청이 취소되었습니다."); + } catch (Exception e) { + result.put("success", false); + result.put("message", "신청 취소 중 오류가 발생했습니다: " + e.getMessage()); + } + + return result; } + /** + * API Key를 삭제합니다. + * AJAX 요청을 지원하기 위해 @ResponseBody를 사용하여 JSON 응답 반환 + * + * @param requestData 요청 데이터 (clientId와 type 포함) + * @return 성공/실패 결과를 담은 Map + */ + @PostMapping("/api_key_delete") + @Secured("ROLE_API_KEY_REQUEST") + @ResponseBody + public Map deleteApiKey(@RequestBody Map requestData) { + Map result = new java.util.HashMap<>(); + + try { + String clientId = requestData.get("clientId"); + String type = requestData.get("type"); + + if (clientId == null || clientId.trim().isEmpty()) { + result.put("success", false); + result.put("msg", "클라이언트 ID가 필요합니다."); + return result; + } + + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + + // API Key 즉시 삭제 (승인 프로세스 없이) + appServiceFacade.deleteApp(user.getPortalOrg().getId(), clientId); + + result.put("success", true); + result.put("msg", "API Key가 삭제되었습니다."); + } catch (Exception e) { + result.put("success", false); + result.put("msg", "삭제 요청 중 오류가 발생했습니다: " + e.getMessage()); + } + + return result; + } + + /** + * 사용자 비밀번호를 검증합니다. + * Client Secret 조회 시 본인 확인을 위해 사용됩니다. + * + * @param password 검증할 비밀번호 + * @return 성공/실패 결과를 담은 Map + */ + @PostMapping("/verify-password") + @Secured("ROLE_APP") + @org.springframework.web.bind.annotation.ResponseBody + public Map verifyPassword(@RequestParam String password) { + Map result = new java.util.HashMap<>(); + + try { + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + boolean isValid = appServiceFacade.verifyUserPassword(user, password); + + result.put("success", isValid); + if (!isValid) { + result.put("message", "비밀번호가 일치하지 않습니다."); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "비밀번호 확인 중 오류가 발생했습니다."); + } + + return result; + } + + /** + * API Key 요청 이력을 페이지 형태로 조회합니다. + * 각 요청의 내용을 사용자 친화적인 형식으로 포맷팅하여 표시합니다. + */ @GetMapping("/api_key_request/history") @Secured("ROLE_API_KEY_REQUEST_VIEW") - public ModelAndView apiRequestHistory(@PageableDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable, Model model) { + public ModelAndView apiRequestHistory( + @PageableDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable, + Model model) { + Page apiRequests = appServiceFacade.getApiRequestHistory(pageable, SecurityUtil.getUserOrg()); - for (AppRequestDTO request : apiRequests.getContent()) { - - if (!StringUtils.isEmpty(request.getApiGroupList())) { - String[] apiGroupList = request.getApiGroupList().split(","); - - ApiServiceDTO firstService = apiServiceService.getApiGroupById(apiGroupList[0]); - - if (apiGroupList.length == 1) { - request.setContents(firstService.getGroupName()); - } else { - request.setContents(firstService.getGroupName() + " 외 " + (apiGroupList.length - 1) + "개의 API 그룹"); - } - } - - if (StringUtils.isEmpty(request.getContents())) { - if (!StringUtils.isEmpty(request.getApiList())) { - String[] apiList = request.getApiList().split(","); - - ApiSpecInfoDto firstApi = apiService.selectDetail(apiList[0]); - - if (apiList.length == 1) { - request.setContents(firstApi.getApiName()); - } else { - request.setContents(firstApi.getApiName() + " 외 " + (apiList.length - 1) + "개의 API"); - } - } - } - } + // 각 요청의 내용을 사용자 친화적인 형식으로 포맷팅 + apiRequests.getContent().forEach(this::formatApiRequestContent); model.addAttribute("requests", apiRequests.getContent()); model.addAttribute("page", apiRequests); return new ModelAndView(API_KEY_REQUEST_HISTORY); } - @GetMapping("/api_key_request/prod_history") - @Secured("ROLE_API_KEY_REQUEST_VIEW") - public ModelAndView apiRequestProdHistory(@PageableDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable, Model model) { - Page apiRequests = appServiceFacade.getApiRequestProdHistory(pageable, SecurityUtil.getUserOrg()); + /** + * API 요청 내용을 사용자 친화적인 형식으로 포맷팅합니다. + * API 그룹 또는 개별 API 목록을 "첫번째 외 N개" 형식으로 변환합니다. + * + * @param request 포맷팅할 AppRequest DTO + */ + private void formatApiRequestContent(AppRequestDTO request) { + // API 그룹 목록 포맷팅 + if (!StringUtils.isEmpty(request.getApiGroupList())) { + String[] apiGroupList = request.getApiGroupList().split(","); + ApiServiceDTO firstService = apiServiceService.getApiGroupById(apiGroupList[0]); - for (AppRequestDTO request : apiRequests.getContent()) { - - if (!StringUtils.isEmpty(request.getApiGroupList())) { - String[] apiGroupList = request.getApiGroupList().split(","); - - ApiServiceDTO firstService = apiServiceService.getApiGroupById(apiGroupList[0]); - - if (apiGroupList.length == 1) { - request.setContents(firstService.getGroupName()); - } else { - request.setContents(firstService.getGroupName() + " 외 " + (apiGroupList.length - 1) + "개의 API 그룹"); - } - } - - if (StringUtils.isEmpty(request.getContents())) { - if (!StringUtils.isEmpty(request.getApiList())) { - String[] apiList = request.getApiList().split(","); - - ApiSpecInfoDto firstApi = apiService.selectDetail(apiList[0]); - - if (apiList.length == 1) { - request.setContents(firstApi.getApiName()); - } else { - request.setContents(firstApi.getApiName() + " 외 " + (apiList.length - 1) + "개의 API"); - } - } + if (apiGroupList.length == 1) { + request.setContents(firstService.getGroupName()); + } else { + request.setContents(firstService.getGroupName() + " 외 " + (apiGroupList.length - 1) + "개의 API 그룹"); } + return; } - model.addAttribute("requests", apiRequests.getContent()); - model.addAttribute("page", apiRequests); - return new ModelAndView(API_KEY_REQUEST_PROD_HISTORY); + // 개별 API 목록 포맷팅 + if (!StringUtils.isEmpty(request.getApiList())) { + String[] apiList = request.getApiList().split(","); + ApiSpecInfoDto firstApi = apiService.selectDetail(apiList[0]); + + if (apiList.length == 1) { + request.setContents(firstApi.getApiName()); + } else { + request.setContents(firstApi.getApiName() + " 외 " + (apiList.length - 1) + "개의 API"); + } + } } + /** + * 특정 API Key 요청의 상세 정보를 표시합니다. + * + * @param id 요청 ID + */ @GetMapping("/api_key_request/detail") @Secured("ROLE_API_KEY_REQUEST_VIEW") public ModelAndView apiRequestDetail(@RequestParam(value = "id", required = false) String id, Model model) { - if (id == null) { return new ModelAndView("redirect:/myapikey/api_key_request/history"); } @@ -244,20 +354,598 @@ public class MyAppController { return new ModelAndView(API_KEY_REQUEST_DETAIL); } - @GetMapping("/api_key_request/prod_detail") - @Secured("ROLE_API_KEY_REQUEST_VIEW") - public ModelAndView apiRequestProdDetail(@RequestParam(value = "id", required = false) String id, Model model) { + /** + * 세션 등록 객체 초기화 + */ + @ModelAttribute("apiKeyRegistration") + public ApiKeyRegistrationDTO getApiKeyRegistration() { + return new ApiKeyRegistrationDTO(); + } - if(id == null) { - return new ModelAndView("redirect:/myapikey/api_key_request/prod_history"); + /** + * 세션 수정 객체 초기화 + */ + @ModelAttribute("apiKeyModification") + public ApiKeyRegistrationDTO getApiKeyModification() { + return new ApiKeyRegistrationDTO(); + } + + /** + * API Key 등록 - 1단계: 기본 정보 입력 + * + * @param clear - 새로운 등록을 시작할 때 세션을 초기화하는 선택적 파라미터 + */ + @GetMapping("/register/step1") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView registerStep1( + @RequestParam(value = "clear", required = false, defaultValue = "false") boolean clear, + @ModelAttribute("apiKeyRegistration") ApiKeyRegistrationDTO registration, + SessionStatus sessionStatus, + Model model) { + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + + // 명시적으로 요청된 경우에만 세션 초기화 (새 등록 시작) + // 페이지 새로고침이나 뒤로가기 시에는 세션 데이터를 보존 + if (clear) { + sessionStatus.setComplete(); + // 새로운 깨끗한 등록 객체 생성 + ApiKeyRegistrationDTO newRegistration = new ApiKeyRegistrationDTO(); + model.addAttribute("apiKeyRegistration", newRegistration); + } + + // 등록 프로세스를 위한 세션 데이터 초기화 + setupStepModel(model, 1); + model.addAttribute("userOrg", user.getPortalOrg()); + + return new ModelAndView(API_KEY_REGISTER_STEP1); + } + + /** + * API Key 등록 - 1단계 처리 및 2단계로 이동 + */ + @PostMapping("/register/step1") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView processStep1( + @RequestParam(value = "ipWhitelist", required = false) String ipWhitelist, + @Valid @ModelAttribute("apiKeyRegistration") ApiKeyRegistrationDTO registration, + BindingResult bindingResult, + Model model) { + + try { + // 앱 아이콘 파일 검증 + MultipartFile appIcon = registration.getAppIcon(); + boolean hasExistingIcon = registration.getAppIconData() != null && registration.getAppIconData().length > 0; + validateAppIcon(appIcon, hasExistingIcon, bindingResult); + + // 검증 오류가 있는 경우 Step 1로 돌아가기 + if (bindingResult.hasErrors()) { + setupStepModel(model, 1); + model.addAttribute("error", buildErrorMessage(bindingResult)); + return new ModelAndView(API_KEY_REGISTER_STEP1); + } + + // 새 업로드가 있는 경우 세션에 파일 데이터 저장 + boolean hasNewUpload = appIcon != null && !appIcon.isEmpty(); + if (hasNewUpload) { + registration.setAppIconFileName(appIcon.getOriginalFilename()); + registration.setAppIconData(appIcon.getBytes()); + registration.setAppIconContentType(appIcon.getContentType()); + } + + // 텍스트 필드 공백 제거 및 설정 (널 안전) + registration.setAppName(StringUtils.trimToEmpty(registration.getAppName())); + registration.setAppDescription(StringUtils.trimToEmpty(registration.getAppDescription())); + registration.setCallbackUrl(StringUtils.trimToEmpty(registration.getCallbackUrl())); + + // IP 화이트리스트 설정 + if (ipWhitelist != null && !ipWhitelist.trim().isEmpty()) { + registration.setIpWhitelistFromString(ipWhitelist); + } + + return new ModelAndView("redirect:/myapikey/register/step2"); + + } catch (Exception e) { + setupStepModel(model, 1); + model.addAttribute("error", "파일 처리 중 오류가 발생했습니다."); + return new ModelAndView(API_KEY_REGISTER_STEP1); + } + } + + /** + * 업로드된 앱 아이콘 파일의 유효성을 검증합니다. + * - 파일 크기 검증 (최대 2MB) + * - 파일 형식 검증 (PNG, JPG만 허용) + * - Magic Number 기반 실제 파일 타입 검증 + * + * @param appIcon 업로드된 파일 + * @param hasExistingIcon 세션에 기존 아이콘이 있는지 여부 + * @param bindingResult 검증 오류를 저장할 BindingResult + */ + private void validateAppIcon(MultipartFile appIcon, boolean hasExistingIcon, BindingResult bindingResult) { + boolean hasNewUpload = appIcon != null && !appIcon.isEmpty(); + + // 새 업로드도 없고 기존 아이콘도 없는 경우 + if (!hasNewUpload && !hasExistingIcon) { + bindingResult.rejectValue("appIconFileName", "error.appIcon", "앱 아이콘을 선택해주세요."); + return; + } + + // 새 업로드가 없으면 검증 종료 (기존 아이콘 사용) + if (!hasNewUpload) { + return; + } + + // 파일 크기 검증 (최대 2MB) + if (appIcon.getSize() > MAX_APP_ICON_BYTES) { + bindingResult.rejectValue("appIconFileName", "error.appIcon.size", + "파일 크기는 2MB를 초과할 수 없습니다."); + return; + } + + // 파일 내용 기반 실제 파일 타입 검증 (Magic Number 검증) + try { + byte[] fileBytes = appIcon.getBytes(); + String detectedType = fileTypeDetector.detectFileType(fileBytes); + String normalizedType = detectedType != null ? detectedType.toLowerCase() : ""; + + // PNG, JPG/JPEG만 허용 (SVG 제외) + if (!"png".equals(normalizedType) && !"jpg".equals(normalizedType) && !"jpeg".equals(normalizedType)) { + bindingResult.rejectValue("appIconFileName", "error.appIcon.type", + "PNG, JPG/JPEG 형식만 업로드 가능합니다. 업로드된 파일은 " + detectedType + " 형식입니다."); + } + } catch (Exception e) { + bindingResult.rejectValue("appIconFileName", "error.appIcon.invalid", + "파일 형식을 확인할 수 없습니다. 올바른 이미지 파일을 선택해주세요."); + } + } + + /** + * API Key 등록 - 2단계: API 선택 + */ + @GetMapping("/register/step2") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView registerStep2( + @ModelAttribute("apiKeyRegistration") ApiKeyRegistrationDTO registration, + RedirectAttributes redirectAttributes, + Model model) { + + // 1단계가 완료되었는지 검증 + if (!registration.isStep1Complete()) { + redirectAttributes.addFlashAttribute("error", "먼저 기본 정보를 입력해주세요."); + return new ModelAndView("redirect:/myapikey/register/step1"); + } + + // 서비스 카테고리만 가져오기 (API는 AJAX로 로드됨) + ApiGroupSearch search = new ApiGroupSearch(); + List apiServices = apiServiceService.searchApiGroups(search); + + setupStepModel(model, 2); + model.addAttribute("apiServices", apiServices); + model.addAttribute("registration", registration); + + return new ModelAndView(API_KEY_REGISTER_STEP2); + } + + /** + * API Key 등록 - 2단계 선택 저장 (뒤로가기 네비게이션용) + */ + @PostMapping("/register/step2/save") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView saveStep2( + @RequestParam(value = "selectedApis", required = false) List selectedApis, + @ModelAttribute("apiKeyRegistration") ApiKeyRegistrationDTO registration) { + + // 선택된 API를 세션에 저장 (부분 진행 상황을 보존하기 위해 비어있어도 저장) + if (selectedApis != null) { + registration.setSelectedApis(selectedApis); + } else { + registration.setSelectedApis(new ArrayList<>()); + } + + // 1단계로 리다이렉트 + return new ModelAndView("redirect:/myapikey/register/step1"); + } + + /** + * API Key 등록 - 2단계 처리 및 3단계로 이동 + * 실제 AppRequest 생성 및 승인 프로세스 시작 + */ + @PostMapping("/register/step2") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView processStep2( + @RequestParam(value = "selectedApis", required = false) List selectedApis, + @ModelAttribute("apiKeyRegistration") ApiKeyRegistrationDTO registration, + SessionStatus sessionStatus, + RedirectAttributes redirectAttributes) { + + // 1단계가 완료되었는지 검증 + if (!registration.isStep1Complete()) { + redirectAttributes.addFlashAttribute("error", "먼저 기본 정보를 입력해주세요."); + return new ModelAndView("redirect:/myapikey/register/step1"); + } + + // API 선택 검증 + if (selectedApis == null || selectedApis.isEmpty()) { + redirectAttributes.addFlashAttribute("error", "최소 1개 이상의 API를 선택해주세요."); + return new ModelAndView("redirect:/myapikey/register/step2"); + } + + // 선택된 API를 세션에 저장 + registration.setSelectedApis(selectedApis); + + // 등록이 완료되었는지 최종 검증 + if (!registration.isComplete()) { + redirectAttributes.addFlashAttribute("error", "등록 정보가 완전하지 않습니다."); + return new ModelAndView("redirect:/myapikey/register/step1"); } PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); - AppRequestDTO appRequest = appServiceFacade.getApiRequestProdByIdAndPortalOrg(id, user.getPortalOrg()); + try { + // AppRequest 생성 및 승인 프로세스 시작 + AppRequestDTO appRequestDTO = appServiceFacade.createAppRequestFromRegistration(registration, user.getPortalOrg()); + appServiceFacade.beginApproval(appRequestDTO.getApproval().getId()); - model.addAttribute("appRequest", appRequest); - return new ModelAndView(API_KEY_REQUEST_PROD_DETAIL); + // 성공 메시지와 함께 step3로 리다이렉트 + redirectAttributes.addFlashAttribute("registrationSuccess", true); + redirectAttributes.addFlashAttribute("appName", registration.getAppName()); + + // 성공적으로 완료된 후 세션 초기화 + sessionStatus.setComplete(); + + return new ModelAndView("redirect:/myapikey/register/step3"); + + } catch (Exception e) { + // 실패 시 에러 메시지와 함께 step2로 돌아감 + redirectAttributes.addFlashAttribute("error", "API Key 등록 중 오류가 발생했습니다. 다시 시도해주세요."); + return new ModelAndView("redirect:/myapikey/register/step2"); + } } + /** + * API Key 등록 - 3단계: 결과 확인 페이지 + * Step 2에서 이미 처리가 완료되었으므로 결과만 표시 + */ + @GetMapping("/register/step3") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView registerStep3(Model model) { + + // Step 2 POST에서 전달된 성공 플래그 확인 + Boolean registrationSuccess = (Boolean) model.asMap().get("registrationSuccess"); + String appName = (String) model.asMap().get("appName"); + + // 직접 접근 방지: Step 2 POST를 거치지 않고 직접 접근한 경우 + if (registrationSuccess == null || !registrationSuccess) { + return new ModelAndView("redirect:/myapikey"); + } + + // 결과 페이지 표시용 속성 설정 + setupStepModel(model, 3); + model.addAttribute("registrationComplete", true); + model.addAttribute("appName", appName); + + return new ModelAndView(API_KEY_REGISTER_STEP3); + } + + /** + * API Key 등록 취소 및 목록으로 돌아가기 + */ + @GetMapping("/register/cancel") + @Secured("ROLE_API_KEY_REQUEST") + public String cancelRegistration(SessionStatus sessionStatus) { + // 등록과 관련된 세션 데이터 초기화 + sessionStatus.setComplete(); + return "redirect:/myapikey"; + } + + /** + * 등록 단계별 공통 모델 속성을 설정합니다. + * + * @param model 모델 객체 + * @param currentStep 현재 단계 번호 + */ + private void setupStepModel(Model model, int currentStep) { + model.addAttribute("currentStep", currentStep); + model.addAttribute("totalSteps", 3); + model.addAttribute("userOrg", SecurityUtil.getPortalAuthenticatedUser().getPortalOrg()); + } + + /** + * BindingResult의 모든 에러 메시지를 하나의 문자열로 결합합니다. + * + * @param bindingResult 검증 결과 + * @return 줄바꿈으로 구분된 에러 메시지 + */ + private String buildErrorMessage(BindingResult bindingResult) { + StringBuilder errorMessage = new StringBuilder(); + for (FieldError error : bindingResult.getFieldErrors()) { + if (errorMessage.length() > 0) { + errorMessage.append("\n"); + } + errorMessage.append(error.getDefaultMessage()); + } + return errorMessage.toString(); + } + + // ========== API Key 수정 관련 엔드포인트 ========== + + /** + * API Key 수정 - 1단계: 기본 정보 수정 + * Credential을 ApiKeyRegistrationDTO로 변환하여 세션에 저장 + * + * @param clientId 수정할 API Key의 Client ID + */ + @GetMapping("/modify/step1") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView modifyStep1( + @RequestParam(value = "clientId", required = false) String clientId, + @ModelAttribute("apiKeyModification") ApiKeyRegistrationDTO modification, + SessionStatus sessionStatus, + Model model, + RedirectAttributes redirectAttributes) { + + if (clientId == null) { + return new ModelAndView("redirect:/myapikey"); + } + + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + + // 기존 API Key 정보 조회 + ClientDTO apiKey = appServiceFacade.getApiKey(user.getPortalOrg().getId(), clientId); + if (apiKey == null) { + return new ModelAndView("redirect:/myapikey"); + } + + // 새로운 수정 세션 시작시에만 초기화 + // clientId가 다르거나, clientId는 같지만 다른 필드가 비어있는 경우 (세션이 클리어된 경우) + if (modification.getClientId() == null || + !modification.getClientId().equals(clientId) || + modification.getAppName() == null) { + modification = new ApiKeyRegistrationDTO(); + + // ClientDTO를 ApiKeyRegistrationDTO로 변환 + modification.setClientId(clientId); + modification.setAppName(apiKey.getClientname()); + modification.setAppDescription(apiKey.getAppDescription()); + modification.setCallbackUrl(apiKey.getRedirecturi()); + + // IP 화이트리스트 변환 + if (apiKey.getAllowedips() != null && !apiKey.getAllowedips().isEmpty()) { + modification.setIpWhitelistFromString(apiKey.getAllowedips()); + } + + // 앱 아이콘 정보 설정 + if (apiKey.getAppIconFileId() != null) { + // 파일 ID만 설정하면 뷰에서 /file/download로 직접 조회 + modification.setAppIconFileId(apiKey.getAppIconFileId()); + } + + // 기존 API 목록 설정 + List apiIds = new ArrayList<>(); + if (apiKey.getApiList() != null) { + for (ApiServiceApiDTO api : apiKey.getApiList()) { + apiIds.add(api.getApiId()); + } + } + modification.setSelectedApis(apiIds); + + // 수정 타입 설정 + modification.setRequestType("MODIFY"); + + model.addAttribute("apiKeyModification", modification); + } + + // Step 모델 설정 + setupStepModel(model, 1); + model.addAttribute("userOrg", user.getPortalOrg()); + + return new ModelAndView(API_KEY_MODIFY_STEP1); + } + + /** + * API Key 수정 - 1단계 처리 및 2단계로 이동 + */ + @PostMapping("/modify/step1") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView processModifyStep1( + @RequestParam(value = "ipWhitelist", required = false) String ipWhitelist, + @Valid @ModelAttribute("apiKeyModification") ApiKeyRegistrationDTO modification, + BindingResult bindingResult, + Model model) { + + try { + // 앱 아이콘 파일 검증 + MultipartFile appIcon = modification.getAppIcon(); + // 수정 시에는 appIconFileId가 있으면 기존 아이콘이 있는 것으로 처리 + boolean hasExistingIcon = (modification.getAppIconData() != null && modification.getAppIconData().length > 0) + || (modification.getAppIconFileId() != null && !modification.getAppIconFileId().isEmpty()); + validateAppIcon(appIcon, hasExistingIcon, bindingResult); + + // 검증 오류가 있는 경우 Step 1로 돌아가기 + if (bindingResult.hasErrors()) { + setupStepModel(model, 1); + model.addAttribute("error", buildErrorMessage(bindingResult)); + return new ModelAndView(API_KEY_MODIFY_STEP1); + } + + // 새 업로드가 있는 경우 세션에 파일 데이터 저장 + boolean hasNewUpload = appIcon != null && !appIcon.isEmpty(); + if (hasNewUpload) { + modification.setAppIconFileName(appIcon.getOriginalFilename()); + modification.setAppIconData(appIcon.getBytes()); + modification.setAppIconContentType(appIcon.getContentType()); + } + + // 텍스트 필드 공백 제거 및 설정 + modification.setAppName(StringUtils.trimToEmpty(modification.getAppName())); + modification.setAppDescription(StringUtils.trimToEmpty(modification.getAppDescription())); + modification.setCallbackUrl(StringUtils.trimToEmpty(modification.getCallbackUrl())); + + // IP 화이트리스트 설정 + if (ipWhitelist != null && !ipWhitelist.trim().isEmpty()) { + modification.setIpWhitelistFromString(ipWhitelist); + } + + return new ModelAndView("redirect:/myapikey/modify/step2"); + + } catch (Exception e) { + setupStepModel(model, 1); + model.addAttribute("error", "파일 처리 중 오류가 발생했습니다."); + return new ModelAndView(API_KEY_MODIFY_STEP1); + } + } + + /** + * API Key 수정 - 2단계: API 선택 + */ + @GetMapping("/modify/step2") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView modifyStep2( + @ModelAttribute("apiKeyModification") ApiKeyRegistrationDTO modification, + RedirectAttributes redirectAttributes, + Model model) { + + // 1단계가 완료되었는지 검증 + if (!modification.isStep1Complete()) { + redirectAttributes.addFlashAttribute("error", "먼저 기본 정보를 입력해주세요."); + return new ModelAndView("redirect:/myapikey/modify/step1?clientId=" + modification.getClientId()); + } + + // 서비스 카테고리와 API 목록 가져오기 + ApiGroupSearch search = new ApiGroupSearch(); + List apiServices = apiServiceService.searchApiGroups(search); + + setupStepModel(model, 2); + model.addAttribute("apiServices", apiServices); + model.addAttribute("modification", modification); + + return new ModelAndView(API_KEY_MODIFY_STEP2); + } + + /** + * API Key 수정 - 2단계 선택 저장 (뒤로가기용) + */ + @PostMapping("/modify/step2/save") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView saveModifyStep2( + @RequestParam(value = "selectedApis", required = false) List selectedApis, + @ModelAttribute("apiKeyModification") ApiKeyRegistrationDTO modification) { + + // 선택된 API를 세션에 저장 + if (selectedApis != null) { + modification.setSelectedApis(selectedApis); + } else { + modification.setSelectedApis(new ArrayList<>()); + } + + // 1단계로 리다이렉트 + return new ModelAndView("redirect:/myapikey/modify/step1?clientId=" + modification.getClientId()); + } + + /** + * API Key 수정 - 2단계 처리 및 3단계로 이동 + * 실제 수정 요청 생성 및 승인 프로세스 시작 + */ + @PostMapping("/modify/step2") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView processModifyStep2( + @RequestParam(value = "selectedApis", required = false) List selectedApis, + @ModelAttribute("apiKeyModification") ApiKeyRegistrationDTO modification, + SessionStatus sessionStatus, + RedirectAttributes redirectAttributes) { + + // 1단계가 완료되었는지 검증 + if (!modification.isStep1Complete()) { + redirectAttributes.addFlashAttribute("error", "먼저 기본 정보를 입력해주세요."); + return new ModelAndView("redirect:/myapikey/modify/step1?clientId=" + modification.getClientId()); + } + + // API 선택 검증 + if (selectedApis == null || selectedApis.isEmpty()) { + redirectAttributes.addFlashAttribute("error", "최소 1개 이상의 API를 선택해주세요."); + return new ModelAndView("redirect:/myapikey/modify/step2"); + } + + // 선택된 API를 세션에 저장 + modification.setSelectedApis(selectedApis); + + // 등록이 완료되었는지 최종 검증 + if (!modification.isComplete()) { + redirectAttributes.addFlashAttribute("error", "수정 정보가 완전하지 않습니다."); + return new ModelAndView("redirect:/myapikey/modify/step1?clientId=" + modification.getClientId()); + } + + PortalAuthenticatedUser user = SecurityUtil.getPortalAuthenticatedUser(); + + try { + // AppRequest 생성 (MODIFY 타입으로) 및 승인 프로세스 시작 + AppRequestDTO appRequestDTO = appServiceFacade.createModifyRequestFromRegistration(modification, user.getPortalOrg()); + appServiceFacade.beginApproval(appRequestDTO.getApproval().getId()); + + // 성공 메시지와 함께 step3로 리다이렉트 + redirectAttributes.addFlashAttribute("modificationComplete", true); + redirectAttributes.addFlashAttribute("appName", modification.getAppName()); + + // 성공적으로 완료된 후 세션 초기화 + sessionStatus.setComplete(); + + return new ModelAndView("redirect:/myapikey/modify/step3"); + + } catch (Exception e) { + // 실패 시 에러 메시지와 함께 step2로 돌아감 + redirectAttributes.addFlashAttribute("error", "API Key 수정 요청 중 오류가 발생했습니다. 다시 시도해주세요."); + return new ModelAndView("redirect:/myapikey/modify/step2"); + } + } + + /** + * API Key 수정 - 3단계: 결과 확인 페이지 + */ + @GetMapping("/modify/step3") + @Secured("ROLE_API_KEY_REQUEST") + public ModelAndView modifyStep3(Model model) { + + // Step 2 POST에서 전달된 성공 플래그 확인 + Boolean modificationComplete = (Boolean) model.asMap().get("modificationComplete"); + String appName = (String) model.asMap().get("appName"); + + // 직접 접근 방지: Step 2 POST를 거치지 않고 직접 접근한 경우 + if (modificationComplete == null || !modificationComplete) { + return new ModelAndView("redirect:/myapikey"); + } + + // 결과 페이지 표시용 속성 설정 + setupStepModel(model, 3); + model.addAttribute("modificationComplete", true); + model.addAttribute("appName", appName); + + return new ModelAndView(API_KEY_MODIFY_STEP3); + } + + /** + * API Key 수정 취소 및 상세 페이지로 돌아가기 + */ + @GetMapping("/modify/cancel") + @Secured("ROLE_API_KEY_REQUEST") + public String cancelModification( + @RequestParam(value = "clientId", required = false) String clientId, + SessionStatus sessionStatus, + HttpSession session) { + + // 세션에서 직접 apiKeyModification 제거 + session.removeAttribute("apiKeyModification"); + + // Spring의 세션 관리도 초기화 + sessionStatus.setComplete(); + + // clientId가 있으면 상세 페이지로, 없으면 목록으로 + if (clientId != null && !clientId.isEmpty()) { + return "redirect:/myapikey/credential_detail?id=" + clientId; + } else { + return "redirect:/myapikey"; + } + } + + + } diff --git a/src/main/java/com/eactive/apim/portal/apps/app/dto/ApiKeyRegistrationDTO.java b/src/main/java/com/eactive/apim/portal/apps/app/dto/ApiKeyRegistrationDTO.java new file mode 100644 index 0000000..baded2d --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/app/dto/ApiKeyRegistrationDTO.java @@ -0,0 +1,108 @@ +package com.eactive.apim.portal.apps.app.dto; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.web.multipart.MultipartFile; + +/** + * API Key Registration Session Data + * Holds data across multiple registration steps + */ +@Data +public class ApiKeyRegistrationDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + // Client ID for modification operations + private String clientId; + + // Request type for tracking operation type + private String requestType; // "NEW" or "MODIFY" + + // Existing app icon file ID (for modifications) + private String appIconFileId; + + // Step 1: Basic Information + // Transient field for file upload (not serialized in session) + private transient MultipartFile appIcon; + + // Persisted file data + private String appIconFileName; + private byte[] appIconData; + private String appIconContentType; + + @NotBlank(message = "앱 이름을 입력해주세요.") + @Length(max = 100, message = "앱 이름은 100자를 초과할 수 없습니다.") + private String appName; + + @NotBlank(message = "앱 설명을 입력해주세요.") + @Length(max = 500, message = "앱 설명은 500자를 초과할 수 없습니다.") + private String appDescription; + + private String callbackUrl; + + private List ipWhitelist = new ArrayList<>(); + + // Step 2: API Selection + private List selectedApis = new ArrayList<>(); + + // Helper method to add IP to whitelist + public void addIpAddress(String ip) { + if (ip != null && !ip.trim().isEmpty() && !ipWhitelist.contains(ip)) { + ipWhitelist.add(ip); + } + } + + // Helper method to set IP whitelist from comma-separated string + public void setIpWhitelistFromString(String ipString) { + ipWhitelist.clear(); + if (ipString != null && !ipString.trim().isEmpty()) { + String[] ips = ipString.split(","); + for (String ip : ips) { + String trimmedIp = ip.trim(); + if (!trimmedIp.isEmpty()) { + ipWhitelist.add(trimmedIp); + } + } + } + } + + // Helper method to get IP whitelist as comma-separated string + public String getIpWhitelistAsString() { + return String.join(",", ipWhitelist); + } + + // Helper method to get app icon as base64 data URI for image display + public String getAppIconBase64() { + if (appIconData == null || appIconData.length == 0) { + return null; + } + String base64Data = Base64.getEncoder().encodeToString(appIconData); + String contentType = appIconContentType != null ? appIconContentType : "image/png"; + return "data:" + contentType + ";base64," + base64Data; + } + + // Validation helpers + public boolean isStep1Complete() { + // callbackUrl is optional, so we only check required fields + // For modifications, appIconFileId indicates an existing icon + boolean hasIcon = (appIconData != null && appIconData.length > 0) + || (appIconFileId != null && !appIconFileId.trim().isEmpty()); + return hasIcon && + appName != null && !appName.trim().isEmpty() && + appDescription != null && !appDescription.trim().isEmpty(); + } + + public boolean isStep2Complete() { + return selectedApis != null && !selectedApis.isEmpty(); + } + + public boolean isComplete() { + return isStep1Complete() && isStep2Complete(); + } +} diff --git a/src/main/java/com/eactive/apim/portal/apps/app/dto/AppRequestDTO.java b/src/main/java/com/eactive/apim/portal/apps/app/dto/AppRequestDTO.java index c034fe9..2889f4c 100644 --- a/src/main/java/com/eactive/apim/portal/apps/app/dto/AppRequestDTO.java +++ b/src/main/java/com/eactive/apim/portal/apps/app/dto/AppRequestDTO.java @@ -44,6 +44,14 @@ public class AppRequestDTO { private String reason; + private String appDescription; + + private String callbackUrl; + + private String ipWhitelist; + + private String appIconFileId; + private LocalDateTime createdDate; private String prevApiList; diff --git a/src/main/java/com/eactive/apim/portal/apps/app/dto/ClientDTO.java b/src/main/java/com/eactive/apim/portal/apps/app/dto/ClientDTO.java index 552eb51..016a0bb 100644 --- a/src/main/java/com/eactive/apim/portal/apps/app/dto/ClientDTO.java +++ b/src/main/java/com/eactive/apim/portal/apps/app/dto/ClientDTO.java @@ -45,6 +45,10 @@ public class ClientDTO { private String appstatus; + private String appDescription; + + private String appIconFileId; + private List apiList = new ArrayList<>(); } diff --git a/src/main/java/com/eactive/apim/portal/apps/app/mapper/AppRequestMapper.java b/src/main/java/com/eactive/apim/portal/apps/app/mapper/AppRequestMapper.java index 0be97f5..d6318c1 100644 --- a/src/main/java/com/eactive/apim/portal/apps/app/mapper/AppRequestMapper.java +++ b/src/main/java/com/eactive/apim/portal/apps/app/mapper/AppRequestMapper.java @@ -4,6 +4,7 @@ package com.eactive.apim.portal.apps.app.mapper; import com.eactive.apim.portal.apprequest.entity.AppRequest; import com.eactive.apim.portal.apps.apiservice.mapper.ApiServiceApiMapper; import com.eactive.apim.portal.apps.app.dto.AppRequestDTO; +import com.eactive.apim.portal.apps.app.dto.ClientDTO; import com.eactive.apim.portal.apps.approval.mapper.ApprovalMapper; import com.eactive.apim.portal.apps.user.mapper.PortalOrgMapper; import com.eactive.eai.data.mapper.BaseMapperConfig; @@ -13,4 +14,53 @@ import org.mapstruct.Mapper; @Mapper(config = BaseMapperConfig.class, uses = {PortalOrgMapper.class, ApiServiceApiMapper.class, ApprovalMapper.class}) public interface AppRequestMapper extends GenericMapper { + /** + * AppRequest를 ClientDTO로 간단하게 매핑합니다. + * 뷰에서 AppRequest를 ClientDTO와 동일한 형식으로 표시하기 위해 사용됩니다. + * + * @param appRequest 앱 요청 엔티티 + * @return ClientDTO 표시용 DTO + */ + default ClientDTO mapToClientDTO(AppRequest appRequest) { + if (appRequest == null) { + return null; + } + + ClientDTO dto = new ClientDTO(); + + // 기본 식별 정보 + dto.setClientid(appRequest.getId()); // AppRequest ID를 임시 client ID로 사용 + dto.setClientname(appRequest.getClientName()); + + // 앱 상세 정보 + dto.setAppDescription(appRequest.getAppDescription()); + dto.setAppIconFileId(appRequest.getAppIconFileId()); + + // 네트워크 설정 + dto.setRedirecturi(appRequest.getCallbackUrl()); + dto.setAllowedips(appRequest.getIpWhitelist()); + + // 상태 정보 (ApprovalStatus → appstatus 매핑) + if (appRequest.getStatus() != null) { + switch (appRequest.getStatus()) { + case APPROVED: + dto.setAppstatus("1"); // 승인됨 = 활성화 + break; + case DENIED: + dto.setAppstatus("0"); // 거부됨 = 비활성화 + break; + default: + dto.setAppstatus("2"); // 대기중/진행중 = 보류 + break; + } + } + + // 수정 날짜 (createdDate를 modifiedon으로 사용) + dto.setModifiedon(appRequest.getCreatedDate()); + + // API 목록은 별도 처리 필요 (콤마로 구분된 문자열 → List) + // 필요시 컨트롤러에서 추가 처리 + + return dto; + } } diff --git a/src/main/java/com/eactive/apim/portal/apps/app/service/AppServiceFacade.java b/src/main/java/com/eactive/apim/portal/apps/app/service/AppServiceFacade.java index d4828df..b765fec 100644 --- a/src/main/java/com/eactive/apim/portal/apps/app/service/AppServiceFacade.java +++ b/src/main/java/com/eactive/apim/portal/apps/app/service/AppServiceFacade.java @@ -7,12 +7,14 @@ import com.eactive.apim.portal.apprequest.entity.AppRequest; import com.eactive.apim.portal.apprequest.entity.AppRequestType; import com.eactive.apim.portal.apprequest.repository.AppRequestRepository; import com.eactive.apim.portal.approval.entity.Approval; +import com.eactive.apim.portal.approval.statemachine.ProcessingState; +import com.eactive.apim.portal.approval.statemachine.RequestedState; import com.eactive.apim.portal.apps.apis.dto.ApiSpecInfoDto; import com.eactive.apim.portal.apps.apis.service.ApiService; import com.eactive.apim.portal.apps.apiservice.dto.ApiGroupSearch; import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceDTO; -import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceApiDTO; import com.eactive.apim.portal.apps.apiservice.service.ApiServiceService; +import com.eactive.apim.portal.apps.app.dto.ApiKeyRegistrationDTO; import com.eactive.apim.portal.apps.app.dto.AppRequestDTO; import com.eactive.apim.portal.apps.app.dto.ClientDTO; import com.eactive.apim.portal.apps.app.mapper.AppRequestMapper; @@ -21,16 +23,24 @@ import com.eactive.apim.portal.apps.approval.service.ApprovalService; import com.eactive.apim.portal.apps.user.dto.PortalOrgDTO; import com.eactive.apim.portal.apps.user.mapper.PortalOrgMapper; import com.eactive.apim.portal.common.exception.NotFoundException; +import com.eactive.apim.portal.common.user.PortalAuthenticatedUser; import com.eactive.apim.portal.common.util.ApiServiceHelper; +import com.eactive.apim.portal.file.entity.FileInfo; +import com.eactive.apim.portal.file.service.FileService; import com.eactive.apim.portal.portalorg.entity.PortalOrg; +import java.io.IOException; import java.time.LocalDateTime; -import java.util.*; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service @@ -47,53 +57,64 @@ public class AppServiceFacade { private final AppRequestMapper appRequestMapper; private final PortalOrgMapper portalOrgMapper; private final ApiServiceHelper apiServiceHelper; + private final FileService fileService; + private final PasswordEncoder passwordEncoder; - public Page getApiKeyPageForServer(Pageable pageable, PortalOrg portalOrg, String server) { - Page clients = credentialRepository.findAllByOrgidAndServer(pageable, portalOrg.getId(), server); - return clients.map(credentialMapper::toVo); - } + public List getApikeyList(PortalOrg portalOrg) { - public List getApiKeyList(PortalOrg portalOrg, String server) { - List clients = credentialRepository.findAllByOrgidAndServer(portalOrg.getId(), server); + List clients = credentialRepository.findAllByOrgid(portalOrg.getId()); return clients.stream().map(credentialMapper::toVo).collect(Collectors.toList()); } - public ClientDTO getApiKey(String orgid, String clientId, String server) { - return credentialRepository.findByClientidAndOrgidAndServer(clientId, orgid, server).map(credentialMapper::toVo).orElse(null); + public List getPendingApiKeyList(PortalOrg portalOrg) { + List appRequests = appRequestRepository.findAllByOrgAndTypeIsInAndApproval_ApprovalStatusIn(portalOrg, Arrays.asList(AppRequestType.NEW, AppRequestType.MODIFY, AppRequestType.DELETE), + Arrays.asList(new ProcessingState(), new RequestedState())); + + return appRequests; + } + + public ClientDTO getApiKey(String orgid, String clientId) { + return credentialRepository.findByClientidAndOrgid(clientId, orgid).map(credentialMapper::toVo).orElse(null); + } + + /** + * AppRequest ID와 조직 정보로 AppRequest를 조회합니다. + * API 그룹 및 API 목록 정보를 함께 처리하여 반환합니다. + * + * @param id AppRequest ID + * @param portalOrg 포털 조직 + * @return AppRequest DTO (없으면 null) + */ + public AppRequestDTO getAppRequestById(String id, PortalOrg portalOrg) { + return getApiRequestByIdAndPortalOrg(id, portalOrg); } public Page getApiRequestHistory(Pageable pageable, PortalOrgDTO portalOrg) { - return appRequestRepository.findAllByOrgAndTypeIsIn(pageable, portalOrgMapper.toEntity(portalOrg), Arrays.asList(AppRequestType.NEW,AppRequestType.MODIFY, AppRequestType.DELETE)).map(appRequestMapper::toVo); - } - - public Page getApiRequestProdHistory(Pageable pageable, PortalOrgDTO portalOrg) { - return appRequestRepository.findAllByOrgAndTypeIsIn(pageable, portalOrgMapper.toEntity(portalOrg), Arrays.asList(AppRequestType.PROD_NEW,AppRequestType.PROD_MODIFY, AppRequestType.PROD_DELETE)).map(appRequestMapper::toVo); + return appRequestRepository.findAllByOrgAndTypeIsIn(pageable, portalOrgMapper.toEntity(portalOrg), Arrays.asList(AppRequestType.NEW, AppRequestType.MODIFY, AppRequestType.DELETE)).map(appRequestMapper::toVo); } public AppRequestDTO createAppRequest(AppRequestDTO appRequest) { - setApiGroupsFromApiList(appRequest); AppRequest request = appRequestRepository.save(appRequestMapper.toEntity(appRequest)); - if (request.getType() != null && (request.getType().equals(AppRequestType.MODIFY) || request.getType().equals(AppRequestType.DELETE) || - request.getType().equals(AppRequestType.PROD_MODIFY) || request.getType().equals(AppRequestType.PROD_DELETE))) { + if (request.getType() != null && (request.getType().equals(AppRequestType.MODIFY) || request.getType().equals(AppRequestType.DELETE))) { Optional client = credentialRepository.findById(request.getClientId()); if (client.isPresent()) { request.setClientName(client.get().getClientname()); - if(client.get().getApiList() != null) { + if (client.get().getApiList() != null) { // 기존 API 목록을 저장 String existingApiList = client.get().getApiList().stream() - .map(ApiSpecInfo::getApiId) - .collect(Collectors.joining(",")); + .map(ApiSpecInfo::getApiId) + .collect(Collectors.joining(",")); request.setPrevApiList(existingApiList); } - if(AppRequestType.DELETE.equals(request.getType()) || AppRequestType.PROD_DELETE.equals(request.getType())) { + if (AppRequestType.DELETE.equals(request.getType())) { request.setApiList(request.getPrevApiList()); } } else { @@ -108,22 +129,6 @@ public class AppServiceFacade { return appRequestMapper.toVo(request); } - private void setApiGroupsFromApiList(AppRequestDTO appRequest) { - if (StringUtils.isEmpty(appRequest.getApiList())) { - return; - } - - Set uniqueGroupIds = Arrays.stream(appRequest.getApiList().split(",")) - .map(apiId -> apiServiceService.findApiServiceByApiId(apiId)) - .filter(Objects::nonNull) - .flatMap(apiService -> apiService.getApiGroupApiList().stream()) - .map(ApiServiceApiDTO::getApiGroupId) - .collect(Collectors.toSet()); - - appRequest.setApiGroupList(String.join(",", uniqueGroupIds)); - } - - public void beginApproval(String approvalId) { approvalService.beginApproval(approvalId); } @@ -132,27 +137,11 @@ public class AppServiceFacade { appRequestRepository.findByIdAndOrg(id, portalOrg).ifPresent(approvalService::cancelAppApproval); } - public List getProdApiRequestHistory(String clientid) { - return appRequestRepository.findAllByClientIdsContainsAndTypeIsIn(clientid,Arrays.asList(AppRequestType.PROD_NEW,AppRequestType.PROD_MODIFY, AppRequestType.PROD_DELETE)).stream().map(appRequestMapper::toVo).collect(Collectors.toList()); - } - - - public AppRequestDTO getApiRequestProdByIdAndPortalOrg(String id, PortalOrg portalOrg) { - AppRequestDTO appRequest = appRequestRepository.findByIdAndOrgAndTypeIsIn(id, portalOrg, - Arrays.asList(AppRequestType.PROD_NEW,AppRequestType.PROD_MODIFY, AppRequestType.PROD_DELETE)).map(this::convertToAppRequestDTO).orElse(null); - - if(appRequest != null) { - processApiGroups(appRequest); - processApiList(appRequest); - } - return appRequest; - } public AppRequestDTO getApiRequestByIdAndPortalOrg(String id, PortalOrg org) { AppRequestDTO appRequest = appRequestRepository.findByIdAndOrg(id, org).map(this::convertToAppRequestDTO).orElse(null); - if(appRequest != null) { - processApiGroups(appRequest); + if (appRequest != null) { processApiList(appRequest); } return appRequest; @@ -167,16 +156,6 @@ public class AppServiceFacade { return dto; } - private void processApiGroups(AppRequestDTO appRequest) { - - if (!StringUtils.isEmpty(appRequest.getApiGroupList())) { - String[] apiGroupList = appRequest.getApiGroupList().split(","); - for (String apiGroupId : apiGroupList) { - appRequest.getApiServiceDTOList().add(apiServiceService.getApiGroupById(apiGroupId)); - } - } - } - private void processApiList(AppRequestDTO appRequest) { if (!StringUtils.isEmpty(appRequest.getApiList())) { @@ -192,4 +171,140 @@ public class AppServiceFacade { } } } + + /** + * ApiKeyRegistrationDTO를 기반으로 AppRequest를 생성합니다. + * + * @param registration API Key 등록 정보 + * @param portalOrg 포털 조직 + * @return 생성된 AppRequest DTO + * @throws IOException 파일 처리 중 오류 발생 시 + */ + public AppRequestDTO createAppRequestFromRegistration(ApiKeyRegistrationDTO registration, PortalOrg portalOrg) throws IOException { + // 1. 앱 아이콘 파일 저장 + String appIconFileId = null; + + if (registration.getAppIconData() != null && registration.getAppIconData().length > 0) { + FileInfo fileInfo = fileService.createSingleFileFromBytes(registration.getAppIconFileName(), registration.getAppIconContentType(), registration.getAppIconData()); + appIconFileId = fileInfo.getFileId(); + } + + // 2. AppRequestDTO 생성 및 필드 매핑 + AppRequestDTO appRequestDTO = new AppRequestDTO(); + appRequestDTO.setOrg(portalOrgMapper.toVo(portalOrg)); + appRequestDTO.setType(AppRequestType.NEW); + + // 기본 정보 매핑 + appRequestDTO.setClientName(registration.getAppName()); + appRequestDTO.setAppDescription(registration.getAppDescription()); + appRequestDTO.setCallbackUrl(registration.getCallbackUrl()); + appRequestDTO.setAppIconFileId(appIconFileId); + + // IP 화이트리스트 매핑 (List → comma-separated String) + if (registration.getIpWhitelist() != null && !registration.getIpWhitelist().isEmpty()) { + appRequestDTO.setIpWhitelist(String.join(",", registration.getIpWhitelist())); + } + + // 선택된 API 목록 매핑 (List → comma-separated String) + if (registration.getSelectedApis() != null && !registration.getSelectedApis().isEmpty()) { + appRequestDTO.setApiList(String.join(",", registration.getSelectedApis())); + } + + // 3. 기존 createAppRequest 메소드 호출하여 승인 프로세스 시작 + return createAppRequest(appRequestDTO); + } + + /** + * ApiKeyRegistrationDTO를 기반으로 수정 AppRequest를 생성합니다. + * + * @param registration API Key 수정 정보 + * @param portalOrg 포털 조직 + * @return 생성된 AppRequest DTO + * @throws IOException 파일 처리 중 오류 발생 시 + */ + public AppRequestDTO createModifyRequestFromRegistration(ApiKeyRegistrationDTO registration, PortalOrg portalOrg) throws IOException { + // 1. 기존 Credential 정보 조회 + ClientDTO existingClient = getApiKey(portalOrg.getId(), registration.getClientId()); + if (existingClient == null) { + throw new NotFoundException("Client not found: " + registration.getClientId()); + } + + // 2. 앱 아이콘 파일 저장 (변경된 경우) + String appIconFileId = null; + + // 새로운 아이콘 데이터가 있으면 저장 + if (registration.getAppIconData() != null && registration.getAppIconData().length > 0) { + FileInfo fileInfo = fileService.createSingleFileFromBytes(registration.getAppIconFileName(), registration.getAppIconContentType(), registration.getAppIconData()); + appIconFileId = fileInfo.getFileId(); + } + // 새로운 아이콘이 없으면 기존 아이콘 ID 사용 (registration에서 가져오거나 기존 클라이언트에서 가져옴) + else if (registration.getAppIconFileId() != null) { + appIconFileId = registration.getAppIconFileId(); + } else { + appIconFileId = existingClient.getAppIconFileId(); + } + + // 3. AppRequestDTO 생성 및 필드 매핑 + AppRequestDTO appRequestDTO = new AppRequestDTO(); + appRequestDTO.setOrg(portalOrgMapper.toVo(portalOrg)); + appRequestDTO.setType(AppRequestType.MODIFY); + appRequestDTO.setClientId(registration.getClientId()); // 수정할 클라이언트 ID 설정 + + // 기본 정보 매핑 + appRequestDTO.setClientName(registration.getAppName()); + appRequestDTO.setAppDescription(registration.getAppDescription()); + appRequestDTO.setCallbackUrl(registration.getCallbackUrl()); + appRequestDTO.setAppIconFileId(appIconFileId); + + // IP 화이트리스트 매핑 (List → comma-separated String) + if (registration.getIpWhitelist() != null && !registration.getIpWhitelist().isEmpty()) { + appRequestDTO.setIpWhitelist(String.join(",", registration.getIpWhitelist())); + } + + // 선택된 API 목록 매핑 (List → comma-separated String) + if (registration.getSelectedApis() != null && !registration.getSelectedApis().isEmpty()) { + appRequestDTO.setApiList(String.join(",", registration.getSelectedApis())); + } + + // 4. 기존 createAppRequest 메소드 호출하여 승인 프로세스 시작 + // createAppRequest 내부에서 MODIFY 타입인 경우 기존 API 목록을 prevApiList에 저장함 + return createAppRequest(appRequestDTO); + } + + /** + * 사용자의 비밀번호를 검증합니다. + * Client Secret 조회 등 민감한 작업 수행 시 본인 확인을 위해 사용됩니다. + * + * @param user 인증된 사용자 정보 + * @param password 검증할 비밀번호 (평문) + * @return 비밀번호 일치 여부 + */ + public boolean verifyUserPassword(PortalAuthenticatedUser user, String password) { + if (user == null || password == null) { + return false; + } + + try { + // PasswordEncoder를 사용하여 평문 비밀번호와 저장된 해시를 비교 + return passwordEncoder.matches(password, user.getPassword()); + } catch (Exception e) { + // 비밀번호 검증 중 오류 발생 시 false 반환 (보안상 구체적인 오류 노출 방지) + return false; + } + } + + /** + * API Key(Credential)를 즉시 삭제합니다. + * 승인 프로세스 없이 바로 삭제 처리됩니다. + * + * @param orgId 조직 ID + * @param clientId 삭제할 클라이언트 ID + * @throws NotFoundException 클라이언트를 찾을 수 없는 경우 + */ + public void deleteApp(String orgId, String clientId) { + Credential credential = credentialRepository.findByClientidAndOrgid(clientId, orgId) + .orElseThrow(() -> new NotFoundException("Client not found: " + clientId)); + + credentialRepository.delete(credential); + } } diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/constant/Constants.java b/src/main/java/com/eactive/apim/portal/apps/commission/constant/Constants.java new file mode 100755 index 0000000..62df1d0 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/constant/Constants.java @@ -0,0 +1,26 @@ +package com.eactive.apim.portal.apps.commission.constant; + +/** + * Application constants. + */ +public final class Constants { + + public static final String SYSTEM_ACCOUNT = "system"; + + public static final String APIM_FOR_OBP_KEY = "x-obp-trust-system"; + + public static final String APIM_CODE_FOR_OBP_KEY = "x-obp-partnercode"; + + public static final String SMS_URL = "/api/messaging/sms"; + + public static final String COMMISSION_URL = "/api/billing/billing/findBillingForCondition"; + + public static final String COMMISSION_PRINT_URL = "/api/billing/billing/findBillingForCondition/print"; + + public static final String OBP_ORGANIZATION_URL = "/api/customer/findCustomerByBusinessManRegistrationNo/"; + + public static String LANGUAGE = "ko"; + + private Constants() { + } +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/controller/CommissionController.java b/src/main/java/com/eactive/apim/portal/apps/commission/controller/CommissionController.java new file mode 100755 index 0000000..4ca5ee7 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/controller/CommissionController.java @@ -0,0 +1,241 @@ +package com.eactive.apim.portal.apps.commission.controller; + +import com.eactive.apim.portal.apps.commission.constant.Constants; +import com.eactive.apim.portal.apps.commission.dto.CommissionDTO; +import com.eactive.apim.portal.apps.commission.dto.CommissionSearch; +import com.eactive.apim.portal.apps.commission.exception.ErrorUtil; +import com.eactive.apim.portal.apps.commission.service.ExternalService; +import com.eactive.apim.portal.common.util.SecurityUtil; +import com.eactive.apim.portal.portalproperty.service.PortalPropertyService; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections.MapUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Controller +@RequestMapping(value = "/commission") +@Secured("ROLE_APP") +@RequiredArgsConstructor +public class CommissionController { + + private final Logger log = LoggerFactory.getLogger(CommissionController.class); + + private final ExternalService externalService; + private final PortalPropertyService portalPropertyService; + + @GetMapping("/manage") + public String commissionManagePage(Model model) { + // 기본 정보 설정 + model.addAttribute("organization", SecurityUtil.getUserOrg()); + return "apps/commission/commissionManage"; + } + + @GetMapping("/print/{year}/{month}") + public String commissionPrintPage( + @PathVariable("year") String year, + @PathVariable("month") String month, + Model model) { + + CommissionDTO commissionDTO = null; + CommissionSearch search = new CommissionSearch(); + search.setPartnerCode(SecurityUtil.getUserOrg().getOrgCode()); + search.setYear(year); + search.setMonth(month); + + if (!StringUtils.isEmpty(search.getPartnerCode())) { + try { + String obmUrl = portalPropertyService.getPortalPropertiesAsMap("Portal").getOrDefault("obp.obm.url", ""); + String url = obmUrl + Constants.COMMISSION_PRINT_URL; + String result = externalService.getResponseHttpPost(url, toJson(search)); + HashMap returnObj = new ObjectMapper().readValue(result, HashMap.class); + + if (!StringUtils.isEmpty(returnObj.get("error"))) { + HashMap error = (HashMap) returnObj.get("error"); + model.addAttribute("error", error.get("message").toString()); + return "apps/commission/commissionPrint"; + } + + if (StringUtils.pathEquals(search.getPartnerCode(), "000002-01")) { + log.debug("Found Together : " + search.getPartnerCode()); + search.setPartnerCode("000002-02"); + String togetherResult = externalService.getResponseHttpPost(url, toJson(search)); + + HashMap togetherLendingReturnObj = new ObjectMapper().readValue(togetherResult, HashMap.class); + log.debug("togetherLendingReturnObj : " + togetherLendingReturnObj.toString()); + if (!StringUtils.isEmpty(togetherLendingReturnObj.get("error"))) { + HashMap error = (HashMap) togetherLendingReturnObj.get("error"); + model.addAttribute("error", error.get("message").toString()); + return "apps/commission/commissionPrint"; + } + + HashMap mergeMap = mergeCommissionData(returnObj, togetherLendingReturnObj); + result = new ObjectMapper().writeValueAsString(mergeMap); + } + commissionDTO = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).readValue(result, CommissionDTO.class); + } catch (Exception e) { + log.warn(e.getMessage(), e); + model.addAttribute("error", "수수료 조회에 실패하였습니다."); + return "apps/commission/commissionPrint"; + } + } + + // Model에 데이터 바인딩 + model.addAttribute("commission", commissionDTO); + model.addAttribute("organization", SecurityUtil.getUserOrg().getOrgName()); + model.addAttribute("year", year); + model.addAttribute("month", month); + model.addAttribute("toDay", java.time.LocalDate.now().toString()); + + return "apps/commission/commissionPrint"; + } + + // ==================== API Endpoints ==================== + + @PostMapping() + public ResponseEntity list(@RequestBody CommissionSearch search) { + CommissionDTO commissionDTO = null; + search.setPartnerCode(SecurityUtil.getUserOrg().getOrgCode()); + + if (!StringUtils.isEmpty(search.getPartnerCode())) { + try { + String obmUrl = portalPropertyService.getPortalPropertiesAsMap("Portal").getOrDefault("obp.obm.url", ""); + String url = obmUrl + Constants.COMMISSION_URL; + String result = externalService.getResponseHttpPost(url, toJson(search)); + HashMap returnObj = new ObjectMapper().readValue(result, HashMap.class); + if (!StringUtils.isEmpty(returnObj.get("error"))) { + HashMap error = (HashMap) returnObj.get("error"); + return ErrorUtil.create("fail.commission.serverError", error.get("message").toString()); + } + + if (StringUtils.pathEquals(search.getPartnerCode(), "000002-01")) { + log.debug("Found Together : " + search.getPartnerCode()); + search.setPartnerCode("000002-02"); + String togetherResult = externalService.getResponseHttpPost(url, toJson(search)); + + HashMap togetherLendingReturnObj = new ObjectMapper().readValue(togetherResult, HashMap.class); + log.debug("togetherLendingReturnObj : " + togetherLendingReturnObj.toString()); + if (!StringUtils.isEmpty(togetherLendingReturnObj.get("error"))) { + HashMap error = (HashMap) togetherLendingReturnObj.get("error"); + return ErrorUtil.create("fail.commission.serverError", error.get("message").toString()); + } + + HashMap mergeMap = mergeCommissionData(returnObj, togetherLendingReturnObj); + result = new ObjectMapper().writeValueAsString(mergeMap); + } + commissionDTO = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).readValue(result, CommissionDTO.class); + } catch (Exception e) { + log.warn(e.getMessage(), e); + return ErrorUtil.create("fail.commission.list", "수수료 조회에 실패하였습니다."); + } + return ResponseEntity.ok().body(commissionDTO); + } + return ErrorUtil.create("fail.commission.needPartnerCode"); + } + + private String toJson(CommissionSearch search) { + try { + Map jsonMap = new HashMap<>(); + jsonMap.put("partnerCode", search.getPartnerCode()); + jsonMap.put("targetOnMonth", search.getYear() + search.getMonth()); + + return new ObjectMapper().writeValueAsString(jsonMap); + } catch (Exception e) { + log.warn("Failed to serialize CommissionSearch to JSON", e); + return "{}"; + } + } + + /** + * Safely parse double value from HashMap + * Handles both numeric types and string representations + */ + private double safeGetDouble(HashMap map, String key) { + Object value = map.get(key); + if (value == null) { + return 0.0; + } + try { + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } else if (value instanceof String) { + return Double.parseDouble((String) value); + } + return 0.0; + } catch (NumberFormatException e) { + log.warn("Failed to parse double value for key: {} with value: {}", key, value); + return 0.0; + } + } + + public HashMap mergeCommissionData(HashMap o1, HashMap o2) { + + HashMap mergeMap = new HashMap(); + + String o1Status = MapUtils.getString(o1, "status"); + String o2Status = MapUtils.getString(o2, "status"); + String resultStatus = null; + if (Integer.parseInt(o1Status) <= Integer.parseInt(o2Status)) { + resultStatus = o1Status; + } else { + resultStatus = o2Status; + } + double apiTotalValueSum = safeGetDouble(o1, "apiTotalValueSum") + safeGetDouble(o2, "apiTotalValueSum"); + double apiSum = safeGetDouble(o1, "apiSum") + safeGetDouble(o2, "apiSum"); + double apiTotalValueSum2 = safeGetDouble(o1, "apiTotalValueSum2") + safeGetDouble(o2, "apiTotalValueSum2"); + double apiSum2 = safeGetDouble(o1, "apiSum2") + safeGetDouble(o2, "apiSum2"); + double productTotalValueCountSum = safeGetDouble(o1, "productTotalValueCountSum") + safeGetDouble(o2, "productTotalValueCountSum"); + double productTotalValueAmountSum = safeGetDouble(o1, "productTotalValueAmountSum") + safeGetDouble(o2, "productTotalValueAmountSum"); + double productSum = safeGetDouble(o1, "productSum") + safeGetDouble(o2, "productSum"); + double productTotalValueCountSum2 = safeGetDouble(o1, "productTotalValueCountSum2") + safeGetDouble(o2, "productTotalValueCountSum2"); + double productTotalValueAmountSum2 = safeGetDouble(o1, "productTotalValueAmountSum2") + safeGetDouble(o2, "productTotalValueAmountSum2"); + double productSum2 = safeGetDouble(o1, "productSum2") + safeGetDouble(o2, "productSum2"); + double totalValueCountSum = safeGetDouble(o1, "totalValueCountSum") + safeGetDouble(o2, "totalValueCountSum"); + double totalValueCountSum2 = safeGetDouble(o1, "totalValueCountSum2") + safeGetDouble(o2, "totalValueCountSum2"); + double totalValueAmountSum = safeGetDouble(o1, "totalValueAmountSum") + safeGetDouble(o2, "totalValueAmountSum"); + double totalValueAmountSum2 = safeGetDouble(o1, "totalValueAmountSum2") + safeGetDouble(o2, "totalValueAmountSum2"); + double sum = safeGetDouble(o1, "sum") + safeGetDouble(o2, "sum"); + double sum2 = safeGetDouble(o1, "sum2") + safeGetDouble(o2, "sum2"); + + List o1List = (ArrayList) o1.get("list"); + List o2pList = (ArrayList) o2.get("list"); + o1List.addAll(o2pList); + + mergeMap.put("status", resultStatus); + mergeMap.put("apiTotalValueSum", String.format("%.2f", apiTotalValueSum)); + mergeMap.put("apiSum", String.format("%.2f", apiSum)); + mergeMap.put("apiTotalValueSum2", String.format("%.2f", apiTotalValueSum2)); + mergeMap.put("apiSum2", String.format("%.2f", apiSum2)); + mergeMap.put("productTotalValueCountSum", String.format("%.2f", productTotalValueCountSum)); + mergeMap.put("productTotalValueAmountSum", String.format("%.2f", productTotalValueAmountSum)); + mergeMap.put("productSum", String.format("%.2f", productSum)); + mergeMap.put("productTotalValueCountSum2", String.format("%.2f", productTotalValueCountSum2)); + mergeMap.put("productTotalValueAmountSum2", String.format("%.2f", productTotalValueAmountSum2)); + mergeMap.put("productSum2", String.format("%.2f", productSum2)); + mergeMap.put("totalValueCountSum", String.format("%.2f", totalValueCountSum)); + mergeMap.put("totalValueCountSum2", String.format("%.2f", totalValueCountSum2)); + mergeMap.put("totalValueAmountSum", String.format("%.2f", totalValueAmountSum)); + mergeMap.put("totalValueAmountSum2", String.format("%.2f", totalValueAmountSum2)); + mergeMap.put("sum", String.format("%.2f", sum)); + mergeMap.put("sum2", String.format("%.2f", sum2)); + mergeMap.put("list", o1List); + + return mergeMap; + } +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionDTO.java b/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionDTO.java new file mode 100755 index 0000000..52281a3 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionDTO.java @@ -0,0 +1,28 @@ +package com.eactive.apim.portal.apps.commission.dto; + +import java.util.List; +import lombok.Data; + +@Data +public class CommissionDTO { + + private String status; + private String apiTotalValueSum; + private String apiSum; + private String apiTotalValueSum2; + private String apiSum2; + private String productTotalValueCountSum; + private String productTotalValueAmountSum; + private String productSum; + private String productTotalValueCountSum2; + private String productTotalValueAmountSum2; + private String productSum2; + private String totalValueCountSum; + private String totalValueCountSum2; + private String totalValueAmountSum; + private String totalValueAmountSum2; + private String sum; + private String sum2; + private List list; + private String documentFormatNo; +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionList.java b/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionList.java new file mode 100755 index 0000000..d967539 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionList.java @@ -0,0 +1,32 @@ +package com.eactive.apim.portal.apps.commission.dto; + +import lombok.Data; + +/** + * Created by jskim on 17. 01. 26. + * + * @author jskim + */ +@Data +public class CommissionList { + + private String paymentTargetName; + private String paymentTargetType; + private String value; + private String minimumAmount; + private String maximumAmount; + private String totalCount; + private String totalCount2; + private String totalValue; + private String totalValue2; + private String minimumAmount2; + private String maximumAmount2; + private String paymentBaseName; + private String paymentTimingName; + private String valueDivisionName; + private String sum; + private String sum2; + private String detailFeeTypeName; + private String value2; + private String changeReason2; +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionSearch.java b/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionSearch.java new file mode 100755 index 0000000..70b1e78 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/dto/CommissionSearch.java @@ -0,0 +1,17 @@ +package com.eactive.apim.portal.apps.commission.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class CommissionSearch { + + @ApiModelProperty(value = "대상년") + private String year; + + @ApiModelProperty(value = "대상월") + private String month; + + private String partnerCode; + +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/exception/ErrorUtil.java b/src/main/java/com/eactive/apim/portal/apps/commission/exception/ErrorUtil.java new file mode 100755 index 0000000..ce0f6db --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/exception/ErrorUtil.java @@ -0,0 +1,27 @@ +package com.eactive.apim.portal.apps.commission.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +/** + * Created by ybsong on 16. 12. 7. + * + * @author ybsong + */ +public class ErrorUtil { + public static ResponseEntity create(HttpStatus status, String message, String description) { + return new ResponseEntity<>(new ErrorVM(message, description), status); + } + + public static ResponseEntity create(HttpStatus status, String message) { + return create(status, message, null); + } + + public static ResponseEntity create(String message, String description) { + return create(HttpStatus.BAD_REQUEST, message, description); + } + + public static ResponseEntity create(String message) { + return create(message, null); + } +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/exception/ErrorVM.java b/src/main/java/com/eactive/apim/portal/apps/commission/exception/ErrorVM.java new file mode 100755 index 0000000..8a00cd6 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/exception/ErrorVM.java @@ -0,0 +1,43 @@ +package com.eactive.apim.portal.apps.commission.exception; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import lombok.Data; + +/** + * View Model for transferring error message with a list of field errors. + */ +@Data +public class ErrorVM implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String message; + private final String description; + + private List fieldErrors; + + public ErrorVM(String message) { + this(message, null); + } + + public ErrorVM(String message, String description) { + this.message = message; + this.description = description; + } + + public ErrorVM(String message, String description, List fieldErrors) { + this.message = message; + this.description = description; + this.fieldErrors = fieldErrors; + } + + public void add(String objectName, String field, String message) { + if (fieldErrors == null) { + fieldErrors = new ArrayList<>(); + } + fieldErrors.add(new FieldErrorVM(objectName, field, message)); + } + +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/exception/FieldErrorVM.java b/src/main/java/com/eactive/apim/portal/apps/commission/exception/FieldErrorVM.java new file mode 100755 index 0000000..7b5315f --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/exception/FieldErrorVM.java @@ -0,0 +1,33 @@ +package com.eactive.apim.portal.apps.commission.exception; + +import java.io.Serializable; + +public class FieldErrorVM implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String objectName; + + private final String field; + + private final String message; + + public FieldErrorVM(String dto, String field, String message) { + this.objectName = dto; + this.field = field; + this.message = message; + } + + public String getObjectName() { + return objectName; + } + + public String getField() { + return field; + } + + public String getMessage() { + return message; + } + +} diff --git a/src/main/java/com/eactive/apim/portal/apps/commission/service/ExternalService.java b/src/main/java/com/eactive/apim/portal/apps/commission/service/ExternalService.java new file mode 100755 index 0000000..561e720 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/commission/service/ExternalService.java @@ -0,0 +1,71 @@ +package com.eactive.apim.portal.apps.commission.service; + +import com.eactive.apim.portal.apps.commission.constant.Constants; +import com.eactive.apim.portal.portalproperty.service.PortalPropertyService; +import java.util.Map; +import javax.inject.Inject; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +/** + * 외부 API 호출 서비스 + * RestTemplate 기반으로 외부 시스템과 HTTP 통신을 수행합니다. + * + * @author ybsong + * @since 2017-03-02 + */ +@Service +@Transactional +@RequiredArgsConstructor +public class ExternalService { + + private final Logger log = LoggerFactory.getLogger(ExternalService.class); + + private final RestTemplate restTemplate; + private final PortalPropertyService portalPropertyService; + + /** + * HTTP POST 요청을 통해 외부 API를 호출하고 응답을 받습니다. + * + * @param url 호출할 API URL + * @param payload 요청 본문 (JSON 문자열) + * @return API 응답 본문 (문자열), 오류 발생 시 null + */ + public String getResponseHttpPost(String url, String payload) { + try { + + Map portalProperties = portalPropertyService.getPortalPropertiesAsMap("Portal"); + + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set(Constants.APIM_FOR_OBP_KEY, portalProperties.getOrDefault("obp.api_key","APIMPT-0002-QVBJTVBULTAwMDI=")); + headers.set(Constants.APIM_CODE_FOR_OBP_KEY, portalProperties.getOrDefault("obp.partner_code","100001-01")); + + // HTTP 요청 엔티티 생성 (헤더 + 본문) + HttpEntity requestEntity = new HttpEntity<>(payload, headers); + + // POST 요청 실행 + ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class); + + // 응답 본문 반환 + return response.getBody(); + + } catch (RestClientException e) { + log.error("Failed to call external API: url={}, error={}", url, e.getMessage(), e); + return null; + } catch (Exception e) { + log.error("Unexpected error during HTTP POST: url={}", url, e); + return null; + } + } +} diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/controller/PartnershipApplicationController.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/controller/PartnershipApplicationController.java similarity index 81% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/controller/PartnershipApplicationController.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/controller/PartnershipApplicationController.java index 46c7e2a..07eedda 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/controller/PartnershipApplicationController.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/controller/PartnershipApplicationController.java @@ -1,7 +1,7 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.controller; +package com.eactive.apim.portal.apps.community.partnership.controller; -import com.eactive.apim.portal.apps.community.partnershipapplication.dto.PartnershipApplicationDTO; -import com.eactive.apim.portal.apps.community.partnershipapplication.service.PartnershipApplicationFacade; +import com.eactive.apim.portal.apps.community.partnership.dto.PartnershipApplicationDTO; +import com.eactive.apim.portal.apps.community.partnership.service.PartnershipApplicationFacade; import com.eactive.apim.portal.common.util.SecurityUtil; import java.io.IOException; import org.springframework.beans.factory.annotation.Autowired; @@ -44,7 +44,7 @@ public class PartnershipApplicationController { @PostMapping public String createPartnershipApplication(@Valid @ModelAttribute PartnershipApplicationDTO partnershipApplicationDTO, - BindingResult bindingResult, HttpServletRequest httpServletRequest, RedirectAttributes redirectAttributes) throws IOException { + BindingResult bindingResult, HttpServletRequest httpServletRequest, RedirectAttributes redirectAttributes) throws IOException { if (bindingResult.hasErrors()) { return "apps/community/mainPartnershipForm"; } diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/dto/PartnershipApplicationDTO.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/dto/PartnershipApplicationDTO.java similarity index 88% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/dto/PartnershipApplicationDTO.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/dto/PartnershipApplicationDTO.java index 72a08d5..7866253 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/dto/PartnershipApplicationDTO.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/dto/PartnershipApplicationDTO.java @@ -1,4 +1,4 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.dto; +package com.eactive.apim.portal.apps.community.partnership.dto; import java.util.List; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/mapper/PartnershipApplicationMapper.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/mapper/PartnershipApplicationMapper.java similarity index 61% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/mapper/PartnershipApplicationMapper.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/mapper/PartnershipApplicationMapper.java index 529d32c..cf45014 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/mapper/PartnershipApplicationMapper.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/mapper/PartnershipApplicationMapper.java @@ -1,7 +1,7 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.mapper; +package com.eactive.apim.portal.apps.community.partnership.mapper; -import com.eactive.apim.portal.apps.community.partnershipapplication.dto.PartnershipApplicationDTO; +import com.eactive.apim.portal.apps.community.partnership.dto.PartnershipApplicationDTO; import com.eactive.apim.portal.common.mapper.CommonMapper; import com.eactive.apim.portal.partnershipapplication.entity.PartnershipApplication; import org.mapstruct.Mapper; @@ -9,8 +9,8 @@ import org.mapstruct.ReportingPolicy; import org.springframework.stereotype.Component; @Mapper(componentModel = "spring", - uses = {CommonMapper.class}, - unmappedTargetPolicy = ReportingPolicy.IGNORE) + uses = {CommonMapper.class}, + unmappedTargetPolicy = ReportingPolicy.IGNORE) @Component public interface PartnershipApplicationMapper { diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/repository/PartnershipApplicationRepository.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/repository/PartnershipApplicationRepository.java similarity index 86% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/repository/PartnershipApplicationRepository.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/repository/PartnershipApplicationRepository.java index 8f52467..726f4af 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/repository/PartnershipApplicationRepository.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/repository/PartnershipApplicationRepository.java @@ -1,4 +1,4 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.repository; +package com.eactive.apim.portal.apps.community.partnership.repository; import com.eactive.apim.portal.partnershipapplication.entity.PartnershipApplication; import com.eactive.eai.rms.data.EMSDataSource; diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationFacade.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacade.java similarity index 51% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationFacade.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacade.java index 6410d69..4d2289d 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationFacade.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacade.java @@ -1,6 +1,6 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.service; +package com.eactive.apim.portal.apps.community.partnership.service; -import com.eactive.apim.portal.apps.community.partnershipapplication.dto.PartnershipApplicationDTO; +import com.eactive.apim.portal.apps.community.partnership.dto.PartnershipApplicationDTO; import java.io.IOException; public interface PartnershipApplicationFacade { diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationFacadeImpl.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java similarity index 83% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationFacadeImpl.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java index 38284e8..c9019c7 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java @@ -1,7 +1,7 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.service; +package com.eactive.apim.portal.apps.community.partnership.service; -import com.eactive.apim.portal.apps.community.partnershipapplication.dto.PartnershipApplicationDTO; -import com.eactive.apim.portal.apps.community.partnershipapplication.mapper.PartnershipApplicationMapper; +import com.eactive.apim.portal.apps.community.partnership.dto.PartnershipApplicationDTO; +import com.eactive.apim.portal.apps.community.partnership.mapper.PartnershipApplicationMapper; import com.eactive.apim.portal.file.entity.FileInfo; import com.eactive.apim.portal.file.service.FileService; import com.eactive.apim.portal.file.service.FileTypeContext; diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationService.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationService.java similarity index 80% rename from src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationService.java rename to src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationService.java index a00277a..8f76844 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnershipapplication/service/PartnershipApplicationService.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationService.java @@ -1,6 +1,6 @@ -package com.eactive.apim.portal.apps.community.partnershipapplication.service; +package com.eactive.apim.portal.apps.community.partnership.service; -import com.eactive.apim.portal.apps.community.partnershipapplication.repository.PartnershipApplicationRepository; +import com.eactive.apim.portal.apps.community.partnership.repository.PartnershipApplicationRepository; import com.eactive.apim.portal.partnershipapplication.entity.PartnershipApplication; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/eactive/apim/portal/apps/dashboard/controller/DashboardHandler.java b/src/main/java/com/eactive/apim/portal/apps/dashboard/controller/DashboardHandler.java index ade2417..89aa474 100644 --- a/src/main/java/com/eactive/apim/portal/apps/dashboard/controller/DashboardHandler.java +++ b/src/main/java/com/eactive/apim/portal/apps/dashboard/controller/DashboardHandler.java @@ -4,7 +4,6 @@ import com.eactive.apim.portal.apps.dashboard.service.DashboardService; import com.eactive.apim.portal.common.pagerouter.PageHandler; import com.eactive.apim.portal.common.util.SecurityUtil; import com.eactive.apim.portal.portalorg.entity.PortalOrg; -import java.util.List; import javax.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -22,9 +21,7 @@ public class DashboardHandler implements PageHandler { if (SecurityUtil.getPortalAuthenticatedUser() != null && SecurityUtil.getPortalAuthenticatedUser().getPortalOrg() != null) { PortalOrg org = SecurityUtil.getPortalAuthenticatedUser().getPortalOrg(); model.addAttribute("pendingKeyCount", dashboardService.getPendingApiKeyRequestCount(org)); - model.addAttribute("testKeyCount", dashboardService.getTestApiKeyCount(org)); - model.addAttribute("pendingProdCount", dashboardService.getProdApiKeyRequestCount(org)); - model.addAttribute("prodKeyCount", dashboardService.getProdApiKeyCount(org)); + model.addAttribute("testKeyCount", dashboardService.getApiKeyCount(org)); model.addAttribute("totalApi", dashboardService.getTotalApi(org)); model.addAttribute("dailyTotal", dashboardService.getDailyTotalApiUsage(org)); diff --git a/src/main/java/com/eactive/apim/portal/apps/dashboard/service/DashboardService.java b/src/main/java/com/eactive/apim/portal/apps/dashboard/service/DashboardService.java index d227516..b033eda 100644 --- a/src/main/java/com/eactive/apim/portal/apps/dashboard/service/DashboardService.java +++ b/src/main/java/com/eactive/apim/portal/apps/dashboard/service/DashboardService.java @@ -5,24 +5,18 @@ import com.eactive.apim.portal.app.entity.Credential; import com.eactive.apim.portal.app.repository.CredentialRepository; import com.eactive.apim.portal.apprequest.entity.AppRequestType; import com.eactive.apim.portal.apprequest.repository.AppRequestRepository; -import com.eactive.apim.portal.approval.entity.ApprovalStatus; import com.eactive.apim.portal.approval.statemachine.ProcessingState; import com.eactive.apim.portal.approval.statemachine.RequestedState; -import com.eactive.apim.portal.apps.approval.service.ApprovalService; import com.eactive.apim.portal.apps.dashboard.ApiDailyStatistics; import com.eactive.apim.portal.apps.dashboard.repository.PortalStatisticsRepository; import com.eactive.apim.portal.apps.dashboard.repository.PortalStatisticsRepository.TopApiUsage; import com.eactive.apim.portal.common.util.DateUtil; import com.eactive.apim.portal.portalorg.entity.PortalOrg; -import java.text.SimpleDateFormat; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -39,15 +33,12 @@ import org.springframework.transaction.annotation.Transactional; @Service public class DashboardService { - private final static String PROD_SERVER = "PROD"; - private final static String STG_SERVER = "STG"; - private final AppRequestRepository appRequestRepository; private final CredentialRepository credentialRepository; private final PortalStatisticsRepository portalStatisticsRepository; - public int getTestApiKeyCount(PortalOrg org) { - return credentialRepository.countAllByOrgidAndServer(org.getId(), STG_SERVER); + public int getApiKeyCount(PortalOrg org) { + return credentialRepository.countAllByOrgid(org.getId()); } public int getPendingApiKeyRequestCount(PortalOrg org) { @@ -55,18 +46,9 @@ public class DashboardService { Arrays.asList(new ProcessingState(), new RequestedState())); } - public int getProdApiKeyRequestCount(PortalOrg org) { - return appRequestRepository.countAllByOrgAndTypeIsInAndApproval_ApprovalStatusIn(org, Arrays.asList(AppRequestType.PROD_NEW, AppRequestType.PROD_MODIFY, AppRequestType.PROD_DELETE), - Arrays.asList(new ProcessingState(), new RequestedState())); - } - - public int getProdApiKeyCount(PortalOrg org) { - return credentialRepository.findAllByOrgidAndServer(org.getId(), PROD_SERVER).size(); - } - public int getTotalApi(PortalOrg org) { - List credentials = credentialRepository.findAllByOrgidAndServer(org.getId(), PROD_SERVER); + List credentials = credentialRepository.findAllByOrgid(org.getId()); return (int) credentials.stream() .flatMap(credential -> credential.getApiList().stream()) .map(ApiSpecInfo::getApiId) diff --git a/src/main/java/com/eactive/apim/portal/apps/main/controller/IndexController.java b/src/main/java/com/eactive/apim/portal/apps/main/controller/IndexController.java index 2b70e66..fc5e865 100644 --- a/src/main/java/com/eactive/apim/portal/apps/main/controller/IndexController.java +++ b/src/main/java/com/eactive/apim/portal/apps/main/controller/IndexController.java @@ -10,6 +10,7 @@ import com.eactive.apim.portal.apps.community.notice.service.PortalNoticeFacade; import com.eactive.apim.portal.apps.main.service.MainApiFacade; import com.eactive.apim.portal.common.util.SecurityUtil; +import com.eactive.apim.portal.portalproperty.service.PortalPropertyService; import java.util.*; import java.util.stream.Collectors; @@ -26,13 +27,12 @@ public class IndexController { private final ApiSearchFacade apiSearchFacade; private final MainApiFacade mainApiFacade; - private final PortalNoticeFacade portalNoticeFacade; + private final PortalPropertyService portalPropertyService; /** * 메인 페이지 API는 Portal Property 에 main.service.list 에 등록된 그룹을 기준으로 API를 조회함. * 프로퍼티에 등록되어 있어도 어드민의 그룹 표시 설정이 N이면 표시 되지 않음. - * 어드민의 API 스펙의 표시 설정이 N이면 표시되지 않음. - * 그룹 또는 권한이 지정된 경우, 해당사용자의 권한 또는 기관이 일치해야 표시됨. + * 어드민의 API 스펙의 표시 설정이 N이면 표시되지 않음. 그룹 또는 권한이 지정된 경우, 해당사용자의 권한 또는 기관이 일치해야 표시됨. *

* 검색어는 Portal Property 또는 메인 관리 화면에 main.keyword.list 에 등록된 내용이 표시 됨. * @@ -41,23 +41,8 @@ public class IndexController { */ @GetMapping("/") public String index(Model model) { - // Step 1: Fetch and sort API services - List apiServices = getSortedApiServices(null); - // Step 2: Create a map of API ID to ApiServiceDTO for icon mapping - Map mainIconsMap = createMainIconsMap(apiServices); - - // Step 3: Merge all API lists from apiServices - List allApis = getAllApis(apiServices); - - // Step 4: Enrich API spec info DTOs with main icon and service info - List apiSpecInfoDtos = enrichApiSpecInfo(apiServices, allApis, mainIconsMap); - - // Step 5: Calculate total API count - int totalApiCount = calculateTotalApiCount(apiServices); - - // Step 6: Fetch portal notices and hashtags - List portalNotices = portalNoticeFacade.getLatestNotices(); + List services = mainApiFacade.getOpenApiServices(); List hashTags = mainApiFacade.getHashTags(); ApiGroupSearch search = new ApiGroupSearch(); @@ -65,107 +50,19 @@ public class IndexController { int selectedApiCount = (int) searchResult.get("selectedApiCount"); - // 서비스 이용 수 int serviceCount = ((List) searchResult.get("services")).size(); // 승인된 기업 건수 int approvedOrgCount = mainApiFacade.getApprovedOrgCount(); - // Step 7: Add attributes to model - addAttributesToModel(model, apiServices, apiSearchFacade.sortApisByService(apiSpecInfoDtos, apiServices), totalApiCount, portalNotices, hashTags, serviceCount, approvedOrgCount, selectedApiCount); + addAttributesToModel(model, services, hashTags, serviceCount, approvedOrgCount, selectedApiCount); return "apps/main/index"; } - private List getSortedApiServices(String apiId) { - List apiServices = mainApiFacade.getOpenApiServices(apiId); - apiServices.sort(Comparator.comparing(ApiServiceDTO::getDisplayOrder)); - return apiServices; - } - - private Map createMainIconsMap(List apiServices) { - Map mainIconsMap = new HashMap<>(); - apiServices.forEach(service -> - service.getApiGroupApiList().forEach(api -> - mainIconsMap.put(api.getApiId(), service) - ) - ); - return mainIconsMap; - } - - private List getAllApis(List apiServices) { - return apiServices.stream() - .flatMap(service -> service.getApiGroupApiList().stream()) - .collect(Collectors.toList()); - } - - private List enrichApiSpecInfo(List services, List allApis, Map mainIconsMap) { - List apiIds = allApis.stream().map(ApiServiceApiDTO::getApiId).collect(Collectors.toList()); - List apiSpecInfoDtos = mainApiFacade.getOpenApis(apiIds); - apiSpecInfoDtos.forEach(spec -> { - ApiServiceDTO serviceDTO = mainIconsMap.get(spec.getApiId()); - if (serviceDTO != null) { - spec.setMainIcon(serviceDTO.getMainIcon()); - spec.setService(serviceDTO.getGroupName()); - } - }); - - boolean isAuthenticated = SecurityUtil.isAuthenticated(); - String roleCode; - String org; - - if (isAuthenticated) { - roleCode = SecurityUtil.getPortalAuthenticatedUser().getRoleCode().toString(); - org = SecurityUtil.getUserOrg().getId(); - } else { - roleCode = null; - org = null; - } - - List filteredApiSpecInfoDtos = apiSpecInfoDtos.stream() - .filter(spec -> { - if (!isAuthenticated) { - return spec.getDisplayOrg() == null && spec.getDisplayRoleCode() == null; - } - boolean orgMatch = false; - if (org != null) { - orgMatch = spec.getDisplayOrg() == null || spec.getDisplayOrg().isEmpty() || spec.getDisplayOrg().contains(org); - } - boolean roleMatch = spec.getDisplayRoleCode() == null || spec.getDisplayRoleCode().isEmpty() || spec.getDisplayRoleCode().contains(roleCode); - return orgMatch || roleMatch; - }) - .collect(Collectors.toList()); - - Set filteredApiIds = filteredApiSpecInfoDtos.stream() - .map(ApiSpecInfoDto::getApiId) - .collect(Collectors.toSet()); - - services.forEach(service -> { - if (service.getApiGroupApiList() != null) { - List filteredApiList = service.getApiGroupApiList().stream() - .filter(api -> filteredApiIds.contains(api.getApiId())) - .collect(Collectors.toList()); - service.setApiGroupApiList(filteredApiList); - } - }); - - return filteredApiSpecInfoDtos.stream().collect(Collectors.toList()); - } - - private int calculateTotalApiCount(List apiServices) { - return apiServices.stream() - .mapToInt(service -> service.getApiGroupApiList().size()) - .sum(); - } - - private void addAttributesToModel(Model model, List apiServices, - List apiSpecInfoDtos, int totalApiCount, - List portalNotices, List hashTags, int serviceCount, int approvedOrgCount, int selectedApiCount) { + private void addAttributesToModel(Model model, List apiServices, List hashTags, int serviceCount, int approvedOrgCount, int selectedApiCount) { model.addAttribute("services", apiServices); - model.addAttribute("apis", apiSpecInfoDtos); - model.addAttribute("totalApiCount", totalApiCount); - model.addAttribute("portalNotices", portalNotices); model.addAttribute("hashtags", hashTags); model.addAttribute("serviceCount", serviceCount); @@ -173,15 +70,4 @@ public class IndexController { model.addAttribute("selectedApiCount", selectedApiCount); } - @GetMapping("/api_fragments") - public String getApiFragments(@RequestParam(value = "id", required = false) String id, Model model) { - List apiServices = getSortedApiServices(id); - Map mainIconsMap = createMainIconsMap(apiServices); - List allApis = getAllApis(apiServices); - List apiSpecInfoDtos = enrichApiSpecInfo(apiServices, allApis, mainIconsMap); - model.addAttribute("apis", apiSpecInfoDtos); - return "apps/main/apiListFragment :: apiListFragment"; - } - - } diff --git a/src/main/java/com/eactive/apim/portal/apps/main/service/MainApiFacade.java b/src/main/java/com/eactive/apim/portal/apps/main/service/MainApiFacade.java index f0b07ba..d802bd4 100644 --- a/src/main/java/com/eactive/apim/portal/apps/main/service/MainApiFacade.java +++ b/src/main/java/com/eactive/apim/portal/apps/main/service/MainApiFacade.java @@ -7,17 +7,13 @@ import com.eactive.apim.portal.apps.apiservice.dto.ApiServiceDTO; import com.eactive.apim.portal.apps.apiservice.service.ApiServiceService; import com.eactive.apim.portal.apps.user.service.PortalOrgService; import com.eactive.apim.portal.portalproperty.service.PortalPropertyService; - import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; - import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; @Transactional @Service @@ -34,17 +30,13 @@ public class MainApiFacade { return portalOrgService.getActiveApprovedOrgCount(); } - public List getOpenApiServices(String serviceId) { + public List getOpenApiServices() { ApiGroupSearch search = new ApiGroupSearch(); Map property = portalPropertyService.getPortalPropertiesAsMap(PORTAL_PROPERTY); String services = property.getOrDefault("main.service.list", ""); - if (StringUtils.hasText(serviceId) && services.contains(serviceId)) { - search.setGroupIds(Collections.singletonList(serviceId)); - } else { - search.setGroupIds(Arrays.asList(services.split(","))); - } + search.setGroupIds(Arrays.asList(services.replace(" ", "").split(","))); return apiServiceService.searchApiGroups(search); } diff --git a/src/main/java/com/eactive/apim/portal/apps/proxy/ApimProxyController.java b/src/main/java/com/eactive/apim/portal/apps/proxy/ApimProxyController.java deleted file mode 100644 index 13b5b8d..0000000 --- a/src/main/java/com/eactive/apim/portal/apps/proxy/ApimProxyController.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.eactive.apim.portal.apps.proxy; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import javax.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.HttpStatusCodeException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - -@RestController -@RequestMapping("/_proxy") // /proxy 대신 /_proxy 사용 -@Slf4j -public class ApimProxyController { - - private final RestTemplate restTemplate; - private final ProxyProperties proxyProperties; - private final ObjectMapper objectMapper; - private final MediaType JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8); - - - public ApimProxyController( - RestTemplateBuilder restTemplateBuilder, - ProxyProperties proxyProperties, - ObjectMapper objectMapper) { - this.proxyProperties = proxyProperties; - this.objectMapper = objectMapper; - this.restTemplate = restTemplateBuilder - .setConnectTimeout(Duration.ofMillis(proxyProperties.getTimeout().getConnect())) - .setReadTimeout(Duration.ofMillis(proxyProperties.getTimeout().getRead())) - .build(); - } - - private ResponseEntity createJsonResponse(HttpStatus status, String message) { - ObjectNode jsonResponse = objectMapper.createObjectNode() - .put("status", status.value()) - .put("message", message); - return ResponseEntity - .status(status) - .contentType(JSON_UTF8) - .body(jsonResponse.toString()); - } - - @RequestMapping(value = "/**") - public ResponseEntity proxyRequest( - HttpServletRequest request, - @RequestBody(required = false) String body, - @RequestHeader HttpHeaders headers) { - - String targetKey = headers.getFirst("target_host"); - if (targetKey == null || targetKey.trim().isEmpty()) { - log.error("Missing or empty target_host header"); - return createJsonResponse(HttpStatus.BAD_REQUEST, "Error: target_host header is required"); - } - - String targetUrl = proxyProperties.getTargets().get(targetKey.trim().toLowerCase()); - if (targetUrl == null) { - log.error("Invalid target_host: {}. Available targets: {}", - targetKey, proxyProperties.getTargets().keySet()); - return createJsonResponse(HttpStatus.BAD_REQUEST, - "Error: Invalid target_host. Must be one of: " + - String.join(", ", proxyProperties.getTargets().keySet())); - } - - try { - String requestUrl = request.getRequestURI().replace("/_proxy", ""); - URI uri = UriComponentsBuilder - .fromHttpUrl(targetUrl + requestUrl) - .query(request.getQueryString()) - .build() - .toUri(); - - HttpMethod method = HttpMethod.valueOf(request.getMethod()); - - HttpHeaders proxyHeaders = new HttpHeaders(); - headers.forEach((key, value) -> { - if (!key.equalsIgnoreCase("host") && - !key.equalsIgnoreCase("target_host")) { - proxyHeaders.addAll(key, value); - } - }); - - HttpEntity httpEntity = new HttpEntity<>(body, proxyHeaders); - - log.debug("Forwarding request to: {} ({})", targetKey, uri); - ResponseEntity response = restTemplate.exchange( - uri, - method, - httpEntity, - String.class - ); - log.debug("Received response status: {}", response.getStatusCode()); - - // Create JSON response with the original response data - ObjectNode jsonResponse = objectMapper.createObjectNode() - .put("status", response.getStatusCode().value()); - - // Try to parse the response body as JSON, if it fails, include it as a string - try { - jsonResponse.set("data", objectMapper.readTree(response.getBody())); - } catch (Exception e) { - jsonResponse.put("data", response.getBody()); - } - - return ResponseEntity - .status(response.getStatusCode()) - .contentType(JSON_UTF8) - .body(jsonResponse.toString()); - - } catch (HttpStatusCodeException e) { - log.error("Target server returned error: {} for host: {}", e.getStatusCode(), targetKey); - ObjectNode jsonResponse = objectMapper.createObjectNode() - .put("status", e.getStatusCode().value()); - - // Try to parse the error response body as JSON, if it fails, include it as a string - try { - jsonResponse.set("data", objectMapper.readTree(e.getResponseBodyAsString())); - } catch (Exception ex) { - jsonResponse.put("data", e.getResponseBodyAsString()); - } - - return ResponseEntity - .status(e.getStatusCode()) - .contentType(JSON_UTF8) - .body(jsonResponse.toString()); - - } catch (Exception e) { - log.error("Error during proxy request to: {}", targetKey, e); - return createJsonResponse(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage()); - } - } -} diff --git a/src/main/java/com/eactive/apim/portal/apps/proxy/ProxyProperties.java b/src/main/java/com/eactive/apim/portal/apps/proxy/ProxyProperties.java deleted file mode 100644 index 3f021d9..0000000 --- a/src/main/java/com/eactive/apim/portal/apps/proxy/ProxyProperties.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.eactive.apim.portal.apps.proxy; - -import java.util.Map; -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConfigurationProperties(prefix = "proxy") -@Getter -@Setter -public class ProxyProperties { - private Map targets; - private Timeout timeout = new Timeout(); - - @Getter - @Setter - public static class Timeout { - private int connect = 5000; - private int read = 5000; - } -} diff --git a/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java b/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java index 8c8aa29..f2f39c7 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java @@ -262,9 +262,10 @@ public class OrgRegisterFacadeImpl implements OrgRegisterFacade { // PortalOrgService를 통한 기관 등록 PortalOrg newOrg = portalOrgService.registerOrgFromDTOWithFile(orgDTO, uploadedFile); - // 새 사용자 생성 - existingUser.setLoginId(newEmail); - existingUser.setEmailAddr(newEmail); + // 새 사용자 생성 (이메일 소문자 변환 적용) + String normalizedNewEmail = newEmail != null ? newEmail.toLowerCase() : null; + existingUser.setLoginId(normalizedNewEmail); + existingUser.setEmailAddr(normalizedNewEmail); existingUser.setPortalOrg(newOrg); existingUser.setRoleCode(PortalUserEnums.RoleCode.ROLE_CORP_MANAGER); existingUser.setUserStatus(PortalUserEnums.UserStatus.READY); diff --git a/src/main/java/com/eactive/apim/portal/apps/user/facade/UserRegisterFacadeImpl.java b/src/main/java/com/eactive/apim/portal/apps/user/facade/UserRegisterFacadeImpl.java index f28e68c..c34f9a8 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/facade/UserRegisterFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/facade/UserRegisterFacadeImpl.java @@ -132,6 +132,11 @@ public class UserRegisterFacadeImpl implements UserRegisterFacade { return new ValidationResponse(false,"입력값을 확인해 주세요."); } + // 이메일 중복 체크 + if (portalUserService.existsByLoginId(registrationDTO.getLoginId())) { + return new ValidationResponse(false, "이미 사용 중인 이메일입니다."); + } + // 25.10.01 - 휴대폰 번호 중복이여도 가입 가능 // PortalUser existingUser = portalUserRepository.findByUserNameAndMobileNumber(registrationDTO.getUserName(), registrationDTO.getMobileNumber()); // diff --git a/src/main/java/com/eactive/apim/portal/apps/user/repository/PortalOrgRepository.java b/src/main/java/com/eactive/apim/portal/apps/user/repository/PortalOrgRepository.java index 63fd9aa..c555858 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/repository/PortalOrgRepository.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/repository/PortalOrgRepository.java @@ -12,6 +12,11 @@ public interface PortalOrgRepository extends BaseRepository { Optional findByCompRegNo(String compRegNo); + /** + * 사업자등록번호 존재 여부 확인 (중복 데이터가 있어도 안전하게 처리) + */ + boolean existsByCompRegNo(String compRegNo); + long countByOrgStatusAndApprovalStatus(PortalOrgEnums.OrgStatus status, PortalOrgEnums.ApprovalStatus approvalStatus); Optional findById(String orgId); diff --git a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalOrgService.java b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalOrgService.java index bab11aa..560fa51 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalOrgService.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalOrgService.java @@ -59,8 +59,8 @@ public class PortalOrgService { org.setApprovalStatus(ApprovalStatus.PENDING); } - // 사업자등록번호 중복 체크 + // 사업자등록번호 중복 체크 (Spring Data JPA의 existsBy 쿼리 사용 - 중복 데이터에도 안전) public boolean existsByCompRegNo(String compRegNo) { - return portalOrgRepository.findByCompRegNo(compRegNo).isPresent(); + return portalOrgRepository.existsByCompRegNo(compRegNo); } } \ No newline at end of file diff --git a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java index 1c84d81..b95b60e 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java @@ -55,7 +55,9 @@ public class PortalUserAuthService implements UserDetailsService { @Transactional(noRollbackFor = UsernameNotFoundException.class) public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { try { - PortalUser portalUser = findByEmailAddr(username); + // 이메일 소문자 변환 적용 (대소문자 구분 없이 로그인 가능하도록) + String normalizedUsername = username != null ? username.toLowerCase() : null; + PortalUser portalUser = findByEmailAddr(normalizedUsername); RoleCode userRole = portalUser.getRoleCode() == null ? RoleCode.ROLE_USER : portalUser.getRoleCode(); List roles = portalProperties.getPortalSecurity().get(userRole); PortalAuthenticatedUser authenticatedUser = portalUserMapper.portalUserToAuthenticatedUser(portalUser); diff --git a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java index d8b17c5..20921e5 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java @@ -46,11 +46,15 @@ public class PortalUserService { } public Optional findByLoginId(String loginId) { - return portalUserRepository.findByLoginId(loginId); + // 이메일 소문자 변환 적용 + String normalizedLoginId = loginId != null ? loginId.toLowerCase() : null; + return portalUserRepository.findByLoginId(normalizedLoginId); } public PortalUser findByEmailAddr(String emailAddr) { - return portalUserRepository.findPortalUserByEmailAddr(emailAddr) + // 이메일 소문자 변환 적용 + String normalizedEmail = emailAddr != null ? emailAddr.toLowerCase() : null; + return portalUserRepository.findPortalUserByEmailAddr(normalizedEmail) .orElseThrow(() -> new IllegalArgumentException("해당 이메일 주소의 사용자를 찾을 수 없습니다.")); } @@ -59,7 +63,9 @@ public class PortalUserService { } public boolean existsByLoginId(String loginId) { - return portalUserRepository.existsByLoginId(loginId); + // 이메일 소문자 변환 적용 + String normalizedLoginId = loginId != null ? loginId.toLowerCase() : null; + return portalUserRepository.existsByLoginId(normalizedLoginId); } public boolean checkOrgHasOtherUsers(PortalOrg portalOrg) { @@ -137,11 +143,13 @@ public class PortalUserService { } private void mapDtoToEntity(PortalUser user, PortalUserRegistrationDTO dto) { - user.setLoginId(dto.getLoginId()); + // 이메일 소문자 변환 적용 (대소문자 구분 없이 로그인 가능하도록) + String normalizedEmail = dto.getLoginId() != null ? dto.getLoginId().toLowerCase() : null; + user.setLoginId(normalizedEmail); user.setUserName(dto.getUserName()); user.setPasswordHash(passwordEncoder.encode(dto.getPassword())); user.setMobileNumber(dto.getMobileNumber()); - user.setEmailAddr(dto.getLoginId()); + user.setEmailAddr(normalizedEmail); } /** @@ -176,7 +184,9 @@ public class PortalUserService { } public boolean checkPassword(String loginId, String inputPassword) { - PortalUser user = portalUserRepository.findByLoginId(loginId) + // 이메일 소문자 변환 적용 + String normalizedLoginId = loginId != null ? loginId.toLowerCase() : null; + PortalUser user = portalUserRepository.findByLoginId(normalizedLoginId) .orElseThrow(() -> new IllegalArgumentException("해당 사용자를 찾을 수 없습니다.")); return passwordEncoder.matches(inputPassword, user.getPasswordHash()); } diff --git a/src/main/java/com/eactive/apim/portal/common/exception/PortalGlobalExceptionHandler.java b/src/main/java/com/eactive/apim/portal/common/exception/PortalGlobalExceptionHandler.java index 21c7141..e848f6d 100644 --- a/src/main/java/com/eactive/apim/portal/common/exception/PortalGlobalExceptionHandler.java +++ b/src/main/java/com/eactive/apim/portal/common/exception/PortalGlobalExceptionHandler.java @@ -67,7 +67,7 @@ public class PortalGlobalExceptionHandler { log.error(ex.getMessage()); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMessage", ex.getMessage()); - modelAndView.setViewName("common/error/error"); + modelAndView.setViewName("error"); return modelAndView; } @@ -84,7 +84,7 @@ public class PortalGlobalExceptionHandler { log.error(ex.getMessage()); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMessage", ex.getMessage()); - modelAndView.setViewName("common/error/error"); + modelAndView.setViewName("error"); return modelAndView; } @@ -105,7 +105,7 @@ public class PortalGlobalExceptionHandler { log.error("Exception occurred: ", ex); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMessage", ex.getMessage()); - modelAndView.setViewName("common/error/error"); + modelAndView.setViewName("error"); return modelAndView; } diff --git a/src/main/java/com/eactive/apim/portal/common/util/SecurityUtil.java b/src/main/java/com/eactive/apim/portal/common/util/SecurityUtil.java index f94d127..3c6520d 100644 --- a/src/main/java/com/eactive/apim/portal/common/util/SecurityUtil.java +++ b/src/main/java/com/eactive/apim/portal/common/util/SecurityUtil.java @@ -49,9 +49,11 @@ public final class SecurityUtil { public static PortalOrgDTO getUserOrg() { PortalOrgDTO portalOrgDTO = new PortalOrgDTO(); - if (Objects.requireNonNull(getPortalAuthenticatedUser()).getPortalOrg() != null) { - portalOrgDTO.setOrgName(getPortalAuthenticatedUser().getPortalOrg().getOrgName()); - portalOrgDTO.setId(getPortalAuthenticatedUser().getPortalOrg().getId()); + PortalAuthenticatedUser portalAuthenticatedUser = getPortalAuthenticatedUser(); + if (Objects.requireNonNull(portalAuthenticatedUser).getPortalOrg() != null) { + portalOrgDTO.setOrgName(portalAuthenticatedUser.getPortalOrg().getOrgName()); + portalOrgDTO.setId(portalAuthenticatedUser.getPortalOrg().getId()); + portalOrgDTO.setOrgCode(portalAuthenticatedUser.getPortalOrg().getOrgCode()); } return portalOrgDTO; diff --git a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java index c6d6f2e..8b9b684 100644 --- a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java +++ b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java @@ -49,6 +49,8 @@ public class PortalAuthenticationFailureHandler implements AuthenticationFailure @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {AuthenticationException.class, UserNotFoundException.class}) public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException { String username = request.getParameter("id"); + // 이메일 소문자 변환 적용 + String normalizedUsername = username != null ? username.toLowerCase() : null; String ip = request.getRemoteAddr(); String sessionId = request.getSession().getId(); @@ -56,8 +58,8 @@ public class PortalAuthenticationFailureHandler implements AuthenticationFailure logger.error(exception.getLocalizedMessage()); } else if (!(exception instanceof UsernameNotFoundException)) { try { - PortalUser user = portalUserRepository.findPortalUserByEmailAddr(username) - .orElseThrow(() -> new UserNotFoundException(username)); + PortalUser user = portalUserRepository.findPortalUserByEmailAddr(normalizedUsername) + .orElseThrow(() -> new UserNotFoundException(normalizedUsername)); user.setLoginFailureCount(user.getLoginFailureCount() + 1); if (user.getLoginFailureCount() >= 5) { diff --git a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java index 736e4f8..0510d8c 100644 --- a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java +++ b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java @@ -46,7 +46,9 @@ public class PortalAuthenticationSuccessHandler implements AuthenticationSuccess public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { String username = request.getParameter("id"); - PortalUser user = portalUserRepository.findPortalUserByEmailAddr(username).orElse(null); + // 이메일 소문자 변환 적용 + String normalizedUsername = username != null ? username.toLowerCase() : null; + PortalUser user = portalUserRepository.findPortalUserByEmailAddr(normalizedUsername).orElse(null); if (user == null) { response.sendRedirect(request.getContextPath() + "/login?error=true"); return; diff --git a/src/main/java/com/eactive/apim/portal/config/RestTemplateConfig.java b/src/main/java/com/eactive/apim/portal/config/RestTemplateConfig.java new file mode 100644 index 0000000..314d12d --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/config/RestTemplateConfig.java @@ -0,0 +1,35 @@ +package com.eactive.apim.portal.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate 설정 클래스 + * 외부 API 호출을 위한 RestTemplate Bean을 제공합니다. + * + * @author sungpilhyun + * @since 2025-01-16 + */ +@Configuration +public class RestTemplateConfig { + + /** + * RestTemplate Bean 생성 + * + * @return 설정된 RestTemplate 인스턴스 + */ + @Bean + public RestTemplate restTemplate() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + + // 연결 타임아웃: 10초 + factory.setConnectTimeout(10000); + + // 읽기 타임아웃: 30초 + factory.setReadTimeout(30000); + + return new RestTemplate(factory); + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 09dae30..c0060a7 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -13,6 +13,7 @@ spring: devtools: restart: enabled: false + additional-exclude: logback*.xml livereload: enabled: true thymeleaf: diff --git a/src/main/resources/application-gf63.yml b/src/main/resources/application-gf63.yml index d0ad9e3..46a2107 100644 --- a/src/main/resources/application-gf63.yml +++ b/src/main/resources/application-gf63.yml @@ -12,6 +12,7 @@ spring: devtools: restart: enabled: false + additional-exclude: logback*.xml livereload: enabled: true thymeleaf: diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 5698dc6..97170c0 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,4 +1,6 @@ - + + + diff --git a/src/main/resources/message/apim/message_ko.properties b/src/main/resources/message/apim/message_ko.properties index fe38a41..693428a 100644 --- a/src/main/resources/message/apim/message_ko.properties +++ b/src/main/resources/message/apim/message_ko.properties @@ -1,4 +1,4 @@ -title.html=Kbank API Portal +title.html=KJbank API Portal apim.route.register.file=\uCCA8\uBD80\uD30C\uC77C field.required=\uD544\uC218 \uC785\uB825\uD56D\uBAA9\uC785\uB2C8\uB2E4. companyName=\uD68C\uC0AC\uBA85 diff --git a/src/main/resources/static/css/main.css b/src/main/resources/static/css/main.css index 1b38ef5..845c846 100644 --- a/src/main/resources/static/css/main.css +++ b/src/main/resources/static/css/main.css @@ -73,12 +73,12 @@ section, summary { } ::selection { - background-color: rgba(75, 155, 255, 0.2); + background-color: rgba(0, 73, 180, 0.2); color: #1A1A2E; } ::-moz-selection { - background-color: rgba(75, 155, 255, 0.2); + background-color: rgba(0, 73, 180, 0.2); color: #1A1A2E; } @@ -157,33 +157,12 @@ p:last-child { margin-bottom: 0; } -.text-gradient { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.text-gradient-accent { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.text-gradient-warm { - background: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - .text-primary { - color: #4B9BFF; + color: #0049b4; } .text-secondary { - color: #2E7FF7; + color: #c3dfea; } .text-dark { @@ -275,16 +254,16 @@ p:last-child { } a { - color: #4B9BFF; + color: #0049b4; } a:hover { - color: #2E7FF7; + color: #c3dfea; } blockquote { padding: 16px; margin: 16px 0; - border-left: 4px solid #4B9BFF; + border-left: 4px solid #0049b4; background: #F8FAFC; font-style: italic; } @@ -570,7 +549,6 @@ hr { left: -50%; width: 200%; height: 200%; - background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.2) 50%, transparent 70%); transform: rotate(45deg); transition: transform 0.6s ease; transform: translateX(-200%); @@ -594,9 +572,6 @@ hr { --gray-bg: #F8FAFC; --light-bg: #EFF6FF; --border-gray: #E2E8F0; - --gradient-primary: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - --gradient-accent: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - --gradient-warm: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%); --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 12px rgba(75, 155, 255, 0.1); --shadow-lg: 0 8px 24px rgba(75, 155, 255, 0.15); @@ -620,23 +595,24 @@ hr { top: 0; left: 0; right: 0; - background: rgba(255, 255, 255, 0.95); + background-color: #ffffff; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); - box-shadow: var(--shadow-sm); z-index: 1000; - height: 80px; + height: 112px; transition: all 0.3s ease; + border-bottom: 1px solid #dddddd; } .header-content { display: flex; align-items: center; justify-content: space-between; - height: 80px; - max-width: 1280px; + height: 65px; + max-width: 1920px; margin: 0 auto; padding: 0 20px; + margin-top: 20px; } .header-left { @@ -644,8 +620,8 @@ hr { align-items: center; } .header-left .logo { - height: 45px; - width: auto; + height: 22px; + width: 114px; } .logo-wrapper { @@ -658,7 +634,7 @@ hr { display: flex; align-items: center; gap: 12px; - height: 45px; + height: 22px; z-index: 10; } .logo a { @@ -669,29 +645,23 @@ hr { text-decoration: none; } .logo img { - height: 45px; - width: auto; + height: 22px; + width: 114px; } .logo-text { font-size: 16px; font-weight: 700; - color: var(--primary-blue); - padding: 4px 12px; - background: var(--light-bg); - border-radius: 20px; + color: var(--text-dark); text-decoration: none; display: inline-block; transition: all 0.3s ease; } .logo-text:hover { - background: var(--primary-blue); - color: var(--white); - transform: translateY(-1px); - box-shadow: var(--shadow-md); + color: var(--primary-blue); } .logo-text:visited { - color: var(--primary-blue); + color: var(--text-dark); } .logo-link, @@ -947,7 +917,6 @@ hr { justify-content: center; gap: 8px; padding: 14px 20px; - background: var(--gradient-primary); color: var(--white); text-decoration: none; border-radius: 12px; @@ -1100,7 +1069,7 @@ hr { } .main-nav.m-nav .nav-list .nav-item .sub-menu a:hover { background: #FFFFFF; - color: #4B9BFF; + color: #0049b4; } .main-nav.m-nav .nav-list .nav-item.expanded .sub-menu { display: block; @@ -1119,6 +1088,52 @@ hr { margin: 0; padding: 0; } +.nav-menu > li { + position: relative; +} +.nav-menu > li.submenu-open > .nav-link { + background: var(--light-bg); + color: var(--primary-blue); +} +.nav-menu > li.submenu-open .sub-menu { + visibility: visible; + opacity: 1; + transform: translateY(0); +} +.nav-menu > li .sub-menu { + position: absolute; + top: calc(100% + 8px); + left: 0; + min-width: 200px; + background: var(--white); + border: 1px solid var(--border-gray); + border-radius: 12px; + box-shadow: var(--shadow-xl); + padding: 8px 0; + visibility: hidden; + opacity: 0; + transform: translateY(-10px); + transition: all 0.3s ease; + z-index: 100; + list-style: none; + margin: 0; +} +.nav-menu > li .sub-menu li { + margin: 0; +} +.nav-menu > li .sub-menu li a { + display: block; + padding: 8px 24px; + color: var(--text-dark); + text-decoration: none; + font-size: 14px; + font-weight: 500; + transition: all 0.3s ease; +} +.nav-menu > li .sub-menu li a:hover { + background: var(--light-bg); + color: var(--primary-blue); +} .nav-link { display: flex; @@ -1133,9 +1148,7 @@ hr { transition: all 0.3s ease; } .nav-link:hover { - background: var(--light-bg); color: var(--primary-blue); - transform: translateY(-2px); } .nav-icon { @@ -1147,7 +1160,6 @@ hr { align-items: center; gap: 8px; text-decoration: none; - background: var(--gradient-primary); color: var(--white); padding: 12px 24px; border-radius: 50px; @@ -1161,12 +1173,12 @@ hr { } body { - padding-top: 80px; + padding-top: 112px; } @media (max-width: 768px) { .global-header { - height: 60px; + height: 90px; } .global-header .container .header-content { padding: 0 16px; @@ -1184,254 +1196,269 @@ body { display: none; } } -.global-footer { - background: #1A1A2E; - color: #FFFFFF; - padding: 80px 0 40px; -} -@media (max-width: 768px) { - .global-footer { - padding: 48px 0 32px; - } -} - -.footer-top { - display: grid; - grid-template-columns: 2fr 3fr; - gap: 80px; - margin-bottom: 64px; - max-width: 1280px; - margin-left: auto; - margin-right: auto; - padding: 0 24px; -} -@media (max-width: 1024px) { - .footer-top { - grid-template-columns: 1fr; - gap: 40px; - } -} - -.footer-brand { - max-width: 360px; -} -.footer-brand .footer-logo { - height: 48px; - margin-bottom: 24px; -} -.footer-brand .footer-desc { - font-size: 14px; - line-height: 1.8; - color: rgba(255, 255, 255, 0.7); - margin-bottom: 24px; -} -.footer-brand .footer-newsletter { - margin-bottom: 32px; -} -.footer-brand .footer-newsletter h4 { - font-size: 18px; - font-weight: 600; - margin-bottom: 16px; -} -.footer-brand .footer-newsletter .newsletter-form { +.header-user-info { display: flex; - gap: 8px; -} -.footer-brand .footer-newsletter .newsletter-form input { - flex: 1; - padding: 8px 16px; - background: rgba(255, 255, 255, 0.1); - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 8px; - color: #FFFFFF; - font-size: 14px; -} -.footer-brand .footer-newsletter .newsletter-form input::placeholder { - color: rgba(255, 255, 255, 0.5); -} -.footer-brand .footer-newsletter .newsletter-form input:focus { - background: rgba(255, 255, 255, 0.15); - border-color: #4B9BFF; - outline: none; -} -.footer-brand .footer-newsletter .newsletter-form button { - padding: 8px 24px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - color: #FFFFFF; - border-radius: 8px; - font-weight: 600; - font-size: 14px; - transition: all 0.3s ease; -} -.footer-brand .footer-newsletter .newsletter-form button:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); -} - -.social-links { - display: flex; - gap: 16px; -} -.social-links a { - width: 44px; - height: 44px; - background: rgba(255, 255, 255, 0.1); - border-radius: 12px; - display: flex; - justify-content: center; align-items: center; - color: #FFFFFF; - transition: all 0.3s ease; - font-size: 20px; + gap: 6px; + padding: 4px 6px; + border-radius: 6px; } -.social-links a:hover { - background: #4B9BFF; - transform: translateY(-3px); +.header-user-info .user-identity { + display: flex; + align-items: center; + gap: 2px; } -.social-links a.facebook:hover { - background: #1877f2; +.header-user-info .user-identity .user-icon { + width: 16px; + height: 18px; + display: block; } -.social-links a.twitter:hover { - background: #1da1f2; -} -.social-links a.linkedin:hover { - background: #0077b5; -} -.social-links a.github:hover { - background: #333; -} -.social-links a.youtube:hover { - background: #ff0000; -} - -.footer-links { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 40px; -} -@media (max-width: 1024px) { - .footer-links { - grid-template-columns: repeat(2, 1fr); - } -} -@media (max-width: 768px) { - .footer-links { - grid-template-columns: 1fr; - text-align: center; - } -} - -.footer-column h4 { +.header-user-info .user-identity .user-name { + font-family: "Noto Sans CJK KR", sans-serif; font-size: 16px; - font-weight: 700; - margin-bottom: 24px; - color: #FFFFFF; + font-weight: 400; + color: #515961; + white-space: nowrap; } -.footer-column ul { - list-style: none; +.header-user-info .divider { + font-size: 8px; + color: var(--text-gray); + line-height: 1; } -.footer-column ul li { - margin-bottom: 16px; +.header-user-info .header-link { + font-family: "Noto Sans CJK KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #515961; + text-decoration: none; + white-space: nowrap; + background: none; + border: none; + padding: 0; + cursor: pointer; + transition: color 0.3s ease; } -.footer-column ul li a { - color: rgba(255, 255, 255, 0.7); - font-size: 14px; - transition: all 0.3s ease; +.header-user-info .header-link:hover { + color: var(--primary-blue); +} +.header-user-info .mypage-dropdown { position: relative; } -.footer-column ul li a::after { - content: ""; - position: absolute; - bottom: -2px; - left: 0; - width: 0; - height: 1px; - background: #00D4FF; - transition: all 0.3s ease; -} -.footer-column ul li a:hover { - color: #00D4FF; -} -.footer-column ul li a:hover::after { - width: 100%; -} -.footer-column .footer-badge { - display: inline-flex; +.header-user-info .mypage-dropdown .mypage-toggle { + display: flex; align-items: center; gap: 4px; - padding: 4px 8px; - background: rgba(107, 207, 127, 0.2); - color: #6BCF7F; - border-radius: 50px; - font-size: 12px; - font-weight: 600; - margin-left: 8px; +} +.header-user-info .mypage-dropdown .mypage-dropdown-menu { + position: absolute; + top: calc(100% + 8px); + right: 0; + min-width: 200px; + background: var(--white); + border: 1px solid var(--border-gray); + border-radius: 12px; + box-shadow: var(--shadow-xl); + padding: 8px 0; + visibility: hidden; + opacity: 0; + transform: translateY(-10px); + transition: all 0.3s ease; + z-index: 100; +} +.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list { + list-style: none; + margin: 0; + padding: 0; +} +.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li { + margin: 0; +} +.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li a { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 24px; + color: var(--text-dark); + text-decoration: none; + font-size: 14px; + font-weight: 500; + transition: all 0.3s ease; +} +.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li a i { + font-size: 14px; + width: 16px; + text-align: center; +} +.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li a:hover { + background: var(--light-bg); + color: var(--primary-blue); +} +.header-user-info .mypage-dropdown.active .mypage-dropdown-menu { + visibility: visible; + opacity: 1; + transform: translateY(0); } -.footer-bottom { - padding-top: 40px; - border-top: 1px solid rgba(255, 255, 255, 0.1); - max-width: 1280px; +@media (max-width: 768px) { + .header-user-info { + display: none; + } +} +.global-footer { + background: #FFFFFF; + border-top: 1px solid #E5E7EB; +} +.global-footer .container { + max-width: 1200px; margin: 0 auto; - padding-left: 24px; - padding-right: 24px; + padding: 0 20px; } -.footer-legal { +.footer-content { display: flex; justify-content: space-between; align-items: center; + min-height: 200px; + padding: 40px 0; + gap: 40px; } -@media (max-width: 768px) { - .footer-legal { +@media (max-width: 1024px) { + .footer-content { flex-direction: column; - gap: 24px; - text-align: center; + align-items: flex-start; + gap: 32px; + padding: 32px 0; } } -.footer-legal p { - color: rgba(255, 255, 255, 0.5); - font-size: 14px; - margin: 0; -} -.footer-legal .legal-links { + +.footer-left { display: flex; - gap: 24px; + flex-direction: column; + gap: 16px; } -.footer-legal .legal-links a { - color: rgba(255, 255, 255, 0.7); +.footer-left .footer-logo { + width: 114px; + height: auto; + object-fit: contain; +} +.footer-left .footer-links { + display: flex; + align-items: center; + gap: 8px; +} +.footer-left .footer-links .footer-link { + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #5F666C; + text-decoration: none; + transition: color 0.3s ease; +} +.footer-left .footer-links .footer-link:hover { + color: #0049B4; + text-decoration: underline; +} +.footer-left .footer-links .footer-separator { + color: #D1D5DB; + font-size: 16px; + user-select: none; +} +.footer-left .footer-copyright { + font-family: "Noto Sans KR", sans-serif; font-size: 14px; + font-weight: 400; + color: #9CA3AF; + margin: 0; + line-height: 1.5; +} + +.footer-right { + display: flex; + flex-direction: column; + gap: 16px; + align-items: flex-end; +} +@media (max-width: 1024px) { + .footer-right { + align-items: flex-start; + width: 100%; + } +} +.footer-right .footer-related-sites .related-sites-select { + width: 240px; + height: 44px; + padding: 0 16px; + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #5F666C; + background: #FFFFFF; + border: 1px solid #D1D5DB; + border-radius: 6px; + cursor: pointer; transition: all 0.3s ease; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L6 6L11 1' stroke='%235F666C' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 16px center; + padding-right: 40px; } -.footer-legal .legal-links a:hover { - color: #FFFFFF; +.footer-right .footer-related-sites .related-sites-select:hover { + border-color: #0049B4; +} +.footer-right .footer-related-sites .related-sites-select:focus { + outline: none; + border-color: #0049B4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +@media (max-width: 1024px) { + .footer-right .footer-related-sites .related-sites-select { + width: 100%; + } +} +.footer-right .footer-contact { + font-family: "Noto Sans KR", sans-serif; + font-size: 30px; + font-weight: 700; + color: #1F2937; + margin: 0; + line-height: 1.2; +} +@media (max-width: 1024px) { + .footer-right .footer-contact { + font-size: 24px; + } } -.footer-decoration { - position: relative; - overflow: hidden; +@media (max-width: 576px) { + .footer-content { + padding: 24px 0; + gap: 24px; + } + .footer-left { + gap: 12px; + } + .footer-left .footer-logo { + width: 90px; + } + .footer-left .footer-links { + flex-wrap: wrap; + gap: 6px; + } + .footer-left .footer-links .footer-link, + .footer-left .footer-links .footer-separator { + font-size: 14px; + } + .footer-left .footer-copyright { + font-size: 12px; + } + .footer-right { + gap: 12px; + } + .footer-right .footer-contact { + font-size: 20px; + } } -.footer-decoration::before { - content: ""; - position: absolute; - top: -100px; - right: -100px; - width: 300px; - height: 300px; - background: radial-gradient(circle, rgba(75, 155, 255, 0.1) 0%, transparent 70%); - border-radius: 50%; -} -.footer-decoration::after { - content: ""; - position: absolute; - bottom: -150px; - left: -150px; - width: 400px; - height: 400px; - background: radial-gradient(circle, rgba(0, 212, 255, 0.05) 0%, transparent 70%); - border-radius: 50%; -} - .grid { display: grid; gap: 24px; @@ -1752,14 +1779,7 @@ body { .section-bg-light { background: #EFF6FF; } -.section-bg-gradient { - background: linear-gradient(180deg, #FFFFFF 0%, #EFF6FF 100%); -} -.section-bg-gradient-reverse { - background: linear-gradient(180deg, #EFF6FF 0%, #FFFFFF 100%); -} .section-bg-primary { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); color: #FFFFFF; } .section-bg-dark { @@ -1782,7 +1802,7 @@ body { gap: 4px; padding: 4px 16px; background: #EFF6FF; - color: #4B9BFF; + color: #0049b4; border-radius: 50px; font-size: 14px; font-weight: 600; @@ -1799,12 +1819,6 @@ body { font-size: 32px; } } -.section-header .section-title .title-highlight { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} .section-header .section-subtitle { font-size: 18px; color: #64748B; @@ -1876,7 +1890,7 @@ body { font-size: 20px; } .btn-primary { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); + background: #0049b4; color: #FFFFFF; box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); } @@ -1888,16 +1902,14 @@ body { transform: translateY(-1px); } .btn-secondary { - background: #FFFFFF; - color: #4B9BFF; - border: 2px solid #4B9BFF; + background: #E5E7EB; + color: #5F666C; } .btn-secondary:hover { background: #EFF6FF; transform: translateY(-3px); } .btn-accent { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); color: #FFFFFF; box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); } @@ -1906,7 +1918,6 @@ body { box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); } .btn-warm { - background: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%); color: #FFFFFF; box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); } @@ -1932,12 +1943,12 @@ body { } .btn-ghost { background: transparent; - color: #4B9BFF; + color: #0049b4; border: 2px solid transparent; } .btn-ghost:hover { - background: rgba(75, 155, 255, 0.1); - border-color: #4B9BFF; + background: rgba(0, 73, 180, 0.1); + border-color: #0049b4; } .btn-outline { background: transparent; @@ -1945,8 +1956,8 @@ body { border: 2px solid #E2E8F0; } .btn-outline:hover { - border-color: #4B9BFF; - color: #4B9BFF; + border-color: #0049b4; + color: #0049b4; transform: translateY(-3px); } .btn:disabled, .btn.disabled { @@ -2015,7 +2026,6 @@ body { right: 32px; width: 60px; height: 60px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); border: none; border-radius: 50%; color: #FFFFFF; @@ -2070,7 +2080,7 @@ body { } .btn-cta-primary { background: #FFFFFF; - color: #4B9BFF; + color: #0049b4; padding: 16px 40px; font-size: 18px; box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); @@ -2107,6 +2117,408 @@ body { transform: translateY(-3px); } +.action-btn, +.action-btn-new, +.action-btn-primary, +.action-btn-secondary, +.action-btn-edit, +.action-btn-delete { + padding: 16px 40px; + border-radius: 8px; + font-size: 16px; + font-weight: 500; + text-decoration: none; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + cursor: pointer; + border: none; +} +@media (max-width: 768px) { + .action-btn, + .action-btn-new, + .action-btn-primary, + .action-btn-secondary, + .action-btn-edit, + .action-btn-delete { + padding: 16px 24px; + font-size: 14px; + } +} +.action-btn i, +.action-btn-new i, +.action-btn-primary i, +.action-btn-secondary i, +.action-btn-edit i, +.action-btn-delete i { + font-size: 16px; +} + +.action-btn-new, +.action-btn-primary { + color: #FFFFFF; +} +.action-btn-new:hover, +.action-btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.action-btn-new:active, +.action-btn-primary:active { + transform: translateY(0); +} + +.action-btn-secondary { + background: #FFFFFF; + color: #1A1A2E; + border: 1px solid #E2E8F0; +} +.action-btn-secondary:hover { + background: #F8FAFC; + border-color: #0049b4; + color: #0049b4; +} +.action-btn-secondary:active { + transform: scale(0.98); +} + +.action-btn-edit { + background: #0049b4; + color: #FFFFFF; +} +.action-btn-edit:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + background: #c3dfea; +} +.action-btn-edit:active { + transform: translateY(0); +} + +.action-btn-delete { + background: #FF6B6B; + color: #FFFFFF; +} +.action-btn-delete:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + background: rgb(255, 81.5, 81.5); +} +.action-btn-delete:active { + transform: translateY(0); +} + +.action-btn.btn-list { + background: #FFFFFF; + color: #1A1A2E; + border: 1px solid #E2E8F0; +} +.action-btn.btn-list:hover { + background: #F8FAFC; + border-color: #0049b4; + color: #0049b4; +} +.action-btn.btn-edit { + color: #FFFFFF; +} +.action-btn.btn-edit:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.action-btn.btn-delete { + background: #FF6B6B; + color: #FFFFFF; +} +.action-btn.btn-delete:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} + +.btn-copy { + padding: 8px 16px; + background: rgba(0, 73, 180, 0.1); + color: #0049b4; + border: 1px solid rgba(0, 73, 180, 0.2); + border-radius: 6px; + font-size: 12px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + gap: 4px; +} +.btn-copy:hover { + background: rgba(0, 73, 180, 0.2); + border-color: #0049b4; +} +.btn-copy i { + font-size: 12px; +} + +.btn-action { + padding: 8px 24px; + color: #FFFFFF; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + gap: 4px; +} +.btn-action:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.btn-action i { + font-size: 14px; +} + +.btn-cancel { + padding: 8px 24px; + background: #FFFFFF; + color: #64748B; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + gap: 4px; +} +.btn-cancel:hover { + border-color: #0049b4; + color: #0049b4; +} +.btn-cancel i { + font-size: 14px; +} + +.btn-input-action { + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 172px; + height: 60px; + padding: 10px 24px; + border: none; + border-radius: 12px; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + cursor: pointer; + transition: all 0.3s ease; + white-space: nowrap; +} +.btn-input-action.btn-change { + background: #a4d6ea; +} +.btn-input-action.btn-change:hover { + background: rgb(122.5625, 195.3303571429, 224.4375); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.btn-input-action.btn-change:active { + transform: translateY(0); +} +.btn-input-action.btn-auth { + background: #A4D6EA; +} +.btn-input-action.btn-auth:hover { + background: #c3dfea; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.btn-input-action.btn-auth:active { + transform: translateY(0); +} +.btn-input-action.btn-auth:disabled { + background: #E2E8F0; + cursor: not-allowed; + transform: none; + box-shadow: none; +} +@media (max-width: 768px) { + .btn-input-action { + width: 100%; + min-width: auto; + height: 52px; + font-size: 16px; + } +} + +.btn-upload { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + height: 60px; + padding: 10px 24px; + background-color: #3ba4ed; + color: #FFFFFF; + border: none; + border-radius: 12px; + font-size: 18px; + font-weight: 700; + cursor: pointer; + transition: background-color 0.2s ease; +} +.btn-upload:hover { + background-color: #2b94dd; +} +@media (max-width: 1024px) { + .btn-upload { + font-size: 16px; + height: 50px; + } +} + +.status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 4px 16px; + border-radius: 50px; + font-size: 12px; + font-weight: 600; + white-space: nowrap; + transition: all 0.3s ease; +} +.status-badge.status-pending { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; +} +.status-badge.status-completed { + background: rgba(107, 207, 127, 0.1); + color: #6BCF7F; +} +.status-badge.status-active { + background: rgba(0, 73, 180, 0.1); + color: #0049b4; +} +.status-badge.status-inactive { + background: rgba(100, 116, 139, 0.1); + color: #64748B; +} +.status-badge.status-processing { + background: rgba(255, 217, 61, 0.1); + color: rgb(163, 131.0721649485, 0); +} +.status-badge.status-failed { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; +} +.status-badge.status-success { + background: rgba(107, 207, 127, 0.1); + color: #6BCF7F; +} + +.status-badge-header { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 4px 16px; + border-radius: 50px; + font-size: 12px; + font-weight: 600; + margin-bottom: 16px; + transition: all 0.3s ease; +} +.status-badge-header.status-pending { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; +} +.status-badge-header.status-completed { + background: rgba(107, 207, 127, 0.1); + color: #6BCF7F; +} +.status-badge-header.status-active { + background: rgba(0, 73, 180, 0.1); + color: #0049b4; +} +.status-badge-header.status-inactive { + background: rgba(100, 116, 139, 0.1); + color: #64748B; +} +.status-badge-header.status-processing { + background: rgba(255, 217, 61, 0.1); + color: rgb(163, 131.0721649485, 0); +} + +.badge-sm { + padding: 2px 8px; + font-size: 10px; + border-radius: 6px; +} + +.badge-lg { + padding: 8px 24px; + font-size: 14px; + border-radius: 8px; +} + +.badge-outline { + background: transparent; + border: 1px solid currentColor; +} +.badge-outline.status-pending { + color: #FF6B6B; + border-color: #FF6B6B; +} +.badge-outline.status-completed { + color: #6BCF7F; + border-color: #6BCF7F; +} +.badge-outline.status-active { + color: #0049b4; + border-color: #0049b4; +} +.badge-outline.status-inactive { + color: #64748B; + border-color: #64748B; +} + +.badge-icon i { + margin-right: 4px; + font-size: 0.9em; +} + +.notification-badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 20px; + height: 20px; + padding: 0 4px; + background: #FF6B6B; + color: #FFFFFF; + border-radius: 50%; + font-size: 11px; + font-weight: 700; + line-height: 1; +} +.notification-badge.badge-primary { + background: #0049b4; +} +.notification-badge.badge-success { + background: #6BCF7F; +} +.notification-badge.badge-warning { + background: #FFD93D; + color: #1A1A2E; +} +.notification-badge.badge-danger { + background: #FF6B6B; +} + .card { background: #FFFFFF; border-radius: 20px; @@ -2114,29 +2526,12 @@ body { transition: all 0.3s ease; } .card:hover { - transform: translateY(-5px); box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } .card { position: relative; overflow: hidden; } -.card::before { - content: ""; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(45deg, transparent 30%, rgba(75, 155, 255, 0.03) 50%, transparent 70%); - transform: rotate(45deg); - transition: all 0.5s ease; - opacity: 0; -} -.card:hover::before { - animation: shimmer 0.6s ease; - opacity: 1; -} .api-card { background: #FFFFFF; @@ -2145,7 +2540,6 @@ body { transition: all 0.3s ease; } .api-card:hover { - transform: translateY(-5px); box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } .api-card { @@ -2153,16 +2547,13 @@ body { border: 2px solid #E2E8F0; } .api-card:hover { - border-color: #4B9BFF; - transform: translateY(-8px); + border-color: #0049b4; } .api-card-popular { border-color: #FFD93D; - background: linear-gradient(180deg, rgba(255, 217, 61, 0.05) 0%, #FFFFFF 100%); } .api-card-new { border-color: #6BCF7F; - background: linear-gradient(180deg, rgba(107, 207, 127, 0.05) 0%, #FFFFFF 100%); } .api-card .api-badge { position: absolute; @@ -2193,13 +2584,12 @@ body { align-items: center; font-size: 28px; background: #EFF6FF; - color: #4B9BFF; + color: #0049b4; border-radius: 16px; transition: all 0.3s ease; } .api-card:hover .api-icon { transform: scale(1.1); - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); color: #FFFFFF; } .api-card .api-name { @@ -2233,14 +2623,14 @@ body { display: inline-flex; align-items: center; gap: 4px; - color: #4B9BFF; + color: #0049b4; font-weight: 600; font-size: 14px; transition: all 0.3s ease; } .api-card .api-link:hover { gap: 8px; - color: #2E7FF7; + color: #c3dfea; } .experience-card { @@ -2250,7 +2640,6 @@ body { transition: all 0.3s ease; } .experience-card:hover { - transform: translateY(-5px); box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } .experience-card { @@ -2264,7 +2653,6 @@ body { justify-content: center; align-items: center; font-size: 24px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); color: #FFFFFF; border-radius: 16px; } @@ -2290,7 +2678,7 @@ body { .experience-card .card-metric .metric-value { font-size: 24px; font-weight: 800; - color: #4B9BFF; + color: #0049b4; } .experience-card .card-metric .metric-label { font-size: 12px; @@ -2305,7 +2693,6 @@ body { transition: all 0.3s ease; } .feature-card:hover { - transform: translateY(-5px); box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } .feature-card { @@ -2320,7 +2707,6 @@ body { display: flex; justify-content: center; align-items: center; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); color: #FFFFFF; border-radius: 12px; font-size: 24px; @@ -2347,7 +2733,6 @@ body { transition: all 0.3s ease; } .testimonial-card:hover { - transform: translateY(-5px); box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } .testimonial-card { @@ -2359,7 +2744,7 @@ body { top: 16px; left: 16px; font-size: 60px; - color: #4B9BFF; + color: #0049b4; opacity: 0.1; font-weight: 700; } @@ -2400,7 +2785,6 @@ body { transition: all 0.3s ease; } .pricing-card:hover { - transform: translateY(-5px); box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } .pricing-card { @@ -2408,7 +2792,7 @@ body { position: relative; } .pricing-card.featured { - border: 2px solid #4B9BFF; + border: 2px solid #0049b4; transform: scale(1.05); } .pricing-card.featured .pricing-badge { @@ -2417,7 +2801,6 @@ body { left: 50%; transform: translateX(-50%); padding: 4px 16px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); color: #FFFFFF; border-radius: 50px; font-size: 12px; @@ -2448,10 +2831,6 @@ body { .pricing-card .pricing-header .price .amount { font-size: 48px; font-weight: 800; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; } .pricing-card .pricing-header .price .period { font-size: 16px; @@ -2485,6 +2864,460 @@ body { margin-top: auto; } +.common-container, .org-register-container, .app-management-container, .apikey-detail-container, .apikey-register-container { + max-width: 1280px; + margin: 0 auto; + padding: 60px 24px 80px; +} +@media (max-width: 768px) { + .common-container, .org-register-container, .app-management-container, .apikey-detail-container, .apikey-register-container { + padding: 40px 16px 60px; + } +} + +.common-section-box, .app-list-container, .register-result, .register-form-container { + background-color: #f6f9fb; + border-radius: 12px; + padding: 30px 45px; +} +@media (max-width: 768px) { + .common-section-box, .app-list-container, .register-result, .register-form-container { + padding: 24px; + } +} + +.common-title-bar, .app-list-title-section, .register-title-bar { + background-color: #f6f9fb; + border-radius: 12px; + padding: 14px 45px; + margin-bottom: 30px; +} +@media (max-width: 768px) { + .common-title-bar, .app-list-title-section, .register-title-bar { + padding: 12px 24px; + } +} +.common-title-bar .common-title, .app-list-title-section .common-title, .register-title-bar .common-title { + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 28px; + font-weight: 700; + color: #1A1A2E; + margin: 0; +} +@media (max-width: 768px) { + .common-title-bar .common-title, .app-list-title-section .common-title, .register-title-bar .common-title { + font-size: 22px; + } +} +.common-title-bar .common-subtitle, .app-list-title-section .common-subtitle, .register-title-bar .common-subtitle { + font-size: 16px; + font-weight: 400; + color: #515151; +} +@media (max-width: 768px) { + .common-title-bar .common-subtitle, .app-list-title-section .common-subtitle, .register-title-bar .common-subtitle { + font-size: 14px; + } +} + +.apikey-status-badge, .app-status-badge, .status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 5px 14px; + border-radius: 40px; + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 13px; + font-weight: 700; + color: #FFFFFF; + white-space: nowrap; +} +.apikey-status-badge.status-pending, .status-pending.app-status-badge, .status-pending.status-badge { + background-color: #8c959f; +} +.apikey-status-badge.status-approved, .status-approved.app-status-badge, .status-approved.status-badge, .apikey-status-badge.status-active, .status-active.app-status-badge, .status-active.status-badge { + background-color: #0049b4; +} +.apikey-status-badge.status-changing, .status-changing.app-status-badge, .status-changing.status-badge { + background-color: #88a5f3; +} +.apikey-status-badge.status-inactive, .status-inactive.app-status-badge, .status-inactive.status-badge, .apikey-status-badge.status-rejected, .status-rejected.app-status-badge, .status-rejected.status-badge { + background-color: #dc3545; +} +.apikey-status-badge.status-light.status-pending, .status-light.status-pending.app-status-badge, .status-light.status-pending.status-badge { + background-color: #FFF3CD; + color: #856404; +} +.apikey-status-badge.status-light.status-approved, .status-light.status-approved.app-status-badge, .status-light.status-approved.status-badge, .apikey-status-badge.status-light.status-active, .status-light.status-active.app-status-badge, .status-light.status-active.status-badge { + background-color: #D4EDDA; + color: #155724; +} +.apikey-status-badge.status-light.status-rejected, .status-light.status-rejected.app-status-badge, .status-light.status-rejected.status-badge, .apikey-status-badge.status-light.status-inactive, .status-light.status-inactive.app-status-badge, .status-light.status-inactive.status-badge { + background-color: #F8D7DA; + color: #721C24; +} + +.apikey-status-indicator, .status-indicator { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 4px 16px; + border-radius: 16px; + font-size: 14px; + font-weight: 600; +} +.apikey-status-indicator .status-dot, .status-indicator .status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: currentColor; +} +.apikey-status-indicator.status-active, .status-active.status-indicator { + background-color: #D4EDDA; + color: #155724; +} +.apikey-status-indicator.status-inactive, .status-inactive.status-indicator { + background-color: #F8D7DA; + color: #721C24; +} + +.apikey-icon-display, .app-list-icon, .app-icon-display { + width: 120px; + height: 120px; +} +.apikey-icon-display.icon-sm, .icon-sm.app-list-icon, .icon-sm.app-icon-display { + width: 70px; + height: 70px; +} +@media (max-width: 768px) { + .apikey-icon-display.icon-sm, .icon-sm.app-list-icon, .icon-sm.app-icon-display { + width: 60px; + height: 60px; + } +} +.apikey-icon-display.icon-md, .icon-md.app-list-icon, .icon-md.app-icon-display { + width: 100px; + height: 100px; +} + +.apikey-icon-image, .app-list-icon .app-icon-image, .app-icon-image { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 12px; + border: 2px solid #E2E8F0; +} + +.apikey-icon-placeholder, .app-list-icon .app-icon-placeholder, .app-icon-placeholder { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background-color: #e9ecef; + border-radius: 12px; + color: #868e96; + font-size: 48px; +} +.apikey-icon-placeholder.placeholder-sm, .placeholder-sm.app-icon-placeholder { + font-size: 24px; +} + +.apikey-empty-state, .app-list-empty, .empty-state, .empty-api-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 80px 24px; + text-align: center; +} +.apikey-empty-state .empty-icon, .app-list-empty .empty-icon, .empty-state .empty-icon, .empty-api-state .empty-icon { + font-size: 64px; + margin-bottom: 24px; + opacity: 0.5; +} +.apikey-empty-state h3, .app-list-empty h3, .empty-state h3, .empty-api-state h3 { + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 24px; + font-weight: 700; + color: #1A1A2E; + margin: 0 0 16px; +} +.apikey-empty-state p, .app-list-empty p, .empty-state p, .empty-api-state p { + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 16px; + color: #6e7780; + margin: 0; +} + +.apikey-action-btn, .btn-app-create, .btn-submit { + display: inline-flex; + align-items: center; + justify-content: center; + width: 220px; + height: 60px; + border: none; + border-radius: 12px; + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 18px; + font-weight: 700; + cursor: pointer; + text-decoration: none; + transition: background-color 0.2s ease, transform 0.2s ease; +} +.apikey-action-btn:hover, .btn-app-create:hover, .btn-submit:hover { + transform: translateY(-2px); +} +.apikey-action-btn:active, .btn-app-create:active, .btn-submit:active { + transform: translateY(0); +} +.apikey-action-btn.btn-primary, .btn-primary.btn-app-create, .btn-primary.btn-submit { + background-color: #0049b4; + color: #FFFFFF; +} +.apikey-action-btn.btn-primary:hover, .btn-primary.btn-app-create:hover, .btn-primary.btn-submit:hover { + background-color: #003a91; +} +.apikey-action-btn.btn-secondary, .btn-secondary.btn-app-create, .btn-secondary.btn-submit { + background-color: #e5e7eb; + color: #5f666c; +} +.apikey-action-btn.btn-secondary:hover, .btn-secondary.btn-app-create:hover, .btn-secondary.btn-submit:hover { + background-color: #d1d5db; +} +.apikey-action-btn.btn-accent, .btn-accent.btn-app-create, .btn-accent.btn-submit { + background-color: #3ba4ed; + color: #FFFFFF; +} +.apikey-action-btn.btn-accent:hover, .btn-accent.btn-app-create:hover, .btn-accent.btn-submit:hover { + background-color: #2b94dd; +} +@media (max-width: 768px) { + .apikey-action-btn, .btn-app-create, .btn-submit { + width: 100%; + max-width: 300px; + height: 54px; + font-size: 16px; + } +} + +.apikey-btn-copy, .btn-copy { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 6px 12px; + background: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 6px; + font-size: 14px; + color: #1A1A2E; + cursor: pointer; + transition: all 0.3s ease; +} +.apikey-btn-copy svg, .btn-copy svg { + width: 16px; + height: 16px; +} +.apikey-btn-copy:hover, .btn-copy:hover { + background: #0049b4; + border-color: #0049b4; + color: #FFFFFF; +} +@media (max-width: 768px) { + .apikey-btn-copy, .btn-copy { + align-self: stretch; + justify-content: center; + } +} + +.apikey-detail-section, .detail-section { + background: #FFFFFF; + border-radius: 12px; + padding: 64px; + margin-bottom: 24px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +@media (max-width: 768px) { + .apikey-detail-section, .detail-section { + padding: 32px; + } +} +.apikey-detail-section .section-title, .detail-section .section-title { + font-size: 24px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 24px; + padding-bottom: 16px; +} + +.apikey-detail-grid, .detail-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 24px; +} +@media (max-width: 768px) { + .apikey-detail-grid, .detail-grid { + grid-template-columns: 1fr; + } +} + +.apikey-detail-item, .detail-item { + display: flex; + flex-direction: column; + gap: 8px; +} +.apikey-detail-item.full-width, .full-width.detail-item { + grid-column: 1/-1; +} +.apikey-detail-item .detail-label, .detail-item .detail-label { + font-size: 14px; + font-weight: 600; + color: #64748B; +} +.apikey-detail-item .detail-value, .detail-item .detail-value { + font-size: 16px; + color: #1A1A2E; + word-break: break-word; +} + +.apikey-ip-list, .ip-list { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.apikey-ip-tag, .ip-tag { + display: inline-block; + padding: 4px 16px; + background-color: #EFF6FF; + color: #c3dfea; + border-radius: 6px; + font-size: 14px; + font-family: "Fira Code", "Courier New", monospace; +} + +.apikey-credential-code, .credential-code { + display: inline-block; + padding: 8px 16px; + background-color: #F8FAFC; + border: 1px solid #E2E8F0; + border-radius: 6px; + font-family: "Fira Code", "Courier New", monospace; + font-size: 14px; + color: #c3dfea; +} + +.apikey-secret-box, .secret-box { + display: flex; + align-items: center; + gap: 16px; +} +@media (max-width: 768px) { + .apikey-secret-box, .secret-box { + flex-direction: column; + align-items: flex-start; + } +} + +.apikey-api-list, .api-detail-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.apikey-api-item, .api-list-item { + display: flex; + align-items: center; + gap: 16px; + padding: 16px 24px; + background: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 8px; + transition: all 0.2s; +} +.apikey-api-item:hover, .api-list-item:hover { + border-color: #0049b4; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} +@media (max-width: 768px) { + .apikey-api-item, .api-list-item { + padding: 16px; + gap: 8px; + } +} +.apikey-api-item .api-method, .api-list-item .api-method { + display: inline-block; + padding: 4px 16px; + border-radius: 6px; + font-size: 14px; + font-weight: 700; + font-family: "Fira Code", "Courier New", monospace; + min-width: 80px; + text-align: center; +} +.apikey-api-item .api-method.method-get, .api-list-item .api-method.method-get { + background-color: #D1FAE5; + color: #065F46; +} +.apikey-api-item .api-method.method-post, .api-list-item .api-method.method-post { + background-color: #DBEAFE; + color: #1E40AF; +} +.apikey-api-item .api-method.method-put, .api-list-item .api-method.method-put { + background-color: #FEF3C7; + color: #92400E; +} +.apikey-api-item .api-method.method-delete, .api-list-item .api-method.method-delete { + background-color: #FEE2E2; + color: #991B1B; +} +.apikey-api-item .api-method.method-other, .api-list-item .api-method.method-other { + background-color: #E2E8F0; + color: #1A1A2E; +} +.apikey-api-item .api-name, .api-list-item .api-name { + flex: 1; + font-size: 16px; + font-weight: 500; + color: #1A1A2E; + margin: 0; +} +.apikey-api-item .api-status, .api-list-item .api-status { + padding: 4px 16px; + border-radius: 12px; + font-size: 14px; + font-weight: 600; +} +.apikey-api-item .api-status.status-pending, .api-list-item .api-status.status-pending { + background-color: #FFF3CD; + color: #856404; +} +.apikey-api-item .api-status.status-active, .api-list-item .api-status.status-active { + background-color: #D4EDDA; + color: #155724; +} + +.apikey-form-actions, .detail-actions { + display: flex; + justify-content: center; + gap: 16px; + flex-wrap: wrap; + margin-top: 64px; + padding-top: 64px; + border-top: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .apikey-form-actions, .detail-actions { + flex-direction: column; + align-items: stretch; + } +} +@media (max-width: 768px) { + .apikey-form-actions .btn, .detail-actions .btn { + width: 100%; + } +} + .form-group { margin-bottom: 24px; } @@ -2529,8 +3362,8 @@ body { } .form-control:focus { outline: none; - border-color: #4B9BFF; - box-shadow: 0 0 0 3px rgba(75, 155, 255, 0.1); + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); } .form-control:disabled { background: #F8FAFC; @@ -2624,7 +3457,7 @@ select.form-control { transition: all 0.3s ease; } .form-switch .switch.active { - background: #4B9BFF; + background: #0049b4; } .form-switch .switch.active::after { transform: translateX(24px); @@ -2684,13 +3517,391 @@ select.form-control { } } +.file-upload-wrapper { + display: flex; + gap: 16px; + align-items: center; + width: 100%; +} +@media (max-width: 768px) { + .file-upload-wrapper { + flex-direction: column; + align-items: stretch; + } +} +.file-upload-wrapper .file-name-display { + flex: 1; + padding: 16px; + background: #F8FAFC; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 14px; + color: #64748B; + cursor: default; + transition: all 0.3s ease; +} +.file-upload-wrapper .file-name-display.has-file { + color: #1A1A2E; + background: rgba(0, 73, 180, 0.05); + border-color: #0049b4; +} +.file-upload-wrapper .file-name-display:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.file-upload-wrapper .file-upload-btn { + padding: 16px 24px; + color: #FFFFFF; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + white-space: nowrap; + display: inline-flex; + align-items: center; + gap: 4px; + border: none; +} +@media (max-width: 768px) { + .file-upload-wrapper .file-upload-btn { + justify-content: center; + } +} +.file-upload-wrapper .file-upload-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.file-upload-wrapper .file-upload-btn:active { + transform: translateY(0); +} +.file-upload-wrapper .file-upload-btn i { + font-size: 14px; +} +.file-upload-wrapper .file-remove-btn { + padding: 16px; + background: #FF6B6B; + color: #FFFFFF; + border-radius: 8px; + border: none; + cursor: pointer; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; +} +@media (max-width: 768px) { + .file-upload-wrapper .file-remove-btn { + width: 100%; + height: auto; + padding: 16px; + } +} +.file-upload-wrapper .file-remove-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + background: rgb(255, 81.5, 81.5); +} +.file-upload-wrapper .file-remove-btn:active { + transform: translateY(0); +} +.file-upload-wrapper .file-remove-btn i { + font-size: 14px; +} +.file-upload-wrapper input[type=file] { + display: none; +} + +.form-help-text { + margin-top: 16px; + font-size: 12px; + color: #94A3B8; + line-height: 1.6; +} +.form-help-text p { + margin: 4px 0; + display: flex; + align-items: flex-start; + gap: 4px; +} +.form-help-text p i { + color: #0049b4; + margin-top: 2px; + flex-shrink: 0; +} + +.form-row { + display: flex; + align-items: flex-start; + gap: 40px; + margin-bottom: 50px; +} +@media (max-width: 1024px) { + .form-row { + flex-direction: column; + gap: 12px; + margin-bottom: 30px; + } +} + +.form-label-wrapper { + display: flex; + align-items: center; + gap: 5px; + min-width: 214px; + width: 214px; + flex-shrink: 0; +} +@media (max-width: 1024px) { + .form-label-wrapper { + padding-top: 0; + width: auto; + } +} +.form-label-wrapper.label-offset { + margin-top: 15px; +} +@media (max-width: 1024px) { + .form-label-wrapper.label-offset { + margin-top: 0; + } +} + +.form-label-text { + font-size: 20px; + font-weight: 700; + color: #000000; +} +@media (max-width: 1024px) { + .form-label-text { + font-size: 16px; + } +} +.form-label-text.required::after { + content: "*"; + color: #FF6B6B; + margin-left: 4px; +} + +.required-badge { + background-color: #3ba4ed; + color: #FFFFFF; + font-size: 11px; + font-weight: 400; + padding: 3px 4px 4px; + border-radius: 4px; + line-height: 1; +} + +.form-field-wrapper { + flex: 1; +} +@media (max-width: 768px) { + .form-field-wrapper { + width: 100%; + } +} + +.char-counter-wrapper { + display: block; + text-align: right; + margin-top: 8px; +} +.char-counter-wrapper .char-counter { + font-size: 14px; + color: #94A3B8; +} + +.section-divider { + margin-top: 48px; + padding-top: 32px; + border-top: 1px solid #E2E8F0; +} + +.compound-input { + display: flex; + align-items: center; + gap: 8px; + width: 100%; +} +.compound-input .form-input, +.compound-input .form-select { + flex: 1; + min-width: 0; +} +.compound-input .separator { + color: #64748B; + font-weight: 600; + user-select: none; + flex-shrink: 0; +} +.compound-input .phone-number { + flex: 1; + width: 100%; +} +.compound-input .biz-reg-number { + flex: 1; + width: 100%; +} +@media (max-width: 768px) { + .compound-input { + gap: 4px; + } + .compound-input .separator { + font-size: 14px; + } +} + +.input-with-button { + display: flex; + align-items: center; + gap: 16px; +} +.input-with-button .compound-input, +.input-with-button .auth-input-group { + flex: 1; +} +@media (max-width: 768px) { + .input-with-button { + flex-direction: column; + gap: 8px; + } + .input-with-button .compound-input, + .input-with-button .auth-input-group { + width: 100%; + } +} + +.auth-input-group { + display: flex; + align-items: center; + position: relative; +} +.auth-input-group .form-input { + flex: 1; + padding-right: 100px; +} +.auth-input-group .auth-timer { + position: absolute; + right: 16px; + top: 50%; + transform: translateY(-50%); + font-size: 14px; + font-weight: 600; + color: #FF6B6B; + white-space: nowrap; +} + +.form-actions, .form-actions-center { + display: flex; + justify-content: center; + gap: 16px; + flex-wrap: wrap; + padding-top: 40px; +} +@media (max-width: 768px) { + .form-actions, .form-actions-center { + flex-direction: column-reverse; + align-items: stretch; + gap: 8px; + margin-top: 48px; + padding-top: 32px; + } +} +.form-actions .btn, .form-actions-center .btn, +.form-actions .action-btn-primary, +.form-actions-center .action-btn-primary, +.form-actions .action-btn-secondary, +.form-actions-center .action-btn-secondary { + min-width: 160px; + padding: 16px 40px; +} +@media (max-width: 768px) { + .form-actions .btn, .form-actions-center .btn, + .form-actions .action-btn-primary, + .form-actions-center .action-btn-primary, + .form-actions .action-btn-secondary, + .form-actions-center .action-btn-secondary { + width: 100%; + min-width: auto; + } +} +.form-actions--between { + justify-content: space-between; +} +.form-actions--no-border { + border-top: none; + padding-top: 0; +} +.form-actions--compact { + margin-top: 40px; + padding-top: 24px; +} +.form-actions--with-withdrawal { + position: relative; + justify-content: center; +} +.form-actions--with-withdrawal .withdrawal-link { + position: absolute; + left: 0; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 3px; + width: 150px; + padding: 8px; + background: #E5F2F8; + border-radius: 12px; + color: #5F666C; + font-size: 16px; + font-weight: 400; + text-decoration: none; + cursor: pointer; + transition: all 0.3s ease; +} +.form-actions--with-withdrawal .withdrawal-link:hover { + background: rgb(208.9090909091, 231.9545454545, 242.5909090909); +} +.form-actions--with-withdrawal .withdrawal-link img { + width: 22px; + height: 22px; + object-fit: contain; +} +@media (max-width: 768px) { + .form-actions--with-withdrawal .withdrawal-link { + position: static; + width: 100%; + order: 1; + } +} +.form-actions--with-withdrawal .form-actions-buttons { + display: flex; + gap: 16px; +} +@media (max-width: 768px) { + .form-actions--with-withdrawal .form-actions-buttons { + flex-direction: column-reverse; + width: 100%; + gap: 8px; + } +} +@media (max-width: 768px) { + .form-actions--with-withdrawal { + flex-direction: column; + gap: 16px; + } +} + .modal-backdrop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.6); z-index: 400; opacity: 0; visibility: hidden; @@ -2705,46 +3916,109 @@ select.form-control { position: fixed; top: 0; left: 0; - right: 0; - bottom: 0; - z-index: 500; + width: 100%; + height: 100vh; + z-index: 1000; display: flex; align-items: center; justify-content: center; padding: 24px; opacity: 0; visibility: hidden; - transition: all 0.3s ease; + transition: opacity 0.3s ease, visibility 0.3s ease; + pointer-events: none; + overflow-y: auto; } .modal.show { opacity: 1; visibility: visible; + pointer-events: auto; } .modal.show .modal-dialog { transform: scale(1); } +@media (max-width: 768px) { + .modal { + padding: 16px; + } +} + +.modal-container { + position: relative; + max-width: 820px; + width: 100%; +} +.modal-container.modal-sm { + max-width: 500px; +} +.modal-container.modal-lg { + max-width: 1000px; +} +.modal-container.modal-xl { + max-width: 1200px; +} +@media (max-width: 768px) { + .modal-container { + max-width: 100%; + } +} + +.modal-close { + position: absolute; + top: 0; + right: 0; + transform: translate(100%, -100%); + width: 50px; + height: 50px; + background: #0049b4; + border: none; + border-radius: 50%; + color: #FFFFFF; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + z-index: 500; + transition: all 0.3s ease; + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); +} +.modal-close svg { + width: 14px; + height: 14px; +} +.modal-close i { + font-size: 16px; +} +@media (max-width: 768px) { + .modal-close { + width: 40px; + height: 40px; + } + .modal-close svg { + width: 12px; + height: 12px; + } + .modal-close i { + font-size: 14px; + } +} .modal-dialog { + margin-top: 150px; position: relative; background: #FFFFFF; - border-radius: 16px; - box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); - max-width: 500px; - width: 100%; - max-height: 90vh; + border-radius: 12px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + max-width: 700px; + width: calc(100% - 48px); + max-height: 85vh; display: flex; flex-direction: column; transform: scale(0.95); - transition: all 0.3s ease; -} -.modal-dialog.modal-sm { - max-width: 400px; -} -.modal-dialog.modal-lg { - max-width: 800px; -} -.modal-dialog.modal-xl { - max-width: 1200px; + transition: transform 0.3s ease; + z-index: 500; + margin-left: auto; + margin-right: auto; } .modal-dialog.modal-fullscreen { max-width: 100%; @@ -2755,65 +4029,125 @@ select.form-control { } .modal-header { - padding: 24px; - border-bottom: 1px solid #E2E8F0; + padding: 30px 50px 20px; + background: #C7EAFF; + border-bottom: none; display: flex; align-items: center; justify-content: space-between; + border-top-left-radius: 12px; + border-top-right-radius: 12px; } .modal-header .modal-title { font-size: 24px; font-weight: 600; - color: #1A1A2E; + color: #212529; margin: 0; } -.modal-header .modal-close { - width: 32px; - height: 32px; - display: flex; - justify-content: center; - align-items: center; - background: transparent; - border: none; - border-radius: 8px; - color: #64748B; - font-size: 24px; - cursor: pointer; - transition: all 0.3s ease; -} -.modal-header .modal-close:hover { - background: #F8FAFC; - color: #1A1A2E; +@media (max-width: 768px) { + .modal-header { + padding: 20px 24px 16px; + } + .modal-header .modal-title { + font-size: 18px; + } } .modal-body { - padding: 24px; + padding: 30px 50px; flex: 1; overflow-y: auto; - color: #1A1A2E; + color: #212529; + font-size: 20px; line-height: 1.6; } +.modal-body p { + margin: 0; +} +.modal-body p + p { + margin-top: 16px; +} +.modal-body.text-center { + text-align: center; +} +@media (max-width: 768px) { + .modal-body { + padding: 20px 24px; + font-size: 16px; + } +} .modal-footer { - padding: 24px; - border-top: 1px solid #E2E8F0; + padding: 20px 50px 40px; display: flex; - gap: 16px; - justify-content: flex-end; -} -.modal-footer.modal-footer-center { + gap: 10px; justify-content: center; + border-top: none; +} +.modal-footer.modal-footer-end { + justify-content: flex-end; } .modal-footer.modal-footer-between { justify-content: space-between; } +.modal-footer .btn-modal-cancel { + min-width: 150px; + height: 50px; + padding: 10px 40px; + background: #FFFFFF; + border: 1px solid #dadada; + border-radius: 50px; + font-size: 16px; + font-weight: 700; + color: #5f666c; + cursor: pointer; + transition: all 0.3s ease; +} +.modal-footer .btn-modal-cancel:hover { + background: #f5f5f5; + border-color: #c0c0c0; +} +.modal-footer .btn-modal-cancel:active { + transform: scale(0.98); +} +.modal-footer .btn-modal-confirm { + min-width: 150px; + height: 50px; + padding: 10px 40px; + background: #0049b4; + border: none; + border-radius: 50px; + font-size: 16px; + font-weight: 700; + color: #FFFFFF; + cursor: pointer; + transition: all 0.3s ease; +} +.modal-footer .btn-modal-confirm:hover { + background: #003a91; +} +.modal-footer .btn-modal-confirm:active { + transform: scale(0.98); +} +@media (max-width: 768px) { + .modal-footer { + padding: 16px 24px 24px; + flex-direction: column; + } + .modal-footer .btn-modal-cancel, + .modal-footer .btn-modal-confirm { + width: 100%; + height: 46px; + font-size: 15px; + } +} -.modal-alert .modal-dialog { - max-width: 400px; +.modal-alert .modal-container { + max-width: 500px; } .modal-alert .modal-body { text-align: center; - padding: 32px; + padding: 32px 50px; } .modal-alert .modal-body .alert-icon { width: 64px; @@ -2838,8 +4172,8 @@ select.form-control { color: #FF6B6B; } .modal-alert .modal-body .alert-icon.alert-info { - background: rgba(75, 155, 255, 0.1); - color: #4B9BFF; + background: rgba(0, 73, 180, 0.1); + color: #0049b4; } .modal-alert .modal-body .alert-title { font-size: 24px; @@ -2849,6 +4183,7 @@ select.form-control { } .modal-alert .modal-body .alert-message { color: #64748B; + font-size: 16px; } .breadcrumb { @@ -2869,7 +4204,7 @@ select.form-control { transition: all 0.3s ease; } .breadcrumb .breadcrumb-item a:hover { - color: #4B9BFF; + color: #0049b4; } .breadcrumb .breadcrumb-item.active { color: #1A1A2E; @@ -2905,8 +4240,8 @@ select.form-control { color: #1A1A2E; } .nav-tabs .nav-link.active { - color: #4B9BFF; - border-bottom-color: #4B9BFF; + color: #0049b4; + border-bottom-color: #0049b4; } .nav-tabs .nav-link .badge { padding: 2px 6px; @@ -2937,7 +4272,7 @@ select.form-control { } .nav-pills .nav-link.active { background: #FFFFFF; - color: #4B9BFF; + color: #0049b4; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } @@ -2978,18 +4313,18 @@ select.form-control { } .sidebar-nav .nav-menu .nav-link:hover { background: #F8FAFC; - color: #4B9BFF; + color: #0049b4; } .sidebar-nav .nav-menu .nav-link:hover .nav-icon { - color: #4B9BFF; + color: #0049b4; } .sidebar-nav .nav-menu .nav-link.active { background: #EFF6FF; - color: #4B9BFF; + color: #0049b4; font-weight: 500; } .sidebar-nav .nav-menu .nav-link.active .nav-icon { - color: #4B9BFF; + color: #0049b4; } .sidebar-nav .nav-menu .nav-submenu { margin-left: 40px; @@ -3012,9 +4347,9 @@ select.form-control { pointer-events: none; } .pagination .page-item.active .page-link { - background: #4B9BFF; + background: #0049b4; color: #FFFFFF; - border-color: #4B9BFF; + border-color: #0049b4; } .pagination .page-link { display: flex; @@ -3033,8 +4368,8 @@ select.form-control { } .pagination .page-link:hover { background: #F8FAFC; - border-color: #4B9BFF; - color: #4B9BFF; + border-color: #0049b4; + color: #0049b4; } .pagination .page-link.page-prev, .pagination .page-link.page-next { font-size: 18px; @@ -3052,1000 +4387,2414 @@ select.form-control { .final-cta { position: relative; padding: 150px 0; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); overflow: hidden; } -.hero-section { - position: relative; - padding: 160px 0 100px; - background: linear-gradient(180deg, #EFF6FF 0%, #FFFFFF 100%); - overflow: hidden; +#passwordInputPopup .modal-dialog { + max-width: 450px; } -@media (max-width: 768px) { - .hero-section { - padding: 120px 0 60px; - } +#passwordInputPopup .pop_input_group { + text-align: left; + margin: 0; } - -.hero-patterns { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - pointer-events: none; -} -.hero-patterns .pattern-circle { - position: absolute; - border-radius: 50%; - opacity: 0.1; -} -.hero-patterns .pattern-circle.pattern-1 { - width: 400px; - height: 400px; - background: #00D4FF; - border-radius: 50%; - opacity: 0.1; - position: absolute; - top: -200px; - right: -100px; - animation: float 20s ease-in-out infinite; -} -.hero-patterns .pattern-circle.pattern-2 { - width: 300px; - height: 300px; - background: #FFD93D; - border-radius: 50%; - opacity: 0.1; - position: absolute; - bottom: -150px; - left: -50px; - animation: float 15s ease-in-out infinite reverse; -} -.hero-patterns .pattern-dots { - position: absolute; - top: 50%; - left: 10%; - width: 100px; - height: 100px; - background-image: radial-gradient(circle, #A78BFA 2px, transparent 2px); - background-size: 20px 20px; - opacity: 0.3; -} - -.hero-content { - text-align: center; - position: relative; - z-index: 1; - max-width: 1280px; - margin: 0 auto; - padding: 0 24px; -} - -.hero-badge { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 8px 24px; - background: #FFFFFF; - border: 2px solid #FFD93D; - border-radius: 50px; - margin-bottom: 24px; +#passwordInputPopup .pop_input_field { + width: 100%; + padding: 12px 16px; + border: 1px solid #E2E8F0; + border-radius: 8px; font-size: 14px; - font-weight: 600; - color: #1A1A2E; - animation: slideInDown 0.6s ease-out; + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + transition: all 0.3s ease; + box-sizing: border-box; } -.hero-badge .badge-icon { - font-size: 20px; - animation: bounce 2s infinite; +#passwordInputPopup .pop_input_field:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +#passwordInputPopup .pop_input_field::placeholder { + color: #94A3B8; +} +#passwordInputPopup .pop_input_field.error { + border-color: #FF6B6B; +} +#passwordInputPopup .pop_input_field.error:focus { + border-color: #FF6B6B; + box-shadow: 0 0 0 3px rgba(255, 107, 107, 0.1); +} +#passwordInputPopup .error-message { + color: #FF6B6B; + font-size: 12px; + margin-top: 4px; + display: none; + animation: fadeInDown 0.3s ease; +} +#passwordInputPopup .error-message.show { + display: block; } -.main-headline { - font-size: 56px; - font-weight: 800; - line-height: 1.2; - margin-bottom: 24px; - color: #1A1A2E; - animation: slideInUp 0.8s ease-out; -} -@media (max-width: 768px) { - .main-headline { - font-size: 40px; +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); } } -@media (max-width: 480px) { - .main-headline { - font-size: 32px; - } -} -.main-headline .headline-highlight { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.sub-headline { - font-size: 20px; - font-weight: 400; - line-height: 1.6; - margin-bottom: 40px; - color: #64748B; - animation: slideInUp 0.9s ease-out; -} -@media (max-width: 768px) { - .sub-headline { - font-size: 16px; - } -} - -.hero-buttons { +.auth-group { display: flex; + align-items: center; gap: 16px; - justify-content: center; - margin-bottom: 64px; - animation: slideInUp 1s ease-out; } -@media (max-width: 768px) { - .hero-buttons { - flex-direction: column; - align-items: center; - } +.auth-group.authenticated { + gap: 0; } -.hero-buttons .btn { + +.login-btn { display: inline-flex; align-items: center; + padding: 10px 20px; + color: #1A1A2E; + text-decoration: none; + border: 2px solid #0049b4; + border-radius: 50px; + font-weight: 600; + font-size: 14px; + transition: all 0.3s ease; +} +.login-btn-box { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; + padding: 4px 10px; + color: #212529; + text-decoration: none; + border: 1px solid #212529; + border-radius: 6px; + font-family: "Noto Sans CJK KR", "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-weight: 700; + font-size: 16px; + background: transparent; + transition: all 0.3s ease; +} +.login-btn-box .user-icon { + width: 24px; + height: 24px; + flex-shrink: 0; +} + +.user-profile-dropdown { + position: relative; +} +.user-profile-dropdown .user-profile-btn { + display: flex; + align-items: center; gap: 8px; - padding: 16px 32px; + padding: 10px 20px; + background: #EFF6FF; + border: 2px solid transparent; + border-radius: 50px; + cursor: pointer; + transition: all 0.3s ease; + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 14px; +} +.user-profile-dropdown .user-profile-btn .user-name { + color: #1A1A2E; + font-weight: 600; +} +.user-profile-dropdown .user-profile-btn i { + color: #64748B; + font-size: 12px; + transition: transform all 0.15s ease; +} +.user-profile-dropdown .user-profile-btn:hover { + background: #FFFFFF; + border-color: #0049b4; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.user-profile-dropdown .user-profile-btn:hover .user-name { + color: #0049b4; +} +.user-profile-dropdown .user-profile-btn:hover i { + color: #0049b4; +} +.user-profile-dropdown.active .user-profile-btn i { + transform: rotate(180deg); +} +.user-profile-dropdown.active .profile-dropdown-menu { + visibility: visible; + opacity: 1; + transform: translateY(0); +} +.user-profile-dropdown .profile-dropdown-menu { + position: absolute; + top: calc(100% + 12px); + right: 0; + width: 280px; + background: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 12px; + box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); + visibility: hidden; + opacity: 0; + transform: translateY(-10px); + transition: all all 0.3s ease; + z-index: 100; + overflow: hidden; +} +.user-profile-dropdown .profile-header { + padding: 24px; + color: #FFFFFF; + text-align: center; +} +.user-profile-dropdown .profile-header .user-greeting { + margin: 0 0 4px 0; + font-size: 18px; + font-weight: 700; +} +.user-profile-dropdown .profile-header .user-message { + font-size: 12px; + opacity: 0.9; +} +.user-profile-dropdown .profile-menu-list { + list-style: none; + margin: 0; + padding: 8px 0; +} +.user-profile-dropdown .profile-menu-list li { + margin: 0; +} +.user-profile-dropdown .profile-menu-list li a { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 24px; + color: #1A1A2E; + text-decoration: none; + font-size: 14px; + transition: all 0.15s ease; +} +.user-profile-dropdown .profile-menu-list li a i { + width: 20px; + color: #64748B; + font-size: 14px; +} +.user-profile-dropdown .profile-menu-list li a:hover { + background: #EFF6FF; + color: #0049b4; +} +.user-profile-dropdown .profile-menu-list li a:hover i { + color: #0049b4; +} +.user-profile-dropdown .profile-footer { + padding: 8px 24px 24px; + border-top: 1px solid #E2E8F0; +} +.user-profile-dropdown .profile-footer .logout-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + padding: 12px; + background: #F8FAFC; + color: #1A1A2E; + text-decoration: none; + border-radius: 8px; + font-weight: 600; + font-size: 14px; + transition: all 0.3s ease; +} +.user-profile-dropdown .profile-footer .logout-btn i { + font-size: 14px; +} +.user-profile-dropdown .profile-footer .logout-btn:hover { + background: #FF6B6B; + color: #FFFFFF; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} + +.drawer-user-info { + padding: 24px; + border-bottom: 1px solid rgba(255, 255, 255, 0.2); +} +.drawer-user-info .drawer-profile { + display: flex; + align-items: center; + gap: 16px; +} +.drawer-user-info .drawer-profile .profile-avatar { + width: 60px; + height: 60px; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255, 255, 255, 0.2); + border-radius: 50%; + color: #FFFFFF; +} +.drawer-user-info .drawer-profile .profile-avatar i { + font-size: 32px; +} +.drawer-user-info .drawer-profile .profile-info { + flex: 1; + color: #FFFFFF; +} +.drawer-user-info .drawer-profile .profile-info .profile-name { + margin: 0 0 4px 0; + font-size: 18px; + font-weight: 700; +} +.drawer-user-info .drawer-profile .profile-info .profile-greeting { + font-size: 12px; + opacity: 0.9; +} + +.drawer-logout-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + padding: 14px 20px; + background: #FF6B6B; + color: #FFFFFF; + text-decoration: none; border-radius: 12px; font-weight: 600; font-size: 16px; - text-decoration: none; transition: all 0.3s ease; - cursor: pointer; - border: none; -} -.hero-buttons .btn:hover { - transform: translateY(-3px); -} -.hero-buttons .btn.btn-primary { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - color: #FFFFFF; box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); } -.hero-buttons .btn.btn-primary:hover { - box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); +.drawer-logout-btn i { + font-size: 16px; } -.hero-buttons .btn.btn-secondary { - background: #FFFFFF; - color: #4B9BFF; - border: 2px solid #4B9BFF; +.drawer-logout-btn:hover { + background: #ff3838; + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); } -.hero-buttons .btn.btn-secondary:hover { - background: #EFF6FF; + +@media (max-width: 768px) { + .user-profile-dropdown .profile-dropdown-menu { + width: 260px; + right: -10px; + } } @media (max-width: 480px) { - .hero-buttons .btn { - width: 100%; - justify-content: center; + .user-profile-dropdown .user-profile-btn { + padding: 8px 16px; + } + .user-profile-dropdown .user-profile-btn .user-name { + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .user-profile-dropdown .profile-dropdown-menu { + width: 240px; + right: -20px; } } - -.hero-stats { - display: flex; - justify-content: center; - gap: 64px; - animation: fadeIn 1.2s ease-out; -} -@media (max-width: 768px) { - .hero-stats { - flex-direction: column; - gap: 24px; - } -} -.hero-stats .stat-item { - display: flex; - flex-direction: column; - align-items: center; -} -.hero-stats .stat-item .stat-number { - font-size: 40px; - font-weight: 800; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} -.hero-stats .stat-item .stat-label { - font-size: 14px; - color: #64748B; - font-weight: 500; -} - -.hero-image { - position: relative; - margin-top: 64px; - text-align: center; -} -.hero-image img { - max-width: 100%; - height: auto; - border-radius: 16px; - box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); -} -.hero-image .hero-decoration { - position: absolute; +.data-table { width: 100%; - height: 100%; - top: 0; - left: 0; - pointer-events: none; -} -.hero-image .hero-decoration::before, .hero-image .hero-decoration::after { - content: ""; - position: absolute; - border-radius: 50%; -} -.hero-image .hero-decoration::before { - width: 60px; - height: 60px; - background: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%); - top: -30px; - right: 10%; - animation: bounce 2s infinite; -} -.hero-image .hero-decoration::after { - width: 40px; - height: 40px; - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - bottom: -20px; - left: 15%; - animation: bounce 2s infinite 0.5s; -} - -.api-search-section { - padding: 64px 0; - background: linear-gradient(180deg, #FFFFFF 0%, #EFF6FF 100%); - position: relative; -} -.api-search-section::before { - content: ""; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 600px; - height: 600px; - background: radial-gradient(circle, rgba(75, 155, 255, 0.03) 0%, transparent 70%); - pointer-events: none; -} -.api-search-section .search-container { - max-width: 800px; - margin: 0 auto; - text-align: center; - position: relative; - z-index: 1; -} -.api-search-section .search-form { - margin-bottom: 32px; - animation: slideInUp 0.8s ease-out; -} -.api-search-section .search-wrapper { - display: flex; - gap: 16px; - padding: 0 24px; -} -@media (max-width: 768px) { - .api-search-section .search-wrapper { - flex-direction: column; - gap: 8px; - } -} -.api-search-section .search-input { - flex: 1; - padding: 16px 32px; - font-size: 16px; - border: 2px solid #E2E8F0; - border-radius: 50px; background: #FFFFFF; - transition: all 0.3s ease; - outline: none; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } -.api-search-section .search-input::placeholder { - color: #94A3B8; -} -.api-search-section .search-input:focus { - border-color: #4B9BFF; - box-shadow: 0 0 0 4px rgba(75, 155, 255, 0.1); +.data-table-wrapper { + overflow-x: auto; + margin-bottom: 32px; } @media (max-width: 768px) { - .api-search-section .search-input { - width: 100%; - padding: 16px 24px; + .data-table-wrapper { + border-radius: 12px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } } -.api-search-section .search-button { - padding: 16px 40px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - color: #FFFFFF; - border: none; - border-radius: 50px; - font-size: 16px; +.data-table table { + width: 100%; + border-collapse: collapse; +} +.data-table table thead { + background: #EFF6FF; +} +.data-table table thead tr { + border-bottom: 2px solid #E2E8F0; +} +.data-table table thead th { + padding: 16px 24px; + text-align: left; + font-size: 14px; font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - gap: 8px; - box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + color: #1A1A2E; white-space: nowrap; } -.api-search-section .search-button i { - font-size: 20px; -} -.api-search-section .search-button:hover { - transform: translateY(-2px); - box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); - background: linear-gradient(135deg, rgb(49.5, 140.8333333333, 255) 0%, rgb(21.4400921659, 111.9585253456, 246.0599078341) 100%); -} -.api-search-section .search-button:active { - transform: translateY(0); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); -} @media (max-width: 768px) { - .api-search-section .search-button { - width: 100%; - justify-content: center; - padding: 16px 32px; - } -} -.api-search-section .hashtag-suggestions { - display: flex; - align-items: center; - justify-content: center; - gap: 16px; - flex-wrap: wrap; - padding: 0 24px; - animation: fadeIn 0.8s ease-out 0.2s both; -} -@media (max-width: 768px) { - .api-search-section .hashtag-suggestions { - gap: 8px; - justify-content: flex-start; - } -} -.api-search-section .hashtag-label { - font-size: 14px; - color: #64748B; - font-weight: 500; -} -@media (max-width: 768px) { - .api-search-section .hashtag-label { - width: 100%; - margin-bottom: 4px; - } -} -.api-search-section .hashtag { - display: inline-flex; - align-items: center; - padding: 4px 24px; - background: #FFFFFF; - border: 1px solid #E2E8F0; - border-radius: 50px; - font-size: 14px; - color: #1A1A2E; - text-decoration: none; - transition: all 0.3s ease; - position: relative; - overflow: hidden; -} -.api-search-section .hashtag::before { - content: ""; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - transition: left 0.3s ease; - z-index: 0; -} -.api-search-section .hashtag:hover { - border-color: #4B9BFF; - transform: translateY(-2px); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); - color: #FFFFFF; - position: relative; - z-index: 1; -} -.api-search-section .hashtag:hover::before { - left: 0; -} -@media (max-width: 768px) { - .api-search-section .hashtag { - padding: 4px 16px; + .data-table table thead th { + padding: 8px 16px; font-size: 12px; } } - -.api-showcase { - padding: 100px 0; - background: #FFFFFF; +.data-table table tbody tr { + border-bottom: 1px solid #E2E8F0; + transition: all 0.3s ease; } - -.info-section { - padding: 100px 0; - background: #FFFFFF; - position: relative; +.data-table table tbody tr:last-child { + border-bottom: none; } -.info-section::before { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 1px; - background: linear-gradient(90deg, transparent 0%, #E2E8F0 20%, #E2E8F0 80%, transparent 100%); +.data-table table tbody tr:hover { + background-color: rgba(0, 73, 180, 0.02); } -.info-section .info-wrapper { - display: flex; - flex-direction: column; - align-items: center; - gap: 48px; +.data-table table tbody td { + padding: 16px 24px; + font-size: 14px; + color: #64748B; } -.info-section .image-container { - width: 100%; - max-width: 600px; - margin: 0 auto; +@media (max-width: 768px) { + .data-table table tbody td { + padding: 8px 16px; + font-size: 12px; + } } -.info-section .image-placeholder { - position: relative; - width: 100%; - height: 300px; - background: linear-gradient(135deg, #EFF6FF 0%, rgba(75, 155, 255, 0.1) 100%); - border-radius: 20px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 16px; - box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); - overflow: hidden; -} -.info-section .image-placeholder::before { - content: ""; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: radial-gradient(circle at center, rgba(0, 212, 255, 0.1) 0%, transparent 50%); - animation: rotate 20s linear infinite; -} -.info-section .image-placeholder::after { - content: ""; - position: absolute; - bottom: -20px; - right: -20px; - width: 100px; - height: 100px; - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - border-radius: 50%; - opacity: 0.3; - filter: blur(40px); -} -.info-section .image-placeholder i { - font-size: 64px; - color: #4B9BFF; - z-index: 1; -} -.info-section .image-placeholder span { - font-size: 24px; - font-weight: 600; +.data-table table tbody td a { color: #1A1A2E; - z-index: 1; -} -@media (max-width: 768px) { - .info-section .image-placeholder { - height: 200px; - } - .info-section .image-placeholder i { - font-size: 48px; - } - .info-section .image-placeholder span { - font-size: 20px; - } -} -.info-section .info-content { - text-align: center; - max-width: 800px; - margin: 0 auto; -} -.info-section .highlight-text { - font-size: 24px; - line-height: 1.8; - color: #1A1A2E; - margin-bottom: 48px; - font-weight: 500; -} -.info-section .highlight-text .text-accent { - color: #4B9BFF; - font-weight: 600; -} -@media (max-width: 1024px) { - .info-section .highlight-text { - font-size: 20px; - } -} -@media (max-width: 768px) { - .info-section .highlight-text { - font-size: 16px; - padding: 0 24px; - margin-bottom: 40px; - } -} -.info-section .action-buttons { - display: flex; - gap: 24px; - justify-content: center; - flex-wrap: wrap; -} -@media (max-width: 768px) { - .info-section .action-buttons { - flex-direction: column; - align-items: center; - padding: 0 24px; - } -} -.info-section .action-btn { - display: flex; - align-items: center; - gap: 16px; - padding: 16px 32px; - background: #FFFFFF; - border: 2px solid #E2E8F0; - border-radius: 50px; text-decoration: none; transition: all 0.3s ease; - min-width: 280px; - position: relative; +} +.data-table table tbody td a:hover { + color: #0049b4; +} + +.notice-table { + width: 100%; + background: #FFFFFF; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} +.notice-table-wrapper { + overflow-x: auto; +} +@media (max-width: 768px) { + .notice-table-wrapper { + border-radius: 0; + box-shadow: none; + } +} +.notice-table .table-header { + display: grid; + grid-template-columns: 80px 1fr 120px; + gap: 16px; + padding: 16px 24px; + background: #EFF6FF; + border-bottom: 2px solid #E2E8F0; + font-size: 14px; + font-weight: 600; + color: #1A1A2E; +} +@media (max-width: 1024px) { + .notice-table .table-header { + grid-template-columns: 60px 1fr 100px; + padding: 8px 16px; + font-size: 12px; + } +} +@media (max-width: 768px) { + .notice-table .table-header { + display: none; + } +} +.notice-table .table-header .col-num { + text-align: center; +} +.notice-table .table-header .col-title { + text-align: left; +} +.notice-table .table-header .col-date { + text-align: center; +} +.notice-table .table-row { + display: grid; + grid-template-columns: 80px 1fr 120px; + gap: 16px; + padding: 24px; + border-bottom: 1px solid #E2E8F0; + transition: all 0.3s ease; + cursor: pointer; +} +@media (max-width: 1024px) { + .notice-table .table-row { + grid-template-columns: 60px 1fr 100px; + padding: 16px; + } +} +@media (max-width: 768px) { + .notice-table .table-row { + grid-template-columns: 1fr; + gap: 8px; + padding: 16px; + } +} +.notice-table .table-row:last-child { + border-bottom: none; +} +.notice-table .table-row:hover { + background-color: rgba(0, 73, 180, 0.02); +} +.notice-table .table-row .col-num { + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + color: #64748B; + font-weight: 500; +} +@media (max-width: 768px) { + .notice-table .table-row .col-num { + display: none; + } +} +.notice-table .table-row .col-title { + display: flex; + align-items: center; + font-size: 16px; + color: #1A1A2E; + font-weight: 500; +} +@media (max-width: 768px) { + .notice-table .table-row .col-title { + font-size: 14px; + } +} +.notice-table .table-row .col-title a { + color: inherit; + text-decoration: none; + display: flex; + align-items: center; + gap: 8px; + transition: all 0.3s ease; +} +.notice-table .table-row .col-title a:hover { + color: #0049b4; +} +.notice-table .table-row .col-title .file-icon { + display: inline-flex; + align-items: center; + margin-left: 8px; + opacity: 0.6; +} +.notice-table .table-row .col-title .file-icon img { + width: 16px; + height: 16px; +} +.notice-table .table-row .col-date { + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + color: #94A3B8; +} +@media (max-width: 768px) { + .notice-table .table-row .col-date { + justify-content: flex-start; + font-size: 12px; + padding-top: 4px; + } +} +@media (max-width: 768px) { + .notice-table .table-row .col-date::before { + content: "등록일: "; + color: #64748B; + margin-right: 4px; + } +} + +.table-empty { + padding: 80px 24px; + text-align: center; + background: #FFFFFF; + border-radius: 12px; +} +.table-empty .empty-icon { + margin-bottom: 24px; +} +.table-empty .empty-icon img { + max-width: 200px; + opacity: 0.7; +} +@media (max-width: 768px) { + .table-empty .empty-icon img { + max-width: 150px; + } +} +.table-empty .empty-text { + font-size: 16px; + color: #64748B; +} +@media (max-width: 768px) { + .table-empty .empty-text { + font-size: 14px; + } +} + +.table-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 32px; + gap: 24px; +} +@media (max-width: 768px) { + .table-controls { + flex-direction: column; + align-items: stretch; + gap: 16px; + } +} +.table-controls .total-count { + font-size: 14px; + color: #64748B; +} +.table-controls .total-count strong { + color: #0049b4; + font-weight: 600; +} +@media (max-width: 768px) { + .table-controls .total-count { + order: 2; + text-align: center; + } +} +.table-controls .search-box { + display: flex; + gap: 8px; +} +@media (max-width: 768px) { + .table-controls .search-box { + order: 1; + } +} +.table-controls .search-box input { + flex: 1; + min-width: 250px; + padding: 8px 16px; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 14px; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .table-controls .search-box input { + min-width: auto; + } +} +.table-controls .search-box input:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.table-controls .search-box input::placeholder { + color: #94A3B8; +} + +.faq-accordion { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); overflow: hidden; } -.info-section .action-btn::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 0; - height: 100%; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - transition: width 0.3s ease; - z-index: 0; +.faq-accordion .faq-item { + border-bottom: 1px solid #E2E8F0; + transition: all 0.3s ease; } -.info-section .action-btn:hover { - border-color: #4B9BFF; - transform: translateY(-3px); - box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); +.faq-accordion .faq-item:last-child { + border-bottom: none; } -.info-section .action-btn:hover::before { - width: 100%; +.faq-accordion .faq-item.active { + background: rgba(0, 73, 180, 0.02); } -.info-section .action-btn:hover .btn-number { - background: #FFFFFF; - color: #4B9BFF; +.faq-accordion .faq-item.active .faq-question { + color: #0049b4; } -.info-section .action-btn:hover .btn-text, -.info-section .action-btn:hover i { - color: #FFFFFF; +.faq-accordion .faq-item.active .faq-question .faq-icon { + transform: rotate(180deg); + color: #0049b4; } -.info-section .action-btn .btn-number { +.faq-accordion .faq-question { + display: flex; + align-items: center; + justify-content: space-between; + padding: 24px 32px; + font-size: 16px; + font-weight: 500; + color: #1A1A2E; + cursor: pointer; + transition: all 0.3s ease; position: relative; - z-index: 1; + gap: 16px; +} +@media (max-width: 768px) { + .faq-accordion .faq-question { + padding: 16px 24px; + font-size: 14px; + } +} +.faq-accordion .faq-question::before { + content: "Q"; + position: absolute; + left: 32px; + top: 50%; + transform: translateY(-50%); width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); + background: #EFF6FF; + color: #0049b4; + border-radius: 50%; + font-size: 14px; + font-weight: 700; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .faq-accordion .faq-question::before { + width: 28px; + height: 28px; + font-size: 12px; + } +} +.faq-accordion .faq-question:hover { + background: rgba(0, 73, 180, 0.03); + color: #0049b4; +} +.faq-accordion .faq-question .faq-question-text { + flex: 1; + padding-left: 48px; + line-height: 1.6; +} +@media (max-width: 768px) { + .faq-accordion .faq-question .faq-question-text { + padding-left: 40px; + } +} +.faq-accordion .faq-question .faq-icon { + flex-shrink: 0; + font-size: 20px; + color: #64748B; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .faq-accordion .faq-question .faq-icon { + font-size: 18px; + } +} +.faq-accordion .faq-answer { + display: none; + padding: 0 32px 24px; + margin-left: 48px; + margin-right: 32px; + position: relative; +} +@media (max-width: 768px) { + .faq-accordion .faq-answer { + padding: 0 24px 16px; + margin-left: 40px; + margin-right: 24px; + } +} +.faq-accordion .faq-answer::before { + content: "A"; + position: absolute; + left: -48px; + top: 8px; + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + background: #0049b4; color: #FFFFFF; border-radius: 50%; - font-weight: 700; - font-size: 16px; - flex-shrink: 0; - transition: all 0.3s ease; -} -.info-section .action-btn .btn-text { - position: relative; - z-index: 1; - font-size: 16px; - font-weight: 500; - color: #1A1A2E; - transition: color 0.3s ease; -} -.info-section .action-btn i { - position: relative; - z-index: 1; font-size: 14px; - color: #94A3B8; - margin-left: auto; - transition: all 0.3s ease; -} -@media (max-width: 768px) { - .info-section .action-btn { - min-width: 100%; - justify-content: flex-start; - } -} - -@keyframes rotate { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} -.support-center { - padding: 100px 0; - background: #F8FAFC; -} -.support-center .section-header { - text-align: center; - margin-bottom: 64px; -} -.support-center .section-header .section-title { - font-size: 48px; font-weight: 700; - color: #1A1A2E; - margin-bottom: 16px; } @media (max-width: 768px) { - .support-center .section-header .section-title { - font-size: 40px; + .faq-accordion .faq-answer::before { + left: -40px; + width: 28px; + height: 28px; + font-size: 12px; } } -.support-center .section-header .section-title .title-highlight { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; +.faq-accordion .faq-answer.show { + display: block; + animation: slideDown 0.3s ease; } -.support-center .section-header .section-subtitle { - font-size: 20px; +.faq-accordion .faq-answer .faq-answer-content { + padding: 16px 0; + font-size: 14px; color: #64748B; line-height: 1.8; } @media (max-width: 768px) { - .support-center .section-header .section-subtitle { - font-size: 16px; + .faq-accordion .faq-answer .faq-answer-content { + font-size: 12px; + padding: 8px 0; } } -.support-center .support-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 32px; - max-width: 1000px; - margin: 0 auto; +.faq-accordion .faq-answer .faq-answer-content p { + margin-bottom: 16px; } -@media (max-width: 1024px) { - .support-center .support-grid { - grid-template-columns: 1fr; - gap: 24px; - max-width: 500px; - } +.faq-accordion .faq-answer .faq-answer-content p:last-child { + margin-bottom: 0; +} +.faq-accordion .faq-answer .faq-answer-content ul, .faq-accordion .faq-answer .faq-answer-content ol { + margin: 8px 0; + padding-left: 24px; +} +.faq-accordion .faq-answer .faq-answer-content li { + margin-bottom: 4px; +} +.faq-accordion .faq-answer .faq-answer-content a { + color: #0049b4; + text-decoration: underline; +} +.faq-accordion .faq-answer .faq-answer-content a:hover { + color: #c3dfea; +} +.faq-accordion .faq-answer .faq-answer-content code { + background: #F8FAFC; + padding: 2px 6px; + border-radius: 6px; + font-family: "Fira Code", "Courier New", monospace; + font-size: 0.9em; + color: #0049b4; +} +.faq-accordion .faq-answer .faq-answer-content pre { + background: #F8FAFC; + border: 1px solid #E2E8F0; + border-radius: 8px; + padding: 16px; + overflow-x: auto; + margin: 16px 0; +} +.faq-accordion .faq-answer .faq-answer-content pre code { + background: transparent; + padding: 0; + color: #1A1A2E; +} + +.faq-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; } @media (max-width: 768px) { - .support-center .support-grid { - gap: 16px; - padding: 0 16px; + .faq-page { + padding: 40px 16px; } } -.support-center .support-card { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - padding: 40px 32px; + +.faq-container { + max-width: 1280px; + margin: 0 auto; +} + +.faq-header { + margin-bottom: 48px; +} +@media (max-width: 768px) { + .faq-header { + margin-bottom: 40px; + } +} +.faq-header .page-title { + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 16px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} +@media (max-width: 768px) { + .faq-header .page-title { + font-size: 32px; + } +} +.faq-header .page-description { + font-size: 16px; + color: #64748B; + line-height: 1.6; +} +@media (max-width: 768px) { + .faq-header .page-description { + font-size: 14px; + } +} + +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} +.accordion { background: #FFFFFF; - border-radius: 16px; + border-radius: 12px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); - text-decoration: none; - transition: all 0.3s ease; overflow: hidden; } -.support-center .support-card::before { +.accordion .accordion-item { + border-bottom: 1px solid #E2E8F0; +} +.accordion .accordion-item:last-child { + border-bottom: none; +} +.accordion .accordion-item.active .accordion-header { + background: rgba(0, 73, 180, 0.03); + color: #0049b4; +} +.accordion .accordion-item.active .accordion-header .accordion-icon { + transform: rotate(180deg); +} +.accordion .accordion-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 24px 32px; + font-size: 16px; + font-weight: 500; + color: #1A1A2E; + cursor: pointer; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .accordion .accordion-header { + padding: 16px 24px; + font-size: 14px; + } +} +.accordion .accordion-header:hover { + background: rgba(0, 73, 180, 0.02); +} +.accordion .accordion-header .accordion-title { + flex: 1; +} +.accordion .accordion-header .accordion-icon { + flex-shrink: 0; + font-size: 20px; + color: #64748B; + transition: all 0.3s ease; +} +.accordion .accordion-content { + display: none; + padding: 24px 32px; + font-size: 14px; + color: #64748B; + line-height: 1.6; + border-top: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .accordion .accordion-content { + padding: 16px 24px; + } +} +.accordion .accordion-content.show { + display: block; + animation: slideDown 0.3s ease; +} + +.page-title-banner { + background: #E9F8FF; + position: relative; + width: 100%; + height: 220px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} +.page-title-banner::before { content: ""; position: absolute; top: 0; left: 0; right: 0; - height: 4px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - transform: scaleX(0); - transition: transform 0.3s ease; + bottom: 0; + background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h100v100H0z' fill='%23ffffff' opacity='0.03'/%3E%3C/svg%3E"); + background-size: 50px 50px; + opacity: 0.5; } -.support-center .support-card:hover { - transform: translateY(-8px); - box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); +.page-title-banner .title-image { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 220px; + width: auto; + z-index: 1; } -.support-center .support-card:hover::before { - transform: scaleX(1); +.page-title-banner h1 { + position: relative; + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + margin: 0; + z-index: 2; + letter-spacing: -0.5px; } -.support-center .support-card:hover .card-icon { - transform: scale(1.1) rotate(5deg); - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - color: #FFFFFF; +@media (max-width: 768px) { + .page-title-banner { + height: 120px; + margin-bottom: 32px; + } + .page-title-banner .title-image { + height: 120px; + } + .page-title-banner h1 { + font-size: 24px; + } } -.support-center .support-card:hover .card-arrow { - transform: translateX(5px); - color: #4B9BFF; + +.alert { + display: flex; + align-items: flex-start; + gap: 16px; + padding: 16px 24px; + border-radius: 8px; + margin-bottom: 32px; } -.support-center .support-card .card-icon { - width: 80px; - height: 80px; +.alert .alert-icon { + font-size: 20px; + flex-shrink: 0; +} +.alert .alert-content { + flex: 1; + text-align: left; +} +.alert .alert-content strong { + font-weight: 600; +} +.alert.alert-warning { + background: rgba(255, 217, 61, 0.1); + border: 1px solid rgba(255, 217, 61, 0.3); + color: #B89900; +} +.alert.alert-error { + background: rgba(255, 107, 107, 0.1); + border: 1px solid rgba(255, 107, 107, 0.3); + color: #ff3838; + align-items: center; +} +.alert.alert-error svg { + flex-shrink: 0; +} +.alert.alert-error span { + flex: 1; + font-size: 14px; + font-weight: 500; +} +.alert.alert-success { + background: rgba(107, 207, 127, 0.1); + border: 1px solid rgba(107, 207, 127, 0.3); + color: rgb(51.9183673469, 160.0816326531, 73.5510204082); +} +.alert.alert-info { + background: rgba(0, 73, 180, 0.1); + border: 1px solid rgba(0, 73, 180, 0.3); + color: #c3dfea; +} + +.hero-carousel-section { + position: relative; + width: 100%; + overflow: hidden; +} + +.hero-carousel-container { + position: relative; + width: 100%; + height: 720px; + overflow: hidden; +} +@media (max-width: 1024px) { + .hero-carousel-container { + height: 800px; + } +} +@media (max-width: 768px) { + .hero-carousel-container { + height: 600px; + } +} + +.hero-carousel-track { + position: relative; + width: 100%; + height: 100%; +} + +.hero-slide { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 780px; display: flex; align-items: center; justify-content: center; - background: #EFF6FF; - border-radius: 50px; - margin-bottom: 24px; - transition: all 0.3s ease; + opacity: 0; + visibility: hidden; + transition: opacity 0.6s ease-in-out, visibility 0.6s ease-in-out; } -.support-center .support-card .card-icon i { - font-size: 36px; - color: #4B9BFF; +.hero-slide.active { + opacity: 1; + visibility: visible; } -.support-center .support-card h3 { - font-size: 24px; - font-weight: 600; - color: #1A1A2E; - margin-bottom: 8px; - text-align: center; +.hero-slide[data-slide="0"] { + background: #E5F8FF; } -.support-center .support-card p { - font-size: 16px; - color: #64748B; - text-align: center; - line-height: 1.8; - margin-bottom: 24px; +.hero-slide[data-slide="1"] { + background: #E5F8FF; } -.support-center .support-card .card-arrow { - margin-top: auto; - color: #94A3B8; - transition: all 0.3s ease; +.hero-slide[data-slide="2"] { + background: #E5F8FF; } -.support-center .support-card .card-arrow i { - font-size: 20px; + +.hero-slide-content { + width: 100%; + max-width: 1280px; + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 80px; + position: relative; + margin: 0 auto; +} +@media (min-width: 1440px) { + .hero-slide-content { + padding: 0 320px; + } +} +@media (min-width: 1280px) { + .hero-slide-content { + padding: 0 160px; + } +} +@media (max-width: 1024px) { + .hero-slide-content { + flex-direction: column; + padding: 80px 40px; + justify-content: center; + gap: 40px; + } } @media (max-width: 768px) { - .support-center .support-card { - padding: 32px 24px; + .hero-slide-content { + padding: 60px 20px; + gap: 30px; } - .support-center .support-card .card-icon { - width: 70px; - height: 70px; +} + +.hero-text-content { + flex: 0 0 auto; + display: flex; + flex-direction: column; + gap: 46px; + z-index: 2; +} +@media (max-width: 1024px) { + .hero-text-content { + align-items: center; + text-align: center; } - .support-center .support-card .card-icon i { - font-size: 30px; +} + +.hero-text .hero-subtitle { + font-family: "Noto Sans KR", sans-serif; + font-size: 36px; + font-weight: 400; + line-height: 1; + color: #212529; + margin: 0 0 12px 0; +} +@media (max-width: 1024px) { + .hero-text .hero-subtitle { + font-size: 28px; } - .support-center .support-card h3 { - font-size: 20px; +} +@media (max-width: 768px) { + .hero-text .hero-subtitle { + font-size: 24px; } - .support-center .support-card p { +} +.hero-text .hero-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 50px; + font-weight: 700; + line-height: 1.2; + color: #000000; + margin: 0; +} +@media (max-width: 1024px) { + .hero-text .hero-title { + font-size: 40px; + } +} +@media (max-width: 768px) { + .hero-text .hero-title { + font-size: 32px; + } +} + +.btn-hero-signup { + display: inline-flex; + align-items: center; + justify-content: center; + width: 178px; + height: 60px; + padding: 10px; + background: #0049B4; + color: #FFFFFF; + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 700; + border-radius: 10px; + text-decoration: none; + transition: all 0.3s ease; +} +.btn-hero-signup:hover { + background: rgb(0, 52.3166666667, 129); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 73, 180, 0.3); +} +.btn-hero-signup:active { + transform: translateY(0); +} +@media (max-width: 1024px) { + .btn-hero-signup { + width: 200px; + } +} + +.hero-image-content { + flex: 0 0 auto; + width: 556px; + height: 455px; + display: flex; + align-items: center; + justify-content: center; + z-index: 1; +} +@media (min-width: 1280px) { + .hero-image-content { + width: 450px; + height: 370px; + } +} +@media (max-width: 1024px) { + .hero-image-content { + width: 400px; + height: 330px; + } +} +@media (max-width: 768px) { + .hero-image-content { + width: 100%; + max-width: 350px; + height: auto; + } +} +.hero-image-content .hero-image { + width: 100%; + height: 100%; + object-fit: contain; +} + +.hero-nav-btn { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 60px; + height: 60px; + background: rgba(255, 255, 255, 0.5); + border: none; + border-radius: 50px; + cursor: pointer; + display: none; + align-items: center; + justify-content: center; + z-index: 10; + transition: all 0.3s ease; +} +.hero-nav-btn:hover { + background: rgba(255, 255, 255, 0.8); + transform: translateY(-50%) scale(1.1); +} +.hero-nav-btn:active { + transform: translateY(-50%) scale(0.95); +} +.hero-nav-btn svg { + width: 22px; + height: 22px; +} +@media (min-width: 1280px) { + .hero-nav-btn { + display: flex; + } +} + +.hero-nav-prev { + left: 210px; +} +.hero-nav-prev svg { + transform: rotate(180deg); +} +@media (min-width: 1280px) { + .hero-nav-prev { + left: 100px; + } +} +@media (max-width: 1024px) { + .hero-nav-prev { + left: 40px; + } +} +@media (max-width: 768px) { + .hero-nav-prev { + left: 20px; + } +} + +.hero-nav-next { + right: 210px; +} +@media (min-width: 1280px) { + .hero-nav-next { + right: 100px; + } +} +@media (max-width: 1024px) { + .hero-nav-next { + right: 40px; + } +} +@media (max-width: 768px) { + .hero-nav-next { + right: 20px; + } +} + +.hero-carousel-indicators { + position: absolute; + bottom: 160px; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 12px; + z-index: 10; +} +@media (max-width: 768px) { + .hero-carousel-indicators { + bottom: 30px; + gap: 8px; + } +} + +.hero-indicator { + width: 14px; + height: 14px; + border-radius: 50%; + background: #F1F1F1; + border: none; + cursor: pointer; + padding: 0; + transition: all 0.3s ease; +} +.hero-indicator.active { + background: #0049B4; +} +.hero-indicator:hover:not(.active) { + background: rgba(0, 0, 0, 0.5); +} +@media (max-width: 768px) { + .hero-indicator { + width: 10px; + height: 10px; + } + .hero-indicator.active { + width: 28px; + border-radius: 5px; + } +} + +.hero-autoplay-toggle { + display: flex; + align-items: center; + justify-content: center; + margin-left: 8px; + cursor: pointer; + padding: 0; + transition: all 0.3s ease; + position: relative; +} +.hero-autoplay-toggle svg { + position: absolute; + opacity: 0; + transition: opacity 0.3s ease; +} +.hero-autoplay-toggle svg.active { + opacity: 1; +} +.hero-autoplay-toggle:hover { + background: rgb(255, 255, 255); + border-color: #0049B4; + box-shadow: 0 2px 8px rgba(0, 73, 180, 0.2); +} +@media (max-width: 768px) { + .hero-autoplay-toggle { + margin-left: 6px; + } + .hero-autoplay-toggle svg { + width: 10px; + height: 12px; + } +} + +.api-search-section { + position: relative; + padding: 0; + overflow: hidden; + background: #e9f9ff; +} +.api-search-section .search-background { + position: absolute; + inset: 0; + background-image: url("/img/bg_main_intersect.png"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + pointer-events: none; +} +.api-search-section .search-content-wrapper { + position: relative; + display: flex; + align-items: center; + justify-content: center; + gap: 40px; + z-index: 1; +} +@media (max-width: 1024px) { + .api-search-section .search-content-wrapper { + flex-direction: column; + gap: 24px; + padding-top: 40px; + } +} +.api-search-section .search-character { + width: 154px; + height: 148px; + flex-shrink: 0; +} +.api-search-section .search-character img { + width: 100%; + height: 100%; + object-fit: contain; +} +@media (max-width: 1024px) { + .api-search-section .search-character { + width: 120px; + height: 115px; + } +} +.api-search-section .search-text-content { + text-align: left; +} +@media (max-width: 1024px) { + .api-search-section .search-text-content { + text-align: center; + } +} +.api-search-section .search-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 36px; + font-weight: 700; + line-height: 1.3; + color: #000000; + margin: 0; +} +@media (max-width: 1024px) { + .api-search-section .search-title { + font-size: 28px; + } +} +@media (max-width: 768px) { + .api-search-section .search-title { + font-size: 24px; + } +} +.api-search-section .search-input-wrapper { + position: relative; + display: flex; + justify-content: center; + padding: 0px 0 30px; + z-index: 1; +} +@media (max-width: 1024px) { + .api-search-section .search-input-wrapper { + padding: 30px 20px 20px; + } +} +.api-search-section .search-form { + width: 100%; + max-width: 816px; +} +.api-search-section .search-box { + position: relative; + width: 100%; + height: 80px; + background: #FFFFFF; + border: 6px solid #0049B4; + border-radius: 50px; + display: flex; + align-items: center; + padding: 0 24px; +} +@media (max-width: 1024px) { + .api-search-section .search-box { + height: 60px; + border: 4px solid #0049B4; + padding: 0 16px; + } +} +.api-search-section .search-input { + flex: 1; + width: 100%; + height: 100%; + border: none; + outline: none; + background: transparent; + font-family: "Noto Sans KR", sans-serif; + font-size: 17px; + font-weight: 500; + color: #000000; + padding: 0 20px; +} +.api-search-section .search-input::placeholder { + color: #B3B3B3; + font-weight: 400; +} +@media (max-width: 1024px) { + .api-search-section .search-input { + font-size: 15px; + padding: 0 12px; + } +} +.api-search-section .search-icon-button { + background: none; + border: none; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + flex-shrink: 0; + transition: transform 0.3s ease; +} +.api-search-section .search-icon-button:hover { + transform: scale(1.1); +} +.api-search-section .search-icon-button:active { + transform: scale(0.95); +} +.api-search-section .search-icon-button svg { + width: 33px; + height: 34px; +} +@media (max-width: 1024px) { + .api-search-section .search-icon-button svg { + width: 28px; + height: 29px; + } +} +.api-search-section .hashtag-section { + position: relative; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + padding: 0 20px 0px; + z-index: 1; +} +@media (max-width: 1024px) { + .api-search-section .hashtag-section { + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 20px 30px; + } +} +.api-search-section .hashtag-label { + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 700; + color: #000000; + white-space: nowrap; +} +.api-search-section .hashtag-list { + display: flex; + align-items: center; + gap: 14px; + flex-wrap: wrap; +} +@media (max-width: 1024px) { + .api-search-section .hashtag-list { + justify-content: center; + gap: 10px; + } +} +.api-search-section .hashtag-link { + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; + text-decoration: none; + white-space: nowrap; + transition: color 0.3s ease; +} +.api-search-section .hashtag-link:hover { + color: #0049B4; + text-decoration: underline; +} +@media (max-width: 1024px) { + .api-search-section .hashtag-link { + font-size: 14px; + } +} +.api-search-section .hashtag-separator { + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + color: #000000; + user-select: none; +} +@media (max-width: 1024px) { + .api-search-section .hashtag-separator { font-size: 14px; } } -.api-stats-section { - padding: 100px 0; - background: linear-gradient(180deg, #FFFFFF 0%, #EFF6FF 100%); +.api-showcase { position: relative; + display: flex; + align-items: center; + padding: 175px 0 100px; + background: #FFFFFF; overflow: hidden; } -.api-stats-section::before { - content: ""; +.api-showcase .showcase-background { position: absolute; - top: 50%; - left: -100px; - width: 200px; - height: 200px; - background: radial-gradient(circle, #00D4FF 0%, transparent 70%); - opacity: 0.1; - border-radius: 50%; - transform: translateY(-50%); + inset: 0; + background-image: url("/img/bg_main_recommend_apis.png"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + pointer-events: none; } -.api-stats-section::after { - content: ""; +.api-showcase .showcase-wrapper { + max-width: 1228px; + margin: 0 auto; + padding: 0 20px; + position: relative; + width: 100%; + z-index: 1; +} +.api-showcase .section-header { + text-align: center; + margin-bottom: 24px; + position: relative; + padding-right: 150px; +} +@media (max-width: 1024px) { + .api-showcase .section-header { + padding-right: 0; + } +} +.api-showcase .section-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 44px; + font-weight: 700; + line-height: 1.3; + color: #000000; + margin: 0; +} +@media (max-width: 1024px) { + .api-showcase .section-title { + font-size: 36px; + } +} +@media (max-width: 768px) { + .api-showcase .section-title { + font-size: 28px; + } +} +.api-showcase .section-subtitle { + font-family: "Noto Sans KR", sans-serif; + font-size: 26px; + font-weight: 400; + line-height: 1.5; + color: #1E1E1E; + margin-bottom: 30px; +} +@media (max-width: 1024px) { + .api-showcase .section-subtitle { + font-size: 20px; + } +} +@media (max-width: 768px) { + .api-showcase .section-subtitle { + font-size: 18px; + } +} +.api-showcase .btn-all-apis { position: absolute; top: 50%; - right: -100px; - width: 300px; - height: 300px; - background: radial-gradient(circle, #4B9BFF 0%, transparent 70%); - opacity: 0.08; - border-radius: 50%; + right: 0; transform: translateY(-50%); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 21px; + padding: 12px 24px; + font-family: "Noto Sans KR", sans-serif; + font-size: 15px; + font-weight: 500; + color: #FFFFFF; + background: #008ae2; + text-decoration: none; + border-radius: 10px; + transition: all 0.3s ease; + height: 40px; + width: 135px; +} +@media (max-width: 1024px) { + .api-showcase .btn-all-apis { + position: static; + transform: none; + margin: 24px auto 0; + } +} +.api-showcase .btn-all-apis svg { + width: 11px; + height: 17px; + transition: transform 0.3s ease; +} +.api-showcase .btn-all-apis svg path { + stroke: #FFFFFF; +} +.api-showcase .btn-all-apis:hover { + background: rgb(0, 106.8584070796, 175); +} +.api-showcase .btn-all-apis:hover svg { + transform: translateX(4px); +} +.api-showcase .api-cards-container { + display: flex; + gap: 32px; + justify-content: center; +} +@media (min-width: 1280px) { + .api-showcase .api-cards-container { + gap: 24px; + } +} +@media (max-width: 1024px) { + .api-showcase .api-cards-container { + flex-wrap: wrap; + gap: 20px; + justify-content: center; + } +} +.api-showcase .api-card { + width: 283px; + height: 320px; + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 20px; + padding: 36px 38px; + display: flex; + flex-direction: column; + align-items: flex-start; + position: relative; + transition: all 0.3s ease; + gap: 0px; + cursor: pointer; +} +.api-showcase .api-card:hover { + transform: translateY(-4px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + border-color: #008ae2; +} +@media (max-width: 1024px) { + .api-showcase .api-card { + width: calc(50% - 10px); + min-width: 250px; + } +} +@media (max-width: 768px) { + .api-showcase .api-card { + width: 100%; + max-width: 350px; + } +} +.api-showcase .card-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 24px; + font-weight: 700; + line-height: 1.67; + color: #2A2A2A; + margin: 0 0 20px 0; +} +.api-showcase .card-description { + font-family: "Noto Sans KR", sans-serif; + font-size: 15px; + font-weight: 400; + line-height: 1.43; + color: #515151; + margin: 0; + flex: 1; + text-align: left; +} +.api-showcase .card-illustration { + width: 90px; + height: 90px; + display: flex; + align-items: center; + justify-content: center; + margin-top: auto; + align-self: flex-end; +} +.api-showcase .card-illustration img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.info-section { + position: relative; + padding: 100px 0; + background: #FFFFFF; + overflow: hidden; + min-height: 980px; + display: flex; + align-items: center; +} +.info-section .info-background { + position: absolute; + inset: 0; + background-image: url("/img/bg_api_intro.svg"); + background-size: cover; + background-position: center; + pointer-events: none; +} +.info-section .container { + position: relative; + z-index: 1; +} +.info-section .info-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + gap: 80px; +} +@media (max-width: 1024px) { + .info-section .info-wrapper { + flex-direction: column; + gap: 64px; + } +} +.info-section .info-content { + flex: 1; + max-width: 600px; +} +@media (max-width: 1024px) { + .info-section .info-content { + text-align: center; + max-width: 100%; + } +} +.info-section .info-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 28px; + font-weight: 400; + line-height: 1.4; + color: #000000; + margin: 0 0 24px 0; +} +@media (max-width: 1024px) { + .info-section .info-title { + font-size: 36px; + } +} +@media (max-width: 768px) { + .info-section .info-title { + font-size: 28px; + } +} +.info-section .info-title .title-highlight { + font-weight: 700; + color: #0049B4; + font-size: 36px; +} +.info-section .info-description { + font-family: "Noto Sans KR", sans-serif; + font-size: 18px; + font-weight: 400; + line-height: 1.6; + color: #000000; + margin: 0 0 48px 0; +} +@media (max-width: 1024px) { + .info-section .info-description { + font-size: 16px; + } +} +.info-section .action-buttons { + display: flex; + gap: 24px; +} +@media (max-width: 1024px) { + .info-section .action-buttons { + justify-content: center; + } +} +@media (max-width: 768px) { + .info-section .action-buttons { + flex-direction: column; + align-items: stretch; + } +} +.info-section .action-btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 18px 52px; + font-family: "Noto Sans KR", sans-serif; + font-size: 24px; + font-weight: 700; + line-height: 56px; + border-radius: 20px; + text-decoration: none; + white-space: nowrap; + transition: all 0.3s ease; + min-width: 310px; + height: 128px; +} +@media (max-width: 768px) { + .info-section .action-btn { + font-size: 20px; + padding: 12px 32px; + min-width: 100%; + } +} +.info-section .action-btn:hover { + transform: translateY(-3px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); +} +.info-section .action-btn:active { + transform: translateY(0); +} +.info-section .action-btn-primary { + background: #0049B4; + color: #FFFFFF; +} +.info-section .action-btn-primary:hover { + background: rgb(0, 52.3166666667, 129); +} +.info-section .action-btn-secondary { + background: #00ACDD; + color: #FFFFFF; +} +.info-section .action-btn-secondary:hover { + background: rgb(0, 132.3076923077, 170); +} +.info-section .info-image { + flex: 1; + max-width: 560px; + display: flex; + align-items: center; + justify-content: center; +} +.info-section .info-image img { + width: 100%; + height: auto; + object-fit: contain; +} +@media (max-width: 1024px) { + .info-section .info-image { + max-width: 100%; + } +} + +.support-center { + position: relative; + padding: 150px 0; + background: #eef7fd; + overflow: hidden; + min-height: 980px; +} +.support-center .support-background { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + height: 100%; + max-width: 1920px; + pointer-events: none; +} +.support-center .support-background::before { + content: ""; + position: absolute; + top: 17px; + left: 46%; + width: 693px; + height: 597px; + background-image: url("/img/bg_support_center.png"); + background-size: cover; + background-repeat: no-repeat; + opacity: 0.5; +} +.support-center .container { + position: relative; + z-index: 1; + max-width: 1280px; + margin: 0 auto; + padding: 0 40px; +} +.support-center .section-header { + margin-bottom: 80px; + text-align: center; +} +.support-center .section-header .section-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 44px; + line-height: 1.6; + color: #000000; + margin: 0; + text-align: left; +} +@media (max-width: 1024px) { + .support-center .section-header .section-title { + font-size: 36px; + line-height: 1.4; + } +} +@media (max-width: 768px) { + .support-center .section-header .section-title { + font-size: 28px; + } +} +.support-center .section-header .section-title .title-regular { + font-weight: 400; +} +.support-center .section-header .section-title .title-bold { + font-weight: 700; +} +.support-center .support-grid { + display: flex; + gap: 32px; + justify-content: center; + align-items: stretch; + max-width: 1228px; + margin: 0 auto; +} +@media (max-width: 1024px) { + .support-center .support-grid { + flex-direction: column; + align-items: center; + gap: 20px; + } +} +.support-center .support-card { + background: #FFFFFF; + border-radius: 20px; + text-decoration: none; + transition: all 0.3s ease; + display: flex; + box-sizing: border-box; + position: relative; + overflow: hidden; + height: 377px; +} +@media (max-width: 1024px) { + .support-center .support-card { + width: 100%; + max-width: 598px; + height: auto; + min-height: 260px; + } +} +.support-center .support-card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 30px rgba(0, 73, 180, 0.15); +} +.support-center .support-card .card-icon { + display: flex; + align-items: center; + justify-content: center; +} +.support-center .support-card .card-icon img { + width: 100%; + height: 100%; + object-fit: contain; +} +.support-center .support-card .card-content { + display: flex; + flex-direction: column; + justify-content: center; +} +.support-center .support-card .card-content h3 { + font-family: "Noto Sans KR", sans-serif; + font-size: 32px; + font-weight: 700; + color: #212529; + margin: 0 0 10px 0; + line-height: 1.3; +} +@media (max-width: 1024px) { + .support-center .support-card .card-content h3 { + font-size: 28px; + } +} +.support-center .support-card .card-content p { + font-family: "Noto Sans KR", sans-serif; + font-size: 18px; + font-weight: 400; + color: #515961; + margin: 0; + line-height: 1.4; +} +@media (max-width: 1024px) { + .support-center .support-card .card-content p { + font-size: 16px; + } +} +.support-center .support-card--notice { + width: 598px; + flex-shrink: 0; + flex-direction: column; + align-items: center; + padding: 60px 40px; + background: #0049B4; +} +@media (max-width: 1024px) { + .support-center .support-card--notice { + width: 100%; + max-width: 598px; + padding: 50px 40px; + } +} +.support-center .support-card--notice .card-icon { + width: 174px; + height: 120px; + margin-bottom: 36px; +} +.support-center .support-card--notice .card-content { + align-items: center; + text-align: center; +} +.support-center .support-card--notice .card-content h3 { + color: #FFFFFF; + font-size: 36px; +} +@media (max-width: 1024px) { + .support-center .support-card--notice .card-content h3 { + font-size: 32px; + } +} +.support-center .support-card--notice .card-content p { + color: rgba(255, 255, 255, 0.9); + font-size: 20px; +} +@media (max-width: 1024px) { + .support-center .support-card--notice .card-content p { + font-size: 18px; + } +} +.support-center .support-card--notice:hover { + background: rgb(0, 62.6583333333, 154.5); +} +.support-center .support-card--faq, .support-center .support-card--qna { + width: 283px; + flex-shrink: 0; + flex-direction: column; + align-items: center; + padding: 60px 40px; +} +@media (max-width: 1024px) { + .support-center .support-card--faq, .support-center .support-card--qna { + width: 100%; + max-width: 598px; + padding: 40px; + } +} +.support-center .support-card--faq .card-icon, .support-center .support-card--qna .card-icon { + width: 120px; + height: 120px; + margin-bottom: 36px; +} +.support-center .support-card--faq .card-content, .support-center .support-card--qna .card-content { + align-items: center; + text-align: center; + flex: none; +} +.support-center .support-card--faq .card-content h3, .support-center .support-card--qna .card-content h3 { + font-size: 36px; +} +@media (max-width: 1024px) { + .support-center .support-card--faq .card-content h3, .support-center .support-card--qna .card-content h3 { + font-size: 32px; + } +} +.support-center .support-card--faq .card-content p, .support-center .support-card--qna .card-content p { + font-size: 20px; +} +@media (max-width: 1024px) { + .support-center .support-card--faq .card-content p, .support-center .support-card--qna .card-content p { + font-size: 18px; + } +} +.support-center .support-card--faq { + background: #DAF0FF; +} +.support-center .support-card--faq .card-content h3 { + color: #212529; +} +.support-center .support-card--qna { + background: #D9F6F8; +} +.support-center .support-card--qna .card-content h3 { + color: #212529; +} + +.api-stats-section { + position: relative; + min-height: 720px; + padding: 100px 0; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; +} +@media (max-width: 1024px) { + .api-stats-section { + min-height: 600px; + padding: 64px 0; + } +} +@media (max-width: 768px) { + .api-stats-section { + min-height: 500px; + padding: 48px 0; + } +} + +.stats-background { + position: absolute; + inset: 0; + background-image: url("/img/bg_main_api_usage.png"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + overflow: hidden; +} + +.api-stats-section .container { + position: relative; + z-index: 1; } .api-stats-section .section-header { text-align: center; margin-bottom: 80px; - position: relative; - z-index: 1; } -.api-stats-section .section-header .section-title { - font-size: 40px; - font-weight: 700; - color: #1A1A2E; - line-height: 1.8; - margin-bottom: 40px; +@media (max-width: 768px) { + .api-stats-section .section-header { + margin-bottom: 60px; + } +} +.api-stats-section .section-title { + font-family: "Noto Sans KR", sans-serif; + line-height: 1.5; + margin: 0; +} +.api-stats-section .section-title .title-top { + display: block; + font-size: 32px; + font-weight: 400; + color: #E8E8E8; + margin-bottom: 8px; } @media (max-width: 1024px) { - .api-stats-section .section-header .section-title { - font-size: 32px; + .api-stats-section .section-title .title-top { + font-size: 28px; } } @media (max-width: 768px) { - .api-stats-section .section-header .section-title { + .api-stats-section .section-title .title-top { font-size: 24px; - padding: 0 24px; } } -.api-stats-section .section-header .section-title .title-highlight { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - font-weight: 800; +.api-stats-section .section-title .title-highlight { + font-size: 44px; + font-weight: 700; + color: #81D5FF; +} +@media (max-width: 1024px) { + .api-stats-section .section-title .title-highlight { + font-size: 36px; + } +} +@media (max-width: 768px) { + .api-stats-section .section-title .title-highlight { + font-size: 28px; + } +} +.api-stats-section .section-title { + font-size: 44px; + font-weight: 400; + color: #E8E8E8; +} +@media (max-width: 1024px) { + .api-stats-section .section-title { + font-size: 36px; + } +} +@media (max-width: 768px) { + .api-stats-section .section-title { + font-size: 28px; + } } .api-stats-section .stats-cards { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 40px; - max-width: 1100px; + display: flex; + align-items: center; + justify-content: center; + gap: 0; + max-width: 1200px; margin: 0 auto; - position: relative; - z-index: 1; } @media (max-width: 1024px) { .api-stats-section .stats-cards { - grid-template-columns: 1fr; - gap: 32px; - max-width: 400px; + flex-direction: column; + gap: 40px; } } @media (max-width: 768px) { .api-stats-section .stats-cards { + gap: 32px; padding: 0 24px; } } .api-stats-section .stat-card { - background: #FFFFFF; - border-radius: 16px; - padding: 40px; - box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); - border: 1px solid rgba(75, 155, 255, 0.1); - position: relative; - overflow: hidden; - transition: all 0.4s ease; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + width: 145px; } -.api-stats-section .stat-card::before { - content: ""; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - border-radius: 16px; - opacity: 0; - z-index: -1; - transition: opacity 0.4s ease; +@media (max-width: 1024px) { + .api-stats-section .stat-card { + width: auto; + } } -.api-stats-section .stat-card:hover { - transform: translateY(-10px) scale(1.02); - box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); -} -.api-stats-section .stat-card:hover::before { - opacity: 1; -} -.api-stats-section .stat-card:hover .stat-icon { - transform: rotate(360deg) scale(1.1); - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); -} -.api-stats-section .stat-card:hover .stat-icon i { +.api-stats-section .stat-card .stat-label { + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 500; color: #FFFFFF; + line-height: 40px; + margin: 0; + white-space: nowrap; } -.api-stats-section .stat-card:hover .stat-number { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; +@media (max-width: 768px) { + .api-stats-section .stat-card .stat-label { + font-size: 18px; + } } .api-stats-section .stat-card .stat-icon { - width: 70px; - height: 70px; + width: 100px; + height: 100px; display: flex; align-items: center; justify-content: center; - background: #EFF6FF; - border-radius: 50px; - margin-bottom: 24px; - transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.3s ease; } -.api-stats-section .stat-card .stat-icon i { - font-size: 32px; - color: #4B9BFF; - transition: color 0.3s ease; -} -.api-stats-section .stat-card .stat-content .stat-number { - font-size: 48px; - font-weight: 800; - color: #1A1A2E; - margin-bottom: 8px; - transition: all 0.3s ease; - display: block; +.api-stats-section .stat-card .stat-icon svg { + width: 100%; + height: 100%; + filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2)); } @media (max-width: 768px) { - .api-stats-section .stat-card .stat-content .stat-number { + .api-stats-section .stat-card .stat-icon { + width: 80px; + height: 80px; + } +} +.api-stats-section .stat-card .stat-number { + font-family: "Noto Sans KR", sans-serif; + font-size: 44px; + font-weight: 700; + color: #EFDCB2; + line-height: 61px; + margin: 0; + text-align: center; + white-space: nowrap; +} +@media (max-width: 1024px) { + .api-stats-section .stat-card .stat-number { font-size: 40px; } } -.api-stats-section .stat-card .stat-content .stat-number[data-formatted]::after { - content: attr(data-formatted); -} -.api-stats-section .stat-card .stat-content .stat-label { - font-size: 20px; - font-weight: 600; - color: #1A1A2E; - margin-bottom: 4px; -} -.api-stats-section .stat-card .stat-content .stat-description { - font-size: 14px; - color: #64748B; - line-height: 1.6; -} -.api-stats-section .stat-card:nth-child(1) .stat-icon { - background: rgba(0, 212, 255, 0.1); -} -.api-stats-section .stat-card:nth-child(1) .stat-icon i { - color: #00D4FF; -} -.api-stats-section .stat-card:nth-child(1):hover .stat-icon { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); -} -.api-stats-section .stat-card:nth-child(2) .stat-icon { - background: rgba(107, 207, 127, 0.1); -} -.api-stats-section .stat-card:nth-child(2) .stat-icon i { - color: #6BCF7F; -} -.api-stats-section .stat-card:nth-child(2):hover .stat-icon { - background: linear-gradient(135deg, #6BCF7F 0%, rgb(68.4897959184, 194.5102040816, 93.693877551) 100%); -} -.api-stats-section .stat-card:nth-child(3) .stat-icon { - background: rgba(167, 139, 250, 0.1); -} -.api-stats-section .stat-card:nth-child(3) .stat-icon i { - color: #A78BFA; -} -.api-stats-section .stat-card:nth-child(3):hover .stat-icon { - background: linear-gradient(135deg, #A78BFA 0%, rgb(129.9090909091, 90.1074380165, 247.8925619835) 100%); -} @media (max-width: 768px) { - .api-stats-section .stat-card { - padding: 32px; + .api-stats-section .stat-card .stat-number { + font-size: 36px; } - .api-stats-section .stat-card .stat-icon { - width: 60px; - height: 60px; - } - .api-stats-section .stat-card .stat-icon i { - font-size: 28px; +} +.api-stats-section .stat-card:hover .stat-icon { + transform: scale(1.1); +} +.api-stats-section .stats-divider { + width: 1px; + height: 240px; + margin: 0 60px; + flex-shrink: 0; +} +@media (max-width: 1024px) { + .api-stats-section .stats-divider { + display: none; } } +.stat-number { + animation: countUp 0.6s ease-out forwards; +} + @keyframes countUp { from { opacity: 0; @@ -4056,27 +6805,109 @@ select.form-control { transform: translateY(0); } } -.stat-number { - animation: countUp 0.6s ease-out forwards; +.signup-cta-section { + position: relative; + min-height: 329px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} +.signup-cta-section .cta-background { + position: absolute; + inset: 0; + background-image: url("/img/bg_main_join.png"); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + overflow: hidden; +} +.signup-cta-section .container { + position: relative; + z-index: 1; +} +.signup-cta-section .cta-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + text-align: center; +} +.signup-cta-section .cta-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 40px; + font-weight: 700; + color: #000000; + line-height: normal; + margin: 0; +} +@media (max-width: 1024px) { + .signup-cta-section .cta-title { + font-size: 32px; + } +} +@media (max-width: 768px) { + .signup-cta-section .cta-title { + font-size: 24px; + } +} +.signup-cta-section .btn-signup-cta { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 10px; + min-height: 60px; + width: 178px; + background: #008ae2; + color: #FFFFFF; + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 700; + border-radius: 10px; + text-decoration: none; + transition: all 0.3s ease; +} +.signup-cta-section .btn-signup-cta:hover { + background: rgb(0, 106.8584070796, 175); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 138, 226, 0.3); +} +.signup-cta-section .btn-signup-cta:active { + transform: translateY(0); +} +@media (max-width: 768px) { + .signup-cta-section .btn-signup-cta { + width: 100%; + max-width: 300px; + } +} +.signup-cta-section .cta-divider { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background: #DDDDDD; } .api-market-container { display: flex; min-height: 100vh; - background-color: #F8FAFC; + background-color: #FFFFFF; position: relative; + margin-bottom: 20px; } .api-market-sidebar { - width: 280px; - background-color: #FFFFFF; - border-right: 1px solid #E2E8F0; + width: 283px; + background-color: #F8FBFD; + border-radius: 20px; padding: 40px 24px; position: sticky; - top: 0; - height: 100vh; - overflow-y: auto; + top: 24px; + height: calc(100vh - 32px); flex-shrink: 0; + margin: 16px; } @media (max-width: 1024px) { .api-market-sidebar { @@ -4093,33 +6924,50 @@ select.form-control { box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); z-index: 500; height: calc(100vh - 60px); + margin: 0; + border-radius: 0; } .api-market-sidebar.mobile-open { transform: translateX(0); } } +.api-sidebar-header { + display: flex; + justify-content: center; + margin-bottom: 32px; + padding-bottom: 24px; +} +.api-sidebar-header img { + max-width: 100%; + height: auto; +} + .api-sidebar-nav .menu-section { - margin-bottom: 4px; + margin-bottom: 0; + border-bottom: 1px solid #DDDDDD; +} +.api-sidebar-nav .menu-section:last-child { + border-bottom: none; } .api-sidebar-nav .menu-title { - padding: 12px 16px; - font-size: 14px; - font-weight: 600; - color: #2E7FF7; + padding: 16px 10px; + font-size: 20px; + font-weight: 400; + color: #1A1A2E; cursor: pointer; - border-radius: 8px; transition: all 0.3s ease; display: flex; align-items: center; justify-content: space-between; + position: relative; } .api-sidebar-nav .menu-title:hover { - background-color: #F8FAFC; + background-color: rgba(0, 73, 180, 0.05); } .api-sidebar-nav .menu-title.active { - background-color: #EFF6FF; - color: #2E7FF7; + font-weight: 700; + color: #0049b4; } .api-sidebar-nav .menu-title .api-count { display: inline-flex; @@ -4128,19 +6976,54 @@ select.form-control { min-width: 24px; height: 24px; padding: 0 8px; - background-color: rgba(75, 155, 255, 0.1); - color: #4B9BFF; + background-color: rgba(0, 73, 180, 0.1); + color: #0049b4; font-size: 12px; font-weight: 600; border-radius: 50px; transition: all 0.3s ease; } .api-sidebar-nav .menu-title.active .api-count { - background-color: #4B9BFF; + background-color: #0049b4; color: #FFFFFF; } +.api-sidebar-nav .accordion-section .menu-title.accordion-trigger .menu-title-text { + flex: 1; +} +.api-sidebar-nav .accordion-section .menu-title.accordion-trigger .accordion-icon { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + transition: transform 0.3s ease; +} +.api-sidebar-nav .accordion-section .menu-title.accordion-trigger .accordion-icon i { + font-size: 12px; + color: #64748B; + transition: all 0.3s ease; +} +.api-sidebar-nav .accordion-section .menu-title.accordion-trigger:hover .accordion-icon i { + color: #0049b4; +} +.api-sidebar-nav .accordion-section .menu-title.accordion-trigger.expanded .accordion-icon { + transform: rotate(180deg); +} +.api-sidebar-nav .accordion-section .menu-title.accordion-trigger.active .accordion-icon i { + color: #0049b4; +} .api-sidebar-nav .api-list { padding-left: 16px; + margin-top: 0; + margin-bottom: 0; +} +.api-sidebar-nav .api-list.accordion-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease, padding 0.3s ease, margin 0.3s ease; +} +.api-sidebar-nav .api-list.accordion-content.expanded { + max-height: 500px; margin-top: 4px; margin-bottom: 8px; } @@ -4159,11 +7042,11 @@ select.form-control { .api-sidebar-nav .api-item::before { content: "•"; margin-right: 8px; - color: #4B9BFF; + color: #0049b4; opacity: 0.5; } .api-sidebar-nav .api-item:hover { - background-color: rgba(75, 155, 255, 0.05); + background-color: rgba(0, 73, 180, 0.05); color: #1A1A2E; padding-left: 20px; } @@ -4171,8 +7054,8 @@ select.form-control { opacity: 1; } .api-sidebar-nav .api-item.active { - background-color: rgba(75, 155, 255, 0.1); - color: #4B9BFF; + background-color: rgba(0, 73, 180, 0.1); + color: #0049b4; font-weight: 500; } .api-sidebar-nav .api-item.active::before { @@ -4187,7 +7070,9 @@ select.form-control { .api-market-content { flex: 1; - padding: 40px 48px; + padding-top: 80px; + padding-left: 8px; + padding-right: 8px; min-height: 100vh; display: flex; flex-direction: column; @@ -4197,6 +7082,15 @@ select.form-control { padding: 24px 16px; } } +.api-market-content .api-result-count { + font-size: 20px; + color: #000000; + white-space: nowrap; +} +.api-market-content .api-result-count strong { + color: #0049b4; + font-weight: 600; +} .api-mobile-toggle { display: none; @@ -4205,7 +7099,6 @@ select.form-control { right: 24px; width: 56px; height: 56px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); border-radius: 50%; border: none; color: #FFFFFF; @@ -4234,7 +7127,7 @@ select.form-control { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 40px; + margin-bottom: 24px; } @media (max-width: 768px) { .api-market-header { @@ -4280,8 +7173,8 @@ select.form-control { transition: all 0.3s ease; } .api-market-search input:focus { - border-color: #4B9BFF; - box-shadow: 0 0 0 3px rgba(75, 155, 255, 0.1); + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); } .api-market-search input::placeholder { color: #94A3B8; @@ -4305,7 +7198,7 @@ select.form-control { } .api-market-search .search-submit-btn:hover { background: #EFF6FF; - color: #4B9BFF; + color: #0049b4; transform: translateY(-50%) scale(1.05); } .api-market-search .search-submit-btn:active { @@ -4316,21 +7209,16 @@ select.form-control { display: block; } -.api-result-count { - font-size: 16px; - color: #64748B; - margin-bottom: 32px; -} -.api-result-count strong { - color: #4B9BFF; - font-weight: 600; -} - .api-card-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + grid-template-columns: repeat(3, 1fr); gap: 24px; } +@media (max-width: 1024px) { + .api-card-grid { + grid-template-columns: repeat(2, 1fr); + } +} @media (max-width: 768px) { .api-card-grid { grid-template-columns: 1fr; @@ -4342,111 +7230,74 @@ select.form-control { border-radius: 12px; padding: 32px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); - transition: all 0.3s ease; cursor: pointer; display: flex; flex-direction: column; - justify-content: space-between; - min-height: 220px; + gap: 16px; + min-height: 180px; position: relative; - overflow: hidden; -} -.api-card::before { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - transform: scaleX(0); - transform-origin: left; - transition: transform 0.3s ease; -} -.api-card:hover { - box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); - transform: translateY(-5px); -} -.api-card:hover::before { - transform: scaleX(1); -} -.api-card:hover .api-card-icon { - transform: scale(1.1); + border: 1px solid #E2E8F0; } .api-card:active { - transform: translateY(-3px); + transform: scale(0.98); } -.api-card-header { +.api-card-group { display: flex; align-items: center; gap: 8px; - margin-bottom: 16px; } -.api-card-badge { - display: inline-flex; +.api-card-group-icon { + width: 32px; + height: 32px; + display: flex; align-items: center; - gap: 6px; - padding: 6px 12px; - background-color: #F8FAFC; - border-radius: 6px; - font-size: 12px; + justify-content: center; + background: #F8FAFC; + border-radius: 8px; + flex-shrink: 0; +} +.api-card-group-icon img { + width: 20px; + height: 20px; + object-fit: contain; +} +.api-card-group-icon i { + font-size: 16px; + color: #0049b4; +} + +.api-card-group-name { + font-size: 14px; color: #64748B; font-weight: 500; } -.api-card-badge::before { - content: "◉"; - color: #4B9BFF; - font-size: 10px; -} -.api-card-title { - font-size: 18px; +.api-card-name { + font-size: 20px; font-weight: 600; color: #1A1A2E; - margin-bottom: 12px; line-height: 1.2; + margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; + text-align: left; } .api-card-description { font-size: 14px; color: #64748B; line-height: 1.6; + margin: 0; flex-grow: 1; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; -} - -.api-card-icon { - text-align: center; - margin-top: 24px; - font-size: 48px; - opacity: 0.8; - transition: transform 0.3s ease; -} -.api-card-icon img { - max-width: 60px; - max-height: 60px; - object-fit: contain; -} - -.api-card:nth-child(3n+1) .api-card-icon { - color: #60a5fa; -} - -.api-card:nth-child(3n+2) .api-card-icon { - color: #34d399; -} - -.api-card:nth-child(3n+3) .api-card-icon { - color: #818cf8; + text-align: left; } .api-empty-state { @@ -4480,7 +7331,7 @@ select.form-control { width: 48px; height: 48px; border: 4px solid #E2E8F0; - border-top-color: #4B9BFF; + border-top-color: #0049b4; border-radius: 50%; animation: spin 1s linear infinite; } @@ -4539,13 +7390,13 @@ select.form-control { bottom: -2px; } .api-detail-tabs .tab-button:hover { - color: #4B9BFF; - background-color: rgba(75, 155, 255, 0.05); + color: #0049b4; + background-color: rgba(0, 73, 180, 0.05); } .api-detail-tabs .tab-button.active { - color: #4B9BFF; + color: #0049b4; font-weight: 600; - border-bottom-color: #4B9BFF; + border-bottom-color: #0049b4; } .tab-content { @@ -4559,10 +7410,10 @@ select.form-control { } .api-overview-card { - background: #FFFFFF; - border-radius: 12px; - padding: 32px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + background: transparent; + border-radius: 0; + padding: 0; + padding-bottom: 32px; display: flex; flex-direction: column; gap: 24px; @@ -4580,12 +7431,13 @@ select.form-control { } } .api-overview-card .api-method-badge { + background: #0049b4; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; padding: 8px 16px; - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); + height: 100%; color: #FFFFFF; font-size: 14px; font-weight: 600; @@ -4631,22 +7483,23 @@ select.form-control { } .api-detail-card { - background: #FFFFFF; - border-radius: 12px; - padding: 32px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); - transition: all 0.3s ease; + background: transparent; + border-radius: 0; + padding: 0; + padding-bottom: 32px; + border-bottom: 1px solid #E2E8F0; } -.api-detail-card:hover { - box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +.api-detail-card:last-child { + border-bottom: none; + padding-bottom: 0; } .api-detail-card h3 { font-size: 20px; font-weight: 600; color: #1A1A2E; margin-bottom: 16px; - padding-bottom: 8px; - border-bottom: 2px solid #EFF6FF; + padding-bottom: 0; + border-bottom: none; } .api-detail-card .detail-content { font-size: 14px; @@ -4687,7 +7540,7 @@ select.form-control { font-weight: 600; color: #1A1A2E; border-bottom: 2px solid #E2E8F0; - background-color: rgba(75, 155, 255, 0.05); + background-color: rgba(0, 73, 180, 0.05); } .api-detail-card .detail-content table th:not(:last-child) { border-right: 1px solid #E2E8F0; @@ -4708,7 +7561,7 @@ select.form-control { border-bottom: none; } .api-detail-card .detail-content table tr:hover { - background-color: rgba(75, 155, 255, 0.02); + background-color: rgba(0, 73, 180, 0.02); } .api-detail-card .detail-content table tbody tr:nth-child(even) { background-color: rgba(248, 250, 252, 0.3); @@ -4745,221 +7598,196 @@ select.form-control { border-radius: 6px; font-family: "Courier New", monospace; font-size: 12px; - color: #4B9BFF; + color: #0049b4; } .login-page { - min-height: calc(100vh - 140px); display: flex; align-items: center; justify-content: center; - background: linear-gradient(135deg, var(--light-bg) 0%, var(--gray-bg) 100%); + background: #EDF9FE; padding: 40px 20px; position: relative; - overflow: hidden; -} -.login-page::before { - content: ""; - position: absolute; - top: -50%; - right: -20%; - width: 600px; - height: 600px; - background: radial-gradient(circle, var(--accent-cyan) 0%, transparent 70%); - opacity: 0.1; - border-radius: 50%; -} -.login-page::after { - content: ""; - position: absolute; - bottom: -30%; - left: -10%; - width: 400px; - height: 400px; - background: radial-gradient(circle, var(--primary-blue) 0%, transparent 70%); - opacity: 0.1; - border-radius: 50%; + border-radius: 12px; + margin-top: 60px; + margin-bottom: 60px; } .login-container { width: 100%; - max-width: 480px; + max-width: 504px; margin: 0 auto; position: relative; - z-index: 1; } .login-card { - background: var(--white); - border-radius: 24px; - box-shadow: var(--shadow-xl); - padding: 48px 40px; - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.8); + background: transparent; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; } -@media (max-width: 480px) { +@media (max-width: 576px) { .login-card { - padding: 32px 24px; - border-radius: 16px; + padding: 0 20px; } } -.login-header { +.login-logo { + width: 90px; + height: 90px; + margin-bottom: 30px; +} +.login-logo img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.login-message { + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 400; + color: #000000; text-align: center; margin-bottom: 40px; -} -.login-header .login-logo { - display: inline-flex; - align-items: center; - gap: 12px; - margin-bottom: 24px; -} -.login-header .login-logo img { - height: 48px; - width: auto; -} -.login-header .login-logo .logo-text { - font-size: 20px; - font-weight: 700; - color: var(--primary-blue); - padding: 6px 16px; - background: var(--light-bg); - border-radius: 24px; -} -.login-header .login-title { - font-size: 28px; - font-weight: 700; - color: var(--text-dark); - margin-bottom: 8px; -} -.login-header .login-subtitle { - font-size: 15px; - color: var(--text-gray); + line-height: 1; } .login-form { - margin-bottom: 24px; -} -.login-form .form-group { - margin-bottom: 20px; -} -.login-form .form-group:last-child { + width: 100%; margin-bottom: 0; } -.login-form .form-label { - display: block; - font-size: 14px; - font-weight: 600; - color: var(--text-dark); - margin-bottom: 8px; +.login-form .form-group { + margin-bottom: 24px; +} +.login-form .form-group:last-of-type { + margin-bottom: 0; } .login-form .form-input { width: 100%; - padding: 14px 16px; - font-size: 15px; - border: 2px solid var(--border-gray); + height: 70px; + padding: 0 32px; + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #5F666C; + background: #FFFFFF; + border: 1px solid #DDDDDD; border-radius: 12px; - background: var(--white); - transition: all 0.3s ease; outline: none; + transition: all 0.3s ease; } .login-form .form-input::placeholder { - color: var(--text-light); + color: #5F666C; } .login-form .form-input:focus { - border-color: var(--primary-blue); - box-shadow: 0 0 0 4px rgba(75, 155, 255, 0.1); + border-color: #0049B4; } .login-form .form-input.error { - border-color: var(--accent-orange); -} -.login-form .form-input.error:focus { - box-shadow: 0 0 0 4px rgba(255, 107, 107, 0.1); + border-color: #FF6B6B; } .login-form .form-checkbox { display: flex; align-items: center; - gap: 8px; - margin-top: 16px; + justify-content: flex-end; + gap: 7px; + margin-top: 24px; + margin-bottom: 22px; + margin-right: 10px; } .login-form .form-checkbox input[type=checkbox] { - width: 18px; - height: 18px; - accent-color: var(--primary-blue); + width: 20px; + height: 20px; + border: 1.5px solid #000000; + border-radius: 4px; cursor: pointer; + appearance: none; + background: #FFFFFF; + position: relative; + flex-shrink: 0; +} +.login-form .form-checkbox input[type=checkbox]:checked { + background: #FFFFFF; + border-color: #2C2C2C; +} +.login-form .form-checkbox input[type=checkbox]:checked::after { + content: ""; + position: absolute; + left: 50%; + top: 45%; + transform: translate(-50%, -50%) rotate(45deg); + width: 6px; + height: 12px; + border: solid #2C2C2C; + border-width: 0 2px 2px 0; } .login-form .form-checkbox label { - font-size: 14px; - color: var(--text-gray); + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; cursor: pointer; user-select: none; + line-height: 24px; + white-space: nowrap; } .login-button { width: 100%; - padding: 16px 24px; - font-size: 16px; - font-weight: 600; - color: var(--white); - background: var(--gradient-primary); + height: 80px; + padding: 10px; + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + background: #0049B4; border: none; border-radius: 12px; cursor: pointer; transition: all 0.3s ease; - box-shadow: var(--shadow-md); + margin-bottom: 40px; + line-height: 1; } .login-button:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-lg); + background: rgb(0, 62.6583333333, 154.5); } .login-button:active { - transform: translateY(0); + background: rgb(0, 52.3166666667, 129); } .login-button:disabled { opacity: 0.6; cursor: not-allowed; - transform: none; } .login-links { display: flex; justify-content: center; align-items: center; - gap: 16px; - margin-top: 32px; - padding-top: 32px; - border-top: 1px solid var(--border-gray); + gap: 26px; flex-wrap: wrap; } -@media (max-width: 480px) { - .login-links { - gap: 12px; - margin-top: 24px; - padding-top: 24px; - } -} .login-links a { - font-size: 14px; - color: var(--text-gray); + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; text-decoration: none; transition: color 0.3s ease; - display: flex; - align-items: center; - gap: 6px; + line-height: 1; } .login-links a:hover { - color: var(--primary-blue); -} -.login-links a i { - font-size: 16px; + color: #0049B4; + text-decoration: underline; } .login-links .link-separator { - color: var(--border-gray); - font-size: 14px; + color: #000000; + font-size: 16px; } .login-alert { - margin-bottom: 20px; + width: 100%; + margin-bottom: 24px; padding: 12px 16px; border-radius: 8px; font-size: 14px; @@ -4969,34 +7797,33 @@ select.form-control { } .login-alert.alert-error { background: rgba(255, 107, 107, 0.1); - color: var(--accent-orange); + color: #FF6B6B; border: 1px solid rgba(255, 107, 107, 0.2); } .login-alert.alert-success { background: rgba(107, 207, 127, 0.1); - color: var(--accent-green); + color: #6BCF7F; border: 1px solid rgba(107, 207, 127, 0.2); } .login-alert.alert-info { - background: rgba(75, 155, 255, 0.1); - color: var(--primary-blue); - border: 1px solid rgba(75, 155, 255, 0.2); + background: rgba(0, 73, 180, 0.1); + color: #0049B4; + border: 1px solid rgba(0, 73, 180, 0.2); } .login-alert i { font-size: 18px; } .login-loading { - position: absolute; + position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: rgba(255, 255, 255, 0.9); + background: rgba(237, 249, 254, 0.9); display: flex; align-items: center; justify-content: center; - border-radius: 24px; z-index: 10; opacity: 0; pointer-events: none; @@ -5009,8 +7836,8 @@ select.form-control { .login-loading .spinner { width: 40px; height: 40px; - border: 3px solid var(--border-gray); - border-top-color: var(--primary-blue); + border: 3px solid #DDDDDD; + border-top-color: #0049B4; border-radius: 50%; animation: spin 1s linear infinite; } @@ -5020,6 +7847,6106 @@ select.form-control { transform: rotate(360deg); } } +@media (max-width: 576px) { + .login-container { + max-width: 100%; + padding: 0 20px; + } + .login-logo { + width: 70px; + height: 70px; + margin-bottom: 24px; + } + .login-message { + font-size: 18px; + margin-bottom: 32px; + } + .login-form .form-input { + height: 60px; + padding: 0 20px; + font-size: 15px; + } + .login-form .form-checkbox input[type=checkbox] { + width: 24px; + height: 24px; + } + .login-form .form-checkbox label { + font-size: 14px; + } + .login-button { + height: 70px; + font-size: 18px; + margin-bottom: 32px; + } + .login-links { + gap: 20px; + } + .login-links a, .login-links .link-separator { + font-size: 14px; + } +} +.account-recovery-page { + display: flex; + align-items: center; + justify-content: center; + background: #EDF9FE; + padding: 40px 20px; + position: relative; + min-height: calc(100vh - 200px); + margin-top: 60px; + margin-bottom: 60px; + border-radius: 12px; +} + +.account-recovery-container { + width: 100%; + max-width: 540px; + margin: 0 auto; + position: relative; +} + +.account-recovery-card { + background: transparent; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; + position: relative; +} +@media (max-width: 576px) { + .account-recovery-card { + padding: 0 20px; + } +} + +.account-recovery-logo { + width: 90px; + height: 90px; + margin-bottom: 24px; +} +.account-recovery-logo img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.account-recovery-title { + font-family: "Noto Sans KR", sans-serif; + font-size: 28px; + font-weight: 700; + color: #000000; + text-align: center; + margin: 0 0 32px 0; + line-height: 1.3; +} +@media (max-width: 576px) { + .account-recovery-title { + font-size: 24px; + margin-bottom: 24px; + } +} + +.account-recovery-tabs { + display: flex; + gap: 0; + margin-bottom: 40px; + width: 100%; + background: #F8F9FA; + border-radius: 12px; + padding: 4px; +} +.account-recovery-tabs .tab-link { + flex: 1; + padding: 14px 24px; + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 600; + color: #64748B; + text-decoration: none; + text-align: center; + background: transparent; + border-radius: 8px; + transition: all 0.3s ease; +} +.account-recovery-tabs .tab-link:hover { + color: #0049B4; + background: rgba(0, 73, 180, 0.05); +} +.account-recovery-tabs .tab-link.active { + color: #FFFFFF; + background: #0049B4; + box-shadow: 0 2px 4px rgba(0, 73, 180, 0.2); +} +@media (max-width: 576px) { + .account-recovery-tabs .tab-link { + padding: 12px 16px; + font-size: 15px; + } +} + +.account-alert { + width: 100%; + margin-bottom: 20px; + padding: 14px 18px; + border-radius: 12px; + font-family: "Noto Sans KR", sans-serif; + font-size: 15px; + display: flex; + align-items: center; + gap: 10px; + animation: slideDown 0.3s ease; +} +.account-alert i { + font-size: 18px; + flex-shrink: 0; +} +.account-alert.alert-error { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; + border: 1px solid rgba(255, 107, 107, 0.3); +} +.account-alert.alert-success { + background: rgba(107, 207, 127, 0.1); + color: #6BCF7F; + border: 1px solid rgba(107, 207, 127, 0.3); +} +.account-alert.alert-info { + background: rgba(0, 73, 180, 0.1); + color: #0049B4; + border: 1px solid rgba(0, 73, 180, 0.3); +} + +.account-recovery-form { + width: 100%; + margin-bottom: 0; +} +.account-recovery-form .form-group { + margin-bottom: 24px; +} +.account-recovery-form .form-group:last-of-type { + margin-bottom: 0; +} +.account-recovery-form .form-label { + display: block; + font-family: "Noto Sans KR", sans-serif; + font-size: 15px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 10px; +} +.account-recovery-form .form-input { + width: 100%; + height: 70px; + padding: 0 24px; + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #1A1A2E; + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 12px; + outline: none; + transition: all 0.3s ease; +} +.account-recovery-form .form-input::placeholder { + color: #94A3B8; +} +.account-recovery-form .form-input:hover { + border-color: #CBD5E1; +} +.account-recovery-form .form-input:focus { + border-color: #0049B4; + box-shadow: 0 0 0 4px rgba(0, 73, 180, 0.08); +} +.account-recovery-form .form-input:disabled { + background: #F8F9FA; + border-color: #E2E8F0; + color: #94A3B8; + cursor: not-allowed; +} +.account-recovery-form .form-input.error { + border-color: #FF6B6B; +} +.account-recovery-form .form-select { + width: 100%; + height: 70px; + padding: 0 24px; + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #1A1A2E; + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 12px; + outline: none; + cursor: pointer; + transition: all 0.3s ease; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L6 6L11 1' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 24px center; + padding-right: 50px; +} +.account-recovery-form .form-select:hover { + border-color: #CBD5E1; +} +.account-recovery-form .form-select:focus { + border-color: #0049B4; + box-shadow: 0 0 0 4px rgba(0, 73, 180, 0.08); +} +.account-recovery-form .form-select:disabled { + background-color: #F8F9FA; + border-color: #E2E8F0; + color: #94A3B8; + cursor: not-allowed; + opacity: 0.7; +} +.account-recovery-form .form-select option { + padding: 12px; + font-size: 16px; +} + +.phone-input-group { + display: flex; + align-items: center; + gap: 12px; +} +.phone-input-group .phone-prefix { + flex: 0 0 140px; +} +.phone-input-group .phone-middle, +.phone-input-group .phone-last { + flex: 1; +} +.phone-input-group .phone-separator { + font-size: 16px; + color: #64748B; + font-weight: 500; +} +@media (max-width: 576px) { + .phone-input-group .phone-prefix { + flex: 0 0 110px; + } + .phone-input-group .phone-separator { + font-size: 14px; + } +} + +.auth-number-group { + margin-top: 24px; +} + +.auth-input-group { + position: relative; +} +.auth-input-group .auth-input { + padding-right: 100px; +} +.auth-input-group .auth-timer { + position: absolute; + right: 24px; + top: 50%; + transform: translateY(-50%); + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 600; + color: #FF6B6B; + pointer-events: none; +} +@media (max-width: 576px) { + .auth-input-group .auth-timer { + font-size: 14px; + right: 16px; + } +} + +.auth-request-button, +.auth-verify-button { + width: 100%; + height: 70px; + padding: 0 32px; + font-family: "Noto Sans KR", sans-serif; + font-size: 17px; + font-weight: 700; + color: #FFFFFF; + background: #0049B4; + border: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + margin-top: 16px; + line-height: 1; +} +.auth-request-button:hover, +.auth-verify-button:hover { + background: rgb(0, 62.6583333333, 154.5); +} +.auth-request-button:active, +.auth-verify-button:active { + background: rgb(0, 52.3166666667, 129); +} +.auth-request-button:disabled, +.auth-verify-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} +@media (max-width: 576px) { + .auth-request-button, + .auth-verify-button { + height: 60px; + font-size: 16px; + } +} + +.account-recovery-card .form-actions, .account-recovery-card .form-actions-center { + display: flex; + gap: 12px; + margin-top: 32px; + padding-top: 0; + border-top: none; +} +.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button, +.account-recovery-card .form-actions .submit-button, +.account-recovery-card .form-actions-center .submit-button { + flex: 1; + height: 70px; + padding: 0 32px; + font-family: "Noto Sans KR", sans-serif; + font-size: 17px; + font-weight: 700; + border: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + line-height: 1; +} +.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button { + color: #64748B; + background: #FFFFFF; + border: 2px solid #E2E8F0; +} +.account-recovery-card .form-actions .cancel-button:hover, .account-recovery-card .form-actions-center .cancel-button:hover { + background: #F8F9FA; + border-color: #CBD5E1; + color: #475569; +} +.account-recovery-card .form-actions .cancel-button:active, .account-recovery-card .form-actions-center .cancel-button:active { + background: #F1F5F9; + border-color: #94A3B8; +} +.account-recovery-card .form-actions .submit-button, .account-recovery-card .form-actions-center .submit-button { + color: #FFFFFF; + background: #0049B4; +} +.account-recovery-card .form-actions .submit-button:hover, .account-recovery-card .form-actions-center .submit-button:hover { + background: rgb(0, 62.6583333333, 154.5); +} +.account-recovery-card .form-actions .submit-button:active, .account-recovery-card .form-actions-center .submit-button:active { + background: rgb(0, 52.3166666667, 129); +} +.account-recovery-card .form-actions .submit-button:disabled, .account-recovery-card .form-actions-center .submit-button:disabled { + opacity: 0.6; + cursor: not-allowed; +} +@media (max-width: 576px) { + .account-recovery-card .form-actions, .account-recovery-card .form-actions-center { + flex-direction: column; + gap: 12px; + } + .account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button, + .account-recovery-card .form-actions .submit-button, + .account-recovery-card .form-actions-center .submit-button { + height: 60px; + font-size: 16px; + } +} + +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(237, 249, 254, 0.9); + display: none; + align-items: center; + justify-content: center; + z-index: 1000; + transition: opacity 0.3s ease; +} +.loading-overlay.active { + display: flex; +} +.loading-overlay .spinner { + width: 40px; + height: 40px; + border: 3px solid #DDDDDD; + border-top-color: #0049B4; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} +@media (max-width: 768px) { + .account-recovery-page { + padding: 20px 12px; + margin-top: 40px; + margin-bottom: 40px; + } + .account-recovery-container { + max-width: 100%; + } +} +@media (max-width: 576px) { + .account-recovery-logo { + width: 70px; + height: 70px; + margin-bottom: 20px; + } + .account-recovery-form .form-group { + margin-bottom: 20px; + } + .account-recovery-form .form-label { + font-size: 14px; + margin-bottom: 8px; + } + .account-recovery-form .form-input, + .account-recovery-form .form-select { + height: 60px; + padding: 0 20px; + font-size: 15px; + } + .auth-request-button, + .auth-verify-button { + margin-top: 12px; + } + .account-recovery-card .form-actions, .account-recovery-card .form-actions-center { + margin-top: 24px; + } +} +.signup-selection-page { + min-height: calc(100vh - 140px); + display: flex; + align-items: center; + justify-content: center; + background: #EDF9FE; + padding: 60px 20px; + position: relative; + border-radius: 12px; + margin-top: 60px; + margin-bottom: 60px; +} + +.signup-selection-container { + width: 100%; + max-width: 1018px; + margin: 0 auto; + position: relative; +} + +.signup-selection-card { + background: transparent; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; +} +@media (max-width: 576px) { + .signup-selection-card { + padding: 0 20px; + } +} + +.signup-logo { + width: 90px; + height: 90px; + margin-bottom: 30px; +} +.signup-logo img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.signup-message { + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 400; + color: #000000; + text-align: center; + margin-bottom: 40px; + line-height: 1; +} + +.signup-buttons { + width: 100%; + max-width: 504px; + display: flex; + flex-direction: column; + gap: 40px; + margin-bottom: 60px; +} + +.signup-btn { + width: 100%; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + padding: 10px; + font-family: "Noto Sans KR", sans-serif; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + text-decoration: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + line-height: 1; + position: relative; +} +.signup-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.signup-btn:active { + transform: translateY(0); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); +} +.signup-btn .signup-btn-icon { + width: 26px; + height: 30px; + flex-shrink: 0; +} +.signup-btn span { + white-space: nowrap; +} + +.signup-btn-individual { + background: #0049B4; +} + +.signup-btn-organization { + background: #00A1D7; +} + +.signup-navigation { + display: flex; + justify-content: center; + align-items: center; + gap: 26px; + flex-wrap: wrap; +} +.signup-navigation .signup-nav-link { + font-family: "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; + text-decoration: none; + transition: color 0.3s ease; + line-height: 1; +} +.signup-navigation .signup-nav-link:hover { + color: #0049B4; + text-decoration: underline; +} +.signup-navigation .signup-nav-separator { + color: #000000; + font-size: 16px; + line-height: 1; +} + +@media (max-width: 576px) { + .signup-selection-page { + padding: 40px 20px; + } + .signup-selection-container { + max-width: 100%; + padding: 0 20px; + } + .signup-logo { + width: 70px; + height: 70px; + margin-bottom: 24px; + } + .signup-message { + font-size: 18px; + margin-bottom: 32px; + } + .signup-buttons { + max-width: 100%; + gap: 24px; + margin-bottom: 48px; + } + .signup-btn { + height: 70px; + font-size: 18px; + } + .signup-btn .signup-btn-icon { + width: 22px; + height: 26px; + } + .signup-navigation { + gap: 20px; + } + .signup-navigation .signup-nav-link, + .signup-navigation .signup-nav-separator { + font-size: 14px; + } +} +.corporate-transfer-section { + margin-top: 40px; + padding-top: 24px; +} +.corporate-transfer-section .btn-block { + width: 100%; +} + +.register-title-bar { + padding: 18px 45px; + display: flex; + align-items: baseline; + gap: 16px; +} +@media (max-width: 1024px) { + .register-title-bar { + flex-direction: column; + gap: 8px; + padding: 14px 20px; + } +} +.register-title-bar .register-title { + font-size: 28px; + font-weight: 700; + color: #1A1A2E; + margin: 0; +} +@media (max-width: 1024px) { + .register-title-bar .register-title { + font-size: 22px; + } +} +.register-title-bar .register-subtitle { + font-size: 16px; + font-weight: 400; + color: #515151; +} +@media (max-width: 1024px) { + .register-title-bar .register-subtitle { + font-size: 14px; + } +} + +.register-progress { + display: flex; + justify-content: center; + margin-bottom: 40px; +} + +.progress-steps { + display: flex; + align-items: flex-start; + gap: 50px; +} + +.step-dots { + display: flex; + gap: 6px; +} +.step-dots span { + width: 6px; + height: 6px; + border-radius: 50%; + background-color: #dadada; +} +@media (max-width: 1024px) { + .step-dots { + display: none; + } +} + +.progress-step-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; +} +.progress-step-item .step-icon-wrapper { + padding: 10px; +} +.progress-step-item .step-icon { + width: 62px; + height: 62px; + border-radius: 50%; + background-color: #e6e6e6; + display: flex; + align-items: center; + justify-content: center; + color: #999; +} +.progress-step-item.active .step-icon { + background-color: #0049b4; + color: #FFFFFF; +} +.progress-step-item .step-label { + font-size: 14px; + font-weight: 400; + color: #dadada; + text-align: center; + white-space: nowrap; +} +.progress-step-item.active .step-label { + font-weight: 700; + color: #0049b4; +} + +.register-form-container { + padding: 50px 45px; +} +@media (max-width: 1024px) { + .register-form-container { + padding: 30px 20px; + } +} +.register-form-container.with-sidebar { + display: flex; + gap: 0; + padding: 28px; + min-height: 600px; +} +@media (max-width: 768px) { + .register-form-container.with-sidebar { + flex-direction: column; + } +} + +.register-form-container .form-input { + width: 100%; + height: 60px; + padding: 0 20px; + border: 1px solid #dadada; + border-radius: 12px; + background-color: #FFFFFF; + font-size: 20px; + color: #1A1A2E; + outline: none; + transition: border-color 0.2s ease; +} +.register-form-container .form-input::placeholder { + color: #dadada; +} +.register-form-container .form-input:focus { + border-color: #0049b4; +} +@media (max-width: 1024px) { + .register-form-container .form-input { + height: 50px; + font-size: 16px; + } +} +.register-form-container .form-textarea { + width: 100%; + min-height: 190px; + padding: 18px 20px; + border: 1px solid #dadada; + border-radius: 12px; + background-color: #FFFFFF; + font-size: 20px; + color: #1A1A2E; + outline: none; + resize: vertical; + transition: border-color 0.2s ease; +} +.register-form-container .form-textarea::placeholder { + color: #dadada; +} +.register-form-container .form-textarea:focus { + border-color: #0049b4; +} +@media (max-width: 1024px) { + .register-form-container .form-textarea { + min-height: 140px; + font-size: 16px; + } +} + +.icon-upload-box { + background-color: #FFFFFF; + border: 1px solid #dadada; + border-radius: 12px; + padding: 50px 40px; + display: flex; + flex-direction: column; + align-items: center; + gap: 26px; +} +@media (max-width: 1024px) { + .icon-upload-box { + padding: 30px 20px; + } +} + +.icon-preview-area { + width: 100px; + height: 100px; + position: relative; +} +.icon-preview-area img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 8px; +} + +.icon-placeholder { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + border-radius: 8px; + color: #999; +} + +.icon-upload-box .btn-remove-icon { + position: absolute; + top: -8px; + right: -8px; + width: 24px; + height: 24px; + border-radius: 50%; + background-color: #dc3545; + color: #FFFFFF; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s ease; +} +.icon-upload-box .btn-remove-icon:hover { + background-color: #c82333; +} + +.icon-upload-info { + text-align: center; +} +.icon-upload-info .upload-title { + font-size: 16px; + font-weight: 700; + color: #515961; + margin: 0 0 11px; +} +.icon-upload-info .upload-hint { + font-size: 14px; + font-weight: 400; + color: #515961; + margin: 0; +} +.icon-upload-info .upload-hint strong { + font-weight: 700; +} + +.ip-input-row { + display: flex; + gap: 21px; +} +.ip-input-row .ip-input { + flex: 1; +} +@media (max-width: 1024px) { + .ip-input-row { + flex-direction: column; + gap: 12px; + } +} + +.btn-add-ip { + width: 158px; + height: 60px; + background-color: #3ba4ed; + color: #FFFFFF; + border: none; + border-radius: 12px; + font-size: 20px; + font-weight: 700; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; +} +.btn-add-ip:hover { + background-color: #2b94dd; +} +@media (max-width: 1024px) { + .btn-add-ip { + width: 100%; + font-size: 16px; + height: 50px; + } +} + +.register-form-container .ip-list { + margin-top: 20px; + border: none; + background: transparent; +} +.register-form-container .ip-list .ip-items { + display: flex; + flex-direction: column; + gap: 10px; + max-height: none; +} +.register-form-container .ip-list .ip-item { + display: flex; + gap: 21px; + padding: 0; + border-bottom: none; +} +.register-form-container .ip-list .ip-item:hover { + background: transparent; +} +@media (max-width: 1024px) { + .register-form-container .ip-list .ip-item { + flex-direction: column; + gap: 12px; + } +} +.register-form-container .ip-list .ip-item .ip-display { + flex: 1; + height: 60px; + padding: 0 20px; + border: 1px solid #dadada; + border-radius: 8px; + background-color: #FFFFFF; + display: flex; + align-items: center; + font-size: 20px; + color: #1A1A2E; +} +.register-form-container .ip-list .ip-item .btn-remove-ip { + width: 158px !important; + height: 60px !important; + background-color: #e5e7eb !important; + color: #5f666c !important; + border: none !important; + border-radius: 12px !important; + font-size: 20px !important; + font-weight: 700; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; + display: flex !important; + align-items: center; + justify-content: center; +} +@media (max-width: 1024px) { + .register-form-container .ip-list .ip-item .btn-remove-ip { + width: 100% !important; + font-size: 16px !important; + height: 50px !important; + } +} + +.apikey-register-container { + padding: 40px 24px; +} +@media (max-width: 768px) { + .apikey-register-container { + padding: 24px 16px; + } +} +.apikey-register-container.with-sidebar { + display: flex; + min-height: calc(100vh - 200px); + position: relative; + padding: 0; +} + +.register-progress { + margin-bottom: 48px; + padding: 0 24px; +} +.register-progress .progress-steps { + display: flex; + align-items: center; + justify-content: center; + position: relative; +} +.register-progress .progress-step { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + z-index: 2; +} +.register-progress .progress-step .step-number { + width: 40px; + height: 40px; + border-radius: 50%; + background: #FFFFFF; + border: 2px solid #E2E8F0; + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + color: #64748B; + transition: all 0.3s ease; + margin-bottom: 8px; +} +.register-progress .progress-step .step-label { + font-size: 14px; + color: #64748B; + white-space: nowrap; +} +.register-progress .progress-step.active .step-number { + background: #0049b4; + border-color: #0049b4; + color: #FFFFFF; + box-shadow: 0 0 0 4px rgba(0, 73, 180, 0.1); +} +.register-progress .progress-step.active .step-label { + color: #0049b4; + font-weight: 500; +} +.register-progress .progress-step.completed .step-number { + background: #6BCF7F; + border-color: #6BCF7F; + color: #FFFFFF; +} +.register-progress .progress-step.completed .step-label { + color: #1A1A2E; +} +.register-progress .progress-line { + flex: 1; + height: 2px; + background: #E2E8F0; + margin: 0 16px; + margin-bottom: 28px; + position: relative; +} +.register-progress .progress-line.filled { + background: #6BCF7F; +} + +.register-header { + text-align: center; + margin-bottom: 48px; + padding: 0 24px; +} +.register-header h1 { + font-size: 32px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 8px; +} +.register-header h2 { + font-size: 24px; + font-weight: 600; + color: #0049b4; + margin-bottom: 16px; +} +.register-header .header-description { + font-size: 16px; + color: #64748B; + max-width: 600px; + margin: 0 auto; +} + +.apikey-register-sidebar { + width: 254px; + background-color: #eceff4; + border-radius: 12px; + padding: 23px 12px; + position: sticky; + top: 0; + height: fit-content; + max-height: calc(100vh - 100px); + overflow-y: auto; + flex-shrink: 0; +} +@media (max-width: 1024px) { + .apikey-register-sidebar { + width: 240px; + } +} +@media (max-width: 768px) { + .apikey-register-sidebar { + position: fixed; + left: 0; + top: 60px; + transform: translateX(-100%); + transition: transform 0.3s ease; + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); + z-index: 500; + height: calc(100vh - 60px); + max-height: none; + margin: 0; + border-radius: 0; + } + .apikey-register-sidebar.mobile-open { + transform: translateX(0); + } +} + +.apikey-sidebar-nav .sidebar-title { + font-size: 20px; + font-weight: 700; + color: #212529; + text-align: center; + padding: 20px 14px 45px; +} +.apikey-sidebar-nav .menu-section { + margin-bottom: 0; + border-bottom: 1px solid #dadada; +} +.apikey-sidebar-nav .menu-section:last-child { + border-bottom: none; +} +.apikey-sidebar-nav .menu-title { + padding: 22px 14px; + font-size: 20px; + font-weight: 400; + color: #212529; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} +.apikey-sidebar-nav .menu-title:hover { + background-color: rgba(0, 0, 0, 0.02); +} +.apikey-sidebar-nav .menu-title.active { + font-weight: 700; + color: #212529; +} +.apikey-sidebar-nav .menu-title .menu-icon { + width: 20px; + height: 20px; + flex-shrink: 0; +} +.apikey-sidebar-nav .menu-title .menu-icon img { + width: 100%; + height: 100%; + object-fit: contain; +} +.apikey-sidebar-nav .menu-title .menu-text { + flex: 1; +} +.apikey-sidebar-nav .menu-title .api-count { + width: 8px; + height: 8px; + padding: 0; + min-width: auto; + background-color: #dadada; + border-radius: 50%; + font-size: 0; + flex-shrink: 0; +} +.apikey-sidebar-nav .menu-title.active .api-count { + background-color: #3ba4ed; +} + +.apikey-register-content { + flex: 1; + padding: 23px 30px; + min-height: auto; + display: flex; + flex-direction: column; +} +.apikey-register-content .api-result-count { + font-size: 16px; + color: #64748B; + margin-bottom: 32px; +} +.apikey-register-content .api-result-count strong { + color: #0049b4; + font-weight: 600; +} +@media (max-width: 768px) { + .apikey-register-content { + padding: 24px 16px; + } +} + +.apikey-mobile-toggle { + display: none; + position: fixed; + bottom: 24px; + right: 24px; + width: 56px; + height: 56px; + border-radius: 50%; + border: none; + color: #FFFFFF; + font-size: 24px; + cursor: pointer; + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); + z-index: 501; + transition: all 0.3s ease; +} +.apikey-mobile-toggle:hover { + transform: scale(1.05); + box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); +} +.apikey-mobile-toggle:active { + transform: scale(0.95); +} +@media (max-width: 768px) { + .apikey-mobile-toggle { + display: flex; + align-items: center; + justify-content: center; + } +} + +.apikey-mobile-overlay { + display: none; + position: fixed; + top: 60px; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 499; + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; +} +@media (max-width: 768px) { + .apikey-mobile-overlay { + display: block; + } +} +.apikey-mobile-overlay.active { + opacity: 1; + pointer-events: auto; +} + +.api-filter-header { + display: flex; + justify-content: flex-end; + align-items: center; + margin-bottom: 32px; + gap: 16px; +} +@media (max-width: 768px) { + .api-filter-header { + justify-content: stretch; + } +} + +.api-search-box { + position: relative; + width: 228px; + height: 44px; + flex-shrink: 0; + margin-left: auto; +} +@media (max-width: 768px) { + .api-search-box { + width: 100%; + margin-left: 0; + } +} +.api-search-box .search-input { + width: 100%; + height: 100%; + padding: 0 44px 0 17px; + border: 1px solid #dadada; + border-radius: 12px; + background-color: #FFFFFF; + font-size: 14px; + font-family: inherit; + outline: none; + transition: all 0.3s ease; +} +.api-search-box .search-input:focus { + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.api-search-box .search-input::placeholder { + color: #8c959f; +} +.api-search-box svg { + position: absolute; + right: 17px; + top: 50%; + transform: translateY(-50%); + pointer-events: none; +} + +.selection-counter { + font-size: 16px; + color: #64748B; + white-space: nowrap; +} +.selection-counter .counter-value { + font-weight: 600; + color: #0049b4; +} + +.api-filter-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + margin-bottom: 24px; +} +@media (max-width: 768px) { + .api-filter-header { + flex-direction: column; + align-items: stretch; + gap: 16px; + } +} +.api-filter-header .select-all-wrapper { + display: flex; + align-items: center; + flex: 1; +} +@media (max-width: 768px) { + .api-filter-header .select-all-wrapper { + order: 2; + } +} +.api-filter-header .select-all-label { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + font-size: 16px; + color: #1A1A2E; + user-select: none; +} +.api-filter-header .select-all-label:hover { + color: #0049b4; +} +.api-filter-header .select-all-checkbox { + width: 18px; + height: 18px; + cursor: pointer; + accent-color: #0049b4; +} +.api-filter-header .select-all-checkbox:indeterminate { + opacity: 0.6; +} +@media (max-width: 768px) { + .api-filter-header .api-search-box { + order: 1; + } +} + +.api-selection-card-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px; + margin-bottom: 32px; +} +@media (max-width: 1024px) { + .api-selection-card-grid { + grid-template-columns: repeat(2, 1fr); + gap: 16px; + } +} +@media (max-width: 768px) { + .api-selection-card-grid { + grid-template-columns: 1fr; + gap: 16px; + } +} + +.custom-checkbox { + display: inline-block; + width: 22px; + height: 22px; + flex-shrink: 0; + cursor: pointer; + background-image: url("/img/checkbox-unchecked.svg"); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + border-radius: 50%; +} + +input[type=checkbox]:checked + .custom-checkbox { + background-color: #0049B4; + background-image: url("/img/checkbox-checked.svg"); +} + +.select-all-label .custom-checkbox { + margin-right: 8px; +} + +.api-selection-card { + background: #FFFFFF; + border: 1px solid #dadada; + border-radius: 12px; + transition: all 0.3s ease; + cursor: pointer; + position: relative; +} +.api-selection-card:hover { + border-color: #0049b4; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.api-selection-card.selected { + border-color: #0049b4; + background-color: rgba(0, 73, 180, 0.02); +} +.api-selection-card .api-card-content { + display: flex; + flex-direction: column; + gap: 14px; + padding: 26px 28px; + cursor: pointer; +} +.api-selection-card .api-card-content .api-card-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 13px; +} +.api-selection-card .api-card-content .api-card-header .api-card-category { + font-size: 14px; + font-weight: 400; + color: #6e7780; + flex: 1; +} +.api-selection-card .api-card-content .api-card-header .checkbox-wrapper { + flex-shrink: 0; +} +.api-selection-card .api-card-content .api-card-header .checkbox-wrapper .api-checkbox { + width: 22px; + height: 22px; + cursor: pointer; + accent-color: #0049b4; +} +.api-selection-card .api-card-content .api-name { + font-size: 18px; + font-weight: 700; + color: #212529; + margin: 0; + line-height: 1; +} +.api-selection-card .api-card-content .api-description { + font-size: 15px; + font-weight: 400; + color: #515961; + margin: 0; + line-height: 1.2; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.api-selection-card .api-card-content .api-card-icon { + display: flex; + justify-content: flex-end; + margin-top: auto; +} +.api-selection-card .api-card-content .api-card-icon img { + width: 50px; + height: 50px; + object-fit: contain; +} +.api-selection-card .api-card-content .api-card-icon i { + width: 50px; + height: 50px; + display: flex; + align-items: center; + justify-content: center; + font-size: 32px; + color: #999; +} + +.selected-summary { + background: #EFF6FF; + border-radius: 12px; + padding: 24px; + margin-bottom: 32px; +} +.selected-summary h3 { + font-size: 18px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 16px; +} +.selected-summary .selected-list { + display: flex; + flex-wrap: wrap; + gap: 8px; +} +.selected-summary .selected-list .selected-chip { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 6px 12px; + background: #FFFFFF; + border: 1px solid #0049b4; + border-radius: 50px; + font-size: 14px; + color: #0049b4; +} +.selected-summary .selected-list .selected-chip .remove-chip { + background: none; + border: none; + color: #0049b4; + font-size: 18px; + cursor: pointer; + padding: 0; + margin-left: 4px; +} +.selected-summary .selected-list .selected-chip .remove-chip:hover { + color: #FF6B6B; +} + +.empty-api-state { + padding: 48px; +} + +.loading-state { + padding: 48px; + text-align: center; + color: #64748B; +} +.loading-state .loading-spinner { + width: 48px; + height: 48px; + margin: 0 auto 24px; + border: 4px solid #E2E8F0; + border-top-color: #0049b4; + border-radius: 50%; + animation: spin 1s linear infinite; +} +.loading-state p { + font-size: 16px; + color: #64748B; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} +.register-form { + width: 100%; + max-width: 1021px; + margin: 0 auto; +} +.register-form .form-card { + background: #FFFFFF; + border-radius: 12px; + padding: 40px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + margin-bottom: 32px; +} +.register-form .form-group { + margin-bottom: 32px; +} +.register-form .form-group:last-child { + margin-bottom: 0; +} +.register-form .form-label { + display: block; + font-size: 14px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 8px; +} +.register-form .form-label.required .required-mark { + color: #FF6B6B; + margin-left: 4px; +} +.register-form .form-input, +.register-form .form-select, +.register-form .form-textarea { + width: 100%; + padding: 12px 16px; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 16px; + transition: all 0.3s ease; + background: #FFFFFF; +} +.register-form .form-input:focus, +.register-form .form-select:focus, +.register-form .form-textarea:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.register-form .form-input::placeholder, +.register-form .form-select::placeholder, +.register-form .form-textarea::placeholder { + color: #94A3B8; +} +.register-form .form-textarea { + resize: vertical; + min-height: 100px; + font-family: inherit; +} +.register-form .form-hint { + display: block; + font-size: 12px; + color: #64748B; + margin-top: 4px; +} +.register-form .form-hint .char-counter { + float: right; + color: #94A3B8; +} +.register-form .radio-group { + display: flex; + gap: 24px; + flex-wrap: wrap; +} +.register-form .radio-group .radio-label { + display: flex; + align-items: center; + cursor: pointer; +} +.register-form .radio-group .radio-label input[type=radio] { + margin-right: 8px; +} +.register-form .radio-group .radio-label .radio-text { + font-size: 16px; + color: #1A1A2E; +} +.register-form .icon-upload-wrapper { + display: flex; + align-items: center; + gap: 24px; +} +.register-form .icon-upload-wrapper .icon-preview { + width: 120px; + height: 120px; + border: 2px dashed #E2E8F0; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + background: #F8FAFC; + overflow: hidden; + position: relative; + transition: all 0.3s ease; +} +.register-form .icon-upload-wrapper .icon-preview:hover { + border-color: #0049b4; + background: rgba(0, 73, 180, 0.05); +} +.register-form .icon-upload-wrapper .icon-preview .icon-placeholder { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + color: #64748B; + text-align: center; + padding: 16px; +} +.register-form .icon-upload-wrapper .icon-preview .icon-placeholder svg { + opacity: 0.5; +} +.register-form .icon-upload-wrapper .icon-preview .icon-placeholder span { + font-size: 12px; + font-weight: 500; +} +.register-form .icon-upload-wrapper .icon-preview img { + width: 100%; + height: 100%; + object-fit: cover; +} +.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon { + position: absolute; + top: 8px; + right: 8px; + width: 28px; + height: 28px; + padding: 0; + background: rgba(255, 255, 255, 0.95); + border: 1px solid #E2E8F0; + border-radius: 50%; + color: #64748B; + cursor: pointer; + transition: all 0.3s ease; + display: none; + align-items: center; + justify-content: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + z-index: 10; +} +.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon svg { + width: 14px; + height: 14px; +} +.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon:hover { + background: #FF6B6B; + border-color: #FF6B6B; + color: #FFFFFF; + transform: scale(1.1); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon:active { + transform: scale(0.95); +} +.register-form .icon-upload-wrapper .icon-input { + display: none; +} +.register-form .icon-upload-wrapper .btn-icon-select { + padding: 10px 20px; + background: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + color: #1A1A2E; + cursor: pointer; + transition: all 0.3s ease; +} +.register-form .icon-upload-wrapper .btn-icon-select:hover { + background: #0049b4; + border-color: #0049b4; + color: #FFFFFF; +} +.register-form .icon-upload-wrapper .btn-icon-select:active { + transform: scale(0.98); +} +.register-form .ip-input-group { + display: flex; + gap: 8px; + margin-bottom: 16px; +} +.register-form .ip-input-group .form-input { + flex: 1; +} +.register-form .ip-input-group .btn-add-ip { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 10px 16px; + background: #0049b4; + border: none; + border-radius: 8px; + color: #FFFFFF; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + white-space: nowrap; +} +.register-form .ip-input-group .btn-add-ip svg { + flex-shrink: 0; +} +.register-form .ip-input-group .btn-add-ip:hover { + background: #c3dfea; + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.register-form .ip-input-group .btn-add-ip:active { + transform: translateY(0); +} +.register-form .ip-list { + margin-top: 16px; + overflow: hidden; +} +.register-form .ip-list .ip-list-header { + padding: 16px; + background: #F8FAFC; + border-bottom: 1px solid #E2E8F0; +} +.register-form .ip-list .ip-list-header .ip-count { + font-size: 14px; + color: #64748B; +} +.register-form .ip-list .ip-list-header .ip-count strong { + color: #0049b4; + font-weight: 600; +} +.register-form .ip-list .ip-items { + max-height: 240px; + overflow-y: auto; +} +.register-form .ip-list .ip-items::-webkit-scrollbar { + width: 6px; +} +.register-form .ip-list .ip-items::-webkit-scrollbar-track { + background: #F8FAFC; +} +.register-form .ip-list .ip-items::-webkit-scrollbar-thumb { + background: #E2E8F0; + border-radius: 3px; +} +.register-form .ip-list .ip-items::-webkit-scrollbar-thumb:hover { + background: #94A3B8; +} +.register-form .ip-list .ip-item { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #E2E8F0; + transition: all 0.3s ease; +} +.register-form .ip-list .ip-item:last-child { + border-bottom: none; +} +.register-form .ip-list .ip-item:hover { + background: #F8FAFC; +} +.register-form .ip-list .ip-item .ip-address { + font-family: "Fira Code", "Courier New", monospace; + font-size: 14px; + color: #1A1A2E; + font-weight: 500; +} +.register-form .ip-list .ip-item .btn-remove-ip { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + padding: 0; + background: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 6px; + color: #64748B; + cursor: pointer; + transition: all 0.3s ease; +} +.register-form .ip-list .ip-item .btn-remove-ip svg { + width: 14px; + height: 14px; +} +.register-form .ip-list .ip-item .btn-remove-ip:active { + transform: scale(0.95); +} + +.register-form-container .form-actions, .register-form-container .form-actions-center { + justify-content: space-between; + padding: 0 24px 24px; + margin-top: 40px; + border-top: none; + padding-top: 0; +} +@media (max-width: 768px) { + .register-form-container .form-actions, .register-form-container .form-actions-center { + padding: 0 16px 16px; + } +} + +.register-result { + text-align: center; + margin: 0 auto; + height: 1045px; + padding-top: 262px; +} +.register-result.success .result-icon img { + width: 250px; + height: 250px; +} +.register-result.error .result-icon { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; +} +.register-result .result-icon-wrapper { + margin-bottom: 32px; +} +.register-result .result-icon-wrapper .result-icon { + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; + font-size: 40px; +} +.register-result .result-header { + margin-bottom: 40px; +} +.register-result .result-header h1 { + font-size: 24px; + font-weight: 700; + color: #0049b4; + margin-bottom: 16px; +} +.register-result .result-header .result-description { + font-size: 16px; + color: #64748B; + margin: 0 auto; +} + +.key-info-card { + background: #FFFFFF; + border-radius: 12px; + padding: 32px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + margin-bottom: 32px; + text-align: left; +} +.key-info-card .info-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 0; + border-bottom: 1px solid #E2E8F0; +} +.key-info-card .info-row:last-child { + border-bottom: none; +} +.key-info-card .info-row .info-label { + font-size: 14px; + color: #64748B; + font-weight: 500; + min-width: 120px; +} +.key-info-card .info-row .info-value { + font-size: 16px; + color: #1A1A2E; + font-weight: 500; +} +.key-info-card .info-row .key-display { + display: flex; + align-items: center; + gap: 8px; + flex: 1; + justify-content: flex-end; +} +.key-info-card .info-row .key-display .key-value { + font-family: "Fira Code", "Courier New", monospace; + font-size: 14px; + background: #F8FAFC; + padding: 8px 12px; + border-radius: 6px; + color: #c3dfea; + margin-right: 8px; +} +.key-info-card .info-row .key-display .btn-copy, +.key-info-card .info-row .key-display .btn-toggle-visibility { + padding: 6px 10px; + background: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 6px; + cursor: pointer; + transition: all 0.3s ease; +} +.key-info-card .info-row .key-display .btn-copy:hover, +.key-info-card .info-row .key-display .btn-toggle-visibility:hover { + background: #0049b4; + border-color: #0049b4; + color: #FFFFFF; +} +.key-info-card .info-row .status-badge.active { + padding: 4px 12px; + background: rgba(107, 207, 127, 0.15); + color: #4FA065; + border-radius: 50px; + font-size: 12px; + font-weight: 600; +} + +.selected-apis-summary { + background: #F8FAFC; + border-radius: 12px; + padding: 24px; + margin-bottom: 32px; + text-align: left; +} +.selected-apis-summary h3 { + font-size: 18px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 16px; +} +.selected-apis-summary .api-chips { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 16px; +} +.selected-apis-summary .api-chips .api-chip { + padding: 6px 12px; + background: #FFFFFF; + border: 1px solid #0049b4; + border-radius: 50px; + font-size: 14px; + color: #0049b4; +} +.selected-apis-summary .api-note { + font-size: 12px; + color: #64748B; + font-style: italic; +} + +.next-steps-card { + background: #EFF6FF; + border-radius: 12px; + padding: 32px; + margin-bottom: 32px; + text-align: left; +} +.next-steps-card h3 { + font-size: 18px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 16px; +} +.next-steps-card .steps-list { + margin-left: 24px; + color: #64748B; + font-size: 14px; + line-height: 1.8; +} +.next-steps-card .steps-list li { + margin-bottom: 8px; +} + +.result-actions { + display: flex; + justify-content: center; + gap: 16px; + flex-wrap: wrap; +} +@media (max-width: 768px) { + .result-actions { + flex-direction: column; + align-items: stretch; + gap: 8px; + padding: 0 16px; + } +} +.result-actions .btn-primary, +.result-actions .btn-secondary { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + border-radius: 8px; + font-size: 16px; + font-weight: 500; + transition: all 0.3s ease; + text-decoration: none; + cursor: pointer; + border: none; +} +.result-actions .btn-primary .icon, +.result-actions .btn-secondary .icon { + font-size: 18px; +} +@media (max-width: 768px) { + .result-actions .btn-primary, + .result-actions .btn-secondary { + width: 100%; + min-height: 48px; + padding: 14px 24px; + justify-content: center; + } +} +.result-actions .btn-primary { + color: #FFFFFF; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.result-actions .btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); +} +.result-actions .btn-secondary { + background: #FFFFFF; + color: #1A1A2E; + border: 1px solid #E2E8F0; +} +.result-actions .btn-secondary:hover { + background: #F8FAFC; + border-color: #0049b4; + color: #0049b4; +} + +.floating-cart-btn { + position: fixed; + bottom: 80px; + right: 40px; + width: 180px; + height: 66px; + padding: 10px 16px 10px 36px; + border-radius: 60px; + background-color: #3ba4ed; + border: none; + color: #FFFFFF; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2); + transition: all 0.3s ease; + z-index: 300; +} +.floating-cart-btn .cart-label { + font-size: 14px; + font-weight: 700; + color: #FFFFFF; + white-space: nowrap; +} +.floating-cart-btn .cart-badge { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + background: #FFFFFF; + width: 57px; + height: 57px; + border-radius: 120px; + flex-shrink: 0; + margin-right: -8px; +} +.floating-cart-btn .cart-badge .cart-count { + font-size: 24px; + font-weight: 700; + color: #212529; + line-height: 1; +} +.floating-cart-btn .cart-badge .cart-unit { + font-size: 14px; + font-weight: 700; + color: #212529; + line-height: 1; + margin-top: 2px; +} +.floating-cart-btn:hover { + transform: translateY(-4px); + box-shadow: 0 12px 32px rgba(59, 164, 237, 0.4); +} +.floating-cart-btn:active { + transform: translateY(-2px); +} +@media (max-width: 768px) { + .floating-cart-btn { + bottom: 100px; + right: 24px; + width: 160px; + height: 56px; + padding: 8px 12px 8px 28px; + } + .floating-cart-btn .cart-label { + font-size: 12px; + } + .floating-cart-btn .cart-badge { + width: 48px; + height: 48px; + margin-right: -6px; + } + .floating-cart-btn .cart-badge .cart-count { + font-size: 20px; + } + .floating-cart-btn .cart-badge .cart-unit { + font-size: 12px; + } +} + +.modal-dialog .selected-apis-list { + display: flex; + flex-wrap: wrap; + gap: 8px; + align-items: flex-start; +} +.modal-dialog .api-pill { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 16px; + background: #f2f2f2; + border: none; + border-radius: 50px; + transition: all 0.2s ease; + max-width: 100%; + height: 47px; +} +.modal-dialog .api-pill:hover { + background: #e8e8e8; +} +.modal-dialog .api-pill .api-pill-name { + font-size: 16px; + font-weight: 400; + color: #000000; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 280px; + text-align: center; +} +.modal-dialog .api-pill .api-pill-remove { + flex-shrink: 0; + width: 20px; + height: 20px; + padding: 0; + background: transparent; + border: none; + border-radius: 50%; + color: #212529; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + overflow: hidden; +} +.modal-dialog .api-pill .api-pill-remove svg { + width: 12px; + height: 12px; +} +.modal-dialog .api-pill .api-pill-remove:hover { + background: rgba(0, 0, 0, 0.1); + transform: scale(1.1); +} +.modal-dialog .api-pill .api-pill-remove:active { + transform: scale(0.95); +} +@media (max-width: 768px) { + .modal-dialog .api-pill { + padding: 8px 14px; + height: 42px; + } + .modal-dialog .api-pill .api-pill-name { + font-size: 14px; + max-width: 200px; + } + .modal-dialog .api-pill .api-pill-remove { + width: 18px; + height: 18px; + } + .modal-dialog .api-pill .api-pill-remove svg { + width: 10px; + height: 10px; + } +} + +.apikey-detail-container { + padding: 40px 24px; +} +@media (max-width: 768px) { + .apikey-detail-container { + padding: 24px 16px; + } +} + +.register-header { + text-align: center; + margin-bottom: 80px; +} +.register-header h1 { + font-size: 48px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 8px; +} +.register-header .header-description { + font-size: 16px; + color: #64748B; +} + +.status-section { + text-align: center; + margin-bottom: 64px; +} + +.status-badge.badge-pending { + background-color: #FFF3CD; + color: #856404; +} +.status-badge.badge-approved { + background-color: #D4EDDA; + color: #155724; +} +.status-badge.badge-rejected { + background-color: #F8D7DA; + color: #721C24; +} + +.section-title { + font-size: 24px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 24px; + padding-bottom: 16px; +} + +.detail-label { + font-size: 14px; + font-weight: 600; + color: #64748B; +} + +.detail-value { + font-size: 16px; + color: #1A1A2E; + word-break: break-word; +} + +.status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: currentColor; +} + +.api-list-item .api-name { + flex: 1; + font-size: 16px; + font-weight: 500; + color: #1A1A2E; + margin: 0; +} + +.api-method { + display: inline-block; + padding: 4px 16px; + border-radius: 6px; + font-size: 14px; + font-weight: 700; + font-family: "Fira Code", "Courier New", monospace; + min-width: 80px; + text-align: center; +} +.api-method.method-get { + background-color: #D1FAE5; + color: #065F46; +} +.api-method.method-post { + background-color: #DBEAFE; + color: #1E40AF; +} +.api-method.method-put { + background-color: #FEF3C7; + color: #92400E; +} +.api-method.method-delete { + background-color: #FEE2E2; + color: #991B1B; +} +.api-method.method-other { + background-color: #E2E8F0; + color: #1A1A2E; +} + +.api-status { + padding: 4px 16px; + border-radius: 12px; + font-size: 14px; + font-weight: 600; +} +.api-status.status-pending { + background-color: #FFF3CD; + color: #856404; +} +.api-status.status-active { + background-color: #D4EDDA; + color: #155724; +} + +.history-table-wrapper { + overflow-x: auto; +} + +.history-table { + width: 100%; + border-collapse: collapse; +} +.history-table th { + background-color: #F8FAFC; + padding: 16px 16px; + text-align: left; + font-weight: 600; + color: #64748B; + border-bottom: 2px solid #E2E8F0; +} +.history-table td { + padding: 16px; + border-bottom: 1px solid #E2E8F0; +} + +.history-status { + display: inline-block; + padding: 4px 16px; + background-color: #EFF6FF; + color: #c3dfea; + border-radius: 12px; + font-size: 14px; + font-weight: 600; +} + +.empty-state { + grid-column: 1/-1; + padding: 48px 24px; +} + +@media (max-width: 768px) { + .btn-action, + .btn-secondary, + .btn-cancel { + width: 100%; + } +} + +.app-info-card { + display: flex; + align-items: flex-start; + gap: 32px; + padding: 0; + padding-top: 27px; + margin-bottom: 64px; +} +@media (max-width: 768px) { + .app-info-card { + flex-direction: column; + align-items: center; + text-align: center; + padding: 24px 0; + gap: 24px; + } +} + +.app-info-icon { + flex-shrink: 0; + width: 160px; + height: 160px; + border-radius: 16px; + overflow: hidden; + background: #F8FAFC; + display: flex; + align-items: center; + justify-content: center; + margin-left: 87px; +} +@media (max-width: 768px) { + .app-info-icon { + width: 120px; + height: 120px; + } +} +.app-info-icon .app-icon-image { + width: 100%; + height: 100%; + object-fit: cover; +} +.app-info-icon .app-icon-placeholder { + color: #94A3B8; + display: flex; + align-items: center; + justify-content: center; +} + +.app-info-content { + flex: 1; + display: flex; + flex-direction: column; + gap: 16px; +} + +.app-status-badge { + display: inline-block; + padding: 4px 24px; + border-radius: 50px; + font-size: 14px; + font-weight: 600; + width: fit-content; +} +.app-status-badge.status-approved { + background-color: #0049b4; + color: #FFFFFF; +} +.app-status-badge.status-pending { + background-color: #FFF3CD; + color: #856404; +} +.app-status-badge.status-inactive { + background-color: #E2E8F0; + color: #64748B; +} +.app-status-badge.status-rejected { + background-color: #F8D7DA; + color: #721C24; +} + +.app-info-name { + font-size: 24px; + font-weight: 700; + color: #1A1A2E; + margin: 0; +} +@media (max-width: 768px) { + .app-info-name { + font-size: 20px; + } +} + +.app-info-description { + font-size: 18px; + color: #515151; + margin: 0; + line-height: 1.5; +} +@media (max-width: 768px) { + .app-info-description { + font-size: 16px; + } +} + +.apikey-info-section { + background: #F6F9FB; + border-radius: 12px; + padding: 48px 40px; + margin-bottom: 40px; +} +@media (max-width: 768px) { + .apikey-info-section { + padding: 24px; + } +} + +.info-row { + display: flex; + align-items: center; + gap: 32px; + margin-bottom: 32px; +} +.info-row:last-child { + margin-bottom: 0; +} +@media (max-width: 768px) { + .info-row { + flex-direction: column; + align-items: flex-start; + gap: 8px; + } +} + +.info-row-vertical { + align-items: flex-start; +} +.info-row-vertical .info-value { + width: 100%; +} +@media (max-width: 768px) { + .info-row-vertical .info-value { + max-width: 100%; + } +} + +.info-label { + flex-shrink: 0; + width: 140px; + font-size: 20px; + font-weight: 700; + color: #212529; +} +@media (max-width: 768px) { + .info-label { + width: 100%; + font-size: 16px; + } +} + +.info-value { + flex: 1; + font-size: 16px; + color: #1A1A2E; + word-break: break-word; +} +@media (max-width: 768px) { + .info-value { + width: 100%; + } +} + +.info-value-box { + display: flex; + align-items: center; + justify-content: center; + height: 60px; + padding: 0 24px; + background: #DDDDDD; + border-radius: 12px; + font-size: 20px; + color: #515151; + text-align: center; +} +@media (max-width: 768px) { + .info-value-box { + height: 50px; + font-size: 16px; + padding: 0 16px; + } +} +.info-value-box.with-copy { + flex: 1; +} + +.info-row-with-action .info-value { + display: flex; + gap: 16px; + align-items: center; +} + +.btn-copy-action { + display: flex; + align-items: center; + justify-content: center; + gap: 4px; + height: 60px; + width: 158px; + padding: 0 24px; + background: #A4D6EA; + border: none; + border-radius: 12px; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + cursor: pointer; + white-space: nowrap; + transition: background 0.2s ease; +} +.btn-copy-action:hover { + background: rgb(122.5625, 195.3303571429, 224.4375); +} +@media (max-width: 768px) { + .btn-copy-action { + height: 50px; + font-size: 16px; + padding: 0 16px; + } +} + +.btn-view-secret { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + height: 60px; + background: #3BA4ED; + border: none; + border-radius: 12px; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + cursor: pointer; + transition: background 0.2s ease; +} +.btn-view-secret:hover { + background: rgb(20.6074766355, 140.8177570093, 224.3925233645); +} +.btn-view-secret svg { + width: 20px; + height: 20px; +} +@media (max-width: 768px) { + .btn-view-secret { + max-width: 100%; + height: 50px; + font-size: 16px; + } +} + +.api-list-box { + width: 100%; + background: #FFFFFF; + border: 1px solid #DADADA; + border-radius: 12px; + padding: 24px; +} +@media (max-width: 768px) { + .api-list-box { + max-width: 100%; + padding: 16px; + } +} + +.api-list-item-figma { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 0; + border-bottom: 1px solid #DADADA; +} +.api-list-item-figma:last-child { + border-bottom: none; +} +.api-list-item-figma .api-item-name { + font-size: 18px; + color: #000; +} +@media (max-width: 768px) { + .api-list-item-figma .api-item-name { + font-size: 16px; + } +} +.api-list-item-figma .api-item-status { + display: flex; + align-items: center; + justify-content: center; + min-width: 100px; + height: 30px; + padding: 0 24px; + background: #ECEFF4; + border-radius: 50px; + font-size: 16px; + color: #515151; +} +@media (max-width: 768px) { + .api-list-item-figma .api-item-status { + min-width: 80px; + font-size: 14px; + padding: 0 16px; + } +} + +.app-list-title { + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 28px; + font-weight: 700; + color: #1A1A2E; + margin: 0; +} +@media (max-width: 768px) { + .app-list-title { + font-size: 22px; + } +} + +.app-list-container { + min-height: 400px; +} + +.app-list-item { + display: flex; + align-items: center; + gap: 24px; + padding: 40px 0; + border-bottom: 1px solid #e0e0e0; + text-decoration: none; + color: inherit; + transition: background-color 0.2s ease; +} +.app-list-item:last-child { + border-bottom: none; +} +.app-list-item:hover { + background-color: rgba(255, 255, 255, 0.5); + margin: 0 -20px; + padding-left: 20px; + padding-right: 20px; + border-radius: 8px; +} +@media (max-width: 768px) { + .app-list-item { + flex-direction: column; + align-items: flex-start; + padding: 30px 0; + gap: 16px; + } + .app-list-item:hover { + margin: 0 -10px; + padding-left: 10px; + padding-right: 10px; + } +} + +.app-list-icon { + width: 70px; + height: 70px; +} +@media (max-width: 768px) { + .app-list-icon { + width: 60px; + height: 60px; + } +} +.app-list-icon .app-icon-image { + border: none; +} +.app-list-icon .app-icon-placeholder { + font-size: inherit; +} + +.app-list-info { + display: flex; + flex-direction: column; + gap: 14px; + flex: 1; +} + +.app-list-header { + display: flex; + align-items: center; + gap: 12px; +} +@media (max-width: 768px) { + .app-list-header { + flex-wrap: wrap; + gap: 8px; + } +} + +.app-list-name { + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 22px; + font-weight: 700; + color: #1A1A2E; + margin: 0; +} +@media (max-width: 768px) { + .app-list-name { + font-size: 18px; + } +} + +.app-list-description { + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + font-size: 16px; + font-weight: 400; + color: #6e7780; + margin: 0; + line-height: 1.5; +} +@media (max-width: 768px) { + .app-list-description { + font-size: 14px; + } +} + +.app-create-button-wrapper { + display: flex; + justify-content: center; + margin-top: 60px; +} +@media (max-width: 768px) { + .app-create-button-wrapper { + margin-top: 40px; + } +} + +.btn-app-create { + background-color: #0049b4; + color: #FFFFFF; +} +.btn-app-create:hover { + background-color: #003a91; +} + +.notice-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; +} +@media (max-width: 768px) { + .notice-page { + padding: 40px 16px; + } +} + +.notice-container { + max-width: 1280px; + margin: 0 auto; +} + +.notice-header { + margin-bottom: 48px; +} +@media (max-width: 768px) { + .notice-header { + margin-bottom: 40px; + } +} +.notice-header .page-title { + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 16px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} +@media (max-width: 768px) { + .notice-header .page-title { + font-size: 32px; + } +} +.notice-header .page-description { + font-size: 16px; + color: #64748B; + line-height: 1.6; +} +@media (max-width: 768px) { + .notice-header .page-description { + font-size: 14px; + } +} + +.notice-list-wrapper { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + overflow: hidden; + margin-bottom: 32px; +} + +.notice-detail-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; +} +@media (max-width: 768px) { + .notice-detail-page { + padding: 40px 16px; + } +} + +.notice-detail-container { + max-width: 960px; + margin: 0 auto; +} + +.notice-detail-card { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + overflow: hidden; + margin-bottom: 32px; +} +.notice-detail-card .detail-header { + padding: 48px 40px 32px; + border-bottom: 2px solid #E2E8F0; +} +@media (max-width: 768px) { + .notice-detail-card .detail-header { + padding: 40px 24px 16px; + } +} +.notice-detail-card .detail-header .notice-title { + font-size: 32px; + font-weight: 700; + color: #1A1A2E; + line-height: 1.2; + margin-bottom: 24px; +} +@media (max-width: 768px) { + .notice-detail-card .detail-header .notice-title { + font-size: 24px; + } +} +.notice-detail-card .detail-header .notice-meta { + display: flex; + align-items: center; + gap: 24px; + flex-wrap: wrap; + font-size: 14px; + color: #64748B; +} +@media (max-width: 768px) { + .notice-detail-card .detail-header .notice-meta { + font-size: 12px; + gap: 16px; + } +} +.notice-detail-card .detail-header .notice-meta .meta-item { + display: flex; + align-items: center; + gap: 4px; +} +.notice-detail-card .detail-header .notice-meta .meta-item i { + color: #0049b4; +} +.notice-detail-card .detail-header .notice-meta .meta-item strong { + color: #1A1A2E; + font-weight: 500; +} +.notice-detail-card .detail-attachments { + padding: 24px 40px; + background: #F8FAFC; + border-bottom: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .notice-detail-card .detail-attachments { + padding: 16px 24px; + } +} +.notice-detail-card .detail-attachments .attachment-list { + display: flex; + flex-direction: column; + gap: 8px; +} +.notice-detail-card .detail-attachments .attachment-list .attachment-item { + display: flex; + align-items: center; + gap: 8px; +} +.notice-detail-card .detail-attachments .attachment-list .attachment-item a { + color: #1A1A2E; + text-decoration: none; + font-size: 14px; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 4px; +} +@media (max-width: 768px) { + .notice-detail-card .detail-attachments .attachment-list .attachment-item a { + font-size: 12px; + } +} +.notice-detail-card .detail-attachments .attachment-list .attachment-item a:hover { + color: #0049b4; +} +.notice-detail-card .detail-attachments .attachment-list .attachment-item a:hover i { + transform: translateY(-2px); +} +.notice-detail-card .detail-attachments .attachment-list .attachment-item a i { + color: #0049b4; + transition: all 0.3s ease; +} +.notice-detail-card .detail-content { + padding: 48px 40px; + min-height: 300px; +} +@media (max-width: 768px) { + .notice-detail-card .detail-content { + padding: 40px 24px; + } +} +.notice-detail-card .detail-content .content-body { + font-size: 16px; + color: #1A1A2E; + line-height: 1.8; +} +@media (max-width: 768px) { + .notice-detail-card .detail-content .content-body { + font-size: 14px; + } +} +.notice-detail-card .detail-content .content-body p { + margin-bottom: 16px; +} +.notice-detail-card .detail-content .content-body p:last-child { + margin-bottom: 0; +} +.notice-detail-card .detail-content .content-body h1, .notice-detail-card .detail-content .content-body h2, .notice-detail-card .detail-content .content-body h3, .notice-detail-card .detail-content .content-body h4, .notice-detail-card .detail-content .content-body h5, .notice-detail-card .detail-content .content-body h6 { + margin-top: 32px; + margin-bottom: 16px; + font-weight: 600; + color: #1A1A2E; +} +.notice-detail-card .detail-content .content-body img { + max-width: 100%; + height: auto; + border-radius: 8px; + margin: 24px 0; +} +.notice-detail-card .detail-content .content-body a { + color: #0049b4; + text-decoration: underline; +} +.notice-detail-card .detail-content .content-body a:hover { + color: #c3dfea; +} +.notice-detail-card .detail-content .content-body ul, .notice-detail-card .detail-content .content-body ol { + margin: 16px 0; + padding-left: 32px; +} +.notice-detail-card .detail-content .content-body li { + margin-bottom: 8px; +} +.notice-detail-card .detail-content .content-body blockquote { + border-left: 4px solid #0049b4; + padding-left: 24px; + margin: 24px 0; + color: #64748B; + font-style: italic; +} +.notice-detail-card .detail-content .content-body code { + background: #F8FAFC; + padding: 2px 6px; + border-radius: 6px; + font-family: "Fira Code", "Courier New", monospace; + font-size: 0.9em; + color: #0049b4; +} +.notice-detail-card .detail-content .content-body pre { + background: #F8FAFC; + border: 1px solid #E2E8F0; + border-radius: 8px; + padding: 16px; + overflow-x: auto; + margin: 24px 0; +} +.notice-detail-card .detail-content .content-body pre code { + background: transparent; + padding: 0; + color: #1A1A2E; +} +.notice-detail-card .detail-content .content-body table { + width: 100%; + border-collapse: collapse; + margin: 24px 0; + border: 1px solid #E2E8F0; + border-radius: 8px; + overflow: hidden; +} +.notice-detail-card .detail-content .content-body table th { + background: #EFF6FF; + padding: 8px 16px; + text-align: left; + font-weight: 600; + border-bottom: 2px solid #E2E8F0; +} +.notice-detail-card .detail-content .content-body table td { + padding: 8px 16px; + border-bottom: 1px solid #E2E8F0; +} +.notice-detail-card .detail-content .content-body table tr:last-child td { + border-bottom: none; +} + +.notice-actions { + display: flex; + justify-content: center; + gap: 16px; + margin-bottom: 48px; +} +@media (max-width: 768px) { + .notice-actions { + flex-direction: column; + align-items: stretch; + } +} + +.notice-navigation { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + overflow: hidden; +} +.notice-navigation .nav-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 24px 40px; + border-bottom: 1px solid #E2E8F0; + transition: all 0.3s ease; + cursor: pointer; +} +@media (max-width: 768px) { + .notice-navigation .nav-item { + flex-direction: column; + align-items: flex-start; + padding: 16px 24px; + gap: 8px; + } +} +.notice-navigation .nav-item:last-child { + border-bottom: none; +} +.notice-navigation .nav-item:hover { + background: #F8FAFC; +} +.notice-navigation .nav-item:hover .nav-title { + color: #0049b4; +} +.notice-navigation .nav-item .nav-label { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + font-weight: 500; + color: #64748B; + min-width: 80px; +} +@media (max-width: 768px) { + .notice-navigation .nav-item .nav-label { + font-size: 12px; + } +} +.notice-navigation .nav-item .nav-label i { + color: #0049b4; +} +.notice-navigation .nav-item .nav-title { + flex: 1; + font-size: 16px; + color: #1A1A2E; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .notice-navigation .nav-item .nav-title { + font-size: 14px; + } +} +.notice-navigation .nav-item .nav-date { + font-size: 14px; + color: #94A3B8; + min-width: 100px; + text-align: right; +} +@media (max-width: 768px) { + .notice-navigation .nav-item .nav-date { + font-size: 12px; + text-align: left; + } +} + +.inquiry-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; +} +@media (max-width: 768px) { + .inquiry-page { + padding: 40px 16px; + } +} + +.inquiry-container { + max-width: 1280px; + margin: 0 auto; +} + +.inquiry-header { + margin-bottom: 48px; +} +@media (max-width: 768px) { + .inquiry-header { + margin-bottom: 40px; + } +} +.inquiry-header .page-title { + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 16px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} +@media (max-width: 768px) { + .inquiry-header .page-title { + font-size: 32px; + } +} +.inquiry-header .page-description { + font-size: 16px; + color: #64748B; + line-height: 1.6; +} +@media (max-width: 768px) { + .inquiry-header .page-description { + font-size: 14px; + } +} + +.inquiry-list-wrapper { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + overflow: hidden; + margin-bottom: 32px; +} + +.inquiry-table { + width: 100%; + background: #FFFFFF; + border-radius: 12px; + overflow: hidden; +} +.inquiry-table .table-header { + display: grid; + grid-template-columns: 80px 1fr 100px 100px 120px; + gap: 16px; + padding: 16px 24px; + background: #EFF6FF; + border-bottom: 2px solid #E2E8F0; + font-size: 14px; + font-weight: 600; + color: #1A1A2E; +} +@media (max-width: 1024px) { + .inquiry-table .table-header { + grid-template-columns: 60px 1fr 80px 100px; + padding: 8px 16px; + font-size: 12px; + } + .inquiry-table .table-header .col-name { + display: none; + } +} +@media (max-width: 768px) { + .inquiry-table .table-header { + display: none; + } +} +.inquiry-table .table-header .col-num { + text-align: center; +} +.inquiry-table .table-header .col-title { + text-align: left; +} +.inquiry-table .table-header .col-name { + text-align: center; +} +.inquiry-table .table-header .col-status { + text-align: center; +} +.inquiry-table .table-header .col-date { + text-align: center; +} +.inquiry-table .table-row { + display: grid; + grid-template-columns: 80px 1fr 100px 100px 120px; + gap: 16px; + padding: 24px; + border-bottom: 1px solid #E2E8F0; + transition: all 0.3s ease; + cursor: pointer; +} +@media (max-width: 1024px) { + .inquiry-table .table-row { + grid-template-columns: 60px 1fr 80px 100px; + padding: 16px; + } + .inquiry-table .table-row .col-name { + display: none; + } +} +@media (max-width: 768px) { + .inquiry-table .table-row { + grid-template-columns: 1fr; + gap: 8px; + padding: 16px; + } +} +.inquiry-table .table-row:last-child { + border-bottom: none; +} +.inquiry-table .table-row:hover { + background-color: rgba(0, 73, 180, 0.02); +} +.inquiry-table .table-row .col-num { + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + color: #64748B; + font-weight: 500; +} +@media (max-width: 768px) { + .inquiry-table .table-row .col-num { + display: none; + } +} +.inquiry-table .table-row .col-title { + display: flex; + align-items: center; + font-size: 16px; + color: #1A1A2E; + font-weight: 500; +} +@media (max-width: 768px) { + .inquiry-table .table-row .col-title { + font-size: 14px; + } +} +.inquiry-table .table-row .col-title a { + color: inherit; + text-decoration: none; + display: flex; + align-items: center; + gap: 8px; + transition: all 0.3s ease; +} +.inquiry-table .table-row .col-title a:hover { + color: #0049b4; +} +.inquiry-table .table-row .col-title .file-icon { + display: inline-flex; + align-items: center; + margin-left: 8px; + opacity: 0.6; +} +.inquiry-table .table-row .col-title .file-icon img { + width: 16px; + height: 16px; +} +.inquiry-table .table-row .col-name { + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + color: #64748B; +} +@media (max-width: 1024px) { + .inquiry-table .table-row .col-name { + display: none; + } +} +.inquiry-table .table-row .col-status { + display: flex; + align-items: center; + justify-content: center; +} +@media (max-width: 768px) { + .inquiry-table .table-row .col-status { + justify-content: flex-start; + } +} +.inquiry-table .table-row .col-date { + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + color: #94A3B8; +} +@media (max-width: 768px) { + .inquiry-table .table-row .col-date { + justify-content: flex-start; + font-size: 12px; + padding-top: 4px; + } +} +@media (max-width: 768px) { + .inquiry-table .table-row .col-date::before { + content: "등록일: "; + color: #64748B; + margin-right: 4px; + } +} + +.inquiry-actions { + display: flex; + justify-content: center; + align-items: center; + gap: 16px; + margin-top: 32px; +} +@media (max-width: 768px) { + .inquiry-actions { + flex-direction: column; + align-items: stretch; + } +} +.inquiry-actions .actions-left, +.inquiry-actions .actions-right { + display: flex; + align-items: center; + gap: 16px; +} +@media (max-width: 768px) { + .inquiry-actions .actions-left, + .inquiry-actions .actions-right { + width: 100%; + justify-content: center; + } +} +@media (max-width: 768px) { + .inquiry-actions { + flex-direction: column; + align-items: stretch; + gap: 16px; + } + .inquiry-actions .actions-left, + .inquiry-actions .actions-right { + flex-direction: column; + } +} + +.inquiry-detail-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; +} +@media (max-width: 768px) { + .inquiry-detail-page { + padding: 40px 16px; + } +} + +.inquiry-detail-container { + max-width: 960px; + margin: 0 auto; +} + +.inquiry-detail-card { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + overflow: hidden; + margin-bottom: 32px; +} +.inquiry-detail-card .detail-header { + padding: 48px 40px 32px; + border-bottom: 2px solid #E2E8F0; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-header { + padding: 40px 24px 16px; + } +} +.inquiry-detail-card .detail-header .inquiry-title { + font-size: 32px; + font-weight: 700; + color: #1A1A2E; + line-height: 1.2; + margin-bottom: 24px; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-header .inquiry-title { + font-size: 24px; + } +} +.inquiry-detail-card .detail-header .inquiry-meta { + display: flex; + align-items: center; + gap: 24px; + flex-wrap: wrap; + font-size: 14px; + color: #64748B; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-header .inquiry-meta { + font-size: 12px; + gap: 16px; + } +} +.inquiry-detail-card .detail-header .inquiry-meta .meta-item { + display: flex; + align-items: center; + gap: 4px; +} +.inquiry-detail-card .detail-header .inquiry-meta .meta-item i { + color: #0049b4; +} +.inquiry-detail-card .detail-header .inquiry-meta .meta-item strong { + color: #1A1A2E; + font-weight: 500; +} +.inquiry-detail-card .detail-attachments { + padding: 24px 40px; + background: #F8FAFC; + border-bottom: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-attachments { + padding: 16px 24px; + } +} +.inquiry-detail-card .detail-attachments .attachment-list { + display: flex; + flex-direction: column; + gap: 8px; +} +.inquiry-detail-card .detail-attachments .attachment-list .attachment-item { + display: flex; + align-items: center; + gap: 8px; +} +.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a { + color: #1A1A2E; + text-decoration: none; + font-size: 14px; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 4px; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-attachments .attachment-list .attachment-item a { + font-size: 12px; + } +} +.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a:hover { + color: #0049b4; +} +.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a:hover i { + transform: translateY(-2px); +} +.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a i { + color: #0049b4; + transition: all 0.3s ease; +} +.inquiry-detail-card .detail-content { + padding: 48px 40px; + min-height: 200px; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-content { + padding: 40px 24px; + } +} +.inquiry-detail-card .detail-content .content-body { + font-size: 16px; + color: #1A1A2E; + line-height: 1.8; + white-space: pre-line; +} +@media (max-width: 768px) { + .inquiry-detail-card .detail-content .content-body { + font-size: 14px; + } +} + +.inquiry-response-card { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + overflow: hidden; + margin-bottom: 32px; + border-left: 4px solid #6BCF7F; +} +.inquiry-response-card .response-header { + padding: 32px 40px; + background: rgba(107, 207, 127, 0.03); + border-bottom: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .inquiry-response-card .response-header { + padding: 24px; + } +} +.inquiry-response-card .response-header .response-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 20px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 8px; +} +.inquiry-response-card .response-header .response-title i { + color: #6BCF7F; +} +.inquiry-response-card .response-header .response-meta { + font-size: 14px; + color: #64748B; +} +@media (max-width: 768px) { + .inquiry-response-card .response-header .response-meta { + font-size: 12px; + } +} +.inquiry-response-card .response-content { + padding: 40px; + font-size: 16px; + color: #1A1A2E; + line-height: 1.8; + white-space: pre-line; +} +@media (max-width: 768px) { + .inquiry-response-card .response-content { + padding: 24px; + font-size: 14px; + } +} + +.inquiry-detail-actions { + display: flex; + justify-content: center; + gap: 16px; + margin-bottom: 48px; + flex-wrap: wrap; +} +@media (max-width: 768px) { + .inquiry-detail-actions { + flex-direction: column; + align-items: stretch; + } +} +.inquiry-detail-actions .action-btn { + padding: 16px 40px; + border-radius: 8px; + font-size: 16px; + font-weight: 500; + text-decoration: none; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + cursor: pointer; + border: none; +} +@media (max-width: 768px) { + .inquiry-detail-actions .action-btn { + padding: 16px 24px; + font-size: 14px; + } +} +.inquiry-detail-actions .action-btn.btn-list { + background: #FFFFFF; + color: #1A1A2E; + border: 1px solid #E2E8F0; +} +.inquiry-detail-actions .action-btn.btn-list:hover { + background: #F8FAFC; + border-color: #0049b4; +} +.inquiry-detail-actions .action-btn.btn-edit { + color: #FFFFFF; +} +.inquiry-detail-actions .action-btn.btn-edit:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.inquiry-detail-actions .action-btn.btn-delete { + background: #FF6B6B; + color: #FFFFFF; +} +.inquiry-detail-actions .action-btn.btn-delete:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.inquiry-detail-actions .action-btn i { + font-size: 16px; +} + +.inquiry-form-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; +} +@media (max-width: 768px) { + .inquiry-form-page { + padding: 40px 16px; + } +} + +.inquiry-form-container { + max-width: 960px; + margin: 0 auto; +} + +.inquiry-form-card { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + padding: 48px; + margin-bottom: 32px; +} +@media (max-width: 768px) { + .inquiry-form-card { + padding: 40px 24px; + } +} +.inquiry-form-card .form-group { + margin-bottom: 40px; +} +.inquiry-form-card .form-group:last-child { + margin-bottom: 0; +} +.inquiry-form-card .form-group .form-label { + display: block; + font-size: 16px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 16px; +} +@media (max-width: 768px) { + .inquiry-form-card .form-group .form-label { + font-size: 14px; + } +} +.inquiry-form-card .form-group .form-label.required::after { + content: "*"; + color: #FF6B6B; + margin-left: 4px; +} +.inquiry-form-card .form-group .form-input { + width: 100%; + padding: 16px; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 16px; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .inquiry-form-card .form-group .form-input { + font-size: 14px; + padding: 8px 16px; + } +} +.inquiry-form-card .form-group .form-input:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.inquiry-form-card .form-group .form-input::placeholder { + color: #94A3B8; +} +.inquiry-form-card .form-group .form-textarea { + width: 100%; + min-height: 200px; + padding: 16px; + border: 1px solid #E2E8F0; + border-radius: 8px; + font-size: 16px; + font-family: "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif; + resize: vertical; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .inquiry-form-card .form-group .form-textarea { + font-size: 14px; + padding: 8px 16px; + min-height: 150px; + } +} +.inquiry-form-card .form-group .form-textarea:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.inquiry-form-card .form-group .form-textarea::placeholder { + color: #94A3B8; +} + +.inquiry-form-actions { + display: flex; + justify-content: center; + gap: 16px; + margin-top: 32px; +} +@media (max-width: 768px) { + .inquiry-form-actions { + flex-direction: column-reverse; + align-items: stretch; + } +} + +.org-register-page { + min-height: 100vh; + padding: 0; +} +@media (max-width: 768px) { + .org-register-page { + padding: 0; + } +} + +.org-register-container { + padding: 40px 24px; +} +@media (max-width: 768px) { + .org-register-container { + padding: 24px 16px; + } +} + +.org-register-title { + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + text-align: center; + margin-bottom: 48px; +} +@media (max-width: 768px) { + .org-register-title { + font-size: 32px; + margin-bottom: 32px; + } +} + +.org-section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 24px 32px; + background: #EDF9FE; + border-radius: 8px; + margin-bottom: 32px; +} +.org-section-header h3 { + font-size: 20px; + font-weight: 400; + color: #515961; + margin: 0; +} +.org-section-header .required-badge { + background: rgba(255, 255, 255, 0.2); + color: #FFFFFF; + padding: 4px 16px; + border-radius: 50px; + font-size: 14px; + font-weight: 500; + display: inline-flex; + align-items: center; + gap: 4px; +} +.org-section-header .required-badge::before { + content: "*"; + color: #FFD93D; + font-weight: 700; +} +.org-section-header--agreement { + background: none; + padding: 0 0 16px 0; + border-radius: 0; + border-bottom: 2px solid #212529; + margin-bottom: 32px; +} +.org-section-header--agreement h3 { + font-size: 22px; + font-weight: 700; + color: #212529; + margin: 0; +} +.org-section-header--agreement .required-badge { + display: none; +} +@media (max-width: 768px) { + .org-section-header { + padding: 16px 24px; + } + .org-section-header h3 { + font-size: 18px; + } + .org-section-header--agreement { + padding: 0 0 8px 0; + } + .org-section-header--agreement h3 { + font-size: 18px; + } +} + +.org-info-notice { + border-radius: 8px; + margin-bottom: 16px; +} +.org-info-notice ul { + list-style: none; + padding: 0; + margin: 0; +} +.org-info-notice ul li { + position: relative; + padding-left: 24px; + color: #64748B; + font-size: 14px; + line-height: 1.6; +} +.org-info-notice ul li::before { + content: "•"; + position: absolute; + left: 0; + color: #0049b4; + font-weight: 700; +} +.org-info-notice ul li + li { + margin-top: 8px; +} + +.org-form-group { + margin-bottom: 8px; + display: flex; + align-items: flex-start; + gap: 24px; +} +.org-form-group:last-child { + margin-bottom: 0; +} +@media (max-width: 768px) { + .org-form-group { + flex-direction: column; + gap: 16px; + } +} + +.org-form-label { + display: flex; + align-items: center; + gap: 8px; + font-size: 16px; + font-weight: 600; + color: #1A1A2E; + min-width: 180px; + padding-top: 16px; +} +.org-form-label .required-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 2px 8px; + background: #3BA4ED; + color: #FFFFFF; + font-size: 12px; + font-weight: 500; + border-radius: 4px; + line-height: 1.2; +} +@media (max-width: 768px) { + .org-form-label { + min-width: auto; + padding-top: 0; + } +} + +.org-form-input-wrapper { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; +} +@media (max-width: 768px) { + .org-form-input-wrapper { + width: 100%; + } +} + +.org-input-row { + display: flex; + align-items: center; + gap: 16px; +} +.org-input-row .org-form-input, +.org-input-row .org-compound-input, +.org-input-row .org-auth-input-group { + flex: 1; + min-width: 0; +} +.org-input-row .org-btn-check, .org-input-row .org-file-label { + flex-shrink: 0; +} +@media (max-width: 768px) { + .org-input-row { + flex-direction: column; + align-items: stretch; + gap: 8px; + } + .org-input-row .org-form-input, + .org-input-row .org-compound-input, + .org-input-row .org-auth-input-group { + width: 100%; + } + .org-input-row .org-btn-check, .org-input-row .org-file-label { + width: 100%; + } +} + +.org-form-input { + width: 100%; + padding: 16px 24px; + border: 2px solid #E2E8F0; + border-radius: 8px; + font-size: 16px; + color: #1A1A2E; + transition: all 0.3s ease; + background: #FFFFFF; +} +.org-form-input:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(75, 155, 255, 0.1); +} +.org-form-input:disabled { + background: #F8FAFC; + color: #94A3B8; + cursor: not-allowed; +} +.org-form-input.is-invalid { + border-color: #FF6B6B; +} +.org-form-input.is-valid { + border-color: #6BCF7F; +} +.org-form-input::placeholder { + color: #94A3B8; +} + +.org-compound-input { + display: flex; + align-items: center; + gap: 8px; + width: 100%; +} +.org-compound-input .org-form-input, +.org-compound-input .org-form-select { + flex: 1; + min-width: 0; +} +.org-compound-input .phone-number { + flex: 1; + width: 100%; +} +.org-compound-input .separator { + color: #64748B; + font-weight: 600; + user-select: none; + flex-shrink: 0; +} +@media (max-width: 768px) { + .org-compound-input { + width: 100%; + } + .org-compound-input .org-form-input, + .org-compound-input .org-form-select { + flex: 1; + min-width: 0; + } +} + +.org-form-select { + width: 100%; + padding: 16px 24px; + border: 2px solid #E2E8F0; + border-radius: 8px; + font-size: 16px; + color: #1A1A2E; + background: #FFFFFF; + cursor: pointer; + transition: all 0.3s ease; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748B' d='M6 9L1 4h10z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 24px center; + padding-right: 48px; +} +.org-form-select:focus { + outline: none; + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(75, 155, 255, 0.1); +} +.org-form-select:disabled { + background-color: #F8FAFC; + color: #94A3B8; + cursor: not-allowed; +} + +.org-input-button-group { + display: flex; + gap: 16px; +} +.org-input-button-group .org-form-input { + flex: 1; +} +@media (max-width: 768px) { + .org-input-button-group { + flex-direction: column; + } + .org-input-button-group .org-form-input { + flex: none; + } +} + +.org-auth-input-group { + position: relative; + display: flex; + align-items: center; +} +.org-auth-input-group .org-form-input { + padding-right: 100px; +} + +.org-timer { + position: absolute; + right: 24px; + top: 50%; + transform: translateY(-50%); + font-size: 14px; + font-weight: 600; + color: #FF6B6B; + pointer-events: none; + user-select: none; +} + +.org-btn { + padding: 16px 40px; + border-radius: 8px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + border: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + white-space: nowrap; +} +.org-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} +.org-btn:not(:disabled):hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} +.org-btn:not(:disabled):active { + transform: translateY(0); +} + +.org-btn-primary { + color: #FFFFFF; +} + +.org-btn-secondary { + background: #FFFFFF; + color: #64748B; + border: 2px solid #E2E8F0; +} +.org-btn-secondary:not(:disabled):hover { + border-color: #0049b4; + color: #0049b4; +} + +.org-btn-check, .org-file-label { + padding: 16px 24px; + width: 172px; + background: #A4D6EA; + color: #FFFFFF; + border: 2px solid #A4D6EA; + text-align: center; + justify-content: center; +} +.org-btn-check:not(:disabled):hover, .org-file-label:not(:disabled):hover { + color: #FFFFFF; +} +@media (max-width: 768px) { + .org-btn-check, .org-file-label { + width: 100%; + } +} + +.org-file-upload { + display: flex; + align-items: center; + gap: 16px; +} +@media (max-width: 768px) { + .org-file-upload { + flex-direction: column; + align-items: stretch; + } +} + +.org-file-display { + flex: 1; + padding: 16px 24px; + border: 2px dashed #E2E8F0; + border-radius: 8px; + background: #F8FAFC; + color: #94A3B8; + cursor: default; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.org-file-display.has-file { + border-style: solid; + border-color: #6BCF7F; + background: rgba(107, 207, 127, 0.05); + color: #1A1A2E; +} + +.org-file-label { + cursor: pointer; + background: #3BA4ED; + border-radius: 12px; + border: 2px solid #3BA4ED; +} +.org-file-label input[type=file] { + display: none; +} + +.org-file-remove { + padding: 16px; + background: #FF6B6B; + color: #FFFFFF; + border: none; + border-radius: 8px; + cursor: pointer; + transition: all 0.3s ease; +} +.org-file-remove:hover { + background: #ff3838; +} + +.org-file-notice { + margin-top: 16px; + padding: 16px; + border-radius: 6px; +} +.org-file-notice p { + margin: 0; + font-size: 14px; + color: #64748B; + line-height: 1.5; +} +.org-file-notice p + p { + margin-top: 4px; +} +.org-file-notice p::before { + content: "• "; + color: #FFD93D; + font-weight: 700; +} + +.org-action-buttons { + display: flex; + gap: 24px; + justify-content: center; + margin-top: 64px; + padding-top: 48px; + border-top: 1px solid #E2E8F0; +} +.org-action-buttons .btn { + width: 220px; + text-align: center; + justify-content: center; +} +@media (max-width: 768px) { + .org-action-buttons { + flex-direction: column; + margin-top: 40px; + padding-top: 32px; + } +} + +.org-validation-message { + margin-top: 8px; + padding: 8px 16px; + border-radius: 6px; + font-size: 14px; +} +.org-validation-message.success { + background: rgba(107, 207, 127, 0.1); + color: #6BCF7F; +} +.org-validation-message.error { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; +} + +.org-loading-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(26, 26, 46, 0.7); + display: none; + align-items: center; + justify-content: center; + z-index: 9999; +} +.org-loading-overlay.active { + display: flex; +} +.org-loading-overlay .spinner { + width: 50px; + height: 50px; + border: 4px solid rgba(255, 255, 255, 0.2); + border-top-color: #FFFFFF; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} +@media (max-width: 768px) { + .org-form-input { + width: 100%; + } + .org-compound-input { + width: 100%; + } + .org-compound-input .org-form-select, + .org-compound-input .org-form-input { + flex: 1; + min-width: 0; + width: auto; + font-size: 14px; + padding: 8px 16px; + } + .org-auth-input-group { + width: 100%; + } + .org-auth-input-group .org-form-input { + width: 100%; + } +} +.agreement-form { + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 12px; + padding: 30px 20px; + display: flex; + flex-direction: column; + gap: 20px; + margin-bottom: 90px; +} + +.agreement-all-section { + display: flex; + align-items: center; + padding: 10px 0; +} + +.agreement-divider { + height: 1px; + background: #DDDDDD; + width: 100%; +} + +.agreement-items-list { + display: flex; + flex-direction: column; + gap: 20px; +} + +.agreement-item-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 4px; + height: 28px; +} + +.agreement-checkbox-label { + display: flex; + align-items: center; + gap: 4px; + cursor: pointer; + flex: 1; + user-select: none; +} + +.agreement-checkbox-input { + position: absolute; + opacity: 0; + pointer-events: none; +} +.agreement-checkbox-input:checked + .agreement-checkbox-custom { + background-image: url("/img/checkbox-checked.png"); +} +.agreement-checkbox-input:focus + .agreement-checkbox-custom { + box-shadow: 0 0 0 3px rgba(140, 149, 159, 0.1); +} + +.agreement-checkbox-custom { + position: relative; + width: 26px; + height: 26px; + min-width: 26px; + border: none; + border-radius: 50%; + background-image: url("/img/checkbox-unchecked.png"); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + transition: all 0.3s ease; + padding: 0; +} + +.agreement-checkbox-text { + font-size: 16px; + font-weight: 400; + color: #515961; + line-height: 100.02%; + display: flex; + align-items: center; + gap: 4px; +} +.agreement-checkbox-text.agreement-all-text { + font-size: 18px; + font-weight: 700; + color: #212529; +} + +.agreement-required { + color: #0049B4; + font-weight: 700; +} + +.agreement-title { + color: #515961; +} + +.agreement-toggle-icon { + display: flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + min-width: 22px; + border: none; + background: transparent; + color: #64748B; + cursor: pointer; + transition: all 0.3s ease; + padding: 8px 4px 10px 7px; +} +.agreement-toggle-icon i { + font-size: 12px; + transition: transform 0.3s ease; +} +.agreement-toggle-icon:hover { + color: #0049b4; +} +.agreement-toggle-icon.active { + color: #0049b4; +} +.agreement-toggle-icon.active i { + transform: rotate(180deg); +} + +.agreement-content { + margin-top: 16px; + background: #EDF9FE; +} + +.agreement-scroll { + max-height: 300px; + overflow-y: auto; + padding: 24px; +} +.agreement-scroll::-webkit-scrollbar { + width: 8px; +} +.agreement-scroll::-webkit-scrollbar-track { + background: #E2E8F0; + border-radius: 6px; +} +.agreement-scroll::-webkit-scrollbar-thumb { + background: #94A3B8; + border-radius: 6px; +} +.agreement-scroll::-webkit-scrollbar-thumb:hover { + background: #64748B; +} +.agreement-scroll div { + font-size: 14px; + line-height: 1.8; + color: #64748B; +} +.agreement-scroll div h1, .agreement-scroll div h2, .agreement-scroll div h3, .agreement-scroll div h4, .agreement-scroll div h5, .agreement-scroll div h6 { + color: #1A1A2E; + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; +} +.agreement-scroll div p { + margin-bottom: 16px; +} +.agreement-scroll div ul, .agreement-scroll div ol { + margin-left: 24px; + margin-bottom: 16px; +} +.agreement-scroll div table { + width: 100%; + border-collapse: collapse; + margin-bottom: 16px; +} +.agreement-scroll div table th, .agreement-scroll div table td { + border: 1px solid #E2E8F0; + padding: 8px; + text-align: left; +} +.agreement-scroll div table th { + background: #EFF6FF; + font-weight: 600; +} + +@media (max-width: 768px) { + .agreement-form { + padding: 20px 16px; + gap: 16px; + } + .agreement-all-section { + padding: 8px 0; + } + .agreement-items-list { + gap: 16px; + } + .agreement-item-row { + height: auto; + min-height: 28px; + } + .agreement-checkbox-text { + font-size: 14px; + } + .agreement-checkbox-text.agreement-all-text { + font-size: 16px; + } + .agreement-scroll { + max-height: 250px; + padding: 16px; + } +} +.page-header { + margin-bottom: 64px; + text-align: center; +} +@media (max-width: 768px) { + .page-header { + margin-bottom: 48px; + } +} +.page-header .page-header-content { + max-width: 800px; + margin: 0 auto; +} +.page-header .page-title { + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 16px; + display: flex; + align-items: center; + justify-content: center; + gap: 16px; +} +@media (max-width: 768px) { + .page-header .page-title { + font-size: 32px; + flex-direction: column; + gap: 8px; + } +} +.page-header .page-title i { + color: #0049b4; + font-size: 40px; +} +@media (max-width: 768px) { + .page-header .page-title i { + font-size: 32px; + } +} +.page-header .page-description { + font-size: 20px; + color: #64748B; + line-height: 1.6; +} +@media (max-width: 768px) { + .page-header .page-description { + font-size: 16px; + } +} +.page-header .page-description .highlight { + color: #0049b4; + font-weight: 600; + position: relative; +} +.page-header .page-description .highlight::after { + content: ""; + position: absolute; + bottom: -2px; + left: 0; + right: 0; + height: 2px; + border-radius: 2px; +} + +.partnership-form-container { + max-width: 800px; + margin: 0 auto; +} +@media (max-width: 768px) { + .partnership-form-container { + padding: 0 16px; + } +} + +.partnership-card { + padding: 64px; + background: #FFFFFF; + border-radius: 16px; + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); + border: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .partnership-card { + padding: 40px 24px; + border-radius: 8px; + } +} +.partnership-card .form-group { + margin-bottom: 40px; +} +@media (max-width: 768px) { + .partnership-card .form-group { + margin-bottom: 32px; + } +} +.partnership-card .form-group label { + display: flex; + align-items: center; + gap: 8px; + font-size: 16px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 16px; +} +.partnership-card .form-group label i { + color: #0049b4; + font-size: 18px; +} +.partnership-card .form-group label .required { + color: #FF6B6B; + margin-left: 2px; +} +.partnership-card .form-group textarea.form-control { + min-height: 200px; + resize: vertical; + line-height: 1.6; +} +@media (max-width: 768px) { + .partnership-card .form-group textarea.form-control { + min-height: 150px; + } +} +.partnership-card .form-hint { + display: flex; + align-items: flex-start; + gap: 4px; + margin-top: 8px; + font-size: 14px; + color: #64748B; + line-height: 1.6; +} +.partnership-card .form-hint i { + color: #0049b4; + margin-top: 2px; + flex-shrink: 0; +} +.partnership-card .form-error { + display: flex; + align-items: flex-start; + gap: 4px; + margin-top: 8px; + font-size: 14px; + color: #FF6B6B; + line-height: 1.6; +} +.partnership-card .form-error i { + margin-top: 2px; + flex-shrink: 0; +} +.partnership-card .form-help-text { + margin-top: 16px; +} +.partnership-card .form-help-text p { + display: flex; + align-items: flex-start; + gap: 4px; + margin: 4px 0; + font-size: 12px; + color: #94A3B8; + line-height: 1.6; +} +.partnership-card .form-help-text p i { + color: #6BCF7F; + margin-top: 2px; + flex-shrink: 0; +} + +.partnership-card .file-upload-wrapper .file-name-display.has-file { + color: #1A1A2E; + background: rgba(0, 73, 180, 0.05); + border-color: #0049b4; + font-weight: 500; +} +@media (max-width: 768px) { + .partnership-card .file-upload-wrapper .file-upload-btn { + order: 1; + } + .partnership-card .file-upload-wrapper .file-name-display { + order: 2; + } + .partnership-card .file-upload-wrapper .file-remove-btn { + order: 3; + } +} + +.partnership-card .form-control:focus { + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); + outline: none; +} +.partnership-card textarea.form-control:focus { + box-shadow: 0 0 0 4px rgba(0, 73, 180, 0.15); +} + +@media print { + .page-header { + margin-bottom: 32px; + } + .partnership-card { + box-shadow: none; + border: 1px solid #E2E8F0; + padding: 32px; + } + .form-actions, .form-actions-center { + display: none; + } + .file-upload-wrapper .file-upload-btn, + .file-upload-wrapper .file-remove-btn { + display: none; + } +} +.user-management-container { + max-width: 1400px; + margin: 0 auto; + padding: 48px 40px; + background-color: #F8FAFC; + min-height: 100vh; +} +@media (max-width: 768px) { + .user-management-container { + padding: 24px 16px; + } +} + +.user-management-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 40px; +} +@media (max-width: 768px) { + .user-management-header { + flex-direction: column; + align-items: flex-start; + gap: 24px; + } +} + +.user-management-title h1 { + font-size: 14px; + color: #64748B; + font-weight: 400; + margin-bottom: 4px; +} +.user-management-title h2 { + font-size: 32px; + font-weight: 700; + color: #1A1A2E; +} + +.user-management-actions { + display: flex; + gap: 16px; +} + +.btn-create-user-large { + padding: 16px 40px; + font-size: 18px; + margin-top: 24px; +} + +.table-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 24px; + padding: 0 8px; +} +@media (max-width: 768px) { + .table-controls { + flex-direction: column; + align-items: flex-start; + gap: 16px; + } +} + +.total-count { + font-size: 16px; + color: #64748B; +} +.total-count strong { + color: #0049b4; + font-weight: 600; + font-size: 20px; +} + +.user-list-wrapper { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + overflow: hidden; + margin-bottom: 40px; +} + +.user-table { + display: flex; + flex-direction: column; + width: 100%; +} + +.table-header { + display: grid; + grid-template-columns: 60px 120px 1fr 150px 120px 200px; + gap: 16px; + padding: 16px 24px; + background: #EFF6FF; + border-bottom: 2px solid #E2E8F0; + font-size: 14px; + font-weight: 600; + color: #1A1A2E; +} +@media (max-width: 1280px) { + .table-header { + grid-template-columns: 50px 100px 1fr 120px 100px 180px; + font-size: 12px; + padding: 8px 16px; + } +} +@media (max-width: 1024px) { + .table-header { + display: none; + } +} + +.table-row { + display: grid; + grid-template-columns: 60px 120px 1fr 150px 120px 200px; + gap: 16px; + padding: 24px; + border-bottom: 1px solid #E2E8F0; + align-items: center; + transition: all 0.3s ease; + cursor: pointer; +} +.table-row:hover { + background-color: rgba(0, 73, 180, 0.02); +} +.table-row:last-child { + border-bottom: none; +} +.table-row.row-pending { + background-color: rgba(255, 217, 61, 0.03); + border-left: 3px solid #FFD93D; +} +@media (max-width: 1280px) { + .table-row { + grid-template-columns: 50px 100px 1fr 120px 100px 180px; + padding: 16px; + font-size: 14px; + } +} +@media (max-width: 1024px) { + .table-row { + grid-template-columns: 1fr; + gap: 8px; + padding: 16px; + } + .table-row::before { + content: attr(data-label); + font-weight: 600; + color: #64748B; + } +} + +.col-num { + font-size: 14px; + color: #64748B; + text-align: center; +} +@media (max-width: 1024px) { + .col-num { + display: none; + } +} + +.col-name { + font-weight: 500; +} +.col-name a { + color: #1A1A2E; + text-decoration: none; + transition: all 0.3s ease; +} +.col-name a:hover { + color: #0049b4; +} +.col-name .pending-label { + display: inline-flex; + align-items: center; + gap: 4px; + color: #64748B; + font-style: italic; +} +.col-name .pending-label i { + color: #FFD93D; +} + +.col-email { + color: #64748B; + font-size: 14px; + word-break: break-all; +} + +.col-role { + display: flex; + align-items: center; +} + +.user-role-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background-color: rgba(0, 73, 180, 0.1); + color: #0049b4; + border-radius: 6px; + font-size: 12px; + font-weight: 500; +} +.user-role-badge i { + font-size: 12px; +} + +.col-status { + display: flex; + align-items: center; + justify-content: center; +} + +.col-actions { + display: flex; + align-items: center; + justify-content: flex-start; +} + +.user-status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 6px 12px; + border-radius: 50px; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + white-space: nowrap; +} +.user-status-badge.status-active { + background-color: rgba(107, 207, 127, 0.1); + color: rgb(68.4897959184, 194.5102040816, 93.693877551); +} +.user-status-badge.status-inactive { + background-color: rgba(100, 116, 139, 0.1); + color: #64748B; +} +.user-status-badge.status-pending { + background-color: rgba(255, 217, 61, 0.15); + color: rgb(163, 131.0721649485, 0); +} + +.user-current-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background-color: rgba(167, 139, 250, 0.1); + color: #A78BFA; + border-radius: 6px; + font-size: 12px; + font-weight: 500; +} + +.user-action-buttons { + display: flex; + flex-wrap: wrap; + gap: 4px; + align-items: center; +} + +.user-empty-state { + text-align: center; + padding: 80px 24px; + color: #64748B; +} +.user-empty-state .empty-icon { + font-size: 80px; + margin-bottom: 24px; + opacity: 0.5; +} +.user-empty-state h3 { + font-size: 24px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 16px; +} +.user-empty-state p { + font-size: 16px; + color: #64748B; +} + +.user-detail-container { + max-width: 900px; + margin: 0 auto; + padding: 40px; +} +@media (max-width: 768px) { + .user-detail-container { + padding: 24px 16px; + } +} + +.user-profile-card { + color: #FFFFFF; + margin-bottom: 32px; + position: relative; + overflow: hidden; +} +.user-profile-card::before { + content: ""; + position: absolute; + top: -50%; + right: -20%; + width: 400px; + height: 400px; + background: rgba(255, 255, 255, 0.05); + border-radius: 50%; +} +.user-profile-card .detail-grid { + border: none; +} + +.user-profile-header { + display: flex; + align-items: center; + gap: 32px; + position: relative; + z-index: 1; +} +@media (max-width: 768px) { + .user-profile-header { + flex-direction: column; + text-align: center; + } +} + +.user-profile-avatar { + flex-shrink: 0; +} + +.avatar-circle-large { + width: 100px; + height: 100px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 40px; + font-weight: 700; + background: rgba(255, 255, 255, 0.2); + color: #FFFFFF; + border: 4px solid rgba(255, 255, 255, 0.3); + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); +} + +.user-profile-info { + flex: 1; +} +.user-profile-info h2 { + font-size: 32px; + font-weight: 700; + margin-bottom: 8px; +} +.user-profile-info .user-profile-email { + font-size: 16px; + opacity: 0.9; + margin-bottom: 16px; +} + +.user-profile-badges { + display: flex; + gap: 8px; + flex-wrap: wrap; +} +@media (max-width: 768px) { + .user-profile-badges { + justify-content: center; + } +} +.user-profile-badges .user-status-badge, +.user-profile-badges .user-role-badge { + background: rgba(255, 255, 255, 0.2); + color: #FFFFFF; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.3); +} + +.detail-section { + background: #FFFFFF; + border-radius: 12px; + padding: 32px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + margin-bottom: 24px; +} +.detail-section h2 { + font-size: 20px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 24px; + padding-bottom: 8px; + border-bottom: 2px solid #EFF6FF; +} + +.detail-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 24px; +} +@media (max-width: 768px) { + .detail-grid { + grid-template-columns: 1fr; + } +} + +.detail-item { + display: flex; + flex-direction: column; + gap: 4px; +} +.detail-item.full-width { + grid-column: 1/-1; +} + +.detail-label { + font-size: 14px; + font-weight: 600; + color: #64748B; + display: flex; + align-items: center; + gap: 4px; +} +.detail-label i { + color: #0049b4; + font-size: 14px; +} + +.detail-value { + font-size: 16px; + color: #1A1A2E; + padding: 8px 0; +} + +.status-indicator { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 6px 12px; + border-radius: 6px; + font-size: 14px; + font-weight: 500; +} +.status-indicator.status-active { + background-color: rgba(107, 207, 127, 0.1); + color: rgb(68.4897959184, 194.5102040816, 93.693877551); +} +.status-indicator.status-active .status-dot { + background-color: #6BCF7F; +} +.status-indicator.status-inactive { + background-color: rgba(100, 116, 139, 0.1); + color: #64748B; +} +.status-indicator.status-inactive .status-dot { + background-color: #64748B; +} + +.status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} +.detail-actions { + display: flex; + gap: 16px; + justify-content: center; + padding-top: 24px; +} +@media (max-width: 768px) { + .detail-actions { + flex-direction: column; + } +} + +.commission-container { + max-width: 1400px; + margin: 0 auto; +} + +.wrap { + max-width: 1400px; + margin: 0 auto; + background: #FFFFFF; + padding: 24px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); +} + +.searchInfo { + display: inline-block; + margin-right: 8px; + margin-bottom: 16px; +} + +.searchBox { + background: #f8f9fa; + padding: 20px; + border-radius: 8px; + margin-top: 20px; + margin-bottom: 20px; +} +.searchBox.row-two { + display: flex; + align-items: center; + gap: 20px; + flex-wrap: wrap; +} +.searchBox label { + font-weight: 500; + color: #1A1A2E; + min-width: 80px; +} +.searchBox .form-control { + padding: 6px 12px; + border: 1px solid #E2E8F0; + border-radius: 6px; + font-size: 14px; + min-width: 100px; +} + +.form-inline { + display: flex; + align-items: center; + gap: 10px; +} + +.btnBox { + margin-left: auto; +} +.btnBox .btn + .btn { + margin-left: 5px; +} + +#printBtn { + display: none; +} + +.commission-notice { + color: #dc3545; + margin-top: 30px; + line-height: 1.6; +} + +.voffset3 { + margin-top: 30px; +} + +.color_red { + color: #FF6B6B; +} + +.color_blue { + color: #007bff; +} + +.color_darkRed { + color: #8b0000; +} + +.table-responsive { + overflow-x: auto; + margin-top: 30px; +} + +.table { + width: 100%; + border-collapse: collapse; + font-size: 14px; +} +.table th { + background: #F8FAFC; + font-weight: 500; + color: #1A1A2E; + padding: 16px; + text-align: center; + border: 1px solid #E2E8F0; +} +.table td { + padding: 16px; + text-align: center; + border: 1px solid #E2E8F0; +} + +.table-bordered { + border: 1px solid #E2E8F0; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #E2E8F0; +} + +.border-type { + border: 2px solid #dee2e6; +} + +.commission-table-wrapper { + margin-top: 30px; +} +.commission-table-wrapper .table { + border: 2px solid #dee2e6; +} + +.summary-row { + background-color: #fff3cd !important; +} +.summary-row td { + font-weight: 600; +} +.summary-row .summary-amount { + font-size: 16px; + color: #007bff; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-left { + text-align: left; +} + +.bg-warning { + background-color: #fff3cd !important; +} + +.glyphicon-search::before { + content: "🔍"; +} + +.info-table { + border-top: 10px solid #64748B; + width: 100%; + border-bottom: 2px solid #1A1A2E; + margin-bottom: 40px; +} +.info-table th { + text-align: left; + padding: 16px 24px; + font-weight: 600; + background: none; + border: none; +} +.info-table td { + padding: 16px 24px; + border: none; +} + +.commission-table { + width: 100%; + margin-top: 40px; +} +.commission-table th, +.commission-table td { + border: 1px solid #999 !important; + padding: 16px 24px; +} +.commission-table td { + text-align: right; +} + +.bg_ygreen { + background-color: aquamarine; + text-align: center; +} + +.bg_skyBlue { + background-color: skyblue; + text-align: center; +} + +.bg_yellow { + background-color: yellow; + text-align: center; +} + +@media print { + body { + padding: 0; + background: #FFFFFF; + } + .searchBox, + .searchInfo, + #printButton, + #backButton, + #printBtn { + display: none !important; + } + @page { + size: auto; + margin: 0 0cm; + } + html { + margin: 0 0cm; + } +} +@media screen and (max-width: 1024px) { + .wrap { + padding: 16px; + } + .searchBox { + padding: 16px; + } + .searchBox.row-two { + flex-direction: column; + align-items: flex-start; + gap: 16px; + } + .form-inline { + width: 100%; + flex-direction: column; + align-items: flex-start; + } + .form-inline label { + min-width: auto; + } + .form-inline .form-control { + width: 100%; + } + .btnBox { + margin-left: 0; + width: 100%; + } + .btnBox .btn { + width: 100%; + } + .table-responsive { + overflow-x: scroll; + -webkit-overflow-scrolling: touch; + } +} +body.commission-print-page { + font-size: 12px; + width: 600px; + margin: 90px; + font-family: "Noto Sans KR", -apple-system, sans-serif; +} +body.commission-print-page div { + position: relative; +} +body.commission-print-page table { + border-collapse: collapse; +} +body.commission-print-page table th, +body.commission-print-page table td { + padding: 5px 10px; +} +body.commission-print-page table tr { + font-size: 12px; +} +body.commission-print-page h1 { + text-align: center; +} +body.commission-print-page h1 img { + width: 300px; +} +body.commission-print-page h2 { + margin-top: 40px; + float: left; +} +body.commission-print-page p { + line-height: 1.6; +} +body.commission-print-page p[style*="float: right"] { + margin-top: 25px; +} +body.commission-print-page .btn { + padding: 8px 16px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} +body.commission-print-page .btn-primary { + background: #667eea; + color: white; +} +body.commission-print-page .btn-primary:hover { + background: #5a67d8; +} + +.terms-page { + min-height: calc(100vh - 140px); + background: #F8FAFC; + padding: 48px 24px; +} +@media (max-width: 768px) { + .terms-page { + padding: 40px 16px; + } +} + +.terms-container { + max-width: 1280px; + margin: 0 auto; +} + +.terms-header { + margin-bottom: 48px; +} +@media (max-width: 768px) { + .terms-header { + margin-bottom: 40px; + } +} +.terms-header .page-title { + font-size: 40px; + font-weight: 700; + color: #1A1A2E; + margin-bottom: 16px; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} +@media (max-width: 768px) { + .terms-header .page-title { + font-size: 32px; + } +} +.terms-header .page-description { + font-size: 16px; + color: #64748B; + line-height: 1.6; +} +@media (max-width: 768px) { + .terms-header .page-description { + font-size: 14px; + } +} + +.terms-content-card { + background: #FFFFFF; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1); + overflow: hidden; +} + +.terms-tabs { + display: flex; + gap: 0; + background: #F8FAFC; + padding: 4px; + border-bottom: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .terms-tabs { + padding: 4px; + } +} +.terms-tabs .tab-link { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 16px 24px; + font-size: 16px; + font-weight: 600; + color: #64748B; + text-decoration: none; + background: transparent; + border-radius: 8px; + transition: all 0.3s ease; + text-align: center; +} +@media (max-width: 768px) { + .terms-tabs .tab-link { + padding: 8px 16px; + font-size: 14px; + gap: 4px; + } +} +.terms-tabs .tab-link i { + font-size: 18px; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .terms-tabs .tab-link i { + font-size: 16px; + } +} +.terms-tabs .tab-link:hover { + color: #0049b4; + background: rgba(0, 73, 180, 0.05); +} +.terms-tabs .tab-link:hover i { + transform: scale(1.1); +} +.terms-tabs .tab-link.active { + color: #FFFFFF; + background: #0049b4; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} +.terms-tabs .tab-link.active i { + color: #FFFFFF; +} + +.terms-selector { + padding: 24px 40px; + background: #EFF6FF; + border-bottom: 1px solid #E2E8F0; +} +@media (max-width: 768px) { + .terms-selector { + padding: 16px 24px; + } +} +.terms-selector form { + max-width: 400px; +} +.terms-selector .custom-select { + position: relative; + cursor: pointer; +} +.terms-selector .custom-select .select-selected { + display: flex; + align-items: center; + gap: 8px; + padding: 16px 24px; + background: #FFFFFF; + border: 2px solid #E2E8F0; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + color: #1A1A2E; + transition: all 0.3s ease; + cursor: pointer; +} +@media (max-width: 768px) { + .terms-selector .custom-select .select-selected { + padding: 8px 16px; + font-size: 12px; + } +} +.terms-selector .custom-select .select-selected i:first-child { + color: #0049b4; +} +.terms-selector .custom-select .select-selected i:last-child { + margin-left: auto; + font-size: 12px; + color: #64748B; + transition: all 0.3s ease; +} +.terms-selector .custom-select .select-selected span { + font-weight: 600; + color: #0049b4; +} +.terms-selector .custom-select .select-selected:hover { + border-color: #0049b4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); +} +.terms-selector .custom-select .select-selected.select-arrow-active { + border-color: #0049b4; +} +.terms-selector .custom-select .select-selected.select-arrow-active i:last-child { + transform: rotate(180deg); +} +.terms-selector .custom-select .select-items { + position: absolute; + top: calc(100% + 4px); + left: 0; + right: 0; + background: #FFFFFF; + border: 2px solid #0049b4; + border-radius: 8px; + box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15); + max-height: 240px; + overflow-y: auto; + z-index: 100; + list-style: none; + padding: 4px; + margin: 0; +} +.terms-selector .custom-select .select-items.select-hide { + display: none; +} +.terms-selector .custom-select .select-items li { + padding: 8px 16px; + font-size: 14px; + color: #1A1A2E; + border-radius: 6px; + cursor: pointer; + transition: all 0.3s ease; +} +@media (max-width: 768px) { + .terms-selector .custom-select .select-items li { + padding: 4px 8px; + font-size: 12px; + } +} +.terms-selector .custom-select .select-items li:hover { + background: #EFF6FF; + color: #0049b4; +} +.terms-selector .custom-select .select-items li.selected { + background: #0049b4; + color: #FFFFFF; + font-weight: 600; +} + +.terms-content { + padding: 48px 40px; + min-height: 400px; +} +@media (max-width: 768px) { + .terms-content { + padding: 40px 24px; + min-height: 300px; + } +} +.terms-content .content-body { + font-size: 16px; + color: #1A1A2E; + line-height: 1.8; + white-space: pre-wrap; + word-wrap: break-word; +} +@media (max-width: 768px) { + .terms-content .content-body { + font-size: 14px; + } +} +.terms-content .content-body p { + margin-bottom: 16px; +} +.terms-content .content-body p:last-child { + margin-bottom: 0; +} +.terms-content .content-body h1, .terms-content .content-body h2, .terms-content .content-body h3, .terms-content .content-body h4, .terms-content .content-body h5, .terms-content .content-body h6 { + margin-top: 32px; + margin-bottom: 16px; + font-weight: 600; + color: #1A1A2E; + line-height: 1.2; +} +.terms-content .content-body h1:first-child, .terms-content .content-body h2:first-child, .terms-content .content-body h3:first-child, .terms-content .content-body h4:first-child, .terms-content .content-body h5:first-child, .terms-content .content-body h6:first-child { + margin-top: 0; +} +.terms-content .content-body h1 { + font-size: 32px; + font-weight: 700; + padding-bottom: 16px; + border-bottom: 2px solid #E2E8F0; +} +@media (max-width: 768px) { + .terms-content .content-body h1 { + font-size: 24px; + } +} +.terms-content .content-body h2 { + font-size: 24px; +} +@media (max-width: 768px) { + .terms-content .content-body h2 { + font-size: 20px; + } +} +.terms-content .content-body h3 { + font-size: 20px; +} +@media (max-width: 768px) { + .terms-content .content-body h3 { + font-size: 16px; + } +} +.terms-content .content-body strong { + font-weight: 700; + color: #1A1A2E; +} +.terms-content .content-body em { + font-style: italic; + color: #64748B; +} +.terms-content .content-body a { + color: #0049b4; + text-decoration: underline; + transition: all 0.3s ease; +} +.terms-content .content-body a:hover { + color: #c3dfea; +} +.terms-content .content-body ul, .terms-content .content-body ol { + margin: 16px 0; + padding-left: 40px; +} +@media (max-width: 768px) { + .terms-content .content-body ul, .terms-content .content-body ol { + padding-left: 24px; + } +} +.terms-content .content-body ul { + list-style-type: disc; +} +.terms-content .content-body ol { + list-style-type: decimal; +} +.terms-content .content-body li { + margin-bottom: 8px; + line-height: 1.6; +} +.terms-content .content-body li:last-child { + margin-bottom: 0; +} +.terms-content .content-body blockquote { + border-left: 4px solid #0049b4; + padding-left: 24px; + margin: 24px 0; + color: #64748B; + font-style: italic; + background: #F8FAFC; + padding: 16px 24px; + border-radius: 0 8px 8px 0; +} +@media (max-width: 768px) { + .terms-content .content-body blockquote { + padding: 8px 16px; + } +} +.terms-content .content-body code { + background: #F8FAFC; + padding: 2px 6px; + border-radius: 6px; + font-family: "Fira Code", "Courier New", monospace; + font-size: 0.9em; + color: #0049b4; +} +.terms-content .content-body pre { + background: #F8FAFC; + border: 1px solid #E2E8F0; + border-radius: 8px; + padding: 16px; + overflow-x: auto; + margin: 24px 0; +} +@media (max-width: 768px) { + .terms-content .content-body pre { + padding: 8px; + } +} +.terms-content .content-body pre code { + background: transparent; + padding: 0; + color: #1A1A2E; +} +.terms-content .content-body table { + width: 100%; + border-collapse: collapse; + margin: 24px 0; + border: 1px solid #E2E8F0; + border-radius: 8px; + overflow: hidden; + font-size: 14px; +} +@media (max-width: 768px) { + .terms-content .content-body table { + font-size: 12px; + } +} +.terms-content .content-body table th { + background: #EFF6FF; + padding: 8px 16px; + text-align: left; + font-weight: 600; + color: #1A1A2E; + border-bottom: 2px solid #E2E8F0; +} +@media (max-width: 768px) { + .terms-content .content-body table th { + padding: 4px 8px; + } +} +.terms-content .content-body table td { + padding: 8px 16px; + border-bottom: 1px solid #E2E8F0; + color: #1A1A2E; +} +@media (max-width: 768px) { + .terms-content .content-body table td { + padding: 4px 8px; + } +} +.terms-content .content-body table tr:last-child td { + border-bottom: none; +} +.terms-content .content-body table tr:hover { + background: #F8FAFC; +} +.terms-content .content-body hr { + border: none; + border-top: 1px solid #E2E8F0; + margin: 40px 0; +} +.terms-content .content-body .article { + margin-top: 40px; + padding-top: 24px; + border-top: 1px solid #E2E8F0; +} +.terms-content .content-body .article:first-child { + margin-top: 0; + padding-top: 0; + border-top: none; +} +.terms-content .content-body .section-number { + display: inline-block; + min-width: 30px; + color: #0049b4; + font-weight: 700; +} + +.terms-selector .select-items::-webkit-scrollbar { + width: 6px; +} +.terms-selector .select-items::-webkit-scrollbar-track { + background: #F8FAFC; + border-radius: 6px; +} +.terms-selector .select-items::-webkit-scrollbar-thumb { + background: #0049b4; + border-radius: 6px; +} +.terms-selector .select-items::-webkit-scrollbar-thumb:hover { + background: #c3dfea; +} + .container { max-width: 1280px; margin: 0 auto; @@ -5758,11 +14685,11 @@ select.form-control { } .bg-primary { - background: #4B9BFF; + background: #0049b4; } .bg-secondary { - background: #2E7FF7; + background: #c3dfea; } .bg-white { @@ -5777,18 +14704,6 @@ select.form-control { background: #EFF6FF; } -.bg-gradient-primary { - background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); -} - -.bg-gradient-accent { - background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); -} - -.bg-gradient-warm { - background: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%); -} - .border { border: 1px solid #E2E8F0; } @@ -5814,7 +14729,7 @@ select.form-control { } .border-primary { - border-color: #4B9BFF; + border-color: #0049b4; } .rounded-0 { @@ -5983,4 +14898,16 @@ select.form-control { transition: none; } +.visually-hidden, .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + /*# sourceMappingURL=main.css.map */ diff --git a/src/main/resources/static/css/main.css.map b/src/main/resources/static/css/main.css.map index 5af179c..2904fa3 100644 --- a/src/main/resources/static/css/main.css.map +++ b/src/main/resources/static/css/main.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../sass/base/_reset.scss","../sass/abstracts/_variables.scss","../sass/base/_typography.scss","../sass/abstracts/_mixins.scss","../sass/base/_animations.scss","../sass/layout/_header.scss","../sass/layout/_footer.scss","../sass/layout/_grid.scss","../sass/layout/_container.scss","../sass/components/_buttons.scss","../sass/components/_cards.scss","../sass/components/_forms.scss","../sass/components/_modals.scss","../sass/components/_navigation.scss","../sass/components/_partners.scss","../sass/components/_cta.scss","../sass/pages/_index.scss","../sass/pages/_api-market.scss","../sass/pages/_login.scss","../sass/base/_utilities.scss"],"names":[],"mappings":";AAIA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE,aCqBoB;EDpBpB,aC4CmB;ED3CnB,OCJU;EDKV,kBCFM;EDGN;;;AAIF;EACE;;;AAIF;EACE;EACA;EACA,YC4EgB;;;ADxElB;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;;;AAIF;EACE,aChBiB;EDiBjB,aCbkB;;;ADiBpB;AAAA;AAAA;EAGE;;;AAIF;EACE;EACA,OCxEU;;;AD2EZ;EACE;EACA,OC7EU;;;ACXZ;EACE,WDuCe;ECtCf,aDgDoB;EC/CpB,ODQU;;;ACJZ;EACE,WDuCc;ECtCd,aD6CsB;EC5CtB,eDuDW;;AE7DT;EDGJ;IAMI,WDgCY;;;AE3CZ;EDKJ;IAUI,WD2BY;;;;ACvBhB;EACE,WDwBc;ECvBd,aD8BiB;EC7BjB,eDwCW;;AE5DT;EDiBJ;IAMI,WDiBY;;;AE1CZ;EDmBJ;IAUI,WDYW;;;;ACRf;EACE,WDSc;ECRd,aDgBiB;ECfjB,eD0BW;;AE5DT;ED+BJ;IAMI,WDEW;;;;ACEf;EACE,WDFc;ECGd,aDKqB;ECJrB,eDeW;;;ACZb;EACE,WDTa;ECUb,aDDqB;ECErB,eDSW;;;ACNb;EACE,WDhBa;ECiBb,aDPqB;ECQrB,eDGW;;;ACCb;EACE,eDDW;ECEX,aDRmB;;ACUnB;EACE;;;AAKJ;ECTE,YF1CiB;EE2CjB;EACA;EACA;;;ADUF;ECbE,YFzCgB;EE0ChB;EACA;EACA;;;ADcF;ECjBE,YFxCc;EEyCd;EACA;EACA;;;ADkBF;EACE,ODrFa;;;ACwFf;EACE,ODxFe;;;AC2FjB;EACE,ODpFU;;;ACuFZ;EACE,ODvFU;;;AC0FZ;EACE,OD1FW;;;AC6Fb;EACE,OD7FM;;;ACiGR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,aD3EoB;;;AC8EtB;EACE,aD9EmB;;;ACiFrB;EACE,aDjFqB;;;ACoFvB;EACE,aDpFiB;;;ACuFnB;EACE,aDvFsB;;;AC2FxB;EACE,WD5Ga;;;AC+Gf;EACE,WD/Ga;;;ACkHf;EACE,WDlHe;;;ACqHjB;EACE,WDpHa;;;ACuHf;EACE,WDvHa;;;AC2Hf;EACE,WD7Ha;EC8Hb,aDtHoB;ECuHpB,aD9GkB;EC+GlB,OD9JU;;;ACiKZ;EACE,WDvIa;ECwIb,ODnKU;;;ACsKZ;EACE,aDhJiB;ECiJjB,WD7Ia;EC8Ib,YDtKQ;ECuKR;EACA,eD7GiB;;;ACiHnB;EACE,OD1La;;AC4Lb;EACE,OD5La;;;ACiMjB;EACE,SDrIW;ECsIX;EACA;EACA,YDzLQ;EC0LR;;AAEA;EACE;;;AAKJ;EACE;EACA;EACA;;;AEpNF;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;AAEA;EACE;;;AAIJ;EACE;;AAEA;EACE;EACA,YHjQQ;;;AGqQZ;EACE;;AAEA;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAMA;EACA;EACA;;AAGF;EACE;;;AClUJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EAGA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;;AAEA;EACE;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;;AAKJ;AAAA;AAAA;EAGE;EACA;EACA;;AAEA;AAAA;AAAA;EACE;;AAGF;AAAA;AAAA;EACE;;;AAKJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;EACA;EACA;EACA;;AAEA;EANF;IAOI;;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EANF;IAOI;;;;AAQF;EACE;EACA;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAKE;EACE;;AAEF;EACE;;AAEF;EACE;;;AAUV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAOV;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAMR;EACE;EACA,OJxZW;EIyZX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,YJ5dQ;EI6dR;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;EACA,YJxeM;EIyeN;;AAGF;EAAY;;AACZ;EAAW;;AAGb;EACE;;AACA;EAAY;EAAQ;;AACpB;EAAW;EAAQ;;;AAOvB;EAEE;EACA;EACA;EACA;EACA;EACA,YJ9fM;EI+fN,SJ1ac;EI2ad;EACA;EACA;EACA;EACA;;AAKA;EACE,SJvdS;EIwdT,YJ1gBM;EI2gBN;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA,SJxeK;EIyeL,OJ/hBI;EIgiBJ,WJlgBO;EImgBP,aJzfa;EI0fb;EACA;;AAGF;EACE;EACA;EACA,OJnfK;EIofL;EACA;EACA;EACA;EACA;EA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;;AAKJ;EACE;EACA;EACA,KN7FY;EM8FZ;;AJ7JE;EIyJJ;IAOI;;;;AAKJ;EACE;EACA;EACA,KN1GW;;AE9DT;EIqKJ;IAMI;;;;AAKJ;EACE;EACA;EACA,KNpHY;EMqHZ;;AJlLE;EI8KJ;IAOI;;;;AAKJ;EACE;EACA;EACA,KN7HY;;AEhEV;EI0LJ;IAMI;IACA,KNpIU;;;AMuIZ;EACE;EACA;EACA,KN1IU;;AE7DV;EIoMF;IAMI;;;AJ5MF;EIsMF;IAUI;IACA;;;;AAMN;EACE;EACA;EACA,KN7JW;EM8JX;;AJzNE;EIqNJ;IAOI;IACA,KNjKS;;;;AMsKb;EACE;EACA;EACA,KN1KW;;AE7DT;EIoOJ;IAMI;;;;AAKJ;EACE;EACA;EACA,KNpLW;EMqLX;;AJjPE;EI6OJ;IAOI;;;AJtPA;EI+OJ;IAWI;;;;AAKJ;EACE;EACA;EACA,KNlMY;EMmMZ;;AJjQE;EI6PJ;IAOI;IACA,KNzMS;;;AM4MX;EACE;;AAEA;EACE;;AJ5QF;EIwQF;IAQI;;;;AAMN;EACE;EACA;EACA,KN7NW;;AE5DT;EIsRJ;IAMI;;;;AClSJ;EACE,WPkFoB;EOjFpB;EACA;;ALCE;EKJJ;IAMI;;;AAIF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;;AAKJ;EACE;;ALtBE;EKqBJ;IAII;;;AAIF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAMF;EACE,YPtCM;;AOyCR;EACE,YPzCO;;AO4CT;EACE;;AAGF;EACE;;AAGF;EACE,YP9Ce;EO+Cf,OPxDI;;AO2DN;EACE,YP/DQ;EOgER,OP7DI;;;AOkER;EACE;EACA,ePbY;;AEjEV;EK4EJ;IAKI,ePjBU;;;AOoBZ;EACE;EACA;EACA,KP7BS;EO8BT;EACA,YP7EO;EO8EP,OP5FW;EO6FX,ePhBiB;EOiBjB,WPzDW;EO0DX,aP7CmB;EO8CnB,ePlCS;;AOqCX;EACE,WPzDY;EO0DZ,aPlDe;EOmDf,ePxCS;EOyCT,OP9FQ;;AEPR;EKiGF;IAOI,WPhEU;;;AOmEZ;EL9CF,YFzCgB;EE0ChB;EACA;EACA;;AKgDA;EACE,WP5EW;EO6EX,OP1GQ;EO2GR,aP7DiB;EO8DjB;EACA;;ALrHA;EKgHF;IAQI,WPpFW;;;;AO0FjB;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA,aPtDY;;;AO2DhB;EACE;EACA;;;AAIF;EACE;EACA;;;ACvJF;ENiCE;EACA;EACA,KF4BW;EE3BX;EACA,eFuCiB;EEtCjB,aFcqB;EEbrB,WFCe;EEAf;EACA,YFgEgB;EE/DhB;EACA;;AAEA;EACE;;AM9CJ;EAEE;EACA;;AAGA;EACE;EACA,WR+BW;;AQ5Bb;EACE;EACA,WR2Ba;;AQxBf;EACE;EACA,WRuBW;;AQpBb;EACE;EACA,WRmBW;;AQfb;EACE,YRLe;EQMf,ORfI;EQgBJ,YRDQ;;AQGR;EACE;EACA,YRHM;;AQMR;EACE;;AAIJ;EACE,YR7BI;EQ8BJ,OR1CW;EQ2CX;;AAEA;EACE,YRhCK;EQiCL;;AAIJ;EACE,YR9Bc;EQ+Bd,ORzCI;EQ0CJ,YR3BQ;;AQ6BR;EACE;EACA,YR7BM;;AQiCV;EACE,YRxCY;EQyCZ,ORpDI;EQqDJ,YRtCQ;;AQwCR;EACE;EACA,YRxCM;;AQ4CV;EACE,YRrEW;EQsEX,OR/DI;;AQiEJ;EACE;EACA;;AAIJ;EACE,YRhFY;EQiFZ,ORzEI;;AQ2EJ;EACE;EACA;;AAIJ;EACE;EACA,OR/FW;EQgGX;;AAEA;EACE;EACA,cRpGS;;AQwGb;EACE;EACA,ORjGQ;EQkGR;;AAEA;EACE,cR9GS;EQ+GT,OR/GS;EQgHT;;AAKJ;EAEE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;ENtDJ;EACA;EACA;EACA;EMqDI;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eRvEmB;;AQyEnB;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;;AAIF;EACE;EACA;;AAEA;EACE;;AAEA;EACE,wBRvGW;EQwGX,2BRxGW;;AQ2Gb;EACE,yBR5GW;EQ6GX,4BR7GW;;;AQoHnB;EACE;EACA,QRhIW;EQiIX,ORjIW;EQkIX;EACA;EACA,YR/KiB;EQgLjB;EACA,eRxHqB;EQyHrB,OR3LM;EQ4LN,WR/Ja;EQgKb;EACA,YR9KU;EQ+KV,YRpGgB;EQqGhB,SR9Gc;EE5Ed;EACA;EACA;;AM2LA;EACE;EACA,YRpLQ;;AQsLR;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA,YRrNQ;EQsNR,ORnNI;EQoNJ;EACA,eRxJe;EQyJf,WR7LW;EQ8LX;EACA;EACA,YR9Hc;EQ+Hd;;;AAMF;EN7MA;EACA;EACA,KF4BW;EE3BX;EACA,eFuCiB;EEtCjB,aFcqB;EEbrB,WFCe;EEAf;EACA,YFgEgB;EE/DhB;EACA;;AAEA;EACE;;AMgMF;EAEE,YRlOI;EQmOJ,OR/OW;EQgPX;EACA,WR1MW;EQ2MX,YRtNQ;;AQwNR;EACE;EACA,YRzNM;;AQ6NV;EN3NA;EACA;EACA,KF4BW;EE3BX;EACA,eFuCiB;EEtCjB,aFcqB;EEbrB,WFCe;EEAf;EACA,YFgEgB;EE/DhB;EACA;;AAEA;EACE;;AM8MF;EAEE;EACA,ORjPI;EQkPJ;EACA;EACA,WRzNW;;AQ2NX;EACE;EACA;;;ACtQN;EPoDE,YFtCM;EEuCN,eFyBkB;EExBlB,SF0Da;EEzDb,YFkDgB;;AEhDhB;EACE;EACA,YF7BQ;;AS9BZ;EAEE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAMA;EACA,YTuFc;EStFd;;AAGF;EACE;EACA;;;AAKJ;EPqBE,YFtCM;EEuCN,eFyBkB;EExBlB,SF0Da;EEzDb,YFkDgB;;AEhDhB;EACE;EACA,YF7BQ;;ASCZ;EAEE;EACA;;AAEA;EACE,cTnCW;ESoCX;;AAIF;EACE,cTtCY;ESuCZ;;AAIF;EACE,cT1CW;ES2CX;;AAIF;EACE;EACA;EACA;EACA;EACA,YTtDY;ESuDZ,OTjDQ;ESkDR,eTiBgB;EShBhB,WTxBW;ESyBX,aTVe;ESWf;;AAEA;EACE,YT5DS;ES6DT,OTtDE;;ASyDJ;EACE,YThEU;ESiEV,OT3DE;;ASgEN;EACE;EACA;EACA;EP7DF;EACA;EACA;EO6DE;EACA,YTpEO;ESqEP,OTnFW;ESoFX,eTTe;ESUf,YTkBc;;ASfhB;EACE;EACA,YTrEe;ESsEf,OT/EI;;ASmFN;EACE,WTxDW;ESyDX,aT9Ce;ES+Cf,eTpCS;ESqCT,OT1FQ;;AS6FV;EACE,OT7FQ;ES8FR,aThDiB;ESiDjB,eT1CS;ES2CT,WTrEW;;ASyEb;EACE;EACA;EACA,KTpDS;ESqDT,eTnDS;ESoDT;;AAEA;EACE;EACA,YT1GI;ES2GJ,OT9GM;ES+GN,eT7Cc;ES8Cd,WTtFS;ESuFT,aT1Ee;;AS+EnB;EACE;EACA;EACA,KTvES;ESwET,OTpIW;ESqIX,aTnFmB;ESoFnB,WTjGW;ESkGX,YThCc;;ASkCd;EACE,KT7EO;ES8EP,OT1IW;;;ASgJjB;EP/FE,YFtCM;EEuCN,eFyBkB;EExBlB,SF0Da;EEzDb,YFkDgB;;AEhDhB;EACE;EACA,YF7BQ;;ASqHZ;EAEE;;AAEA;EACE;EACA;EACA;EPtIF;EACA;EACA;EOsIE,WTjHW;ESkHX,YTtIe;ESuIf,OThJI;ESiJJ,eTlFe;;ASqFjB;EACE,WTzHW;ES0HX,aT/Ge;ESgHf,eTrGS;ESsGT,OT3JQ;;AS8JV;EACE,OT9JQ;ES+JR,aTjHiB;ESkHjB,eT3GS;ES4GT,WTtIW;;AS0Ib;EACE;EACA;EACA;EACA,aTpHS;ESqHT;;AAEA;EACE,WT9IS;ES+IT,aTpIkB;ESqIlB,OTzLS;;AS4LX;EACE,WTzJS;ES0JT,OTpLM;ESqLN,aT9Ie;;;ASoJrB;EPnJE,YFtCM;EEuCN,eFyBkB;EExBlB,SF0Da;EEzDb,YFkDgB;;AEhDhB;EACE;EACA,YF7BQ;;ASyKZ;EAEE;EACA;EACA,KT1IW;;AS4IX;EACE;EACA;EACA;EP5LF;EACA;EACA;EO4LE,YT3Le;ES4Lf,OTrMI;ESsMJ,eTxIe;ESyIf,WT1KW;;AS6Kb;EACE;;AAEA;EACE,WTnLS;ESoLT,aTzKiB;ES0KjB,eT/JO;ESgKP,OTpNM;;ASuNR;EACE,OTvNM;ESwNN,aT1Ke;ES2Kf,WT9LS;;;ASoMf;EPvLE,YFtCM;EEuCN,eFyBkB;EExBlB,SF0Da;EEzDb,YFkDgB;;AEhDhB;EACE;EACA,YF7BQ;;AS6MZ;EAEE;;AAEA;EACE;EACA;EACA,KTlLS;ESmLT,MTnLS;ESoLT;EACA,OTnPW;ESoPX;EACA,aTlMe;;ASqMjB;EACE;EACA;EACA,WTrNa;ESsNb,aTnMgB;ESoMhB,OTpPQ;ESqPR,eT/LS;ESgMT;;AAGF;EACE;EACA;EACA,KTvMS;;ASyMT;EACE;EACA;EACA,eT5LiB;ES6LjB;;AAIA;EACE,aT9Ne;ES+Nf,OTxQI;ESyQJ;;AAGF;EACE,WTjPO;ESkPP,OT7QI;;;ASoRZ;EP5OE,YFtCM;EEuCN,eFyBkB;EExBlB,SF0Da;EEzDb,YFkDgB;;AEhDhB;EACE;EACA,YF7BQ;;ASkQZ;EAEE;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA,YTxRa;ESyRb,OTlSE;ESmSF,eTlOe;ESmOf,WT5QS;ES6QT,aT9Pa;ES+Pb;;AAIJ;EACE,gBTxPS;ESyPT;EACA,eT1PS;;AS4PT;EACE,WTnRS;ESoRT,aT1Qa;ES2Qb,eTjQO;ESkQP,OTtTM;;ASyTR;EACE;EACA;EACA;EACA,KT1QO;;AS4QP;EACE,WTjSO;ESkSP,OThUI;;ASmUN;EACE,WTlSQ;ESmSR,aT3RgB;EEWtB,YF1CiB;EE2CjB;EACA;EACA;;AOiRI;EACE,WT9SS;ES+ST,OT3UI;;ASgVV;EACE;EACA,eT7RS;;AS+RT;EACE;EACA,OTtVM;ESuVN,WT5TS;ES6TT;EACA;EACA,KTvSO;;ASySP;EACE;EACA,OTnWO;ESoWP,aTtTW;;ASyTb;EACE;;AAEA;EACE;EACA,OTtWG;;AS4WX;EACE;;;AC1XJ;EACE,eVgEW;;AU9DX;EACE;EACA,WVkCW;EUjCX,aV6CiB;EU5CjB,OVIQ;EUHR,eVuDS;;AUrDT;EACE,OVLU;EUMV;;AAIJ;EACE,WVqBW;EUpBX,OVNQ;EUOR,YV2CS;;AUxCX;EACE,WVeW;EUdX,OVlBY;EUmBZ,YVqCS;EUpCT;EACA;EACA,KVkCS;;;AU7Bb;EACE;EACA;EACA,WVIe;EUHf,aVHoB;EUIpB,OV3BU;EU4BV,YVzBM;EU0BN;EACA,eVkCiB;EUjCjB,YV+DgB;;AU7DhB;EACE,OVhCS;;AUmCX;EACE;EACA,cVhDW;EUiDX;;AAGF;EACE,YVxCM;EUyCN,OV5CQ;EU6CR;;AAIF;EACE;EACA,WVxBW;;AU2Bb;EACE;EACA,WV3BW;;AU+Bb;EACE,cVlEW;;AUoEX;EACE;;AAIJ;EACE,cV3EY;;AU6EZ;EACE;;;AAMN;EACE;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA,eVnCY;;;AUuCd;EACE;EACA;EACA,eV7CW;;AU+CX;AAAA;EAEE;EACA;EACA,cVpDS;EUqDT;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;AAAA;EAEE;;;AAMN;EACE;EACA;EACA,KV5EW;;AU8EX;EACE;EACA;EACA;EACA,YVjIU;EUkIV,eVpEiB;EUqEjB;EACA,YV5Cc;;AU8Cd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YVhJE;EUiJF,eV/EiB;EUgFjB,YVvDY;;AU0Dd;EACE,YVlKS;;AUoKT;EACE;;;AAOR;EACE;EACA;;AAEA;EACE;EACA,WV5Ia;EU6Ib,OVzKQ;EU0KR,YVvKM;EUwKN;EACA;EACA;;AAGF;EACE;;AAIA;EACE;EACA;EACA;;AAGF;EACE;;;AAMN;EACE;EACA;EACA,KVjJW;;AUmJX;EACE;;ARhNA;EQ0MJ;IAUI;IACA;;EAEA;IACE,eV5JO;;;;AUkKb;EACE;EACA;EACA,KVpKW;;AE7DT;EQ8NJ;IAMI;;;;ACxOJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,SX2FuB;EW1FvB;EACA;EACA,YX+FgB;;AW7FhB;EACE;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA,SX0Ec;EWzEd;EACA;EACA;EACA,SXoCW;EWnCX;EACA;EACA,YXyEgB;;AWvEhB;EACE;EACA;;AAEA;EACE;;;AAMN;EACE;EACA,YXjCM;EWkCN,eX6BiB;EW5BjB,YXlBU;EWmBV;EACA;EACA;EACA;EACA;EACA;EACA,YXiDgB;;AW9ChB;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAKJ;EACE,SXjBW;EWkBX;EACA;EACA;EACA;;AAEA;EACE,WX9CW;EW+CX,aXtCmB;EWuCnB,OXhFQ;EWiFR;;AAGF;EACE;EACA;ET7EF;EACA;EACA;ES6EE;EACA;EACA,eX1Be;EW2Bf,OX1FQ;EW2FR,WX5DW;EW6DX;EACA;;AAEA;EACE,YX7FI;EW8FJ,OXlGM;;;AWwGZ;EACE,SXnDW;EWoDX;EACA;EACA,OX5GU;EW6GV,aX9DmB;;;AWkErB;EACE,SX5DW;EW6DX;EACA;EACA,KXhEW;EWiEX;;AAEA;EACE;;AAGF;EACE;;;AAMF;EACE;;AAGF;EACE;EACA,SXlFS;;AWoFT;EACE;EACA;EACA;ETrIJ;EACA;EACA;ESqII,WX/GU;EWgHV,eX5EiB;;AW8EjB;EACE;EACA,OXzJO;;AW4JT;EACE;EACA,OXhKQ;;AWmKV;EACE;EACA,OXpKQ;;AWuKV;EACE;EACA,OX7KO;;AWiLX;EACE,WXzIS;EW0IT,aXjIiB;EWkIjB,eXvHO;EWwHP,OX5KM;;AW+KR;EACE,OX/KM;;;AYZZ;EACE;EACA;EACA,KZ4DW;EY3DX;EACA,WZkCa;;AYhCb;EACE;EACA;EACA,KZqDS;EYpDT,OZCQ;;AYCR;EACE,OZFM;EYGN,YZ0FY;;AYxFZ;EACE,OZhBO;;AYoBX;EACE,OZZM;EYaN,aZ2Be;;AYxBjB;EACE;EACA,OZhBO;EYiBP,aZiCO;;;AY3Bb;EACE;EACA,KZwBW;EYvBX;EACA,eZ0BW;;AYxBX;EACE;;AAGF;EACE;EACA;EACA,KZcS;EYbT;EACA,OZvCQ;EYwCR,aZDiB;EYEjB;EACA;EACA,YZkDc;;AYhDd;EACE,OZ/CM;;AYkDR;EACE,OZ5DS;EY6DT,qBZ7DS;;AYgEX;EACE;EACA,YZrDI;EYsDJ,OZzDM;EY0DN,eZSe;EYRf;EACA,aZpBiB;;;AY0BvB;EACE;EACA,KZjBW;EYkBX,SZnBW;EYoBX,YZnEQ;EYoER,eZPiB;;AYSjB;EACE;EACA,OZ3EQ;EY4ER,aZrCiB;EYsCjB,eZde;EYef,YZec;;AYbd;EACE,OZlFM;EYmFN;;AAGF;EACE,YZpFE;EYqFF,OZjGS;EYkGT,YZxEM;;;AY+EV;EACE,eZ1CS;;AY4CT;EACE,WZzES;EY0ET,aZ5DiB;EY6DjB;EACA,OZtGM;EYuGN;EACA;;AAIJ;EACE;;AAEA;EACE,eZ9DO;;AYiET;EACE;EACA;EACA,KZlEO;EYmEP;EACA,OZzHM;EY0HN,eZ1Da;EY2Db,YZ7BY;;AY+BZ;EACE;EACA;EVtHN;EACA;EACA;EUsHM,WZnGO;EYoGP,OZjII;;AYoIN;EACE,YZlIE;EYmIF,OZhJO;;AYkJP;EACE,OZnJK;;AYuJT;EACE,YZ1IG;EY2IH,OZzJO;EY0JP,aZzGa;;AY2Gb;EACE,OZ7JK;;AYmKX;EACE,aZnGQ;EYoGR,YZzGO;EY0GP;;AAEA;EACE,WZpIO;EYqIP;;;AAOR;EACE;EACA;EACA,KZxHW;;AY4HP;EACE;EACA;EACA;;AAKF;EACE,YZjMO;EYkMP,OZtLA;EYuLA,cZnMO;;AYwMb;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YZnMI;EYoMJ;EACA,eZxIe;EYyIf,OZzMQ;EY0MR,WZ9KW;EY+KX,aZnKiB;EYoKjB,YZ9Gc;;AYgHd;EACE,YZ3MI;EY4MJ,cZzNS;EY0NT,OZ1NS;;AY6NX;EAEE,WZxLS;;AY4Lb;EACE;EACA,OZ3NQ;;;AabZ;EACE;EACA,YbaM;;;AcfR;EACE;EACA;EACA,YdqBiB;EcpBjB;;;ACJF;EACE;EACA;EACA;EACA;;AbCE;EaLJ;IAOI;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;Eb4GF,Oa3G4B;Eb4G5B,Qa5G4B;Eb6G5B,YFlIY;EEmIZ;EACA;EACA;Ea/GI;EACA;EbmEJ;;Aa/DE;EbqGF,OapG4B;EbqG5B,QarG4B;EbsG5B,YFjIc;EEkId;EACA;EACA;EaxGI;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA,Wf2BoB;Ee1BpB;EACA;;;AAIF;EACE;EACA;EACA,KfFW;EeGX;EACA,YfrDM;EesDN;EACA,efUmB;EeTnB,efLW;EeMX,WfhCa;EeiCb,afpBqB;EeqBrB,Of9DU;EE2FV;;Aa1BA;EACE,WfnCW;EEwDb;;;AafF;EACE,WfrCc;EesCd,af/BsB;EegCtB,af7BkB;Ee8BlB,eftBW;EeuBX,Of7EU;EE+FV;;AAtGE;Ea+EJ;IASI,Wf/CY;;;AE3CZ;EaiFJ;IAaI,WfpDY;;;AeuDd;EblCA,YFzCgB;EE0ChB;EACA;EACA;;;AaqCF;EACE,WfhEa;EeiEb,afzDoB;Ee0DpB,aflDmB;EemDnB,ef1CY;Ee2CZ,OflGU;EemGV;;Ab3GE;EaqGJ;IASI,Wf1Ea;;;;Ae+EjB;EACE;EACA,KfzDW;Ee0DX;EACA,eftDY;EeuDZ;;AbxHE;EamHJ;IAQI;IACA;;;AAGF;EblGA;EACA;EACA,KF4BW;EE3BX;EACA,eFuCiB;EEtCjB,aFcqB;EEbrB,WFCe;EEAf;EACA,YFgEgB;EE/DhB;EACA;;AAEA;EACE;;AawFA;EACE,YfhHa;EeiHb,Of1HE;Ee2HF,Yf5GM;;Ae8GN;EACE,Yf7GI;;AeiHR;EACE,YfnIE;EeoIF,OfhJS;EeiJT;;AAEA;EACE,YftIG;;AEdP;EaiIF;IAwBI;IACA;;;;AAMN;EACE;EACA;EACA,KfhGY;EEyCZ;;AA1GE;Ea8JJ;IAOI;IACA,KfzGS;;;Ae4GX;EACE;EACA;EACA;;AAEA;EACE,WftIU;EeuIV,af9HkB;EEWtB,YF1CiB;EE2CjB;EACA;EACA;;AaoHE;EACE,WflJS;EemJT,Of9KM;Ee+KN,afxIe;;;Ae8IrB;EACE;EACA,Yf9HY;Ee+HZ;;AAEA;EACE;EACA;EACA,ef5He;Ee6Hf,Yf3KQ;;Ae8KV;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;;AAGF;EACE;EACA;EACA,YftMU;EeuMV;EACA;Eb/HJ;;AamIE;EACE;EACA;EACA,YfhNY;EeiNZ;EACA;EACA;;;AAWN;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE,ef9MS;EEwCX;;Aa0KA;EACE;EACA,KftNS;EeuNT;;AbnRA;EagRF;IAMI;IACA,Kf5NO;;;AegOX;EACE;EACA;EACA,Wf1Pa;Ee2Pb;EACA,efrNiB;EesNjB,YfvRI;EewRJ;EACA;;AAEA;EACE,Of7RO;;AegST;EACE,cf5SS;Ee6ST;;Ab3SF;Ea2RF;IAoBI;IACA;;;AAIJ;EACE;EACA,YfnSe;EeoSf,Of7SI;Ee8SJ;EACA,ef9OiB;Ee+OjB,WftRa;EeuRb,af3QmB;Ee4QnB;EACA;EACA;EACA;EACA,KfrQS;EesQT,YfxSQ;EeySR;;AAEA;EACE,Wf/RS;;AekSX;EACE;EACA,Yf/SM;EegTN;;AAGF;EACE;EACA,YfxTM;;AExBR;EaoTF;IAgCI;IACA;IACA;;;AAIJ;EACE;EACA;EACA;EACA,KflSS;EemST;EACA;EACA;;AbjWA;Ea0VF;IAUI,KfzSO;Ie0SP;;;AAIJ;EACE,WfvUW;EewUX,OfnWQ;EeoWR,af7TiB;;AE/CjB;EayWF;IAMI;IACA,eftTO;;;Ae0TX;EACE;EACA;EACA;EACA,Yf9WI;Ee+WJ;EACA,ef/SiB;EegTjB,WfxVW;EeyVX,OfrXQ;EesXR;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YftXa;EeuXb;EACA;;AAGF;EACE,cfjZS;EekZT;EACA,YfzXM;Ee0XN,OfxYE;EeyYF;EACA;;AAEA;EACE;;AbvZJ;EaoXF;IAwCI;IACA,Wf3XS;;;;AeqYf;EACE;EACA,Yf/ZM;;;AeuaR;EACE;EACA,YfzaM;Ee0aN;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAQF;EACE;EACA;EACA;EACA,KfzYU;;Ae4YZ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA,ef7YgB;Ee8YhB;EACA;EACA;EACA;EACA,KfhaS;EeiaT,YfpcQ;EeqcR;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAKA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YfleY;EemeZ;EACA;EACA;;AAGF;EACE;EACA,OfhgBS;EeigBT;;AAGF;EACE,Wf5dS;Ee6dT,afpdiB;EeqdjB,Of9fM;Ee+fN;;AbtgBF;EakdF;IAwDI;;EAEA;IACE;;EAGF;IACE,Wf3eO;;;Aegfb;EACE;EACA;EACA;;AAGF;EACE,WftfW;EeufX,afvegB;EewehB,OfxhBQ;EeyhBR,efheU;EeieV,aflfiB;;AeofjB;EACE,OftiBS;EeuiBT,afrfiB;;AE9CnB;Ea0hBF;IAaI,WfngBS;;;AEtCX;Ea4hBF;IAiBI,WfzgBW;Ie0gBX;IACA,efhfQ;;;AeofZ;EACE;EACA,KfxfS;EeyfT;EACA;;AbvjBA;EamjBF;IAOI;IACA;IACA;;;AAIJ;EACE;EACA;EACA,KfvgBS;EewgBT;EACA,Yf3jBI;Ee4jBJ;EACA,ef5fiB;Ee6fjB;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YflkBa;EemkBb;EACA;;AAGF;EACE,cf7lBS;Ee8lBT;EACA,YfnkBM;;AeqkBN;EACE;;AAGF;EACE,Yf1lBA;Ee2lBA,OfvmBO;;Ae0mBT;AAAA;EAEE,OfhmBA;;AeomBJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YfnmBa;EeomBb,Of7mBE;Ee8mBF;EACA,afxkBa;EeykBb,WftlBW;EeulBX;EACA;;AAGF;EACE;EACA;EACA,Wf9lBW;Ee+lBX,afplBe;EeqlBf,Of7nBM;Ee8nBN;;AAGF;EACE;EACA;EACA,WfxmBS;EeymBT,OfnoBO;EeooBP;EACA;;Ab9oBF;EagkBF;IAkFI;IACA;;;;AAKN;EACE;IACE;;EAEF;IACE;;;AASJ;EACE;EACA,Yf7pBQ;;Ae+pBR;EACE;EACA,ef3mBU;;Ae6mBV;EACE,WfroBU;EesoBV,af/nBa;EegoBb,Of1qBM;Ee2qBN,eftnBO;;AE5DT;Ea8qBA;IAOI,Wf5oBQ;;;Ae+oBV;Eb3nBJ,YF1CiB;EE2CjB;EACA;EACA;;Aa6nBE;EACE,WfxpBS;EeypBT,OfvrBM;EewrBN,afzoBc;;AEvDhB;Ea6rBA;IAMI,Wf/pBS;;;AeoqBf;EACE;EACA;EACA,Kf7oBS;Ee8oBT;EACA;;Ab3sBA;EassBF;IAQI;IACA,KfppBO;IeqpBP;;;AbltBF;EawsBF;IAcI,Kf1pBO;Ie2pBP;;;AAIJ;EACE;EACA;EAC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;EACA;EACA;EACA;EACA,WhBhea;EgBieb,ahBtdiB;EgBudjB,OhB9fQ;EgB+fR;EACA,YhBnac;EgBoad;EACA;;AAEA;EACE,OhB/gBS;EgBghBT;;AAGF;EACE,OhBphBS;EgBqhBT,ahBneiB;EgBoejB,qBhBthBS;;;AgB4hBf;EACE;EACA;EACA,KhB/dW;EgBgeX;;AAEA;EACE;;;AAKJ;EACE,YhB7hBM;EgB8hBN,ehBheiB;EgBiejB,ShB3eW;EgB4eX,YhBlhBU;EgBmhBV;EACA;EACA,KhBhfW;;AgBkfX;EACE;EACA;EACA;EACA,KhBvfS;;AgByfT;EANF;IAOI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,YhB9iBe;EgB+iBf,OhBxjBI;EgByjBJ,WhBhiBW;EgBiiBX,ahBphBmB;EgBqhBnB,ehB/fe;EgBggBf;EACA;;AAGF;EACE;;AAEA;EACE;EACA;EACA,kBhBrkBI;EgBskBJ;EACA,ehB3gBa;EgB4gBb,WhB9iBS;EgB+iBT;EACA,OhB9kBM;EgB+kBN;;AAIJ;EACE;EACA;;AAEA;EACE,WhB3jBW;EgB4jBX,OhBxlBM;EgBylBN,ahB3iBe;EgB4iBf;;AAKF;EACE,WhBnkBS;EgBokBT,ahBzjBiB;EgB0jBjB,OhBnmBM;EgBomBN,ehB/iBO;;;AgBqjBb;EACE;EACA;EACA,KhBvjBW;;;AgB2jBb;EACE,YhB/mBM;EgBgnBN,ehBljBiB;EgBmjBjB,ShB7jBW;EgB8jBX,YhBpmBU;EgBqmBV,YhBxhBgB;;AgB0hBhB;EACE,YhBvmBQ;;AgB0mBV;EACE,WhB9lBW;EgB+lBX,ahBrlBmB;EgBslBnB,OhB/nBQ;EgBgoBR,ehB3kBS;EgB4kBT,gBhB7kBS;EgB8kBT;;AAGF;EACE,WhB1mBW;EgB2mBX,OhBtoBQ;EgBuoBR,ahBzlBiB;;AgB2lBjB;EACE,kBhBvoBI;EgBwoBJ;EACA,ehB7kBa;EgB8kBb,ShBzlBO;EgB0lBP;EACA;;AAEA;EACE;EACA,WhBxnBO;EgBynBP,OhBrpBI;EgBspBJ;EACA;;AAKJ;EACE;EACA;EACA;EACA,kBhB7pBE;EgB8pBF;EACA,ehBlmBa;EgBmmBb;;AAEA;EACE,kBhBjqBG;;AgBoqBL;EACE;EACA;EACA,WhBhpBO;EgBipBP,ahBpoBe;EgBqoBf,OhB9qBI;EgB+qBJ;EACA;;AAEA;EACE;;AAIJ;EACE;EACA,WhB7pBO;EgB8pBP,OhBzrBI;EgB0rBJ;;AAEA;EACE;;AAIJ;EACE,YhBrmBU;;AgBumBV;EACE;;AAGF;EACE;;AAIJ;EACE;;;AAOR;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA,WhBzsBW;EgB0sBX,ahB7rBmB;EgB8rBnB,OhBvuBQ;EgBwuBR;EACA,kBhBruBM;;AgBwuBR;EACE;EACA,WhBltBW;EgBmtBX,OhB9uBQ;;AgBgvBR;EACE;EACA;EACA,kBhBhvBI;EgBivBJ,ehBtrBa;EgBurBb;EACA,WhB5tBS;EgB6tBT,OhBjwBS;;;AiBHf;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EARF;IASI;IACA;;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;;AAEA;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAEA;EACE;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAVF;IAWI;IACA;IACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;IACE;;;AC5SJ;EACE,WlBkFoB;EkBjFpB;EACA;;AhBCE;EgBJJ;IAMI;;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EhBhBE;EACA;EACA;;;AgBkBF;EhBdE;EACA;EACA;;;AgBgBF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,KlBxBW;;;AkB2Bb;EACE,KlB3BW;;;AkB8Bb;EACE,KlB9BW;;;AkBiCb;EACE,KlBjCW;;;AkBoCb;EACE,KlBpCW;;;AkBoDX;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAgBF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,YlB/Pa;;;AkBkQf;EACE,YlBlQe;;;AkBqQjB;EACE,YlB3PM;;;AkB8PR;EACE,YlB9PQ;;;AkBiQV;EACE,YlBjQS;;;AkBoQX;EACE,YlB9PiB;;;AkBiQnB;EACE,YlBjQgB;;;AkBoQlB;EACE,YlBpQc;;;AkBwQhB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,clBxTa;;;AkB4Tf;EACE;;;AAGF;EACE,elBzPiB;;;AkB4PnB;EACE,elB5PiB;;;AkB+PnB;EACE,elB/PiB;;;AkBkQnB;EACE,elBlQiB;;;AkBqQnB;EACE,elBpQmB;;;AkBuQrB;EACE,elBvQqB;;;AkB2QvB;EACE;;;AAGF;EACE,YlBpUU;;;AkBuUZ;EACE,YlBvUU;;;AkB0UZ;EACE,YlB1UU;;;AkB6UZ;EACE,YlB7UU;;;AkBiVZ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AhB1ZE;EgB+ZF;IACE;;;AhB9ZA;EgBmaF;IACE;;;AAKF;EADF;IAEI;;;;AhB5aA;EgBgbJ;IAEI;;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,YlBrXgB;;;AkBwXlB;EACE,YlBxXgB;;;AkB2XlB;EACE,YlB3XgB;;;AkB8XlB;EACE","file":"main.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../sass/base/_reset.scss","../sass/abstracts/_variables.scss","../sass/base/_typography.scss","../sass/abstracts/_mixins.scss","../sass/base/_animations.scss","../sass/layout/_header.scss","../sass/layout/_footer.scss","../sass/layout/_grid.scss","../sass/layout/_container.scss","../sass/components/_buttons.scss","../sass/components/_badges.scss","../sass/components/_cards.scss","../sass/components/_apikey-common.scss","../sass/components/_forms.scss","../sass/components/_modals.scss","../sass/components/_navigation.scss","../sass/components/_partners.scss","../sass/components/_cta.scss","../sass/components/_password-popup.scss","../sass/components/_header-auth.scss","../sass/components/_tables.scss","../sass/components/_accordion.scss","../sass/components/_page-title-banner.scss","../sass/components/_alerts.scss","../sass/pages/_index.scss","../sass/pages/_api-market.scss","../sass/pages/_login.scss","../sass/pages/_account-recovery.scss","../sass/pages/_signup-selection.scss","../sass/pages/_mypage.scss","../sass/pages/_apikey-register.scss","../sass/pages/_apikey-detail.scss","../sass/pages/_apikey-list.scss","../sass/pages/_notice.scss","../sass/pages/_inquiry.scss","../sass/pages/_org-register.scss","../sass/pages/_partnership.scss","../sass/pages/_user-management.scss","../sass/pages/_commission.scss","../sass/pages/_terms-agreements.scss","../sass/base/_utilities.scss"],"names":[],"mappings":";AAIA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE,aCmBoB;EDlBpB,aC0CmB;EDzCnB,OCFU;EDGV;EACA;;;AAIF;EACE;;;AAIF;EACE;EACA;EACA,YC0EgB;;;ADtElB;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;;;AAIF;EACE,aClBiB;EDmBjB,aCfkB;;;ADmBpB;AAAA;AAAA;EAGE;;;AAIF;EACE;EACA,OCtEU;;;ADyEZ;EACE;EACA,OC3EU;;;ACbZ;EACE,WDqCe;ECpCf,aD8CoB;EC7CpB,ODUU;;;ACNZ;EACE,WDqCc;ECpCd,aD2CsB;EC1CtB,eDqDW;;AE3DT;EDGJ;IAMI,WD8BY;;;AEzCZ;EDKJ;IAUI,WDyBY;;;;ACrBhB;EACE,WDsBc;ECrBd,aD4BiB;EC3BjB,eDsCW;;AE1DT;EDiBJ;IAMI,WDeY;;;AExCZ;EDmBJ;IAUI,WDUW;;;;ACNf;EACE,WDOc;ECNd,aDciB;ECbjB,eDwBW;;AE1DT;ED+BJ;IAMI;;;;AAIJ;EACE,WDJc;ECKd,aDGqB;ECFrB,eDaW;;;ACVb;EACE,WDXa;ECYb,aDHqB;ECIrB,eDOW;;;ACJb;EACE,WDlBa;ECmBb,aDTqB;ECUrB,eDCW;;;ACGb;EACE,eDHW;ECIX,aDVmB;;ACYnB;EACE;;;AAIJ;EACE,ODxEa;;;AC2Ef;EACE,OD3Ee;;;AC8EjB;EACE,ODrEU;;;ACwEZ;EACE,ODxEU;;;AC2EZ;EACE,OD3EW;;;AC8Eb;EACE,OD9EM;;;ACkFR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,aDhEoB;;;ACmEtB;EACE,aDnEmB;;;ACsErB;EACE,aDtEqB;;;ACyEvB;EACE,aDzEiB;;;AC4EnB;EACE,aD5EsB;;;ACgFxB;EACE,WDjGa;;;ACoGf;EACE,WDpGa;;;ACuGf;EACE,WDvGe;;;AC0GjB;EACE,WDzGa;;;AC4Gf;EACE,WD5Ga;;;ACgHf;EACE,WDlHa;ECmHb,aD3GoB;EC4GpB,aDnGkB;ECoGlB,OD/IU;;;ACkJZ;EACE,WD5Ha;EC6Hb,ODpJU;;;ACuJZ;EACE,aDrIiB;ECsIjB,WDlIa;ECmIb,YDvJQ;ECwJR;EACA,eDlGiB;;;ACsGnB;EACE,OD7Ka;;AC+Kb;EACE,OD/Ka;;;ACoLjB;EACE,SD1HW;EC2HX;EACA;EACA,YD1KQ;EC2KR;;AAEA;EACE;;;AAKJ;EACE;EACA;EACA;;;AEvMF;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;AAEA;EACE;;;AAIJ;EACE;;AAEA;EACE;EACA,YHnQQ;;;AGuQZ;EACE;;AAEA;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;;AC5TJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMF;EACE;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAQF;EACE;EACA;;AAEA;EACE;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;;AAGF;EACE;;;AAKJ;AAAA;AAAA;EAGE;EACA;EACA;;AAEA;AAAA;AAAA;EACE;;AAGF;AAAA;AAAA;EACE;;;AAKJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAOJ;EACE;EACA;EACA;EACA;;AAEA;EANF;IAOI;;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EANF;IAOI;;;;AAQF;EACE;EACA;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAKE;EACE;;AAEF;EACE;;AAEF;EACE;;;AAUV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAOV;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAMR;EACE;EACA,OJhZW;EIiZX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA,YJhdQ;EIidR;EACA;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;EACA,YJ5dM;EI6dN;;AAGF;EAAY;;AACZ;EAAW;;AAGb;EACE;;AACA;EAAY;EAAQ;;AACpB;EAAW;EAAQ;;;AAOvB;EAEE;EACA;EACA;EACA;EACA;EACA,YJlfM;EImfN,SJlac;EImad;EACA;EACA;EACA;EACA;;AAKA;EACE,SJ/cS;EIgdT,YJ9fM;EI+fN;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA,SJheK;EIieL,OJnhBI;EIohBJ,WJ1fO;EI2fP,aJjfa;EIkfb;EACA;;AAGF;EACE;EACA;EACA,OJ3eK;EI4eL;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA,YJ5iBE;;AI8iBF;EACE;EACA;EACA,OJpjBE;EIqjBF,WJ9hBK;EI+hBL;;AAEA;EACE,YJvjBJ;EIwjBI,OJtkBG;;AI2kBT;EACE;;AAKN;EACE;EACA,YJrkBI;EIskBJ;EACA;;;AAQJ;EACE;EACA;EACA;EACA;EACA;;AAGA;EACE;;AAGE;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eJpjBa;EIqjBb;EACA;EACA;EACA;EACA;EACA;EACA,SJziBa;EI0iBb;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA,WJ5mBK;EI6mBL,aJjmBW;EIkmBX;;AAEA;EACE;EACA;;;AAQZ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAqEJ;EACE;;;AAMF;EACE;IACE;;EAEA;IACE;IACA;;EAIJ;IACE;;;AAIJ;EAEI;IACE;;EAKF;IACE;;;AASN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eJxyBa;EIyyBb;EACA;EACA;EACA;EACA;EACA;EACA,SJ7xBa;;AI+xBb;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,WJr2BG;EIs2BH,aJ11BS;EI21BT;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAOV;EACE;EACA;EACA;;;AAMN;EACE;IACE;;;ACz6BJ;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AHVE;EGIJ;IASI;IACA;IACA;IACA;;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA;;AHzEE;EGqEJ;IAOI;IACA;;;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AH3GJ;EGiFA;IA8BI;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;;AH1HA;EGoHF;IASI;;;;AAMN;EACE;IACE;IACA;;EAGF;IACE;;EAEA;IACE;;EAGF;IACE;IACA;;EAEA;AAAA;IAEE;;EAIJ;IACE;;EAIJ;IACE;;EAEA;IACE;;;ACzKN;EACE;EACA,KN6DW;;AM1DX;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAIF;EACE;;AAGF;EACE;;AAGF;EACE;;AAIF;EACE;;AAGF;EACE,KNSS;;AMNX;EACE,KNMS;;AMHX;EACE,KNGS;;AMAX;EACE;;AJ1DA;EI+DA;IACE;;EAGF;IACE;;;AJtEF;EI2EA;IACE;;EAGF;IACE;;;;AAMN;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA,KNvEW;;AEzDT;EI6HJ;IAMI;;;AJrIA;EI+HJ;IAUI;;;;AAKJ;EACE;EACA;EACA,KNtFW;;AE3DT;EI8IJ;IAMI;;;;AAKJ;EACE;EACA;EACA,KN/FY;EMgGZ;;AJ7JE;EIyJJ;IAOI;;;;AAKJ;EACE;EACA;EACA,KN5GW;;AE5DT;EIqKJ;IAMI;;;;AAKJ;EACE;EACA;EACA,KNtHY;EMuHZ;;AJlLE;EI8KJ;IAOI;;;;AAKJ;EACE;EACA;EACA,KN/HY;;AE9DV;EI0LJ;IAMI;IACA,KNtIU;;;AMyIZ;EACE;EACA;EACA,KN5IU;;AE3DV;EIoMF;IAMI;;;AJ5MF;EIsMF;IAUI;IACA;;;;AAMN;EACE;EACA;EACA,KN/JW;EMgKX;;AJzNE;EIqNJ;IAOI;IACA,KNnKS;;;;AMwKb;EACE;EACA;EACA,KN5KW;;AE3DT;EIoOJ;IAMI;;;;AAKJ;EACE;EACA;EACA,KNtLW;EMuLX;;AJjPE;EI6OJ;IAOI;;;AJtPA;EI+OJ;IAWI;;;;AAKJ;EACE;EACA;EACA,KNpMY;EMqMZ;;AJjQE;EI6PJ;IAOI;IACA,KN3MS;;;AM8MX;EACE;;AAEA;EACE;;AJ5QF;EIwQF;IAQI;;;;AAMN;EACE;EACA;EACA,KN/NW;;AE1DT;EIsRJ;IAMI;;;;AClSJ;EACE,WPgFoB;EO/EpB;EACA;;ALCE;EKJJ;IAMI;;;AAIF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;;AAKJ;EACE;;ALtBE;EKqBJ;IAII;;;AAIF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAMF;EACE,YPpCM;;AOuCR;EACE,YPvCO;;AO0CT;EACE,OP7CI;;AOgDN;EACE,YPpDQ;EOqDR,OPlDI;;;AOuDR;EACE;EACA,ePNY;;AE/DV;EKmEJ;IAKI,ePVU;;;AOaZ;EACE;EACA;EACA,KPtBS;EOuBT;EACA,YPlEO;EOmEP,OPnFW;EOoFX,ePTiB;EOUjB,WPlDW;EOmDX,aPtCmB;EOuCnB,eP3BS;;AO8BX;EACE,WPlDY;EOmDZ,aP3Ce;EO4Cf,ePjCS;EOkCT,OPnFQ;;AETR;EKwFF;IAOI,WPzDU;;;AOgEd;EACE,WPpEW;EOqEX,OP9FQ;EO+FR,aPrDiB;EOsDjB;EACA;;AL3GA;EKsGF;IAQI,WP5EW;;;;AOkFjB;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA,aP9CY;;;AOmDhB;EACE;EACA;;;AAIF;EACE;EACA;;;AC7IF;ENiCE;EACA;EACA,KF0BW;EEzBX;EACA,eFqCiB;EEpCjB,aFYqB;EEXrB,WFDe;EEEf;EACA,YF8DgB;EE7DhB;EACA;;AAEA;EACE;;AM9CJ;EAEE;EACA;;AAGA;EACE;EACA,WR6BW;;AQ1Bb;EACE;EACA,WRyBa;;AQtBf;EACE;EACA,WRqBW;;AQlBb;EACE;EACA,WRiBW;;AQbb;EACE,YR1BW;EQ2BX,ORbI;EQcJ,YRHQ;;AQKR;EACE;EACA,YRLM;;AQQR;EACE;;AAIJ;EACE;EACA;;AAEA;EACE,YR7BK;EQ8BL;;AAIJ;EACE,ORrCI;EQsCJ,YR3BQ;;AQ6BR;EACE;EACA,YR7BM;;AQiCV;EACE,OR/CI;EQgDJ,YRrCQ;;AQuCR;EACE;EACA,YRvCM;;AQ2CV;EACE,YRlEW;EQmEX,OR1DI;;AQ4DJ;EACE;EACA;;AAIJ;EACE,YR7EY;EQ8EZ,ORpEI;;AQsEJ;EACE;EACA;;AAIJ;EACE;EACA,OR5FW;EQ6FX;;AAEA;EACE;EACA,cRjGS;;AQqGb;EACE;EACA,OR5FQ;EQ6FR;;AAEA;EACE,cR3GS;EQ4GT,OR5GS;EQ6GT;;AAKJ;EAEE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;ENnDJ;EACA;EACA;EACA;EMkDI;EACA;EACA;EACA;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eRtEmB;;AQwEnB;EACE;EACA;;AAGF;EACE;EACA;;AAKJ;EACE;EACA;;AAIF;EACE;EACA;;AAEA;EACE;;AAEA;EACE,wBRtGW;EQuGX,2BRvGW;;AQ0Gb;EACE,yBR3GW;EQ4GX,4BR5GW;;;AQmHnB;EACE;EACA,QR/HW;EQgIX,ORhIW;EQiIX;EACA;EAEA;EACA,eRvHqB;EQwHrB,ORtLM;EQuLN,WR9Ja;EQ+Jb;EACA,YR7KU;EQ8KV,YRnGgB;EQoGhB,SR7Gc;EE1Ed;EACA;EACA;;AMwLA;EACE;EACA,YRnLQ;;AQqLR;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA,YRhNQ;EQiNR,OR9MI;EQ+MJ;EACA,eRvJe;EQwJf,WR5LW;EQ6LX;EACA;EACA,YR7Hc;EQ8Hd;;;AAMF;EN1MA;EACA;EACA,KF0BW;EEzBX;EACA,eFqCiB;EEpCjB,aFYqB;EEXrB,WFDe;EEEf;EACA,YF8DgB;EE7DhB;EACA;;AAEA;EACE;;AM6LF;EAEE,YR7NI;EQ8NJ,OR5OW;EQ6OX;EACA,WRzMW;EQ0MX,YRrNQ;;AQuNR;EACE;EACA,YRxNM;;AQ4NV;ENxNA;EACA;EACA,KF0BW;EEzBX;EACA,eFqCiB;EEpCjB,aFYqB;EEXrB,WFDe;EEEf;EACA,YF8DgB;EE7DhB;EACA;;AAEA;EACE;;AM2MF;EAEE;EACA,OR5OI;EQ6OJ;EACA;EACA,WRxNW;;AQ0NX;EACE;EACA;;;AAUN;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA,eR3MiB;EQ4MjB,WR/Oe;EQgPf,aRrOmB;EQsOnB;EACA,YRjLgB;EQkLhB;EACA;EACA;EACA,KR/NW;EQgOX;EACA;;AAEA;EAnBF;AAAA;AAAA;AAAA;AAAA;AAAA;IAoBI;IACA,WR7PW;;;AQgQb;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;;AAKJ;AAAA;EAGE,OR9RM;;AQgSN;AAAA;EACE;EACA,YRvRQ;;AQ0RV;AAAA;EACE;;;AAKJ;EACE,YR5SM;EQ6SN,ORhTU;EQiTV;;AAEA;EACE,YRhTM;EQiTN,cRhUW;EQiUX,ORjUW;;AQoUb;EACE;;;AAKJ;EACE,YR3Ua;EQ4Ub,OR9TM;;AQgUN;EACE;EACA,YRvTQ;EQwTR,YRhVa;;AQmVf;EACE;;;AAKJ;EACE,YRvVc;EQwVd,OR9UM;;AQgVN;EACE;EACA,YRvUQ;EQwUR;;AAGF;EACE;;;AAMF;EACE,YR9VI;EQ+VJ,ORlWQ;EQmWR;;AAEA;EACE,YRlWI;EQmWJ,cRlXS;EQmXT,ORnXS;;AQuXb;EAEE,OR3WI;;AQ6WJ;EACE;EACA,YRpWM;;AQwWV;EACE,YR9XY;EQ+XZ,ORrXI;;AQuXJ;EACE;EACA,YR9WM;;;AQoXZ;EACE;EACA;EACA,ORhZa;EQiZb;EACA,eR5UiB;EQ6UjB,WRjXa;EQkXb,aRrWmB;EQsWnB;EACA,YRjTgB;EQkThB;EACA;EACA,KR/VW;;AQiWX;EACE;EACA,cR7ZW;;AQgab;EACE;;;AAIJ;EACE;EAEA,OR1ZM;EQ2ZN;EACA,eRnWiB;EQoWjB,WRxYa;EQyYb,aR7XmB;EQ8XnB;EACA,YRzUgB;EQ0UhB;EACA;EACA,KRvXW;;AQyXX;EACE;EACA,YR5ZQ;;AQ+ZV;EACE;;;AAIJ;EACE;EACA,YRjbM;EQkbN,ORpbU;EQqbV;EACA,eR3XiB;EQ4XjB,WRhaa;EQiab,aRrZmB;EQsZnB;EACA,YRjWgB;EQkWhB;EACA;EACA,KR/YW;;AQiZX;EACE,cR5cW;EQ6cX,OR7cW;;AQgdb;EACE;;;AAQJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eR1ZiB;EQ2ZjB,WR7ba;EQ8bb,aRnbiB;EQobjB,ORvdM;EQwdN;EACA,YRlYgB;EQmYhB;;AAGA;EACE;;AAEA;EACE;EACA;EACA,YRxdM;;AQ2dR;EACE;;AAKJ;EACE;;AAEA;EACE,YR7fW;EQ8fX;EACA,YRveM;;AQ0eR;EACE;;AAGF;EACE,YRvfQ;EQwfR;EACA;EACA;;AAIJ;EAtDF;IAuDI;IACA;IACA;IACA,WR/ea;;;;AQufjB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ORrhBM;EQshBN;EACA,eR7diB;EQ8djB;EACA,aRtfiB;EQufjB;EACA;;AAEA;EACE;;ANxiBA;EMuhBJ;IAqBI;IACA;;;;ACnjBJ;EACE;EACA;EACA;EACA;EACA,eTwEmB;ESvEnB,WT8Ba;ES7Bb,aT2CqB;ES1CrB;EACA,YT8FgB;;AS3FhB;EACE;EACA,OTRY;;ASWd;EACE;EACA,OTZW;;ASeb;EACE;EACA,OTtBW;;ASyBb;EACE;EACA,OTfQ;;ASkBV;EACE;EACA;;AAGF;EACE;EACA,OTjCY;;ASoCd;EACE;EACA,OTrCW;;;AS0Cf;EACE;EACA;EACA;EACA;EACA,eTuBmB;EStBnB,WTnBa;ESoBb,aTNqB;ESOrB,eTKW;ESJX,YT6CgB;;AS3ChB;EACE;EACA,OTxDY;;AS2Dd;EACE;EACA,OT5DW;;AS+Db;EACE;EACA,OTtEW;;ASyEb;EACE;EACA,OT/DQ;;ASkEV;EACE;EACA;;;AAKJ;EACE;EACA;EACA,eTlBiB;;;ASsBnB;EACE;EACA,WT3Da;ES4Db,eTxBiB;;;AS4BnB;EACE;EACA;;AAEA;EACE,OTpGY;ESqGZ,cTrGY;;ASwGd;EACE,OTxGW;ESyGX,cTzGW;;AS4Gb;EACE,OTlHW;ESmHX,cTnHW;;ASsHb;EACE,OT3GQ;ES4GR,cT5GQ;;;ASkHV;EACE,cTrES;ESsET;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YTxIc;ESyId,OT/HM;ESgIN,eTlEqB;ESmErB;EACA,aT/FiB;ESgGjB;;AAEA;EACE,YTpJW;;ASuJb;EACE,YTnJW;;ASsJb;EACE,YTzJY;ES0JZ,OTlJQ;;ASqJV;EACE,YT7JY;;;AUNhB;ERoDE,YFpCM;EEqCN,eFuBkB;EEtBlB,SFwDa;EEvDb,YFgDgB;;AE9ChB;EAEE,YF/BQ;;AU5BZ;EAEE;EACA;;;AAIF;ER6CE,YFpCM;EEqCN,eFuBkB;EEtBlB,SFwDa;EEvDb,YFgDgB;;AE9ChB;EAEE,YF/BQ;;AUrBZ;EAEE;EACA;;AAEA;EACE,cVXW;;AUgBb;EACE,cVdY;;AUkBd;EACE,cVjBW;;AUqBb;EACE;EACA;EACA;EACA;EACA,YV5BY;EU6BZ,OVrBQ;EUsBR,eVyCgB;EUxChB;EACA,aVce;EUbf;;AAEA;EACE,YVlCS;EUmCT,OV1BE;;AU6BJ;EACE,YVtCU;EUuCV,OV/BE;;AUoCN;EACE;EACA;EACA;ERnCF;EACA;EACA;EQmCE;EACA,YVxCO;EUyCP,OVzDW;EU0DX,eVee;EUdf,YV0Cc;;AUvChB;EACE;EAEA,OVnDI;;AUuDN;EACE,WVhCW;EUiCX,aVtBe;EUuBf,eVZS;EUaT,OV9DQ;;AUiEV;EACE,OVjEQ;EUkER,aVxBiB;EUyBjB,eVlBS;EUmBT,WV7CW;;AUiDb;EACE;EACA;EACA,KV5BS;EU6BT,eV3BS;EU4BT;;AAEA;EACE;EACA,YV9EI;EU+EJ,OVlFM;EUmFN,eVrBc;EUsBd,WV9DS;EU+DT,aVlDe;;AUuDnB;EACE;EACA;EACA,KV/CS;EUgDT,OV1GW;EU2GX,aV3DmB;EU4DnB,WVzEW;EU0EX,YVRc;;AUUd;EACE,KVrDO;EUsDP,OVhHW;;;AUsHjB;ERrEE,YFpCM;EEqCN,eFuBkB;EEtBlB,SFwDa;EEvDb,YFgDgB;;AE9ChB;EAEE,YF/BQ;;AU6FZ;EAEE;;AAEA;EACE;EACA;EACA;ER5GF;EACA;EACA;EQ4GE,WVzFW;EU2FX,OVpHI;EUqHJ,eV1De;;AU6DjB;EACE,WVjGW;EUkGX,aVvFe;EUwFf,eV7ES;EU8ET,OV/HQ;;AUkIV;EACE,OVlIQ;EUmIR,aVzFiB;EU0FjB,eVnFS;EUoFT,WV9GW;;AUkHb;EACE;EACA;EACA;EACA,aV5FS;EU6FT;;AAEA;EACE,WVtHS;EUuHT,aV5GkB;EU6GlB,OV/JS;;AUkKX;EACE,WVjIS;EUkIT,OVxJM;EUyJN,aVtHe;;;AU4HrB;ERzHE,YFpCM;EEqCN,eFuBkB;EEtBlB,SFwDa;EEvDb,YFgDgB;;AE9ChB;EAEE,YF/BQ;;AUiJZ;EAEE;EACA;EACA,KVlHW;;AUoHX;EACE;EACA;EACA;ERlKF;EACA;EACA;EQmKE,OVzKI;EU0KJ,eVhHe;EUiHf,WVlJW;;AUqJb;EACE;;AAEA;EACE,WV3JS;EU4JT,aVjJiB;EUkJjB,eVvIO;EUwIP,OVxLM;;AU2LR;EACE,OV3LM;EU4LN,aVlJe;EUmJf,WVtKS;;;AU4Kf;ER7JE,YFpCM;EEqCN,eFuBkB;EEtBlB,SFwDa;EEvDb,YFgDgB;;AE9ChB;EAEE,YF/BQ;;AUqLZ;EAEE;;AAEA;EACE;EACA;EACA,KV1JS;EU2JT,MV3JS;EU4JT;EACA,OVzNW;EU0NX;EACA,aV1Ke;;AU6KjB;EACE;EACA;EACA,WV7La;EU8Lb,aV3KgB;EU4KhB,OVxNQ;EUyNR,eVvKS;EUwKT;;AAGF;EACE;EACA;EACA,KV/KS;;AUiLT;EACE;EACA;EACA,eVpKiB;EUqKjB;;AAIA;EACE,aVtMe;EUuMf,OV5OI;EU6OJ;;AAGF;EACE,WVzNO;EU0NP,OVjPI;;;AUwPZ;ERlNE,YFpCM;EEqCN,eFuBkB;EEtBlB,SFwDa;EEvDb,YFgDgB;;AE9ChB;EAEE,YF/BQ;;AU0OZ;EAEE;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EAEA,OVtQE;EUuQF,eV1Me;EU2Mf,WVpPS;EUqPT,aVtOa;EUuOb;;AAIJ;EACE,gBVhOS;EUiOT;EACA,eVlOS;;AUoOT;EACE,WV3PS;EU4PT,aVlPa;EUmPb,eVzOO;EU0OP,OV1RM;;AU6RR;EACE;EACA;EACA;EACA,KVlPO;;AUoPP;EACE,WVzQO;EU0QP,OVpSI;;AUuSN;EACE,WV1QQ;EU2QR,aVnQgB;;AUsQlB;EACE,WVrRS;EUsRT,OV9SI;;AUmTV;EACE;EACA,eVpQS;;AUsQT;EACE;EACA,OVzTM;EU0TN,WVnSS;EUoST;EACA;EACA,KV9QO;;AUgRP;EACE;EACA,OVxUO;EUyUP,aV7RW;;AUgSb;EACE;;AAEA;EACE;EACA,OVzUG;;AU+UX;EACE;;;AChVJ;EACE,WXiEoB;EWhEpB;EACA;;ATdE;ESWJ;IAMI;;;;AAOJ;EACE,kBAxBgB;EAyBhB,eX4CiB;EW3CjB;;AT3BE;ESwBJ;IAMI,SX6BS;;;;AWtBb;EACE,kBArCgB;EAsChB,eX+BiB;EW9BjB;EACA;;ATzCE;ESqCJ;IAOI;;;AAGF;EACE,aXpBkB;EWqBlB;EACA,aXHe;EWIf,OX1CQ;EW2CR;;ATpDA;ES+CF;IAQI;;;AAIJ;EACE;EACA,aXjBkB;EWkBlB;;AT9DA;ES2DF;IAMI;;;;AAQN;EACE;EACA;EACA;EACA;EACA;EACA,aXnDoB;EWoDpB;EACA,aXlCiB;EWmCjB,OXtEM;EWuEN;;AAEA;EACE;;AAGF;EAEE,kBAzFkB;;AA4FpB;EACE;;AAGF;EAEE;;AAKA;EACE;EACA;;AAGF;EAEE;EACA;;AAGF;EAEE;EACA;;;AAQN;EACE;EACA;EACA,KXzEW;EW0EX;EACA,eX7DiB;EW8DjB,WXpGa;EWqGb,aXxFqB;;AW0FrB;EACE;EACA;EACA,eXjEmB;EWkEnB;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AAOJ;EACE;EACA;;AAEA;EACE;EACA;;ATnKA;ESiKF;IAKI;IACA;;;AAIJ;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA,eX/GiB;EWgHjB;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eX1HiB;EW2HjB;EACA;;AAEA;EACE;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA,eX3JS;EW4JT;;AAGF;EACE,aX/LkB;EWgMlB,WXvLW;EWwLX,aX9Ke;EW+Kf,OXrNQ;EWsNR;;AAGF;EACE,aXvMkB;EWwMlB,WXlMa;EWmMb,OAjOoB;EAkOpB;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,eX9KiB;EW+KjB,aXzNoB;EW0NpB;EACA,aXxMiB;EWyMjB;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE,kBAnQkB;EAoQlB,OX1PI;;AW4PJ;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;;AAIJ;EACE,kBApRoB;EAqRpB,OX5QI;;AW8QJ;EACE;;AT3RF;ES6OJ;IAmDI;IACA;IACA;IACA,WXjQa;;;;AWwQjB;EACE;EACA;EACA,KXrPW;EWsPX;EACA,YXnSM;EWoSN;EACA,eX7OiB;EW8OjB,WXjRa;EWkRb,OX1SU;EW2SV;EACA,YXlNgB;;AWoNhB;EACE;EACA;;AAGF;EACE,YX/TW;EWgUX,cXhUW;EWiUX,OXnTI;;AWsTN;EAxBF;IAyBI;IACA;;;;AAOJ;EACE,YXhUM;EWiUN,eXvQiB;EWwQjB,SX/QY;EWgRZ,eXpRW;EWqRX,YXzTU;;AW2TV;EAPF;IAQI,SXvRS;;;AW0RX;EACE,WXlTW;EWmTX,aXzSe;EW0Sf,OXhVQ;EWiVR,eX/RS;EWgST,gBXjSS;;;AWwSb;EACE;EACA;EACA,KX1SW;;AW4SX;EALF;IAMI;;;;AAIJ;EACE;EACA;EACA,KXtTW;;AWwTX;EACE;;AAGF;EACE,WXrVW;EWsVX,aXzUmB;EW0UnB,OX9WQ;;AWiXV;EACE,WX1Va;EW2Vb,OXpXQ;EWqXR;;;AAOJ;EACE;EACA;EACA,KX/UW;;;AWkVb;EACE;EACA;EACA,kBXhYS;EWiYT,OXhZe;EWiZf,eX5UiB;EW6UjB,WXhXa;EWiXb,aXrXiB;;;AW2XnB;EACE;EACA;EACA,kBX9YQ;EW+YR;EACA,eXzViB;EW0VjB,aXjYiB;EWkYjB,WX9Xa;EW+Xb,OXjae;;;AWuajB;EACE;EACA;EACA,KX/WW;;AWiXX;EALF;IAMI;IACA;;;;AAOJ;EACE;EACA;EACA,KX9XW;;;AWiYb;EACE;EACA;EACA,KXnYW;EWoYX;EACA,YXnbM;EWobN;EACA,eX5XiB;EW6XjB;;AAEA;EACE,cXvcW;EWwcX,YXhbQ;;AWmbV;EAfF;IAgBI,SXhZS;IWiZT,KXlZS;;;AWqZX;EACE;EACA;EACA,eX7Ye;EW8Yf,WXjbW;EWkbX,aXpae;EWqaf,aXvbe;EWwbf;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE,kBX9dQ;EW+dR,OXreM;;AWyeV;EACE;EACA,WXlda;EWmdb,aXxciB;EWycjB,OX7eQ;EW8eR;;AAGF;EACE;EACA,eXtbe;EWubf,WX5dW;EW6dX,aXhdmB;;AWkdnB;EACE;EACA;;AAGF;EACE;EACA;;;AAQN;EACE;EACA;EACA,KXxdW;EWydX;EACA,YXrdY;EWsdZ,aXtdY;EWudZ;;AAEA;EATF;IAUI;IACA;;;AAIA;EADF;IAEI;;;;ACniBN;EACE,eZ8DW;;AY5DX;EACE;EACA,WZgCW;EY/BX,aZ2CiB;EY1CjB,OZMQ;EYLR,eZqDS;;AYnDT;EACE,OZLU;EYMV;;AAIJ;EACE,WZmBW;EYlBX,OZJQ;EYKR,YZyCS;;AYtCX;EACE,WZaW;EYZX,OZlBY;EYmBZ,YZmCS;EYlCT;EACA;EACA,KZgCS;;;AY3Bb;EACE;EACA;EACA,WZEe;EYDf,aZLoB;EYMpB,OZzBU;EY0BV,YZvBM;EYwBN;EACA,eZgCiB;EY/BjB,YZ6DgB;;AY3DhB;EACE,OZ9BS;;AYiCX;EACE;EACA,cZhDW;EYiDX;;AAGF;EACE,YZtCM;EYuCN,OZ1CQ;EY2CR;;AAIF;EACE;EACA,WZ1BW;;AY6Bb;EACE;EACA,WZ7BW;;AYiCb;EACE,cZlEW;;AYoEX;EACE;;AAIJ;EACE,cZ3EY;;AY6EZ;EACE;;;AAMN;EACE;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA,eZrCY;;;AYyCd;EACE;EACA;EACA,eZ/CW;;AYiDX;AAAA;EAEE;EACA;EACA,cZtDS;EYuDT;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;AAAA;EAEE;;;AAMN;EACE;E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E1DT;EU+oBA;IAKI;IACA;IACA,KZ7lBK;;;AEzDT;EUwmBF;IAmDI;IACA,KZlmBO;;;;Aa5Db;EACE;EACA;EACA;EACA;EACA;EACA;EACA,SbuFuB;EatFvB;EACA;EACA,Yb2FgB;;AazFhB;EACE;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SbgCW;Ea/BX;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAKJ;EA5BF;IA6BI,SbYS;;;;AaPb;EACE;EACA;EACA;;AAIA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EAnBF;IAoBI;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,Ob1EM;Ea2EN;EACA;EACA;EACA;EACA,SbEc;EaDd,YbOgB;EaNhB,YbrEU;;AauEV;EACE;EACA;;AAGF;EACE;;AAGF;EA5BF;IA6BI;IACA;;EAEA;IACE;IACA;;EAGF;IACE;;;;AAMN;EACE;EACA;EACA,Yb/GM;EagHN,ebtDiB;EauDjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SbxCc;EayCd;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,wBbpFiB;EaqFjB,yBbrFiB;;AauFjB;EACE,WbzHW;Ea0HX,abjHmB;EakHnB;EACA;;AAGF;EAjBF;IAkBI;;EAEA;IACE;;;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA,abhImB;;AakInB;EACE;;AAEA;EACE,YbhIO;;AaqIX;EACE;;AAGF;EArBF;IAsBI;IACA;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIF;EACE;EACA;EACA;EACA,YblNI;EamNJ;EACA;EACA;EACA,abnLe;EaoLf;EACA;EACA,YblIc;;AaoId;EACE;EACA;;AAGF;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ab3Me;Ea4Mf,Ob/OI;EagPJ;EACA,Yb1Jc;;Aa4Jd;EACE;;AAGF;EACE;;AAIJ;EA9DF;IA+DI;IACA;;EAEA;AAAA;IAEE;IACA;IACA;;;;AAOJ;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EXlRJ;EACA;EACA;EWkRI,Wb9PU;Ea+PV,eb3NiB;;Aa6NjB;EACE;EACA,ObtSO;;AayST;EACE;EACA,Ob7SQ;;AagTV;EACE;EACA,ObjTQ;;AaoTV;EACE;EACA,Ob1TO;;Aa8TX;EACE,WbxRS;EayRT,abhRiB;EaiRjB,ebtQO;EauQP,ObvTM;;Aa0TR;EACE,Ob1TM;Ea2TN,WbnSW;;;ActCjB;EACE;EACA;EACA,Kd0DW;EczDX;EACA,WdgCa;;Ac9Bb;EACE;EACA;EACA,KdmDS;EclDT,OdGQ;;AcDR;EACE;EACA,YdwFY;;ActFZ;EACE,OdhBO;;AcoBX;EACE,OdVM;EcWN,adyBe;;ActBjB;EACE;EACA,OddO;EceP,ad+BO;;;AczBb;EACE;EACA,KdsBW;EcrBX;EACA,edwBW;;ActBX;EACE;;AAGF;EACE;EACA;EACA,KdYS;EcXT;EACA,OdrCQ;EcsCR,adHiB;EcIjB;EACA;EACA,YdgDc;;Ac9Cd;EACE,Od7CM;;AcgDR;EACE,Od5DS;Ec6DT,qBd7DS;;AcgEX;EACE;EACA,YdnDI;EcoDJ,OdvDM;EcwDN,edOe;EcNf;EACA,adtBiB;;;Ac4BvB;EACE;EACA,KdnBW;EcoBX,SdrBW;EcsBX,YdjEQ;EckER,edTiB;;AcWjB;EACE;EACA,OdzEQ;Ec0ER,advCiB;EcwCjB,edhBe;EciBf,Ydac;;AcXd;EACE,OdhFM;EciFN;;AAGF;EACE,YdlFE;EcmFF,OdjGS;EckGT,Yd1EM;;;AciFV;EACE,ed5CS;;Ac8CT;EACE,Wd3ES;Ec4ET,ad9DiB;Ec+DjB;EACA,OdpGM;EcqGN;EACA;;AAIJ;EACE;;AAEA;EACE,edhEO;;AcmET;EACE;EACA;EACA,KdpEO;EcqEP;EACA,OdvHM;EcwHN,ed5Da;Ec6Db,Yd/BY;;AciCZ;EACE;EACA;EZtHN;EACA;EACA;EYsHM,WdrGO;EcsGP,Od/HI;;AckIN;EACE,YdhIE;EciIF,OdhJO;;AckJP;EACE,OdnJK;;AcuJT;EACE,YdxIG;EcyIH,OdzJO;Ec0JP,ad3Ga;;Ac6Gb;EACE,Od7JK;;AcmKX;EACE,adrGQ;EcsGR,Yd3GO;Ec4GP;;AAEA;EACE,WdtIO;EcuIP;;;AAOR;EACE;EACA;EACA,Kd1HW;;Ac8HP;EACE;EACA;EACA;;AAKF;EACE,YdjMO;EckMP,OdpLA;EcqLA,cdnMO;;AcwMb;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YdjMI;EckMJ;EACA,ed1Ie;Ec2If,OdvMQ;EcwMR,WdhLW;EciLX,adrKiB;EcsKjB,YdhHc;;AckHd;EACE,YdzMI;Ec0MJ,cdzNS;Ec0NT,Od1NS;;Ac6NX;EAEE,Wd1LS;;Ac8Lb;EACE;EACA,OdzNQ;;;AefZ;EACE;EACA,YfeM;;;AgBjBR;EACE;EACA;EAEA;;;ACAA;EACE;;AAIF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA,ejBwDe;EiBvDf,WjBmBW;EiBlBX,ajBakB;EiBZlB;EACA;;AAEA;EACE;EACA,cjBvBS;EiBwBT;;AAGF;EACE,OjBfO;;AiBmBT;EACE,cjB7BU;;AiB+BV;EACE,cjBhCQ;EiBiCR;;AAKN;EACE,OjBvCY;EiBwCZ,WjBVW;EiBWX,YjBaS;EiBZT;EACA;;AAEA;EACE;;;AAMN;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AC9DJ;EACE;EACA;EACA,KlBwDW;;AkBtDX;EACE;;;AAOJ;EACE;EACA;EACA;EACA,OlBPU;EkBQV;EACA;EACA,elBsDmB;EkBrDnB,alB0BqB;EkBzBrB,WlBYa;EkBXb,YlB6EgB;;AkB1EhB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,alBWe;EkBVf,WlBHa;EkBIb;EACA,YlB4Dc;;AkB1Dd;EACE;EACA;EACA;;;AAQN;EACE;;AAEA;EACE;EACA;EACA,KlBDS;EkBET;EACA,YlB9CO;EkB+CP;EACA,elBWiB;EkBVjB;EACA,YlBmCc;EkBlCd,alBrCkB;EkBsClB,WlBjCW;;AkBmCX;EACE,OlB5DM;EkB6DN,alBxBiB;;AkB2BnB;EACE,OlBhEM;EkBiEN;EACA;;AAGF;EACE,YlBpEE;EkBqEF,clBnFS;EkBoFT,YlB3DM;;AkB6DN;EACE,OlBvFO;;AkB0FT;EACE,OlB3FO;;AkBiGX;EACE;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA,YlBnGI;EkBoGJ;EACA,elB3Ce;EkB4Cf,YlBzFQ;EkB0FR;EACA;EACA;EACA;EACA,SlB/Be;EkBgCf;;AAGF;EACE,SlBjES;EkBmET,OlBlHI;EkBmHJ;;AAEA;EACE;EACA,WlBhGS;EkBiGT,alBrFa;;AkBwFf;EACE,WlBxGS;EkByGT;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA,OlBjJI;EkBkJJ;EACA,WlB3HO;EkB4HP,YlBzDU;;AkB2DV;EACE;EACA,OlBvJE;EkBwJF;;AAGF;EACE,YlBxJC;EkByJD,OlBzKK;;AkB2KL;EACE,OlB5KG;;AkBmLb;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA,KlBhIO;EkBiIP;EACA;EACA,YlB/KI;EkBgLJ,OlBpLM;EkBqLN;EACA,elB1Ha;EkB2Hb,alBlJiB;EkBmJjB,WlBhKS;EkBiKT,YlB/FY;;AkBiGZ;EACE;;AAGF;EACE,YlBvMQ;EkBwMR,OlB9LA;EkB+LA;EACA,YlBrLI;;;AkB8LZ;EACE,SlB3JW;EkB6JX;;AAEA;EACE;EACA;EACA,KlBnKS;;AkBqKT;EACE;EACA;EACA;EACA;EACA;EACA;EACA,elB5JiB;EkB6JjB,OlB3NE;;AkB6NF;EACE;;AAIJ;EACE;EACA,OlBpOE;;AkBsOF;EACE;EACA,WlBjNO;EkBkNP,alBtMW;;AkByMb;EACE,WlBzNO;EkB0NP;;;AASR;EACE;EACA;EACA;EACA,KlB9MW;EkB+MX;EACA;EACA,YlBxQc;EkByQd,OlB/PM;EkBgQN;EACA,elBvMiB;EkBwMjB,alBhOqB;EkBiOrB,WlB7Oe;EkB8Of,YlB7KgB;EkB8KhB,YlB1PU;;AkB4PV;EACE;;AAGF;EACE;EACA;EAC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EACA;EACA;EACA;EACA,WpBpQa;EoBqQb,apB1PiB;EoB2PjB,OpB/RQ;EoBgSR;EACA,YpBvMc;;AoByMd;EAXF;IAYI;IACA,WpB7QS;;;AoBgRX;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA,OpBlTM;EoBmTN,YpB1NY;;AoB8NhB;EACE;EACA;EACA,WpBnSW;EoBoSX,OpB3TQ;EoB4TR,apBlRiB;EoBmRjB;;AAEA;EARF;IASI;;;AAGF;EACE;EACA;;;AClVN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA,WrBQY;EqBPZ,arBee;EqBdf,OrBxBQ;EqByBR;EACA;EACA;;AnBpCA;EmBHJ;IA4CI;IACA,erBkBS;;EqBhBT;IACE;;EAGF;IACE,WrBZS;;;;AsBzCf;EACE;EACA;EACA,KtB2DW;EsB1DX;EACA,etBoEiB;EsBnEjB,etB0DW;;AsBxDX;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE,atBgCiB;;AsB3BrB;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA,WtBLS;EsBMT,atBMe;;AsBDnB;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA,OtBvDa;;;AuBJjB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;ArBHE;EqBDJ;IAOI;;;ArBRA;EqBCJ;IAWI;;;;AAIJ;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;ArB1DE;EqBiDJ;IAYI;;;ArB/DA;EqBmDJ;IAgBI;;;ArBrEA;EqBqDJ;IAoBI;IACA;IACA;IACA;;;ArB9EA;EqBuDJ;IA2BI;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;ArB1FE;EqBqFJ;IAQI;IACA;;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;;ArBzGA;EqBmGF;IASI;;;ArB9GF;EqBqGF;IAaI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArB1HA;EqBoHF;IASI;;;ArB/HF;EqBsHF;IAaI;;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;;ArB7JA;EqBsIJ;IA2BI;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;ArB1KE;EqBmKJ;IAUI;IACA;;;ArBhLA;EqBqKJ;IAeI;IACA;;;ArBvLA;EqBuKJ;IAoBI;IACA;IACA;;;AAGF;EACE;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;ArB/NA;EqBoMJ;IAgCI;;;;AAIJ;EACE;;AAEA;EACE;;ArB5OA;EqBwOJ;IAQI;;;ArBlPA;EqB0OJ;IAYI;;;ArBxPA;EqB4OJ;IAgBI;;;;AAIJ;EACE;;ArB7PE;EqB4PJ;IAII;;;ArBlQA;EqB8PJ;IAQI;;;ArBxQA;EqBgQJ;IAYI;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;ArBxRE;EqBiRJ;IAUI;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;ArB/SA;EqBgSJ;IAoBI;IACA;;EAEA;IACE;IACA;;;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;ArBtVA;EqB+TJ;IA2BI;;EAEA;IACE;IACA;;;;AASN;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;ArB5XA;EqBsXF;IASI;IACA;IACA;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;ArB7YF;EqBqYF;IAYI;IACA;;;AAIJ;EACE;;ArBvZA;EqBsZF;IAII;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArBpaA;EqB8ZF;IASI;;;ArBzaF;EqBgaF;IAaI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;ArBpbA;EqB+aF;IAQI;;;AAIJ;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;ArBzcA;EqBgcF;IAYI;IACA;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;ArBjeF;EqBkdF;IAmBI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;ArBjgBF;EqB+fA;IAKI;IACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;ArBjhBA;EqB0gBF;IAUI;IACA;IACA;IACA;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;ArBxiBA;EqBoiBF;IAOI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;ArB3jBF;EqBgjBF;IAeI;;;AAIJ;EACE;EACA;EACA;EACA;;ArBvkBA;EqBmkBF;IAOI;;;;AAUN;EACE;EACA;EACA;EACA;EACA,YvB/kBM;EuBglBN;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;ArBnnBA;EqB+mBF;IAOI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArBhoBA;EqB0nBF;IASI;;;ArBroBF;EqB4nBF;IAaI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArBjpBA;EqB2oBF;IASI;;;ArBtpBF;EqB6oBF;IAcI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;ArBhrBA;EqB6pBF;IAsBI;IACA;IACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;;AAKN;EACE;EACA;EACA;;ArB5sBA;EqBysBF;IAMI;;;ArBjtBF;EqB2sBF;IAUI;IACA;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;ArB7uBF;EqB2tBF;IAsBI;IACA;;;ArBpvBF;EqB6tBF;IA2BI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAaN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;AAYF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA,KvB9wBU;;AE9DV;EqBw0BF;IAOI;IACA,KvBnxBQ;;;AuBuxBZ;EACE;EACA;;ArBt1BA;EqBo1BF;IAKI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArBp2BA;EqB81BF;IASI;;;ArBz2BF;EqBg2BF;IAaI;;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArB33BA;EqBq3BF;IASI;;;AAIJ;EACE;EACA,KvB30BS;;AEzDT;EqBk4BF;IAKI;;;ArBz4BF;EqBo4BF;IASI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;ArBh6BA;EqBk5BF;IAiBI;IACA;IACA;;;AAGF;EACE;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;ArB58BF;EqBk8BF;IAcI;;;;AAgBN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;ArBjhCF;EqB2gCA;IASI;IACA;;;ArBvhCJ;EqB6gCA;IAcI;;;AAGF;EACE;;AAGF;EACE;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;;ArB5iCA;EqBsiCF;IASI;IACA;IACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;ArB/jCA;EqBsjCF;IAYI;IACA;IACA;IACA;;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;ArBpmCJ;EqB8lCE;IASI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArBjnCJ;EqB2mCE;IASI;;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;;ArBhoCF;EqB0nCA;IASI;IACA;IACA;;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;ArBppCN;EqBkpCI;IAKI;;;AAIJ;EACE;EACA;;ArB7pCN;EqB2pCI;IAKI;;;AAKN;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;;ArBhrCF;EqB2qCA;IAQI;IACA;IACA;;;AAGF;EACE;EACA;EACA;;AAIF;EACE;EACA;EACA;;AAEA;EACE;;ArBrsCN;EqBosCI;IAII;;;AAIJ;EACE;;ArB7sCN;EqB4sCI;IAII;;;AAOR;EACE;;AAEA;EACE;;AAKJ;EACE;;AAEA;EACE;;;AAWR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;ArBtvCE;EqB+uCJ;IAUI;IACA;;;ArB5vCA;EqBivCJ;IAeI;IACA;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIA;EACE;EACA;;AAGF;EACE;EACA;;ArBxxCA;EqBsxCF;IAKI;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;ArBvyCF;EqBkyCA;IAQI;;;ArB5yCJ;EqBoyCA;IAYI;;;AAIJ;EACE;EACA;EACA;;ArBrzCF;EqBkzCA;IAMI;;;ArB1zCJ;EqBozCA;IAUI;;;AA/BN;EAoCE;EACA;EACA;;ArBn0CA;EqB6xCF;IAyCI;;;ArBx0CF;EqB+xCF;IA6CI;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;;ArBr1CA;EqB+0CF;IASI;IACA;;;ArB31CF;EqBi1CF;IAcI;IACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;;ArBx2CA;EqBm2CF;IAQI;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;ArBv3CF;EqBg3CA;IAUI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;ArBz4CJ;EqB83CA;IAeI;IACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;ArBx5CF;EqBg5CA;IAWI;;;ArB75CJ;EqBk5CA;IAeI;;;AAMF;EACE;;AAMN;EACE;EACA;EACA;EACA;;ArBh7CA;EqB46CF;IAOI;;;;AAMN;EACE;;;AAGF;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAOJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;ArBh/CA;EqB0+CF;IASI;;;ArBr/CF;EqB4+CF;IAaI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;E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;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;IACE;;;AAKJ;EACE;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAIA;IACE;IACA;IACA;;EAIA;IACE;IACA;;EAGF;IACE;;EAKN;IACE;IACA;IACA;;EAGF;IACE;;EAEA;IACE;;;AC9TN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EARF;IASI;;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EATF;IAUI;IACA;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EAxBF;IAyBI;IACA;;;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAKJ;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;;AAMN;EACE;EACA;EACA;;AAEA;EACE;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;IACE;;EAGF;IACE;;;;AAMN;EACE;;;AAGF;EACE;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAXF;IAYI;IACA;;;;AAMN;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;;AAGF;AAAA;EACE;;AAGF;AAAA;EACE;EACA;;AAGF;EA9BF;AAAA;IA+BI;IACA;;;;AAMJ;EACE;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAIJ;EAzDF;IA0DI;IACA;;EAEA;AAAA;AAAA;IAEE;IACA;;;;AAMN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;IACE;;;AAIJ;EACE;IACE;IACA;;EAEF;IACE;IACA;;;AAKJ;EACE;IACE;IACA;IACA;;EAGF;IACE;;;AAIJ;EACE;IACE;IACA;IACA;;EAIA;IACE;;EAGF;IACE;IACA;;EAGF;AAAA;IAEE;IACA;IACA;;EAIJ;AAAA;IAEE;;EAGF;IACE;;;AC1fJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EAPF;IAQI;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;;;AAKJ;EACE;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;;EAEA;IACE;I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BjB,S7Bl6BW;E6Bm6BX,e7Bl6BW;;A6Bo6BX;EACE,W7B97BW;E6B+7BX,a7Bp7BmB;E6Bq7BnB,O7B19BQ;E6B29BR,e7B16BS;;A6B66BX;EACE;EACA;EACA,K7Bj7BS;;A6Bm7BT;EACE;EACA;EACA,K7Bv7BO;E6Bw7BP;EACA,Y7Br+BE;E6Bs+BF;EACA,e7B16Be;E6B26Bf,W7Bn9BS;E6Bo9BT,O7Bv/BS;;A6By/BT;EACE;EACA;EACA,O7B5/BO;E6B6/BP;EACA;EACA;EACA;;AAEA;EACE,O7B//BM;;;A6BugChB;EAEE,S7B78BY;;;A6Bi9Bd;EACE,S7Bl9BY;E6Bm9BZ;EACA,O7BxgCU;;A6B0gCV;EACE;EACA;EACA;EACA;EACA,kB7B3hCW;E6B4hCX,e7Bh9BmB;E6Bi9BnB;;AAGF;EACE,W7B7/Ba;E6B8/Bb,O7BthCQ;;;A6B0hCZ;EACE;IACE;;;AAKJ;EACE;EACA;EACA;;AAEA;EACE,Y7BriCI;E6BsiCJ,e7B5+Be;E6B6+Bf,S7Bt/BU;E6Bu/BV,Y7B9hCQ;E6B+hCR,e7Bz/BS;;A6B4/BX;EACE,e7B7/BS;;A6B+/BT;EACE;;AAIJ;EACE;EACA,W7BjiCW;E6BkiCX,a7BrhCmB;E6BshCnB,O7B3jCQ;E6B4jCR,e7B5gCS;;A6B8gCT;EACE,O7BtkCU;E6BukCV;;AAIJ;AAAA;AAAA;EAGE;EACA;EACA;EACA,e7B9gCe;E6B+gCf,W7BljCa;E6BmjCb,Y7Bl/Bc;E6Bm/Bd,Y7B1kCI;;A6B4kCJ;AAAA;AAAA;EACE;EACA,c7B5lCS;E6B6lCT;;AAGF;AAAA;AAAA;EACE,O7BplCO;;A6BwlCX;EACE;EACA;EACA;;AAGF;EACE;EACA,W7B3kCW;E6B4kCX,O7BlmCQ;E6BmmCR,Y7BrjCS;;A6BujCT;EACE;EACA,O7BtmCO;;A6B0mCX;EACE;EACA,K7B5jCS;E6B6jCT;;AAEA;EACE;EACA;EACA;;AAEA;EACE,c7BvkCK;;A6B0kCP;EACE,W7BlmCS;E6BmmCT,O7B5nCI;;A6BkoCV;EACE;EACA;EACA,K7BnlCS;;A6BqlCT;EACE;EACA;EACA;EACA,e7B9kCa;E6B+kCb;EACA;EACA;EACA,Y7B3oCI;E6B4oCJ;EACA;EACA,Y7BxjCY;;A6B0jCZ;EACE,c7BhqCO;E6BiqCP;;AAGF;EACE;EACA;EACA;EACA;EACA,K7B9mCK;E6B+mCL,O7B9pCI;E6B+pCJ;EACA,S7BhnCK;;A6BknCL;EACE;;AAGF;EACE,W7BjpCK;E6BkpCL,a7BroCW;;A6ByoCf;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,e7B3nCe;E6B4nCf,O7B5rCI;E6B6rCJ;EACA,Y7BrmCU;E6BsmCV;EACA;EACA;EACA,Y7BtrCI;E6BurCJ;;AAEA;EACE;EACA;;AAGF;EACE,Y7BntCM;E6BotCN,c7BptCM;E6BqtCN,O7B3sCF;E6B4sCE;EACA,Y7BlsCE;;A6BqsCJ;EACE;;AAKN;EACE;;AAGF;EACE;EACA,Y7B5tCE;E6B6tCF;EACA,e7BrqCa;E6BsqCb,W7B1sCS;E6B2sCT,a7B/rCe;E6BgsCf,O7BpuCM;E6BquCN;EACA,Y7B5oCY;;A6B8oCZ;EACE,Y7BpvCO;E6BqvCP,c7BrvCO;E6BsvCP,O7BxuCA;;A6B2uCF;EACE;;AAMN;EACE;EACA,K7BvsCS;E6BwsCT,e7BvsCS;;A6BysCT;EACE;;AAGF;EACE;EACA;EACA,K7BltCO;E6BmtCP;EACA,Y7B9wCS;E6B+wCT;EACA,e7BzsCa;E6B0sCb,O7BnwCE;E6BowCF,W7B/uCS;E6BgvCT,a7BpuCe;E6BquCf;EACA,Y7BhrCY;E6BirCZ;;AAEA;EACE;;AAGF;EACE,Y7B5xCS;E6B6xCT;EACA,Y7BtwCI;;A6BywCN;EACE;;AAKN;EACE,Y7B7uCS;E6B8uCT;;AAEA;EACE,S7BjvCO;E6BkvCP,Y7B/xCI;E6BgyCJ;;AAEA;EACE,W7B/wCO;E6BgxCP,O7BvyCI;;A6ByyCJ;EACE,O7BtzCK;E6BuzCL,a7BvwCa;;A6B4wCnB;EACE;EACA;;AAEA;EACE;;AAGF;EACE,Y7BtzCE;;A6ByzCJ;EACE,Y7BxzCM;E6ByzCN;;AAEA;EACE,Y7Bh0CG;;A6Bq0CT;EACE;EACA;EACA;EACA;EACA,Y7BlvCY;;A6BovCZ;EACE;;AAGF;EACE,Y7B/0CE;;A6Bk1CJ;EACE,a7Bn0CW;E6Bo0CX,W7Bh0CO;E6Bi0CP,O7Bz1CI;E6B01CJ,a7BtzCa;;A6ByzCf;EACE;EACA;EACA;EACA;EACA;EACA;EACA,Y7Bj2CA;E6Bk2CA;EACA,e7B3yCW;E6B4yCX,O7Bt2CI;E6Bu2CJ;EACA,Y7B/wCU;;A6BixCV;EACE;EACA;;AAGF;EACE;;;AASV;EACE;EACA;EACA,Y7Bz0CY;E6B00CZ;EACA;;AAEA;EAPF;IAQI;;;;AAKJ;EAEE;EACA;EACA;EACA;;AAKI;EACE;EACA;;AAMJ;EACE;EACA,O7Bl6CU;;A6Bs6Cd;EACE,e7B72CS;;A6B+2CT;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE,e7Bx3CU;;A6B03CV;EACE,W7Bn5CS;E6Bo5CT,a7B14Ca;E6B24Cb,O7B57CS;E6B67CT,e7Bj4CO;;A6Bo4CT;EACE,W7B75CW;E6B85CX,O7Bt7CM;E6Bu7CN;;;AAON;EACE,Y7B77CM;E6B87CN,e7Bp4CiB;E6Bq4CjB,S7B/4CW;E6Bg5CX,Y7Br7CU;E6Bs7CV,e7Bj5CW;E6Bk5CX;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE,W7B37CS;E6B47CT,O7Bn9CM;E6Bo9CN,a7Bj7Ce;E6Bk7Cf;;AAGF;EACE,W7Bj8CW;E6Bk8CX,O7B39CM;E6B49CN,a7Bx7Ce;;A6B27CjB;EACE;EACA;EACA,K7Bl7CO;E6Bm7CP;EACA;;AAEA;EACE,a7Bn9CW;E6Bo9CX,W7Bh9CO;E6Bi9CP,Y7Br+CE;E6Bs+CF;EACA,e7Bh7CW;E6Bi7CX,O7Bt/CS;E6Bu/CT,c7B77CK;;A6Bg8CP;AAAA;EAEE;EACA,Y7Bh/CA;E6Bi/CA;EACA,e7B17CW;E6B27CX;EACA,Y7B75CU;;A6B+5CV;AAAA;EACE,Y7BrgDK;E6BsgDL,c7BtgDK;E6BugDL,O7Bz/CF;;A6B+/CF;EACE;EACA;EACA;EACA,e7Bt8Ca;E6Bu8Cb,W7Bh/CO;E6Bi/CP,a7Bn+Ce;;;A6By+CvB;EACE,Y7B3gDQ;E6B4gDR,e7Bn9CiB;E6Bo9CjB,S7B/9CW;E6Bg+CX,e7B/9CW;E6Bg+CX;;AAEA;EACE,W7B5/CW;E6B6/CX,a7Bl/CmB;E6Bm/CnB,O7BxhDQ;E6ByhDR,e7Bx+CS;;A6B2+CX;EACE;EACA;EACA,K7B/+CS;E6Bg/CT,e7B/+CS;;A6Bi/CT;EACE;EACA,Y7BjiDE;E6BkiDF;EACA,e7Bt+Ce;E6Bu+Cf,W7B/gDS;E6BghDT,O7BnjDS;;A6BujDb;EACE,W7BthDW;E6BuhDX,O7B7iDQ;E6B8iDR;;;AAIJ;EACE,Y7B/iDS;E6BgjDT,e7Bx/CiB;E6By/CjB,S7BngDW;E6BogDX,e7BpgDW;E6BqgDX;;AAEA;EACE,W7BjiDW;E6BkiDX,a7BvhDmB;E6BwhDnB,O7B7jDQ;E6B8jDR,e7B7gDS;;A6BghDX;EACE,a7BhhDS;E6BihDT,O7BlkDQ;E6BmkDR,W7B5iDW;E6B6iDX,a7BzhDgB;;A6B2hDhB;EACE,e7BxhDO;;;A6B6hDb;EACE;EACA;EACA,K7B/hDW;E6BgiDX;;AAEA;EANF;IAOI;IACA;IACA,K7BtiDS;I6BuiDT;;;AAGF;AAAA;EAEE;EACA;EACA,K7B9iDS;E6B+iDT;EACA,e7BpiDe;E6BqiDf,W7BxkDa;E6BykDb,a7B9jDiB;E6B+jDjB,Y7BzgDc;E6B0gDd;EACA;EACA;;AAEA;AAAA;EACE;;AAGF;EAlBF;AAAA;IAmBI;IACA;IACA;IACA;;;AAIJ;EACE,O7BlnDI;E6BmnDJ,Y7BxmDQ;;A6B0mDR;EACE;EACA,Y7B3mDM;;A6B+mDV;EACE,Y7B5nDI;E6B6nDJ,O7BhoDQ;E6BioDR;;AAEA;EACE,Y7BhoDI;E6BioDJ,c7BhpDS;E6BipDT,O7BjpDS;;;A6B0pDf;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,O7BtpDM;E6BupDN;EACA;EACA;EACA;EACA,Y7B9oDU;E6B+oDV;EACA,S7B/kDc;;A6BklDd;EACE;EACA,a7B/nDe;E6BgoDf,O7BnqDI;E6BoqDJ;;AAIF;EACE;EACA;EACA;EACA;EACA,Y7B7qDI;E6B8qDJ;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA,a7BnpDa;E6BopDb;EACA;;AAGF;EACE;EACA,a7B1pDa;E6B2pDb;EACA;EACA;;AAIJ;EACE;EACA;;AAGF;EACE;;AAGF;EAjEF;IAmEI;IACA;IACA;IACA;IACA;;EAEA;IACE;;EAGF;IACE;IACA;IACA;;EAEA;IACE;;EAGF;IACE;;;;AAcN;EACE;EACA;EACA,K7BvsDS;E6BwsDT;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA,a7B3uDgB;E6B4uDhB;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,e7B7tDiB;E6B8tDjB;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAIJ;EA3DF;IA4DI;IACA;;EAEA;IACE;IACA;;EAGF;IACE;IACA;;EAEA;IACE;IACA;;;;AC90DV;EAEE;;AAEA;EAJF;IAKI;;;;AAIJ;EACE;EACA,e9BqDY;;A8BnDZ;EACE,W9B0BY;E8BzBZ,a9BgCe;E8B/Bf,O9BPQ;E8BQR,e9BwCS;;A8BrCX;EACE,W9Baa;E8BZb,O9BZQ;;;A8BiBZ;EACE;EACA,e9BkCY;;;A8B3BZ;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;;AASJ;EACE,W9BrBa;E8BsBb,a9BZiB;E8BajB,O9BnDU;E8BoDV,e9BFW;E8BGX,gB9BJW;;;A8BgBb;EACE,W9B1Ca;E8B2Cb,a9B9BqB;E8B+BrB,O9BnEU;;;A8BsEZ;EACE,W9B/Ce;E8BgDf,O9BzEU;E8B0EV;;;AA6CF;EACE;EACA;EACA,e9BzDqB;E8B0DrB;;;AAWA;EACE;EACA,W9B/Ga;E8BgHb,a9BrGiB;E8BsGjB,O9B1IQ;E8B2IR;;;AAIJ;EACE;EACA;EACA,e9BvFiB;E8BwFjB,W9B3Ha;E8B4Hb,a9B9GiB;E8B+GjB,a9BjIiB;E8BkIjB;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EACE,kB9BxKU;E8ByKV,O9B/KQ;;;A8BmLZ;EACE;EACA,e9BxHiB;E8ByHjB,W9B9Ja;E8B+Jb,a9BlJqB;;A8BoJrB;EACE;EACA;;AAGF;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;EACA;;AAEA;EACE,kB9B1MM;E8B2MN;EACA;EACA,a9B5KmB;E8B6KnB,O9BjNQ;E8BkNR;;AAGF;EACE,S9BtKS;E8BuKT;;;AAIJ;EACE;EACA;EACA,kB9B1NS;E8B2NT,O9B1Oe;E8B2Of,e9BpKiB;E8BqKjB,W9B1Ma;E8B2Mb,a9B9LqB;;;A8BkMvB;EAEE;EACA;;;AAaA;EAHF;AAAA;AAAA;IAII;;;;AASJ;EACE;EACA;EACA,K9BjNW;E8BkNX;EACA;EACA,e9BjNY;;A8BmNZ;EARF;IASI;IACA;IACA;IACA;IACA,K9B5NS;;;;A8BgOb;EACE;EACA;EACA;EACA,e9BxNiB;E8ByNjB;EACA,Y9BpRQ;E8BqRR;EACA;EACA;EACA;;AAEA;EAZF;IAaI;IACA;;;AAGF;EACE;EACA;EACA;;AAGF;EACE,O9BxSS;E8ByST;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA,K9BpQW;;;A8BuQb;EACE;EACA;EACA,e9B3PmB;E8B4PnB,W9BpSa;E8BqSb,a9BxRqB;E8ByRrB;;AAEA;EACE;EACA,O9B/TI;;A8BkUN;EACE;EACA;;AAGF;EACE,kB9BrUU;E8BsUV,O9B3UQ;;A8B8UV;EACE;EACA;;;AAIJ;EACE;EACA,a9BjTiB;E8BkTjB,O9BxVU;E8ByVV;;AAEA;EANF;IAOI;;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EANF;IAOI,W9B9Ua;;;;A8BwVjB;EACE;EACA,e9BtTiB;E8BuTjB;EACA,e9BjUY;;A8BmUZ;EANF;IAOI,S9BtUS;;;;A8B0Ub;EACE;EACA;EACA,K9B5UW;E8B6UX,e9B7UW;;A8B+UX;EACE;;AAGF;EAVF;IAWI;IACA;IACA,K9BzVS;;;;A8B6Vb;EACE;;AAEA;EACE;;AAEA;EAHF;IAII;;;;AAKN;EACE;EACA;EACA;EACA,a9BvXiB;E8BwXjB;;AAEA;EAPF;IAQI;IACA,W9BzYa;;;;A8B6YjB;EACE;EACA,W9B/Ye;E8BgZf,O9BzaU;E8B0aV;;AAEA;EANF;IAOI;;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,e9B5XiB;E8B6XjB;EACA;EACA;;AAEA;EAZF;IAaI;IACA,W9Bvaa;I8Bwab;;;AAGF;EACE;;;AAMF;EACE;EACA,K9B5ZS;E8B6ZT;;;AAIJ;EACE;EACA;EACA;EACA,K9BvaW;E8BwaX;EACA;EACA;EACA;EACA;EACA,e9B/ZiB;E8BgajB;EACA,a9BxbiB;E8BybjB,O9B5dM;E8B6dN;EACA;EACA;;AAEA;EACE;;AAGF;EAtBF;IAuBI;IACA,W9Bjda;I8Bkdb;;;;AAKJ;EACE;EACA;EACA;EACA,K9BpcW;E8BqcX;EACA;EACA;EACA;EACA,e9B5biB;E8B6bjB;EACA,a9BrdiB;E8BsdjB,O9BzfM;E8B0fN;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EAzBF;IA0BI;IACA;IACA,W9Bnfa;;;;A8BwfjB;EACE;EACA,Y9BhhBM;E8BihBN;EACA,e9BxdiB;E8BydjB,S9BpeW;;A8BseX;EAPF;IAQI;IACA,S9BzeS;;;;A8B8eb;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEA;EAJF;IAKI,W9BthBW;;;A8B0hBf;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,e9B3fiB;E8B4fjB,W9BniBa;E8BoiBb;;AAEA;EAZF;IAaI;IACA,W9BziBS;I8B0iBT;;;;AClkBN;EACE,a/BkBoB;E+BjBpB;EACA,a/BmCiB;E+BlCjB,O/BJU;E+BKV;;A7BdE;E6BSJ;IAQI;;;;AAKJ;EAEE;;;AAIF;EACE;EACA;EACA,K/B4BW;E+B3BX;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA,e/BsBe;;AErEf;E6B4BJ;IAuBI;IACA;IACA;IACA,K/BIS;;E+BFT;IACE;IACA;IACA;;;;AAMN;EAEE;EACA;;A7BpEE;E6BiEJ;IAMI;IACA;;;AAGF;EAEE;;AAGF;EAEE;;;AAKJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA,K/B3BiB;;AEtEf;E6B8FJ;IAMI;IACA,K/B5CS;;;;A+BsDb;EACE,a/BpFoB;E+BqFpB;EACA,a/BnEiB;E+BoEjB,O/B1GU;E+B2GV;;A7BpHE;E6B+GJ;IAQI;;;;AAKJ;EACE,a/BjGoB;E+BkGpB,W/B5Fe;E+B6Ff,a/BnFoB;E+BoFpB;EACA;EACA;;A7BlIE;E6B4HJ;IASI,W/BpGW;;;;A+B8Gf;EACE;EACA;EACA;;A7BlJE;E6B+IJ;IAMI;;;;AAKJ;EAEE;EACA,O/BjJM;;A+BmJN;EACE;;;ACpKJ;EACE;EACA,YhCeQ;EgCdR;;AAEA;EALF;IAMI;;;;AAIJ;EACE,WhCsEoB;EgCrEpB;;;AAIF;EACE,ehCiDY;;AgC/CZ;EAHF;IAII,ehC6CU;;;AgC1CZ;EACE,WhCmBY;EgClBZ,ahC0Be;EgCzBf,OhCbQ;EgCcR,ehCmCS;EgClCT;EACA;EACA;;AAEA;EATF;IAUI,WhCSU;;;AgCLd;EACE;EACA,OhCzBQ;EgC0BR,ahCgBiB;;AgCdjB;EALF;IAMI,WhCNS;;;;AgCYf;EACE,YhClCM;EgCmCN,ehCuBiB;EgCtBjB,YhCzBU;EgC0BV;EACA,ehCUW;;;AgCNb;EACE;EACA,YhC3CQ;EgC4CR;;AAEA;EALF;IAMI;;;;AAIJ;EACE;EACA;;;AAIF;EACE,YhC3DM;EgC4DN,ehCFiB;EgCGjB,YhClDU;EgCmDV;EACA,ehCfW;;AgCkBX;EACE;EACA;;AAEA;EAJF;IAKI;;;AAGF;EACE,WhCjDU;EgCkDV,ahCzCa;EgC0Cb,OhChFM;EgCiFN,ahCvCc;EgCwCd,ehChCO;;AgCkCP;EAPF;IAQI,WhCzDO;;;AgC6DX;EACE;EACA;EACA,KhC1CO;EgC2CP;EACA,WhCtES;EgCuET,OhC9FM;;AgCgGN;EARF;IASI,WhC3EO;IgC4EP,KhClDK;;;AgCqDP;EACE;EACA;EACA,KhC1DK;;AgC4DL;EACE,OhCvHK;;AgC0HP;EACE,OhChHE;EgCiHF,ahC7EW;;AgCoFnB;EACE;EACA,YhCtHM;EgCuHN;;AAEA;EALF;IAMI;;;AAGF;EACE;EACA;EACA,KhCpFO;;AgCsFP;EACE;EACA;EACA,KhCzFK;;AgC2FL;EACE,OhC5IE;EgC6IF;EACA,WhCtHK;EgCuHL,YhCrDQ;EgCsDR;EACA;EACA,KhCnGG;;AgCqGH;EATF;IAUI,WhC9HG;;;AgCiIL;EACE,OhCpKG;;AgCsKH;EACE;;AAIJ;EACE,OhC5KG;EgC6KH,YhCxEM;;AgCgFhB;EACE;EACA;;AAEA;EAJF;IAKI;;;AAGF;EACE,WhC1JW;EgC2JX,OhCpLM;EgCqLN,ahCzIc;;AgC2Id;EALF;IAMI,WhChKO;;;AgCoKT;EACE,ehC5IK;;AgC8IL;EACE;;AAIJ;EACE,YhClJK;EgCmJL,ehCrJK;EgCsJL,ahClKe;EgCmKf,OhCxMI;;AgC2MN;EACE;EACA;EACA,ehClJW;EgCmJX;;AAGF;EACE,OhC9NO;EgC+NP;;AAEA;EACE,OhCjOO;;AgCqOX;EACE;EACA,chC1KK;;AgC6KP;EACE,ehCjLK;;AgCoLP;EACE;EACA,chCpLK;EgCqLL;EACA,OhCvOI;EgCwOJ;;AAGF;EACE,YhCzOE;EgC0OF;EACA,ehCpLW;EgCqLX,ahC5NW;EgC6NX;EACA,OhC7PO;;AgCgQT;EACE,YhClPE;EgCmPF;EACA,ehC5LW;EgC6LX,ShCxMK;EgCyML;EACA;;AAEA;EACE;EACA;EACA,OhChQE;;AgCoQN;EACE;EACA;EACA;EACA;EACA,ehC7MW;EgC8MX;;AAEA;EACE,YhCxQC;EgCyQD;EACA;EACA,ahC3Oa;EgC4Ob;;AAGF;EACE;EACA;;AAGF;EACE;;;AAQV;EACE;EACA;EACA,KhCpPW;EgCqPX,ehCjPY;;AgCmPZ;EANF;IAOI;IACA;;;;AAOJ;EACE,YhC/SM;EgCgTN,ehCtPiB;EgCuPjB,YhCvSU;EgCwSV;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA,YhCnOc;EgCoOd;;AAEA;EATF;IAUI;IACA;IACA;IACA,KhCpRO;;;AgCuRT;EACE;;AAGF;EACE,YhCxUI;;AgC0UJ;EACE,OhC1VO;;AgC8VX;EACE;EACA;EACA,KhCtSO;EgCuSP,WhC/TS;EgCgUT,ahCpTe;EgCqTf,OhCxVM;EgCyVN;;AAEA;EATF;IAUI,WhCtUO;;;AgCyUT;EACE,OhC5WO;;AgCgXX;EACE;EACA,WhC9UW;EgC+UX,OhCxWM;EgCyWN,YhC/QY;;AgCiRZ;EANF;IAOI,WhCpVO;;;AgCwVX;EACE,WhCzVS;EgC0VT,OhChXO;EgCiXP;EACA;;AAEA;EANF;IAOI,WhChWO;IgCiWP;;;;ACrYR;EACE;EACA,YjCeQ;EiCdR;;AAEA;EALF;IAMI;;;;AAIJ;EACE,WjCsEoB;EiCrEpB;;;AAIF;EACE,ejCiDY;;AiC/CZ;EAHF;IAII,ejC6CU;;;AiC1CZ;EACE,WjCmBY;EiClBZ,ajC0Be;EiCzBf,OjCbQ;EiCcR,ejCmCS;EiClCT;EACA;EACA;;AAEA;EATF;IAUI,WjCSU;;;AiCLd;EACE;EACA,OjCzBQ;EiC0BR,ajCgBiB;;AiCdjB;EALF;IAMI,WjCNS;;;;AiCYf;EACE,YjClCM;EiCmCN,ejCuBiB;EiCtBjB,YjCzBU;EiC0BV;EACA,ejCUW;;;AiCNb;EACE;EACA,YjC5CM;EiC6CN,ejCaiB;EiCZjB;;AAGA;EACE;EACA;EACA,KjCNS;EiCOT;EACA,YjCpDO;EiCqDP;EACA,WjCnCW;EiCoCX,ajCvBmB;EiCwBnB,OjC7DQ;;AiC+DR;EAXF;IAYI;IACA;IACA,WjC3CS;;EiC6CT;IACE;;;AAIJ;EArBF;IAsBI;;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAKJ;EACE;EACA;EACA,KjCrDS;EiCsDT,SjCrDS;EiCsDT;EACA,YjCfc;EiCgBd;;AAEA;EATF;IAUI;IACA,SjC7DO;;EiC+DP;IACE;;;AAIJ;EAlBF;IAmBI;IACA,KjCvEO;IiCwEP,SjCvEO;;;AiC0ET;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA,WjC/GS;EiCgHT,OjCvIM;EiCwIN,ajCrGe;;AiCuGf;EARF;IASI;;;AAIJ;EACE;EACA;EACA,WjC1HW;EiC2HX,OjCpJM;EiCqJN,ajCjHe;;AiCmHf;EAPF;IAQI,WjChIO;;;AiCmIT;EACE;EACA;EACA;EACA;EACA,KjChHK;EiCiHL,YjCvEU;;AiCyEV;EACE,OjC/KK;;AiCmLT;EACE;EACA;EACA,ajC3HK;EiC4HL;;AAEA;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA,WjCjKS;EiCkKT,OjCzLM;;AiC2LN;EAPF;IAQI;;;AAIJ;EACE;EACA;EACA;;AAEA;EALF;IAMI;;;AAMJ;EACE;EACA;EACA;EACA,WjCzLS;EiC0LT,OjChNO;;AiCkNP;EAPF;IAQI;IACA,WjC/LO;IiCgMP,ajCxKK;;;AiC8KX;EACE;IACE;IACA,OjC/NM;IiCgON,cjClLO;;;;AiC6Lb;EACE;EACA;EACA;EACA,KjC/LW;EiCgMX,YjC9LW;;AiCgMX;EAPF;IAQI;IACA;;;AAIF;AAAA;EAEE;EACA;EACA,KjC5MS;;AiC8MT;EANF;AAAA;IAOI;IACA;;;AAIJ;EAzBF;IA0BI;IACA;IACA,KjCvNS;;EiCyNT;AAAA;IAEE;;;;AAQN;EACE;EACA,YjClRQ;EiCmRR;;AAEA;EALF;IAMI;;;;AAIJ;EACE;EACA;;;AAIF;EACE,YjClSM;EiCmSN,ejCzOiB;EiC0OjB,YjCzRU;EiC0RV;EACA,ejCtPW;;AiCyPX;EACE;EACA;;AAEA;EAJF;IAKI;;;AAKF;EACE,WjC1RU;EiC2RV,ajClRa;EiCmRb,OjCzTM;EiC0TN,ajChRc;EiCiRd,ejCzQO;;AiC2QP;EAPF;IAQI,WjClSO;;;AiCsSX;EACE;EACA;EACA,KjCnRO;EiCoRP;EACA,WjC/SS;EiCgTT,OjCvUM;;AiCyUN;EARF;IASI,WjCpTO;IiCqTP,KjC3RK;;;AiC8RP;EACE;EACA;EACA,KjCnSK;;AiCqSL;EACE,OjChWK;;AiCmWP;EACE,OjCzVE;EiC0VF,ajCtTW;;AiC6TnB;EACE;EACA,YjC/VM;EiCgWN;;AAEA;EALF;IAMI;;;AAGF;EACE;EACA;EACA,KjC7TO;;AiC+TP;EACE;EACA;EACA,KjClUK;;AiCoUL;EACE,OjCrXE;EiCsXF;EACA,WjC/VK;EiCgWL,YjC9RQ;EiC+RR;EACA;EACA,KjC5UG;;AiC8UH;EATF;IAUI,WjCvWG;;;AiC0WL;EACE,OjC7YG;;AiC+YH;EACE;;AAIJ;EACE,OjCrZG;EiCsZH,YjCjTM;;AiCyThB;EACE;EACA;;AAEA;EAJF;IAKI;;;AAGF;EACE,WjCnYW;EiCoYX,OjC7ZM;EiC8ZN,ajClXc;EiCmXd;;AAEA;EANF;IAOI,WjC1YO;;;;AiCiZf;EACE,YjCvaM;EiCwaN,ejC9WiB;EiC+WjB,YjC9ZU;EiC+ZV;EACA,ejC3XW;EiC4XX;;AAEA;EACE;EACA;EACA;;AAEA;EALF;IAMI,SjCrYO;;;AiCwYT;EACE;EACA;EACA,KjC7YO;EiC8YP,WjCnaS;EiCoaT,ajC1ZiB;EiC2ZjB,OjChcM;EiCicN,ejCjZO;;AiCmZP;EACE,OjC1cO;;AiC8cX;EACE,WjCjbS;EiCkbT,OjCzcM;;AiC2cN;EAJF;IAKI,WjCtbO;;;AiC2bb;EACE,SjC/ZU;EiCgaV,WjC3ba;EiC4bb,OjCrdQ;EiCsdR,ajC1agB;EiC2ahB;;AAEA;EAPF;IAQI,SjCxaO;IiCyaP,WjCncS;;;;AiCycf;EACE;EACA;EACA,KjCnbW;EiCobX,ejChbY;EiCibZ;;AAEA;EAPF;IAQI;IACA;;;AAGF;EACE;EACA,ejCnbe;EiCobf,WjCvda;EiCwdb,ajC7ciB;EiC8cjB;EACA,YjCzZc;EiC0Zd;EACA;EACA;EACA,KjCvcS;EiCwcT;EACA;;AAEA;EAdF;IAeI;IACA,WjCreS;;;AiCweX;EACE,YjC9fE;EiC+fF,OjClgBM;EiCmgBN;;AAEA;EACE,YjClgBE;EiCmgBF,cjClhBO;;AiCshBX;EACE,OjCzgBE;;AiC2gBF;EACE;EACA,YjClgBI;;AiCsgBR;EACE,YjC5hBU;EiC6hBV,OjCnhBE;;AiCqhBF;EACE;EACA,YjC5gBI;;AiCghBR;EACE;;;AAQN;EACE;EACA,YjCriBQ;EiCsiBR;;AAEA;EALF;IAMI;;;;AAIJ;EACE;EACA;;;AAGF;EACE,YjCpjBM;EiCqjBN,ejC3fiB;EiC4fjB,YjC3iBU;EiC4iBV,SjCrgBY;EiCsgBZ,ejCxgBW;;AiC0gBX;EAPF;IAQI;;;AAGF;EACE,ejC9gBU;;AiCghBV;EACE;;AAGF;EACE;EACA,WjCjjBW;EiCkjBX,ajCtiBiB;EiCuiBjB,OjC5kBM;EiC6kBN,ejC5hBO;;AiC8hBP;EAPF;IAQI,WjCxjBO;;;AiC2jBT;EACE;EACA,OjC5lBQ;EiC6lBR,ajCviBK;;AiC2iBT;EACE;EACA,SjC3iBO;EiC4iBP;EACA,ejCliBa;EiCmiBb,WjCtkBW;EiCukBX,YjCtgBY;;AiCwgBZ;EARF;IASI,WjC3kBO;IiC4kBP;;;AAGF;EACE;EACA,cjCpnBO;EiCqnBP;;AAGF;EACE,OjC5mBK;;AiCgnBT;EACE;EACA;EACA,SjCpkBO;EiCqkBP;EACA,ejC3jBa;EiC4jBb,WjC/lBW;EiCgmBX,ajCtmBgB;EiCumBhB;EACA,YjCjiBY;;AiCmiBZ;EAXF;IAYI,WjCtmBO;IiCumBP;IACA;;;AAGF;EACE;EACA,cjChpBO;EiCipBP;;AAGF;EACE,OjCxoBK;;;AiCipBb;EACE;EACA;EACA,KjCrmBW;EiCsmBX,YjCpmBW;;AiCsmBX;EANF;IAOI;IACA;;;;ACtqBJ;EACE;EACA;;AhCAE;EgCFJ;IAKI;;;;AAIJ;EAGE;;AAEA;EALF;IAMI;;;;AAKJ;EACE,WlCoBc;EkCnBd,alC2BiB;EkC1BjB,OlCZU;EkCaV;EACA,elCuCY;;AE9DV;EgCkBJ;IAQI,WlCYY;IkCXZ,elCiCS;;;;AkC5Bb;EACE;EACA;EACA;EACA;EACA;EACA,elC+BiB;EkC9BjB,elCqBW;;AkCnBX;EACE,WlCNW;EkCOX,alCCkB;EkCAlB;EACA;;AAGF;EACE;EACA,OlCtCI;EkCuCJ;EACA,elCqBiB;EkCpBjB,WlCpBW;EkCqBX,alCTiB;EkCUjB;EACA;EACA,KlCDS;;AkCGT;EACE;EACA,OlC5DU;EkC6DV,alCfa;;AkCoBjB;EACE;EACA;EACA;EACA;EACA,elCZS;;AkCcT;EACE;EACA,alC7Ba;EkC8Bb;EACA;;AAGF;EACE;;AhClFF;EgCgCJ;IAuDI;;EAEA;IACE,WlCvDS;;EkC0DX;I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BA;EgCqgBJ;IAeI;IACA,YlCxdU;IkCydV,alC1dS;;;;AkC+db;EACE,YlCneW;EkCoeX;EACA,elC1diB;EkC2djB,WlC9fa;;AkCggBb;EACE;EACA,OlChiBW;;AkCmiBb;EACE;EACA,OlCtiBY;;;AkC2iBhB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA,kBlCrjBI;EkCsjBJ;EACA;;;AAIJ;EACE;IACE;;;AhCzkBA;EgC+kBF;IACE;;EAGF;IACE;;EAEA;AAAA;IAEE;IACA;IACA;IACA,WlC1jBS;IkC2jBT;;EAIJ;IACE;;EAEA;IACE;;;AAMN;EACE,YlC/lBM;EkCgmBN;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YlCrlBgB;EkCslBhB;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKJ;EACE;EACA;;;AAIF;EACE;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OlCxtBU;EkCytBV;EACA,YlCjoBgB;EkCkoBhB;;AAEA;EACE;EACA;;AAGF;EACE,OlC/uBW;;AkCkvBb;EACE,OlCnvBW;;AkCqvBX;EACE;;;AAMN;EACE,YlCjsBW;EkCksBX,YlCtvBQ;;;AkCyvBV;EACE;EACA;EACA,SlCvsBW;;AkCysBX;EACE;;AAGF;EACE,YlC1vBU;EkC2vBV,elCtsBe;;AkCysBjB;EACE,YlCnwBS;EkCowBT,elC3sBe;;AkC6sBf;EACE,YlCxwBM;;AkC6wBV;EACE,WlCvvBW;EkCwvBX;EACA,OlChxBQ;;AkCkxBR;EACE,OlCpxBM;EkCqxBN,YlCnuBO;EkCouBP,elCruBO;EkCsuBP,alClvBiB;;AkCqvBnB;EACE,elC1uBO;;AkC6uBT;EACE,alC7uBO;EkC8uBP,elC/uBO;;AkCkvBT;EACE;EACA;EACA,elCrvBO;;AkCuvBP;EACE;EACA,SlC1vBK;EkC2vBL;;AAGF;EACE,YlC1yBG;EkC2yBH,alC3wBe;;;AE9CnB;EgCi0BF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE,WlCnzBW;;EkCqzBX;IACE,WlCrzBW;;EkCyzBf;IACE;IACA,SlCnyBS;;;AmC9Db;EACE,enCkEY;EmCjEZ;;AjCEE;EiCJJ;IAKI,enC6DU;;;AmC1DZ;EACE;EACA;;AAGF;EACE,WnC6BY;EmC5BZ,anCoCe;EmCnCf,OnCHQ;EmCIR,enC6CS;EmC5CT;EACA;EACA;EACA,KnCyCS;;AE1DT;EiCSF;IAWI,WnCkBU;ImCjBV;IACA,KnCmCO;;;AmChCT;EACE,OnC5BS;EmC6BT,WnCYU;;AEvCZ;EiCyBA;IAKI,WnCQQ;;;AmCHd;EACE;EACA,OnC3BQ;EmC4BR,anCciB;;AEpDjB;EiCmCF;IAMI,WnCPW;;;AmCUb;EACE,OnC/CS;EmCgDT;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAOR;EACE;EACA;;AjCjEE;EiC+DJ;IAKI;;;;AAKJ;EACE,SnCXY;EmCYZ,YnC/DM;EmCgEN,enCLiB;EmCMjB,YnCrDU;EmCsDV;;AjC9EE;EiCyEJ;IAQI;IACA,enCbe;;;AmCiBjB;EACE,enC1BU;;AE7DV;EiCsFF;IAII,enC9BO;;;AmCiCT;EACE;EACA;EACA,KnCvCO;EmCwCP,WnC/DW;EmCgEX,anCpDiB;EmCqDjB,OnC1FM;EmC2FN,enC1CO;;AmC4CP;EACE,OnCzGO;EmC0GP,WnCrEO;;AmCwET;EACE,OnC1GQ;EmC2GR;;AAKJ;EACE;EACA;EACA;;AjCrHF;EiCkHA;IAMI;;;AAMN;EACE;EACA;EACA,KnCzES;EmC0ET,YnCzES;EmC0ET,WnClGW;EmCmGX,OnC1HQ;EmC2HR,anCjFiB;;AmCmFjB;EACE,OnC1IS;EmC2IT;EACA;;AAKJ;EACE;EACA;EACA,KnC1FS;EmC2FT,YnC1FS;EmC2FT,WnCnHW;EmCoHX,OnCnJY;EmCoJZ,anClGiB;;AmCoGjB;EACE;EACA;;AAKJ;EACE,YnCtGS;;AmCwGT;EACE;EACA;EACA,KnC7GO;EmC8GP;EACA,WnCvIS;EmCwIT,OnC7JO;EmC8JP,anCrHe;;AmCuHf;EACE,OnCzKO;EmC0KP;EACA;;;AAWJ;EACE,OnCjLM;EmCkLN;EACA,cnC9LS;EmC+LT,anChJe;;AmCoJnB;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;;AAQJ;EACE,cnCtNW;EmCuNX;EACA;;AAIF;EACE;;;AAKJ;EACE;IACE,enCtKS;;EmCyKX;IACE;IACA;IACA,SnC5KS;;EmC+KX;IACE;;EAIA;AAAA;IAEE;;;ACrPN;EACE;EACA;EACA;EACA,kBpCYQ;EoCXR;;AAEA;EAPF;IAQI;;;;AAKJ;EACE;EACA;EACA;EACA,epC+CY;;AoC7CZ;EANF;IAOI;IACA;IACA,KpCwCS;;;;AoCnCX;EACE,WpCQW;EoCPX,OpChBQ;EoCiBR,apCiBkB;EoChBlB,epC4BS;;AoCzBX;EACE,WpCMY;EoCLZ,apCce;EoCbf,OpCzBQ;;;AoC6BZ;EACE;EACA,KpCkBW;;;AoCfb;EACE;EACA,WpCVa;EoCWb,YpCaW;;;AoCTb;EACE;EACA;EACA;EACA,epCKW;EoCJX;;AAEA;EAPF;IAQI;IACA;IACA,KpCFS;;;;AoCMb;EACE,WpC/Be;EoCgCf,OpCxDU;;AoC0DV;EACE,OpCvEW;EoCwEX,apCxBmB;EoCyBnB,WpCnCW;;;AoCwCf;EACE,YpCjEM;EoCkEN,epCRiB;EoCSjB,YpCzDU;EoC0DV;EACA,epCpBY;;;AoCuBd;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA,KpCpCW;EoCqCX;EACA,YpClFS;EoCmFT;EACA,WpCjEa;EoCkEb,apCrDqB;EoCsDrB,OpC3FU;;AoC6FV;EAXF;IAYI;IACA,WpCxEW;IoCyEX;;;AAGF;EAjBF;IAkBI;;;;AA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AAGF;EACE;;AAIJ;EACE;;AAEA;EACE;;AAIJ;EACE,YrClRU;EqCmRV;;AAGF;EACE;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;;AC5WN;EACE;EACA,YtCcQ;EsCbR;;AAEA;EALF;IAMI;;;;AAIJ;EACE,WtCqEoB;EsCpEpB;;;AAIF;EACE,etCgDY;;AsC9CZ;EAHF;IAII,etC4CU;;;AsCzCZ;EACE,WtCkBY;EsCjBZ,atCyBe;EsCxBf,OtCdQ;EsCeR,etCkCS;EsCjCT;EACA;EACA;;AAEA;EATF;IAUI,WtCQU;;;AsCJd;EACE,WtCDa;EsCEb,OtC1BQ;EsC2BR,atCeiB;;AsCbjB;EALF;IAMI,WtCPS;;;;AsCaf;EACE,YtCnCM;EsCoCN,etCsBiB;EsCrBjB,YtC1BU;EsC2BV;;;AAIF;EACE;EACA;EACA,YtC5CQ;EsC6CR,StCFW;EsCGX;;AAEA;EAPF;IAQI,StCNS;;;AsCSX;EACE;EACA;EACA;EACA;EACA,KtCbS;EsCcT;EACA,WtCtCa;EsCuCb,atC3BmB;EsC4BnB,OtChEQ;EsCiER;EACA;EACA,etCRe;EsCSf,YtCqBc;EsCpBd;;AAEA;EAhBF;IAiBI;IACA,WtClDS;IsCmDT,KtC5BO;;;AsC+BT;EACE,WtCrDS;EsCsDT,YtCUY;;AsCRZ;EAJF;IAKI,WtC1DS;;;AsC8Db;EACE,OtCnGS;EsCoGT;;AAEA;EACE;;AAIJ;EACE,OtC9FE;EsC+FF,YtC7GS;EsC8GT,YtCtFM;;AsCwFN;EACE,OtCnGA;;;AsC0GR;EACE;EACA,YtC1GS;EsC2GT;;AAEA;EALF;IAMI;;;AAGF;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA,KtCjFO;EsCkFP;EACA,YtChIE;EsCiIF;EACA,etCzEa;EsC0Eb,WtC9GS;EsC+GT,atCnGe;EsCoGf,OtCxIM;EsCyIN,YtC/CY;EsCgDZ;;AAEA;EAdF;IAeI;IACA,WtCvHO;;;AsC2HP;EACE,OtC9JK;;AsCiKP;EACE;EACA,WtCjIK;EsCkIL,OtCxJE;EsCyJF,YtChEQ;;AsCoEZ;EACE,atC1He;EsC2Hf,OtC3KO;;AsC8KT;EACE,ctC/KO;EsCgLP;;AAGF;EACE,ctCpLO;;AsCsLP;EACE;;AAKN;EACE;EACA;EACA;EACA;EACA,YtCnLE;EsCoLF;EACA,etC5Ha;EsC6Hb,YtC1KM;EsC2KN;EACA;EACA,StC7Ga;EsC8Gb;EACA,StC/IO;EsCgJP;;AAEA;EACE;;AAGF;EACE;EACA,WtC/KO;EsCgLP,OtCxMI;EsCyMJ,etC9IW;EsC+IX;EACA,YtCjHU;;AsCmHV;EARF;IASI;IACA,WtCxLK;;;AsC2LP;EACE,YtC9MC;EsC+MD,OtC/NK;;AsCkOP;EACE,YtCnOK;EsCoOL,OtCtNF;EsCuNE,atCrLa;;;AsC6LvB;EACE;EACA;;AAEA;EAJF;IAKI;IACA;;;AAGF;EACE,WtCnNa;EsCoNb,OtC7OQ;EsC8OR,atClMgB;EsCmMhB;EACA;;AAEA;EAPF;IAQI,WtC3NS;;;AsC+NX;EACE,etCvMO;;AsCyMP;EACE;;AAIJ;EACE,YtC7MO;EsC8MP,etChNO;EsCiNP,atC7NiB;EsC8NjB,OtCnQM;EsCoQN,atC1Nc;;AsC4Nd;EACE;;AAIJ;EACE,WtC/OU;EsCgPV,atCvOa;EsCwOb,gBtC7NO;EsC8NP;;AAEA;EANF;IAOI,WtCtPO;;;AsC0PX;EACE,WtC3PS;;AsC6PT;EAHF;IAII,WtC/PO;;;AsCmQX;EACE,WtCpQS;;AsCsQT;EAHF;IAII,WtCzQS;;;AsC6Qb;EACE,atCjQa;EsCkQb,OtCxSM;;AsC2SR;EACE;EACA,OtC5SM;;AsC+SR;EACE,OtC5TS;EsC6TT;EACA,YtCzNY;;AsC2NZ;EACE,OtChUS;;AsCoUb;EACE;EACA,ctCxQQ;;AsC0QR;EAJF;IAKI,ctC7QK;;;AsCiRT;EACE;;AAGF;EACE;;AAGF;EACE,etC5RO;EsC6RP,atClSe;;AsCoSf;EACE;;AAIJ;EACE;EACA,ctCpSO;EsCqSP;EACA,OtCvVM;EsCwVN;EACA,YtCtVI;EsCuVJ;EACA;;AAEA;EAVF;IAWI;;;AAIJ;EACE,YtChWI;EsCiWJ;EACA,etC3Sa;EsC4Sb,atCnVa;EsCoVb;EACA,OtCpXS;;AsCuXX;EACE,YtCzWI;EsC0WJ;EACA,etCnTa;EsCoTb,StC/TO;EsCgUP;EACA;;AAEA;EARF;IASI,StCrUK;;;AsCwUP;EACE;EACA;EACA,OtC3XI;;AsC+XR;EACE;EACA;EACA;EACA;EACA,etCxUa;EsCyUb;EACA,WtC9WS;;AsCgXT;EATF;IAUI,WtClXO;;;AsCqXT;EACE,YtCxYG;EsCyYH;EACA;EACA,atC3We;EsC4Wf,OtCjZI;EsCkZJ;;AAEA;EARF;IASI;;;AAIJ;EACE;EACA;EACA,OtC5ZI;;AsC8ZJ;EALF;IAMI;;;AAKF;EACE;;AAGF;EACE,YtCraA;;AsC0aN;EACE;EACA;EACA;;AAIF;EACE,YtClYQ;EsCmYR,atCrYO;EsCsYP;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA,OtC/cS;EsCgdT,atC/Za;;;AsCsajB;EACE;;AAGF;EACE,YtC7cM;EsC8cN,etCvZe;;AsC0ZjB;EACE,YtCjeW;EsCkeX,etC5Ze;;AsC8Zf;EACE,YtCpeW;;;AuCHjB;EACE,WvCgFoB;EuC/EpB;EACA;;ArCCE;EqCJJ;IAMI;;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;ErChBE;EACA;EACA;;;AqCkBF;ErCdE;EACA;EACA;;;AqCgBF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,KvC1BW;;;AuC6Bb;EACE,KvC7BW;;;AuCgCb;EACE,KvChCW;;;AuCmCb;EACE,KvCnCW;;;AuCsCb;EACE,KvCtCW;;;AuCsDX;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAgBF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AA3BF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,YvC/Pa;;;AuCkQf;EACE,YvClQe;;;AuCqQjB;EACE,YvCzPM;;;AuC4PR;EACE,YvC5PQ;;;AuC+PV;EACE,YvC/PS;;;AuCwQX;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,cvCjTa;;;AuCqTf;EACE;;;AAGF;EACE,evCpPiB;;;AuCuPnB;EACE,evCvPiB;;;AuC0PnB;EACE,evC1PiB;;;AuC6PnB;EACE,evC7PiB;;;AuCgQnB;EACE,evC/PmB;;;AuCkQrB;EACE,evClQqB;;;AuCsQvB;EACE;;;AAGF;EACE,YvC/TU;;;AuCkUZ;EACE,YvClUU;;;AuCqUZ;EACE,YvCrUU;;;AuCwUZ;EACE,YvCxUU;;;AuC4UZ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ArCnZE;EqCwZF;IACE;;;ArCvZA;EqC4ZF;IACE;;;AAKF;EADF;IAEI;;;;ArCraA;EqCyaJ;IAEI;;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE,YvChXgB;;;AuCmXlB;EACE,YvCnXgB;;;AuCsXlB;EACE,YvCtXgB;;;AuCyXlB;EACE;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"main.css"} \ No newline at end of file diff --git a/src/main/resources/static/css/main.min.css b/src/main/resources/static/css/main.min.css index 9497a3a..e523361 100644 --- a/src/main/resources/static/css/main.min.css +++ b/src/main/resources/static/css/main.min.css @@ -1 +1 @@ -*{margin:0;padding:0;box-sizing:border-box}html{font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}body{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;line-height:1.6;color:#1a1a2e;background-color:#fff;overflow-x:hidden}ul,ol{list-style:none}a{text-decoration:none;color:inherit;transition:all .3s ease}img{max-width:100%;height:auto;display:block}button{font-family:inherit;font-size:inherit;line-height:inherit;cursor:pointer;background:rgba(0,0,0,0);border:none;padding:0}input,textarea,select{font-family:inherit;font-size:inherit;line-height:inherit;border:none;outline:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.2}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}::selection{background-color:rgba(75,155,255,.2);color:#1a1a2e}::-moz-selection{background-color:rgba(75,155,255,.2);color:#1a1a2e}body{font-size:16px;font-weight:400;color:#1a1a2e}h1,.h1{font-size:56px;font-weight:800;margin-bottom:24px}@media(max-width: 768px){h1,.h1{font-size:40px}}@media(max-width: 480px){h1,.h1{font-size:32px}}h2,.h2{font-size:48px;font-weight:700;margin-bottom:16px}@media(max-width: 768px){h2,.h2{font-size:32px}}@media(max-width: 480px){h2,.h2{font-size:24px}}h3,.h3{font-size:40px;font-weight:700;margin-bottom:16px}@media(max-width: 768px){h3,.h3{font-size:24px}}h4,.h4{font-size:32px;font-weight:600;margin-bottom:8px}h5,.h5{font-size:24px;font-weight:600;margin-bottom:8px}h6,.h6{font-size:20px;font-weight:600;margin-bottom:8px}p{margin-bottom:16px;line-height:1.6}p:last-child{margin-bottom:0}.text-gradient{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.text-gradient-accent{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.text-gradient-warm{background:linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.text-primary{color:#4b9bff}.text-secondary{color:#2e7ff7}.text-dark{color:#1a1a2e}.text-gray{color:#64748b}.text-light{color:#94a3b8}.text-white{color:#fff}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-regular{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.text-xs{font-size:12px}.text-sm{font-size:14px}.text-base{font-size:16px}.text-lg{font-size:20px}.text-xl{font-size:24px}.lead{font-size:20px;font-weight:400;line-height:1.8;color:#64748b}.caption{font-size:14px;color:#64748b}.code{font-family:"Fira Code","Courier New",monospace;font-size:14px;background:#f8fafc;padding:2px 6px;border-radius:6px}a{color:#4b9bff}a:hover{color:#2e7ff7}blockquote{padding:16px;margin:16px 0;border-left:4px solid #4b9bff;background:#f8fafc;font-style:italic}blockquote p{margin-bottom:0}hr{border:none;border-top:1px solid #e2e8f0;margin:32px 0}@keyframes float{0%,100%{transform:translateY(0) rotate(0deg)}50%{transform:translateY(-30px) rotate(10deg)}}@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes slideInDown{from{opacity:0;transform:translateY(-30px)}to{opacity:1;transform:translateY(0)}}@keyframes slideInUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@keyframes slideInLeft{from{opacity:0;transform:translateX(-30px)}to{opacity:1;transform:translateX(0)}}@keyframes slideInRight{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeInScale{from{opacity:0;transform:scale(0.9)}to{opacity:1;transform:scale(1)}}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.05)}100%{transform:scale(1)}}@keyframes shimmer{0%{transform:translateX(-100%) rotate(45deg)}100%{transform:translateX(100%) rotate(45deg)}}@keyframes wave{0%{transform:rotate(0deg)}10%{transform:rotate(14deg)}20%{transform:rotate(-8deg)}30%{transform:rotate(14deg)}40%{transform:rotate(-4deg)}50%{transform:rotate(10deg)}60%{transform:rotate(0deg)}100%{transform:rotate(0deg)}}@keyframes popIn{0%{opacity:0;transform:scale(0.5)}80%{transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}@keyframes popupFadeIn{from{opacity:0;transform:scale(0.95)}to{opacity:1;transform:scale(1)}}@keyframes ripple{0%{transform:scale(0);opacity:1}100%{transform:scale(4);opacity:0}}@keyframes gradientShift{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}.animate-float{animation:float 20s ease-in-out infinite}.animate-bounce{animation:bounce 2s infinite}.animate-spin{animation:spin 1s linear infinite}.animate-pulse{animation:pulse 2s ease-in-out infinite}.animate-fade-in{animation:fadeIn .6s ease-out}.animate-slide-up{animation:slideInUp .8s ease-out}.animate-slide-down{animation:slideInDown .6s ease-out}.animate-pop{animation:popIn .5s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.delay-1{animation-delay:.1s}.delay-2{animation-delay:.2s}.delay-3{animation-delay:.3s}.delay-4{animation-delay:.4s}.delay-5{animation-delay:.5s}.duration-fast{animation-duration:.3s}.duration-normal{animation-duration:.6s}.duration-slow{animation-duration:1s}.duration-slower{animation-duration:2s}.hover-grow{transition:transform .3s ease}.hover-grow:hover{transform:scale(1.05)}.hover-lift{transition:transform .3s ease,box-shadow .3s ease}.hover-lift:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.hover-rotate{transition:transform .3s ease}.hover-rotate:hover{transform:rotate(5deg)}.hover-shine{position:relative;overflow:hidden}.hover-shine::before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.2) 50%, transparent 70%);transform:rotate(45deg);transition:transform .6s ease;transform:translateX(-200%)}.hover-shine:hover::before{transform:translateX(200%) rotate(45deg)}:root{--primary-blue: #4B9BFF;--secondary-blue: #2E7FF7;--accent-cyan: #00D4FF;--accent-yellow: #FFD93D;--accent-orange: #FF6B6B;--accent-green: #6BCF7F;--accent-purple: #A78BFA;--text-dark: #1A1A2E;--text-gray: #64748B;--text-light: #94A3B8;--white: #FFFFFF;--gray-bg: #F8FAFC;--light-bg: #EFF6FF;--border-gray: #E2E8F0;--gradient-primary: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);--gradient-accent: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);--gradient-warm: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%);--shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05);--shadow-md: 0 4px 12px rgba(75, 155, 255, 0.1);--shadow-lg: 0 8px 24px rgba(75, 155, 255, 0.15);--shadow-xl: 0 16px 40px rgba(75, 155, 255, 0.2)}.blind{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.global-header{position:fixed;top:0;left:0;right:0;background:hsla(0,0%,100%,.95);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:var(--shadow-sm);z-index:1000;height:80px;transition:all .3s ease}.header-content{display:flex;align-items:center;justify-content:space-between;height:80px;max-width:1280px;margin:0 auto;padding:0 20px}.header-left{display:flex;align-items:center}.header-left .logo{height:45px;width:auto}.logo-wrapper{display:flex;align-items:center;gap:12px}.logo{display:flex;align-items:center;gap:12px;height:45px;z-index:10}.logo a{display:flex;align-items:center;gap:12px;height:100%;text-decoration:none}.logo img{height:45px;width:auto}.logo-text{font-size:16px;font-weight:700;color:var(--primary-blue);padding:4px 12px;background:var(--light-bg);border-radius:20px;text-decoration:none;display:inline-block;transition:all .3s ease}.logo-text:hover{background:var(--primary-blue);color:var(--white);transform:translateY(-1px);box-shadow:var(--shadow-md)}.logo-text:visited{color:var(--primary-blue)}.logo-link,.mobile-logo-link,.drawer-logo-link{display:inline-block;text-decoration:none;transition:transform .3s ease}.logo-link:hover,.mobile-logo-link:hover,.drawer-logo-link:hover{transform:scale(1.05)}.logo-link img,.mobile-logo-link img,.drawer-logo-link img{display:block}.header-right{display:flex;align-items:center;gap:16px}.search-btn{width:40px;height:40px;background:var(--gray-bg);border:none;border-radius:50%;cursor:pointer;font-size:16px;color:var(--text-gray);transition:all .3s ease}.search-btn:hover{background:var(--light-bg);color:var(--primary-blue);transform:scale(1.1)}.desktop-header{display:flex;align-items:center;justify-content:space-between;width:100%}@media(max-width: 768px){.desktop-header{display:none}}.mobile-header{display:none;align-items:center;justify-content:space-between;width:100%}@media(max-width: 768px){.mobile-header{display:flex}}.mobile-left .mobile-logo{height:32px;width:auto}.mobile-center{flex:1;text-align:center}.mobile-center .mobile-title{font-size:18px;font-weight:700;color:var(--text-dark);margin:0}.mobile-right .mobile-menu-btn{width:40px;height:40px;background:rgba(0,0,0,0);border:none;cursor:pointer;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:8px;border-radius:8px;transition:background-color .3s ease}.mobile-right .mobile-menu-btn:hover{background:var(--gray-bg)}.mobile-right .mobile-menu-btn .hamburger-line{width:24px;height:2px;background:var(--text-dark);transition:all .3s ease;border-radius:1px}.mobile-right .mobile-menu-btn.active .hamburger-line:nth-child(1){transform:rotate(45deg) translateY(6px)}.mobile-right .mobile-menu-btn.active .hamburger-line:nth-child(2){opacity:0}.mobile-right .mobile-menu-btn.active .hamburger-line:nth-child(3){transform:rotate(-45deg) translateY(-6px)}.mobile-drawer{position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999;visibility:hidden;opacity:0;transition:all .3s ease}.mobile-drawer.active{visibility:visible;opacity:1}.mobile-drawer.active .drawer-content{transform:translateY(0)}.mobile-drawer .drawer-overlay{display:none}.mobile-drawer .drawer-content{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;background:var(--white);transform:translateY(100%);transition:transform .3s ease;display:flex;flex-direction:column}.mobile-drawer .drawer-header{display:flex;align-items:center;justify-content:space-between;padding:20px;border-bottom:2px solid var(--border-gray);background:var(--white);box-shadow:var(--shadow-sm);min-height:60px}.mobile-drawer .drawer-header .drawer-logo{display:flex;align-items:center;gap:12px}.mobile-drawer .drawer-header .drawer-logo .logo{height:32px;width:auto}.mobile-drawer .drawer-header .drawer-logo .logo-text{font-size:16px;font-weight:700;color:var(--primary-blue)}.mobile-drawer .drawer-header .drawer-close{width:40px;height:40px;background:rgba(0,0,0,0);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:8px;font-size:18px;color:var(--text-gray);transition:all .3s ease}.mobile-drawer .drawer-header .drawer-close:hover{background:var(--white);color:var(--text-dark)}.mobile-drawer .drawer-nav{flex:1;padding:0;overflow-y:auto;background:var(--white)}.mobile-drawer .drawer-nav .drawer-menu{list-style:none;margin:0;padding:20px 0}.mobile-drawer .drawer-nav .drawer-menu li{margin-bottom:8px}.mobile-drawer .drawer-nav .drawer-menu li .drawer-link{display:block;padding:16px 24px;margin:0 20px;color:var(--text-dark);text-decoration:none;font-size:18px;font-weight:500;border-radius:12px;transition:all .3s ease}.mobile-drawer .drawer-nav .drawer-menu li .drawer-link:hover,.mobile-drawer .drawer-nav .drawer-menu li .drawer-link:active{background:var(--light-bg);color:var(--primary-blue);transform:translateX(4px);box-shadow:var(--shadow-sm)}.mobile-drawer .drawer-actions{padding:24px;border-top:2px solid var(--border-gray);background:var(--white);box-shadow:0 -4px 12px rgba(0,0,0,.05)}.mobile-drawer .drawer-actions .drawer-login-btn{display:block;text-align:center;padding:14px 20px;color:var(--text-dark);text-decoration:none;border:2px solid var(--primary-blue);border-radius:12px;font-weight:600;font-size:16px;margin-bottom:12px;transition:all .3s ease}.mobile-drawer .drawer-actions .drawer-login-btn:hover{background:var(--light-bg);color:var(--primary-blue)}.mobile-drawer .drawer-actions .drawer-signup-btn{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 20px;background:var(--gradient-primary);color:var(--white);text-decoration:none;border-radius:12px;font-weight:600;font-size:16px;margin-bottom:12px;transition:all .3s ease;box-shadow:var(--shadow-md)}.mobile-drawer .drawer-actions .drawer-signup-btn:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}.mobile-drawer .drawer-actions .drawer-search-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px 20px;background:var(--gray-bg);color:var(--text-dark);border:none;border-radius:12px;font-weight:500;font-size:16px;cursor:pointer;transition:all .3s ease}.mobile-drawer .drawer-actions .drawer-search-btn:hover{background:var(--light-bg);color:var(--primary-blue)}.btn-mobilemenu{position:absolute;right:16px;top:50%;transform:translateY(-50%);width:40px;height:40px;background:rgba(0,0,0,0);border:none;cursor:pointer;padding:8px;z-index:501}.btn-mobilemenu span{display:block;width:24px;height:2px;background:#1a1a2e;position:relative;transition:all all .15s ease;text-indent:-9999px}.btn-mobilemenu span::before,.btn-mobilemenu span::after{content:"";position:absolute;left:0;width:24px;height:2px;background:#1a1a2e;transition:all all .15s ease}.btn-mobilemenu span::before{top:-8px}.btn-mobilemenu span::after{top:8px}.btn-mobilemenu.on span{background:rgba(0,0,0,0)}.btn-mobilemenu.on span::before{top:0;transform:rotate(45deg)}.btn-mobilemenu.on span::after{top:0;transform:rotate(-45deg)}.main-nav.m-nav{position:fixed;top:0;left:0;right:0;bottom:0;background:#fff;z-index:500;right:-100%;transition:none;overflow-y:auto;display:flex;flex-direction:column}.main-nav.m-nav .nav-header{padding:24px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.main-nav.m-nav .nav-list{list-style:none;margin:0;padding:0;flex-grow:1}.main-nav.m-nav .nav-list .nav-item{border-bottom:1px solid #e2e8f0}.main-nav.m-nav .nav-list .nav-item>a{display:flex;align-items:center;padding:24px;color:#1a1a2e;font-size:18px;font-weight:500;text-decoration:none;position:relative}.main-nav.m-nav .nav-list .nav-item.has-submenu>a::after{content:"";position:absolute;right:24px;top:50%;width:8px;height:8px;border-right:2px solid #64748b;border-bottom:2px solid #64748b;transform:translateY(-50%) rotate(45deg);transition:transform all .15s ease}.main-nav.m-nav .nav-list .nav-item.expanded>a::after{transform:translateY(-25%) rotate(-135deg)}.main-nav.m-nav .nav-list .nav-item .sub-menu{display:none;list-style:none;padding:0;margin:0;background:#f8fafc}.main-nav.m-nav .nav-list .nav-item .sub-menu a{display:block;padding:16px 24px 16px 48px;color:#64748b;font-size:14px;text-decoration:none}.main-nav.m-nav .nav-list .nav-item .sub-menu a:hover{background:#fff;color:#4b9bff}.main-nav.m-nav .nav-list .nav-item.expanded .sub-menu{display:block}.main-nav.m-nav .info_wrap{padding:32px 24px;background:#fff;border-top:1px solid #e2e8f0;margin-top:auto}.nav-menu{display:flex;list-style:none;gap:8px;margin:0;padding:0}.nav-link{display:flex;align-items:center;gap:6px;text-decoration:none;color:var(--text-dark);font-weight:500;font-size:15px;padding:8px 16px;border-radius:8px;transition:all .3s ease}.nav-link:hover{background:var(--light-bg);color:var(--primary-blue);transform:translateY(-2px)}.nav-icon{font-size:18px}.signup-btn{display:flex;align-items:center;gap:8px;text-decoration:none;background:var(--gradient-primary);color:var(--white);padding:12px 24px;border-radius:50px;font-weight:600;transition:all .3s ease;box-shadow:var(--shadow-md)}.signup-btn:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}body{padding-top:80px}@media(max-width: 768px){.global-header{height:60px}.global-header .container .header-content{padding:0 16px;height:60px}body{padding-top:60px}}@media(max-width: 480px){.global-header .header-content{padding:0 12px}.logo .logo-text{display:none}}.global-footer{background:#1a1a2e;color:#fff;padding:80px 0 40px}@media(max-width: 768px){.global-footer{padding:48px 0 32px}}.footer-top{display:grid;grid-template-columns:2fr 3fr;gap:80px;margin-bottom:64px;max-width:1280px;margin-left:auto;margin-right:auto;padding:0 24px}@media(max-width: 1024px){.footer-top{grid-template-columns:1fr;gap:40px}}.footer-brand{max-width:360px}.footer-brand .footer-logo{height:48px;margin-bottom:24px}.footer-brand .footer-desc{font-size:14px;line-height:1.8;color:hsla(0,0%,100%,.7);margin-bottom:24px}.footer-brand .footer-newsletter{margin-bottom:32px}.footer-brand .footer-newsletter h4{font-size:18px;font-weight:600;margin-bottom:16px}.footer-brand .footer-newsletter .newsletter-form{display:flex;gap:8px}.footer-brand .footer-newsletter .newsletter-form input{flex:1;padding:8px 16px;background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);border-radius:8px;color:#fff;font-size:14px}.footer-brand .footer-newsletter .newsletter-form input::placeholder{color:hsla(0,0%,100%,.5)}.footer-brand .footer-newsletter .newsletter-form input:focus{background:hsla(0,0%,100%,.15);border-color:#4b9bff;outline:none}.footer-brand .footer-newsletter .newsletter-form button{padding:8px 24px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;border-radius:8px;font-weight:600;font-size:14px;transition:all .3s ease}.footer-brand .footer-newsletter .newsletter-form button:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.social-links{display:flex;gap:16px}.social-links a{width:44px;height:44px;background:hsla(0,0%,100%,.1);border-radius:12px;display:flex;justify-content:center;align-items:center;color:#fff;transition:all .3s ease;font-size:20px}.social-links a:hover{background:#4b9bff;transform:translateY(-3px)}.social-links a.facebook:hover{background:#1877f2}.social-links a.twitter:hover{background:#1da1f2}.social-links a.linkedin:hover{background:#0077b5}.social-links a.github:hover{background:#333}.social-links a.youtube:hover{background:red}.footer-links{display:grid;grid-template-columns:repeat(4, 1fr);gap:40px}@media(max-width: 1024px){.footer-links{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.footer-links{grid-template-columns:1fr;text-align:center}}.footer-column h4{font-size:16px;font-weight:700;margin-bottom:24px;color:#fff}.footer-column ul{list-style:none}.footer-column ul li{margin-bottom:16px}.footer-column ul li a{color:hsla(0,0%,100%,.7);font-size:14px;transition:all .3s ease;position:relative}.footer-column ul li a::after{content:"";position:absolute;bottom:-2px;left:0;width:0;height:1px;background:#00d4ff;transition:all .3s ease}.footer-column ul li a:hover{color:#00d4ff}.footer-column ul li a:hover::after{width:100%}.footer-column .footer-badge{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;background:rgba(107,207,127,.2);color:#6bcf7f;border-radius:50px;font-size:12px;font-weight:600;margin-left:8px}.footer-bottom{padding-top:40px;border-top:1px solid hsla(0,0%,100%,.1);max-width:1280px;margin:0 auto;padding-left:24px;padding-right:24px}.footer-legal{display:flex;justify-content:space-between;align-items:center}@media(max-width: 768px){.footer-legal{flex-direction:column;gap:24px;text-align:center}}.footer-legal p{color:hsla(0,0%,100%,.5);font-size:14px;margin:0}.footer-legal .legal-links{display:flex;gap:24px}.footer-legal .legal-links a{color:hsla(0,0%,100%,.7);font-size:14px;transition:all .3s ease}.footer-legal .legal-links a:hover{color:#fff}.footer-decoration{position:relative;overflow:hidden}.footer-decoration::before{content:"";position:absolute;top:-100px;right:-100px;width:300px;height:300px;background:radial-gradient(circle, rgba(75, 155, 255, 0.1) 0%, transparent 70%);border-radius:50%}.footer-decoration::after{content:"";position:absolute;bottom:-150px;left:-150px;width:400px;height:400px;background:radial-gradient(circle, rgba(0, 212, 255, 0.05) 0%, transparent 70%);border-radius:50%}.grid{display:grid;gap:24px}.grid-cols-1{grid-template-columns:1fr}.grid-cols-2{grid-template-columns:repeat(2, 1fr)}.grid-cols-3{grid-template-columns:repeat(3, 1fr)}.grid-cols-4{grid-template-columns:repeat(4, 1fr)}.grid-cols-5{grid-template-columns:repeat(5, 1fr)}.grid-cols-6{grid-template-columns:repeat(6, 1fr)}.grid-cols-12{grid-template-columns:repeat(12, 1fr)}.grid-auto{grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))}.grid-auto-sm{grid-template-columns:repeat(auto-fit, minmax(200px, 1fr))}.grid-auto-lg{grid-template-columns:repeat(auto-fit, minmax(350px, 1fr))}.grid.gap-0{gap:0}.grid.gap-sm{gap:8px}.grid.gap-md{gap:16px}.grid.gap-lg{gap:24px}.grid.gap-xl{gap:32px}@media(max-width: 1024px){.grid-md-cols-1{grid-template-columns:1fr}.grid-md-cols-2{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.grid-sm-cols-1{grid-template-columns:1fr}.grid-sm-cols-2{grid-template-columns:repeat(2, 1fr)}}.col-span-1{grid-column:span 1}.col-span-2{grid-column:span 2}.col-span-3{grid-column:span 3}.col-span-4{grid-column:span 4}.col-span-5{grid-column:span 5}.col-span-6{grid-column:span 6}.col-span-full{grid-column:1/-1}.row-span-1{grid-row:span 1}.row-span-2{grid-row:span 2}.row-span-3{grid-row:span 3}.api-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:24px}@media(max-width: 1024px){.api-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.api-grid{grid-template-columns:1fr}}.experience-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:24px}@media(max-width: 768px){.experience-grid{grid-template-columns:1fr}}.partners-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));gap:40px;align-items:center}@media(max-width: 768px){.partners-grid{grid-template-columns:repeat(2, 1fr)}}.feature-grid{display:grid;grid-template-columns:repeat(2, 1fr);gap:32px}@media(max-width: 768px){.feature-grid{grid-template-columns:1fr}}.demo-wrapper{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:start}@media(max-width: 1024px){.demo-wrapper{grid-template-columns:1fr}}.footer-grid{display:grid;grid-template-columns:2fr 3fr;gap:80px}@media(max-width: 1024px){.footer-grid{grid-template-columns:1fr;gap:40px}}.footer-grid .footer-links{display:grid;grid-template-columns:repeat(4, 1fr);gap:40px}@media(max-width: 1024px){.footer-grid .footer-links{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.footer-grid .footer-links{grid-template-columns:1fr;text-align:center}}.pricing-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:24px;align-items:center}@media(max-width: 1024px){.pricing-grid{grid-template-columns:1fr;gap:32px}}.testimonial-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(350px, 1fr));gap:24px}@media(max-width: 768px){.testimonial-grid{grid-template-columns:1fr}}.stats-grid{display:grid;grid-template-columns:repeat(4, 1fr);gap:32px;text-align:center}@media(max-width: 1024px){.stats-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.stats-grid{grid-template-columns:1fr}}.two-column{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:center}@media(max-width: 1024px){.two-column{grid-template-columns:1fr;gap:32px}}.two-column.reverse{direction:rtl}.two-column.reverse>*{direction:ltr}@media(max-width: 1024px){.two-column.reverse{direction:ltr}}.three-column{display:grid;grid-template-columns:repeat(3, 1fr);gap:32px}@media(max-width: 1024px){.three-column{grid-template-columns:1fr}}.container{max-width:1280px;margin:0 auto;padding:0 24px}@media(max-width: 768px){.container{padding:0 16px}}.container-fluid{max-width:100%;padding:0 24px}.container-narrow{max-width:960px}.container-wide{max-width:1440px}.section{padding:100px 0}@media(max-width: 768px){.section{padding:64px 0}}.section-sm{padding:48px 0}.section-lg{padding:150px 0}.section-no-top{padding-top:0}.section-no-bottom{padding-bottom:0}.section-bg-gray{background:#f8fafc}.section-bg-light{background:#eff6ff}.section-bg-gradient{background:linear-gradient(180deg, #FFFFFF 0%, #EFF6FF 100%)}.section-bg-gradient-reverse{background:linear-gradient(180deg, #EFF6FF 0%, #FFFFFF 100%)}.section-bg-primary{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff}.section-bg-dark{background:#1a1a2e;color:#fff}.section-header{text-align:center;margin-bottom:64px}@media(max-width: 768px){.section-header{margin-bottom:48px}}.section-header .section-badge{display:inline-flex;align-items:center;gap:4px;padding:4px 16px;background:#eff6ff;color:#4b9bff;border-radius:50px;font-size:14px;font-weight:600;margin-bottom:16px}.section-header .section-title{font-size:40px;font-weight:700;margin-bottom:16px;color:#1a1a2e}@media(max-width: 768px){.section-header .section-title{font-size:32px}}.section-header .section-title .title-highlight{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.section-header .section-subtitle{font-size:18px;color:#64748b;line-height:1.6;max-width:600px;margin:0 auto}@media(max-width: 768px){.section-header .section-subtitle{font-size:16px}}.content-wrapper{position:relative;min-height:100vh;display:flex;flex-direction:column}.content-wrapper .main-content{flex:1;padding-top:80px}.page-wrapper{position:relative;overflow:hidden}.inner-content{position:relative;z-index:1}.btn{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.btn:hover{transform:translateY(-3px)}.btn{position:relative;overflow:hidden}.btn-sm{padding:8px 16px;font-size:14px}.btn-md{padding:16px 24px;font-size:16px}.btn-lg{padding:16px 32px;font-size:18px}.btn-xl{padding:24px 40px;font-size:20px}.btn-primary{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-primary:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-primary:active{transform:translateY(-1px)}.btn-secondary{background:#fff;color:#4b9bff;border:2px solid #4b9bff}.btn-secondary:hover{background:#eff6ff;transform:translateY(-3px)}.btn-accent{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-accent:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-warm{background:linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%);color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-warm:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-success{background:#6bcf7f;color:#fff}.btn-success:hover{background:hsl(132,51.0204081633%,51.568627451%);transform:translateY(-3px)}.btn-danger{background:#ff6b6b;color:#fff}.btn-danger:hover{background:#ff3838;transform:translateY(-3px)}.btn-ghost{background:rgba(0,0,0,0);color:#4b9bff;border:2px solid rgba(0,0,0,0)}.btn-ghost:hover{background:rgba(75,155,255,.1);border-color:#4b9bff}.btn-outline{background:rgba(0,0,0,0);color:#1a1a2e;border:2px solid #e2e8f0}.btn-outline:hover{border-color:#4b9bff;color:#4b9bff;transform:translateY(-3px)}.btn:disabled,.btn.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.btn.loading{color:rgba(0,0,0,0);pointer-events:none}.btn.loading::after{content:"";position:absolute;width:16px;height:16px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);border:2px solid #fff;border-radius:50%;border-top-color:rgba(0,0,0,0);animation:spin .6s linear infinite}.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border-radius:50%}.btn-icon.btn-sm{width:32px;height:32px}.btn-icon.btn-lg{width:56px;height:56px}.btn-block{width:100%;justify-content:center}.btn-group{display:inline-flex;gap:-1px}.btn-group .btn{border-radius:0}.btn-group .btn:first-child{border-top-left-radius:12px;border-bottom-left-radius:12px}.btn-group .btn:last-child{border-top-right-radius:12px;border-bottom-right-radius:12px}.fab{position:fixed;bottom:32px;right:32px;width:60px;height:60px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);border:none;border-radius:50%;color:#fff;font-size:24px;cursor:pointer;box-shadow:0 8px 24px rgba(75,155,255,.15);transition:all .3s ease;z-index:300;display:flex;justify-content:center;align-items:center}.fab:hover{transform:scale(1.1);box-shadow:0 16px 40px rgba(75,155,255,.2)}.fab:hover .fab-label{opacity:1;transform:translateX(-10px)}.fab .fab-label{position:absolute;right:70px;top:50%;transform:translateY(-50%);background:#1a1a2e;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;white-space:nowrap;opacity:0;transition:all .3s ease;pointer-events:none}.btn-cta-primary{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.btn-cta-primary:hover{transform:translateY(-3px)}.btn-cta-primary{background:#fff;color:#4b9bff;padding:16px 40px;font-size:18px;box-shadow:0 8px 24px rgba(75,155,255,.15)}.btn-cta-primary:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-cta-secondary{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.btn-cta-secondary:hover{transform:translateY(-3px)}.btn-cta-secondary{background:rgba(0,0,0,0);color:#fff;border:2px solid #fff;padding:16px 40px;font-size:18px}.btn-cta-secondary:hover{background:hsla(0,0%,100%,.1);transform:translateY(-3px)}.card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.card:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.card{position:relative;overflow:hidden}.card::before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:linear-gradient(45deg, transparent 30%, rgba(75, 155, 255, 0.03) 50%, transparent 70%);transform:rotate(45deg);transition:all .5s ease;opacity:0}.card:hover::before{animation:shimmer .6s ease;opacity:1}.api-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.api-card:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.api-card{text-align:center;border:2px solid #e2e8f0}.api-card:hover{border-color:#4b9bff;transform:translateY(-8px)}.api-card-popular{border-color:#ffd93d;background:linear-gradient(180deg, rgba(255, 217, 61, 0.05) 0%, #FFFFFF 100%)}.api-card-new{border-color:#6bcf7f;background:linear-gradient(180deg, rgba(107, 207, 127, 0.05) 0%, #FFFFFF 100%)}.api-card .api-badge{position:absolute;top:-12px;right:20px;padding:4px 16px;background:#ffd93d;color:#1a1a2e;border-radius:20px;font-size:12px;font-weight:700;text-transform:uppercase}.api-card .api-badge.new{background:#6bcf7f;color:#fff}.api-card .api-badge.beta{background:#a78bfa;color:#fff}.api-card .api-icon{width:60px;height:60px;margin:0 auto 24px;display:flex;justify-content:center;align-items:center;font-size:28px;background:#eff6ff;color:#4b9bff;border-radius:16px;transition:all .3s ease}.api-card:hover .api-icon{transform:scale(1.1);background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff}.api-card .api-name{font-size:20px;font-weight:700;margin-bottom:16px;color:#1a1a2e}.api-card .api-description{color:#64748b;line-height:1.6;margin-bottom:24px;font-size:14px}.api-card .api-features{display:flex;justify-content:center;gap:8px;margin-bottom:24px;flex-wrap:wrap}.api-card .api-features .feature-tag{padding:4px 8px;background:#f8fafc;color:#64748b;border-radius:20px;font-size:12px;font-weight:500}.api-card .api-link{display:inline-flex;align-items:center;gap:4px;color:#4b9bff;font-weight:600;font-size:14px;transition:all .3s ease}.api-card .api-link:hover{gap:8px;color:#2e7ff7}.experience-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.experience-card:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.experience-card{text-align:center}.experience-card .card-icon{width:56px;height:56px;margin:0 auto 24px;display:flex;justify-content:center;align-items:center;font-size:24px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;border-radius:16px}.experience-card h3{font-size:20px;font-weight:700;margin-bottom:16px;color:#1a1a2e}.experience-card p{color:#64748b;line-height:1.6;margin-bottom:24px;font-size:14px}.experience-card .card-metric{display:flex;flex-direction:column;align-items:center;padding-top:24px;border-top:1px solid #e2e8f0}.experience-card .card-metric .metric-value{font-size:24px;font-weight:800;color:#4b9bff}.experience-card .card-metric .metric-label{font-size:12px;color:#64748b;font-weight:500}.feature-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.feature-card:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.feature-card{display:flex;align-items:flex-start;gap:24px}.feature-card .feature-icon{flex-shrink:0;width:48px;height:48px;display:flex;justify-content:center;align-items:center;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;border-radius:12px;font-size:24px}.feature-card .feature-content{flex:1}.feature-card .feature-content h4{font-size:18px;font-weight:600;margin-bottom:8px;color:#1a1a2e}.feature-card .feature-content p{color:#64748b;line-height:1.6;font-size:14px}.testimonial-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.testimonial-card:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.testimonial-card{position:relative}.testimonial-card::before{content:'"';position:absolute;top:16px;left:16px;font-size:60px;color:#4b9bff;opacity:.1;font-weight:700}.testimonial-card .testimonial-content{position:relative;z-index:1;font-size:16px;line-height:1.8;color:#1a1a2e;margin-bottom:24px;font-style:italic}.testimonial-card .testimonial-author{display:flex;align-items:center;gap:16px}.testimonial-card .testimonial-author .author-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover}.testimonial-card .testimonial-author .author-info .author-name{font-weight:600;color:#1a1a2e;margin-bottom:2px}.testimonial-card .testimonial-author .author-info .author-title{font-size:14px;color:#64748b}.pricing-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.pricing-card:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.pricing-card{text-align:center;position:relative}.pricing-card.featured{border:2px solid #4b9bff;transform:scale(1.05)}.pricing-card.featured .pricing-badge{position:absolute;top:-14px;left:50%;transform:translateX(-50%);padding:4px 16px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;border-radius:50px;font-size:12px;font-weight:700;text-transform:uppercase}.pricing-card .pricing-header{padding-bottom:24px;border-bottom:1px solid #e2e8f0;margin-bottom:24px}.pricing-card .pricing-header h3{font-size:24px;font-weight:700;margin-bottom:8px;color:#1a1a2e}.pricing-card .pricing-header .price{display:flex;align-items:baseline;justify-content:center;gap:4px}.pricing-card .pricing-header .price .currency{font-size:20px;color:#64748b}.pricing-card .pricing-header .price .amount{font-size:48px;font-weight:800;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.pricing-card .pricing-header .price .period{font-size:16px;color:#64748b}.pricing-card .pricing-features{list-style:none;margin-bottom:24px}.pricing-card .pricing-features li{padding:8px 0;color:#64748b;font-size:14px;display:flex;align-items:center;gap:8px}.pricing-card .pricing-features li::before{content:"✓";color:#6bcf7f;font-weight:700}.pricing-card .pricing-features li.disabled{opacity:.5}.pricing-card .pricing-features li.disabled::before{content:"×";color:#94a3b8}.pricing-card .pricing-cta{margin-top:auto}.form-group{margin-bottom:24px}.form-group label{display:block;font-size:14px;font-weight:500;color:#1a1a2e;margin-bottom:8px}.form-group label .required{color:#ff6b6b;margin-left:2px}.form-group .form-hint{font-size:12px;color:#64748b;margin-top:4px}.form-group .form-error{font-size:12px;color:#ff6b6b;margin-top:4px;display:flex;align-items:center;gap:4px}.form-control{width:100%;padding:12px 16px;font-size:16px;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;color:#1a1a2e;background:#fff;border:2px solid #e2e8f0;border-radius:8px;transition:all .3s ease}.form-control::placeholder{color:#94a3b8}.form-control:focus{outline:none;border-color:#4b9bff;box-shadow:0 0 0 3px rgba(75,155,255,.1)}.form-control:disabled{background:#f8fafc;color:#64748b;cursor:not-allowed}.form-control-sm{padding:8px 16px;font-size:14px}.form-control-lg{padding:16px 24px;font-size:18px}.form-control.is-valid{border-color:#6bcf7f}.form-control.is-valid:focus{box-shadow:0 0 0 3px rgba(107,207,127,.1)}.form-control.is-invalid{border-color:#ff6b6b}.form-control.is-invalid:focus{box-shadow:0 0 0 3px rgba(255,107,107,.1)}textarea.form-control{min-height:120px;resize:vertical}select.form-control{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M6 8L0 0h12z' fill='%2364748B'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 16px center;background-size:12px;padding-right:40px}.form-check{display:flex;align-items:center;margin-bottom:16px}.form-check input[type=checkbox],.form-check input[type=radio]{width:20px;height:20px;margin-right:8px;cursor:pointer}.form-check label{margin-bottom:0;cursor:pointer;user-select:none}.form-check.disabled{opacity:.5;cursor:not-allowed}.form-check.disabled input,.form-check.disabled label{cursor:not-allowed}.form-switch{display:flex;align-items:center;gap:16px}.form-switch .switch{position:relative;width:48px;height:24px;background:#e2e8f0;border-radius:50px;cursor:pointer;transition:all .3s ease}.form-switch .switch::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:all .3s ease}.form-switch .switch.active{background:#4b9bff}.form-switch .switch.active::after{transform:translateX(24px)}.input-group{display:flex;width:100%}.input-group .input-group-text{padding:12px 16px;font-size:16px;color:#64748b;background:#f8fafc;border:2px solid #e2e8f0;border-radius:8px 0 0 8px;border-right:none}.input-group .form-control{border-radius:0 8px 8px 0}.input-group.input-group-append .input-group-text{border-radius:0 8px 8px 0;border-right:2px solid #e2e8f0;border-left:none}.input-group.input-group-append .form-control{border-radius:8px 0 0 8px}.form-inline{display:flex;align-items:flex-end;gap:16px}.form-inline .form-group{margin-bottom:0}@media(max-width: 768px){.form-inline{flex-direction:column;align-items:stretch}.form-inline .form-group{margin-bottom:16px}}.form-row{display:grid;grid-template-columns:repeat(2, 1fr);gap:24px}@media(max-width: 768px){.form-row{grid-template-columns:1fr}}.modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:400;opacity:0;visibility:hidden;transition:all .3s ease}.modal-backdrop.show{opacity:1;visibility:visible}.modal{position:fixed;top:0;left:0;right:0;bottom:0;z-index:500;display:flex;align-items:center;justify-content:center;padding:24px;opacity:0;visibility:hidden;transition:all .3s ease}.modal.show{opacity:1;visibility:visible}.modal.show .modal-dialog{transform:scale(1)}.modal-dialog{position:relative;background:#fff;border-radius:16px;box-shadow:0 16px 40px rgba(75,155,255,.2);max-width:500px;width:100%;max-height:90vh;display:flex;flex-direction:column;transform:scale(0.95);transition:all .3s ease}.modal-dialog.modal-sm{max-width:400px}.modal-dialog.modal-lg{max-width:800px}.modal-dialog.modal-xl{max-width:1200px}.modal-dialog.modal-fullscreen{max-width:100%;max-height:100%;height:100%;margin:0;border-radius:0}.modal-header{padding:24px;border-bottom:1px solid #e2e8f0;display:flex;align-items:center;justify-content:space-between}.modal-header .modal-title{font-size:24px;font-weight:600;color:#1a1a2e;margin:0}.modal-header .modal-close{width:32px;height:32px;display:flex;justify-content:center;align-items:center;background:rgba(0,0,0,0);border:none;border-radius:8px;color:#64748b;font-size:24px;cursor:pointer;transition:all .3s ease}.modal-header .modal-close:hover{background:#f8fafc;color:#1a1a2e}.modal-body{padding:24px;flex:1;overflow-y:auto;color:#1a1a2e;line-height:1.6}.modal-footer{padding:24px;border-top:1px solid #e2e8f0;display:flex;gap:16px;justify-content:flex-end}.modal-footer.modal-footer-center{justify-content:center}.modal-footer.modal-footer-between{justify-content:space-between}.modal-alert .modal-dialog{max-width:400px}.modal-alert .modal-body{text-align:center;padding:32px}.modal-alert .modal-body .alert-icon{width:64px;height:64px;margin:0 auto 24px;display:flex;justify-content:center;align-items:center;font-size:32px;border-radius:50%}.modal-alert .modal-body .alert-icon.alert-success{background:rgba(107,207,127,.1);color:#6bcf7f}.modal-alert .modal-body .alert-icon.alert-warning{background:rgba(255,217,61,.1);color:#ffd93d}.modal-alert .modal-body .alert-icon.alert-danger{background:rgba(255,107,107,.1);color:#ff6b6b}.modal-alert .modal-body .alert-icon.alert-info{background:rgba(75,155,255,.1);color:#4b9bff}.modal-alert .modal-body .alert-title{font-size:24px;font-weight:600;margin-bottom:8px;color:#1a1a2e}.modal-alert .modal-body .alert-message{color:#64748b}.breadcrumb{display:flex;align-items:center;gap:8px;padding:16px 0;font-size:14px}.breadcrumb .breadcrumb-item{display:flex;align-items:center;gap:8px;color:#64748b}.breadcrumb .breadcrumb-item a{color:#64748b;transition:all .3s ease}.breadcrumb .breadcrumb-item a:hover{color:#4b9bff}.breadcrumb .breadcrumb-item.active{color:#1a1a2e;font-weight:500}.breadcrumb .breadcrumb-item:not(:last-child)::after{content:"/";color:#94a3b8;margin-left:8px}.nav-tabs{display:flex;gap:4px;border-bottom:2px solid #e2e8f0;margin-bottom:32px}.nav-tabs .nav-item{position:relative}.nav-tabs .nav-link{display:flex;align-items:center;gap:8px;padding:16px 24px;color:#64748b;font-weight:500;border-bottom:2px solid rgba(0,0,0,0);margin-bottom:-2px;transition:all .3s ease}.nav-tabs .nav-link:hover{color:#1a1a2e}.nav-tabs .nav-link.active{color:#4b9bff;border-bottom-color:#4b9bff}.nav-tabs .nav-link .badge{padding:2px 6px;background:#f8fafc;color:#64748b;border-radius:50px;font-size:11px;font-weight:600}.nav-pills{display:flex;gap:8px;padding:4px;background:#f8fafc;border-radius:12px}.nav-pills .nav-link{padding:8px 24px;color:#64748b;font-weight:500;border-radius:8px;transition:all .3s ease}.nav-pills .nav-link:hover{color:#1a1a2e;background:hsla(0,0%,100%,.5)}.nav-pills .nav-link.active{background:#fff;color:#4b9bff;box-shadow:0 2px 4px rgba(0,0,0,.05)}.sidebar-nav .nav-section{margin-bottom:32px}.sidebar-nav .nav-section .nav-title{font-size:12px;font-weight:600;text-transform:uppercase;color:#64748b;padding:8px 16px;letter-spacing:.05em}.sidebar-nav .nav-menu{list-style:none}.sidebar-nav .nav-menu .nav-item{margin-bottom:4px}.sidebar-nav .nav-menu .nav-link{display:flex;align-items:center;gap:16px;padding:8px 16px;color:#1a1a2e;border-radius:8px;transition:all .3s ease}.sidebar-nav .nav-menu .nav-link .nav-icon{width:20px;height:20px;display:flex;justify-content:center;align-items:center;font-size:18px;color:#64748b}.sidebar-nav .nav-menu .nav-link:hover{background:#f8fafc;color:#4b9bff}.sidebar-nav .nav-menu .nav-link:hover .nav-icon{color:#4b9bff}.sidebar-nav .nav-menu .nav-link.active{background:#eff6ff;color:#4b9bff;font-weight:500}.sidebar-nav .nav-menu .nav-link.active .nav-icon{color:#4b9bff}.sidebar-nav .nav-menu .nav-submenu{margin-left:40px;margin-top:4px;list-style:none}.sidebar-nav .nav-menu .nav-submenu .nav-link{font-size:14px;padding:4px 16px}.pagination{display:flex;align-items:center;gap:4px}.pagination .page-item.disabled .page-link{opacity:.5;cursor:not-allowed;pointer-events:none}.pagination .page-item.active .page-link{background:#4b9bff;color:#fff;border-color:#4b9bff}.pagination .page-link{display:flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 8px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;color:#1a1a2e;font-size:14px;font-weight:500;transition:all .3s ease}.pagination .page-link:hover{background:#f8fafc;border-color:#4b9bff;color:#4b9bff}.pagination .page-link.page-prev,.pagination .page-link.page-next{font-size:18px}.pagination .page-dots{padding:0 8px;color:#64748b}.partners{padding:80px 0;background:#fff}.final-cta{position:relative;padding:150px 0;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);overflow:hidden}.hero-section{position:relative;padding:160px 0 100px;background:linear-gradient(180deg, #EFF6FF 0%, #FFFFFF 100%);overflow:hidden}@media(max-width: 768px){.hero-section{padding:120px 0 60px}}.hero-patterns{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none}.hero-patterns .pattern-circle{position:absolute;border-radius:50%;opacity:.1}.hero-patterns .pattern-circle.pattern-1{width:400px;height:400px;background:#00d4ff;border-radius:50%;opacity:.1;position:absolute;top:-200px;right:-100px;animation:float 20s ease-in-out infinite}.hero-patterns .pattern-circle.pattern-2{width:300px;height:300px;background:#ffd93d;border-radius:50%;opacity:.1;position:absolute;bottom:-150px;left:-50px;animation:float 15s ease-in-out infinite reverse}.hero-patterns .pattern-dots{position:absolute;top:50%;left:10%;width:100px;height:100px;background-image:radial-gradient(circle, #A78BFA 2px, transparent 2px);background-size:20px 20px;opacity:.3}.hero-content{text-align:center;position:relative;z-index:1;max-width:1280px;margin:0 auto;padding:0 24px}.hero-badge{display:inline-flex;align-items:center;gap:8px;padding:8px 24px;background:#fff;border:2px solid #ffd93d;border-radius:50px;margin-bottom:24px;font-size:14px;font-weight:600;color:#1a1a2e;animation:slideInDown .6s ease-out}.hero-badge .badge-icon{font-size:20px;animation:bounce 2s infinite}.main-headline{font-size:56px;font-weight:800;line-height:1.2;margin-bottom:24px;color:#1a1a2e;animation:slideInUp .8s ease-out}@media(max-width: 768px){.main-headline{font-size:40px}}@media(max-width: 480px){.main-headline{font-size:32px}}.main-headline .headline-highlight{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.sub-headline{font-size:20px;font-weight:400;line-height:1.6;margin-bottom:40px;color:#64748b;animation:slideInUp .9s ease-out}@media(max-width: 768px){.sub-headline{font-size:16px}}.hero-buttons{display:flex;gap:16px;justify-content:center;margin-bottom:64px;animation:slideInUp 1s ease-out}@media(max-width: 768px){.hero-buttons{flex-direction:column;align-items:center}}.hero-buttons .btn{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.hero-buttons .btn:hover{transform:translateY(-3px)}.hero-buttons .btn.btn-primary{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.hero-buttons .btn.btn-primary:hover{box-shadow:0 16px 40px rgba(75,155,255,.2)}.hero-buttons .btn.btn-secondary{background:#fff;color:#4b9bff;border:2px solid #4b9bff}.hero-buttons .btn.btn-secondary:hover{background:#eff6ff}@media(max-width: 480px){.hero-buttons .btn{width:100%;justify-content:center}}.hero-stats{display:flex;justify-content:center;gap:64px;animation:fadeIn 1.2s ease-out}@media(max-width: 768px){.hero-stats{flex-direction:column;gap:24px}}.hero-stats .stat-item{display:flex;flex-direction:column;align-items:center}.hero-stats .stat-item .stat-number{font-size:40px;font-weight:800;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.hero-stats .stat-item .stat-label{font-size:14px;color:#64748b;font-weight:500}.hero-image{position:relative;margin-top:64px;text-align:center}.hero-image img{max-width:100%;height:auto;border-radius:16px;box-shadow:0 16px 40px rgba(75,155,255,.2)}.hero-image .hero-decoration{position:absolute;width:100%;height:100%;top:0;left:0;pointer-events:none}.hero-image .hero-decoration::before,.hero-image .hero-decoration::after{content:"";position:absolute;border-radius:50%}.hero-image .hero-decoration::before{width:60px;height:60px;background:linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%);top:-30px;right:10%;animation:bounce 2s infinite}.hero-image .hero-decoration::after{width:40px;height:40px;background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);bottom:-20px;left:15%;animation:bounce 2s infinite .5s}.api-search-section{padding:64px 0;background:linear-gradient(180deg, #FFFFFF 0%, #EFF6FF 100%);position:relative}.api-search-section::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:600px;height:600px;background:radial-gradient(circle, rgba(75, 155, 255, 0.03) 0%, transparent 70%);pointer-events:none}.api-search-section .search-container{max-width:800px;margin:0 auto;text-align:center;position:relative;z-index:1}.api-search-section .search-form{margin-bottom:32px;animation:slideInUp .8s ease-out}.api-search-section .search-wrapper{display:flex;gap:16px;padding:0 24px}@media(max-width: 768px){.api-search-section .search-wrapper{flex-direction:column;gap:8px}}.api-search-section .search-input{flex:1;padding:16px 32px;font-size:16px;border:2px solid #e2e8f0;border-radius:50px;background:#fff;transition:all .3s ease;outline:none}.api-search-section .search-input::placeholder{color:#94a3b8}.api-search-section .search-input:focus{border-color:#4b9bff;box-shadow:0 0 0 4px rgba(75,155,255,.1)}@media(max-width: 768px){.api-search-section .search-input{width:100%;padding:16px 24px}}.api-search-section .search-button{padding:16px 40px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;border:none;border-radius:50px;font-size:16px;font-weight:600;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:8px;box-shadow:0 4px 12px rgba(75,155,255,.1);white-space:nowrap}.api-search-section .search-button i{font-size:20px}.api-search-section .search-button:hover{transform:translateY(-2px);box-shadow:0 16px 40px rgba(75,155,255,.2);background:linear-gradient(135deg, rgb(49.5, 140.8333333333, 255) 0%, rgb(21.4400921659, 111.9585253456, 246.0599078341) 100%)}.api-search-section .search-button:active{transform:translateY(0);box-shadow:0 2px 4px rgba(0,0,0,.05)}@media(max-width: 768px){.api-search-section .search-button{width:100%;justify-content:center;padding:16px 32px}}.api-search-section .hashtag-suggestions{display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;padding:0 24px;animation:fadeIn .8s ease-out .2s both}@media(max-width: 768px){.api-search-section .hashtag-suggestions{gap:8px;justify-content:flex-start}}.api-search-section .hashtag-label{font-size:14px;color:#64748b;font-weight:500}@media(max-width: 768px){.api-search-section .hashtag-label{width:100%;margin-bottom:4px}}.api-search-section .hashtag{display:inline-flex;align-items:center;padding:4px 24px;background:#fff;border:1px solid #e2e8f0;border-radius:50px;font-size:14px;color:#1a1a2e;text-decoration:none;transition:all .3s ease;position:relative;overflow:hidden}.api-search-section .hashtag::before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);transition:left .3s ease;z-index:0}.api-search-section .hashtag:hover{border-color:#4b9bff;transform:translateY(-2px);box-shadow:0 2px 4px rgba(0,0,0,.05);color:#fff;position:relative;z-index:1}.api-search-section .hashtag:hover::before{left:0}@media(max-width: 768px){.api-search-section .hashtag{padding:4px 16px;font-size:12px}}.api-showcase{padding:100px 0;background:#fff}.info-section{padding:100px 0;background:#fff;position:relative}.info-section::before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent 0%, #E2E8F0 20%, #E2E8F0 80%, transparent 100%)}.info-section .info-wrapper{display:flex;flex-direction:column;align-items:center;gap:48px}.info-section .image-container{width:100%;max-width:600px;margin:0 auto}.info-section .image-placeholder{position:relative;width:100%;height:300px;background:linear-gradient(135deg, #EFF6FF 0%, rgba(75, 155, 255, 0.1) 100%);border-radius:20px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden}.info-section .image-placeholder::before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle at center, rgba(0, 212, 255, 0.1) 0%, transparent 50%);animation:rotate 20s linear infinite}.info-section .image-placeholder::after{content:"";position:absolute;bottom:-20px;right:-20px;width:100px;height:100px;background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);border-radius:50%;opacity:.3;filter:blur(40px)}.info-section .image-placeholder i{font-size:64px;color:#4b9bff;z-index:1}.info-section .image-placeholder span{font-size:24px;font-weight:600;color:#1a1a2e;z-index:1}@media(max-width: 768px){.info-section .image-placeholder{height:200px}.info-section .image-placeholder i{font-size:48px}.info-section .image-placeholder span{font-size:20px}}.info-section .info-content{text-align:center;max-width:800px;margin:0 auto}.info-section .highlight-text{font-size:24px;line-height:1.8;color:#1a1a2e;margin-bottom:48px;font-weight:500}.info-section .highlight-text .text-accent{color:#4b9bff;font-weight:600}@media(max-width: 1024px){.info-section .highlight-text{font-size:20px}}@media(max-width: 768px){.info-section .highlight-text{font-size:16px;padding:0 24px;margin-bottom:40px}}.info-section .action-buttons{display:flex;gap:24px;justify-content:center;flex-wrap:wrap}@media(max-width: 768px){.info-section .action-buttons{flex-direction:column;align-items:center;padding:0 24px}}.info-section .action-btn{display:flex;align-items:center;gap:16px;padding:16px 32px;background:#fff;border:2px solid #e2e8f0;border-radius:50px;text-decoration:none;transition:all .3s ease;min-width:280px;position:relative;overflow:hidden}.info-section .action-btn::before{content:"";position:absolute;top:0;left:0;width:0;height:100%;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);transition:width .3s ease;z-index:0}.info-section .action-btn:hover{border-color:#4b9bff;transform:translateY(-3px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.info-section .action-btn:hover::before{width:100%}.info-section .action-btn:hover .btn-number{background:#fff;color:#4b9bff}.info-section .action-btn:hover .btn-text,.info-section .action-btn:hover i{color:#fff}.info-section .action-btn .btn-number{position:relative;z-index:1;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;border-radius:50%;font-weight:700;font-size:16px;flex-shrink:0;transition:all .3s ease}.info-section .action-btn .btn-text{position:relative;z-index:1;font-size:16px;font-weight:500;color:#1a1a2e;transition:color .3s ease}.info-section .action-btn i{position:relative;z-index:1;font-size:14px;color:#94a3b8;margin-left:auto;transition:all .3s ease}@media(max-width: 768px){.info-section .action-btn{min-width:100%;justify-content:flex-start}}@keyframes rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.support-center{padding:100px 0;background:#f8fafc}.support-center .section-header{text-align:center;margin-bottom:64px}.support-center .section-header .section-title{font-size:48px;font-weight:700;color:#1a1a2e;margin-bottom:16px}@media(max-width: 768px){.support-center .section-header .section-title{font-size:40px}}.support-center .section-header .section-title .title-highlight{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.support-center .section-header .section-subtitle{font-size:20px;color:#64748b;line-height:1.8}@media(max-width: 768px){.support-center .section-header .section-subtitle{font-size:16px}}.support-center .support-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:32px;max-width:1000px;margin:0 auto}@media(max-width: 1024px){.support-center .support-grid{grid-template-columns:1fr;gap:24px;max-width:500px}}@media(max-width: 768px){.support-center .support-grid{gap:16px;padding:0 16px}}.support-center .support-card{position:relative;display:flex;flex-direction:column;align-items:center;padding:40px 32px;background:#fff;border-radius:16px;box-shadow:0 2px 4px rgba(0,0,0,.05);text-decoration:none;transition:all .3s ease;overflow:hidden}.support-center .support-card::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);transform:scaleX(0);transition:transform .3s ease}.support-center .support-card:hover{transform:translateY(-8px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.support-center .support-card:hover::before{transform:scaleX(1)}.support-center .support-card:hover .card-icon{transform:scale(1.1) rotate(5deg);background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff}.support-center .support-card:hover .card-arrow{transform:translateX(5px);color:#4b9bff}.support-center .support-card .card-icon{width:80px;height:80px;display:flex;align-items:center;justify-content:center;background:#eff6ff;border-radius:50px;margin-bottom:24px;transition:all .3s ease}.support-center .support-card .card-icon i{font-size:36px;color:#4b9bff}.support-center .support-card h3{font-size:24px;font-weight:600;color:#1a1a2e;margin-bottom:8px;text-align:center}.support-center .support-card p{font-size:16px;color:#64748b;text-align:center;line-height:1.8;margin-bottom:24px}.support-center .support-card .card-arrow{margin-top:auto;color:#94a3b8;transition:all .3s ease}.support-center .support-card .card-arrow i{font-size:20px}@media(max-width: 768px){.support-center .support-card{padding:32px 24px}.support-center .support-card .card-icon{width:70px;height:70px}.support-center .support-card .card-icon i{font-size:30px}.support-center .support-card h3{font-size:20px}.support-center .support-card p{font-size:14px}}.api-stats-section{padding:100px 0;background:linear-gradient(180deg, #FFFFFF 0%, #EFF6FF 100%);position:relative;overflow:hidden}.api-stats-section::before{content:"";position:absolute;top:50%;left:-100px;width:200px;height:200px;background:radial-gradient(circle, #00D4FF 0%, transparent 70%);opacity:.1;border-radius:50%;transform:translateY(-50%)}.api-stats-section::after{content:"";position:absolute;top:50%;right:-100px;width:300px;height:300px;background:radial-gradient(circle, #4B9BFF 0%, transparent 70%);opacity:.08;border-radius:50%;transform:translateY(-50%)}.api-stats-section .section-header{text-align:center;margin-bottom:80px;position:relative;z-index:1}.api-stats-section .section-header .section-title{font-size:40px;font-weight:700;color:#1a1a2e;line-height:1.8;margin-bottom:40px}@media(max-width: 1024px){.api-stats-section .section-header .section-title{font-size:32px}}@media(max-width: 768px){.api-stats-section .section-header .section-title{font-size:24px;padding:0 24px}}.api-stats-section .section-header .section-title .title-highlight{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text;font-weight:800}.api-stats-section .stats-cards{display:grid;grid-template-columns:repeat(3, 1fr);gap:40px;max-width:1100px;margin:0 auto;position:relative;z-index:1}@media(max-width: 1024px){.api-stats-section .stats-cards{grid-template-columns:1fr;gap:32px;max-width:400px}}@media(max-width: 768px){.api-stats-section .stats-cards{padding:0 24px}}.api-stats-section .stat-card{background:#fff;border-radius:16px;padding:40px;box-shadow:0 4px 12px rgba(75,155,255,.1);border:1px solid rgba(75,155,255,.1);position:relative;overflow:hidden;transition:all .4s ease}.api-stats-section .stat-card::before{content:"";position:absolute;top:-2px;left:-2px;right:-2px;bottom:-2px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);border-radius:16px;opacity:0;z-index:-1;transition:opacity .4s ease}.api-stats-section .stat-card:hover{transform:translateY(-10px) scale(1.02);box-shadow:0 16px 40px rgba(75,155,255,.2)}.api-stats-section .stat-card:hover::before{opacity:1}.api-stats-section .stat-card:hover .stat-icon{transform:rotate(360deg) scale(1.1);background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%)}.api-stats-section .stat-card:hover .stat-icon i{color:#fff}.api-stats-section .stat-card:hover .stat-number{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}.api-stats-section .stat-card .stat-icon{width:70px;height:70px;display:flex;align-items:center;justify-content:center;background:#eff6ff;border-radius:50px;margin-bottom:24px;transition:all .6s cubic-bezier(0.4, 0, 0.2, 1)}.api-stats-section .stat-card .stat-icon i{font-size:32px;color:#4b9bff;transition:color .3s ease}.api-stats-section .stat-card .stat-content .stat-number{font-size:48px;font-weight:800;color:#1a1a2e;margin-bottom:8px;transition:all .3s ease;display:block}@media(max-width: 768px){.api-stats-section .stat-card .stat-content .stat-number{font-size:40px}}.api-stats-section .stat-card .stat-content .stat-number[data-formatted]::after{content:attr(data-formatted)}.api-stats-section .stat-card .stat-content .stat-label{font-size:20px;font-weight:600;color:#1a1a2e;margin-bottom:4px}.api-stats-section .stat-card .stat-content .stat-description{font-size:14px;color:#64748b;line-height:1.6}.api-stats-section .stat-card:nth-child(1) .stat-icon{background:rgba(0,212,255,.1)}.api-stats-section .stat-card:nth-child(1) .stat-icon i{color:#00d4ff}.api-stats-section .stat-card:nth-child(1):hover .stat-icon{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%)}.api-stats-section .stat-card:nth-child(2) .stat-icon{background:rgba(107,207,127,.1)}.api-stats-section .stat-card:nth-child(2) .stat-icon i{color:#6bcf7f}.api-stats-section .stat-card:nth-child(2):hover .stat-icon{background:linear-gradient(135deg, #6BCF7F 0%, rgb(68.4897959184, 194.5102040816, 93.693877551) 100%)}.api-stats-section .stat-card:nth-child(3) .stat-icon{background:rgba(167,139,250,.1)}.api-stats-section .stat-card:nth-child(3) .stat-icon i{color:#a78bfa}.api-stats-section .stat-card:nth-child(3):hover .stat-icon{background:linear-gradient(135deg, #A78BFA 0%, rgb(129.9090909091, 90.1074380165, 247.8925619835) 100%)}@media(max-width: 768px){.api-stats-section .stat-card{padding:32px}.api-stats-section .stat-card .stat-icon{width:60px;height:60px}.api-stats-section .stat-card .stat-icon i{font-size:28px}}@keyframes countUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.stat-number{animation:countUp .6s ease-out forwards}.api-market-container{display:flex;min-height:100vh;background-color:#f8fafc;position:relative}.api-market-sidebar{width:280px;background-color:#fff;border-right:1px solid #e2e8f0;padding:40px 24px;position:sticky;top:0;height:100vh;overflow-y:auto;flex-shrink:0}@media(max-width: 1024px){.api-market-sidebar{width:240px}}@media(max-width: 768px){.api-market-sidebar{position:fixed;left:0;top:60px;transform:translateX(-100%);transition:transform .3s ease;box-shadow:0 8px 24px rgba(75,155,255,.15);z-index:500;height:calc(100vh - 60px)}.api-market-sidebar.mobile-open{transform:translateX(0)}}.api-sidebar-nav .menu-section{margin-bottom:4px}.api-sidebar-nav .menu-title{padding:12px 16px;font-size:14px;font-weight:600;color:#2e7ff7;cursor:pointer;border-radius:8px;transition:all .3s ease;display:flex;align-items:center;justify-content:space-between}.api-sidebar-nav .menu-title:hover{background-color:#f8fafc}.api-sidebar-nav .menu-title.active{background-color:#eff6ff;color:#2e7ff7}.api-sidebar-nav .menu-title .api-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 8px;background-color:rgba(75,155,255,.1);color:#4b9bff;font-size:12px;font-weight:600;border-radius:50px;transition:all .3s ease}.api-sidebar-nav .menu-title.active .api-count{background-color:#4b9bff;color:#fff}.api-sidebar-nav .api-list{padding-left:16px;margin-top:4px;margin-bottom:8px}.api-sidebar-nav .api-item{padding:8px 16px;font-size:14px;color:#64748b;cursor:pointer;border-radius:6px;transition:all .3s ease;display:flex;align-items:center;position:relative;margin-bottom:4px}.api-sidebar-nav .api-item::before{content:"•";margin-right:8px;color:#4b9bff;opacity:.5}.api-sidebar-nav .api-item:hover{background-color:rgba(75,155,255,.05);color:#1a1a2e;padding-left:20px}.api-sidebar-nav .api-item:hover::before{opacity:1}.api-sidebar-nav .api-item.active{background-color:rgba(75,155,255,.1);color:#4b9bff;font-weight:500}.api-sidebar-nav .api-item.active::before{opacity:1}.api-sidebar-nav .api-item .api-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.api-market-content{flex:1;padding:40px 48px;min-height:100vh;display:flex;flex-direction:column}@media(max-width: 768px){.api-market-content{padding:24px 16px}}.api-mobile-toggle{display:none;position:fixed;bottom:24px;right:24px;width:56px;height:56px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);border-radius:50%;border:none;color:#fff;font-size:24px;cursor:pointer;box-shadow:0 8px 24px rgba(75,155,255,.15);z-index:501;transition:all .3s ease}.api-mobile-toggle:hover{transform:scale(1.05);box-shadow:0 16px 40px rgba(75,155,255,.2)}.api-mobile-toggle:active{transform:scale(0.95)}@media(max-width: 768px){.api-mobile-toggle{display:flex;align-items:center;justify-content:center}}.api-market-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:40px}@media(max-width: 768px){.api-market-header{flex-direction:column;align-items:flex-start;gap:24px}}.api-market-title h1{font-size:14px;color:#64748b;font-weight:400;margin-bottom:4px}.api-market-title h2{font-size:32px;font-weight:700;color:#1a1a2e}.api-market-search{position:relative;width:300px}@media(max-width: 768px){.api-market-search{width:100%}}.api-market-search form{position:relative;display:flex;align-items:center}.api-market-search input{flex:1;padding:12px 48px 12px 16px;border:1px solid #e2e8f0;border-radius:12px;font-size:14px;outline:none;transition:all .3s ease}.api-market-search input:focus{border-color:#4b9bff;box-shadow:0 0 0 3px rgba(75,155,255,.1)}.api-market-search input::placeholder{color:#94a3b8}.api-market-search .search-submit-btn{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:36px;height:36px;background:rgba(0,0,0,0);border:none;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;color:#64748b}.api-market-search .search-submit-btn:hover{background:#eff6ff;color:#4b9bff;transform:translateY(-50%) scale(1.05)}.api-market-search .search-submit-btn:active{transform:translateY(-50%) scale(0.95)}.api-market-search .search-submit-btn .search-icon{font-size:18px;display:block}.api-result-count{font-size:16px;color:#64748b;margin-bottom:32px}.api-result-count strong{color:#4b9bff;font-weight:600}.api-card-grid{display:grid;grid-template-columns:repeat(auto-fill, minmax(320px, 1fr));gap:24px}@media(max-width: 768px){.api-card-grid{grid-template-columns:1fr}}.api-card{background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 4px rgba(0,0,0,.05);transition:all .3s ease;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;min-height:220px;position:relative;overflow:hidden}.api-card::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);transform:scaleX(0);transform-origin:left;transition:transform .3s ease}.api-card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15);transform:translateY(-5px)}.api-card:hover::before{transform:scaleX(1)}.api-card:hover .api-card-icon{transform:scale(1.1)}.api-card:active{transform:translateY(-3px)}.api-card-header{display:flex;align-items:center;gap:8px;margin-bottom:16px}.api-card-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background-color:#f8fafc;border-radius:6px;font-size:12px;color:#64748b;font-weight:500}.api-card-badge::before{content:"◉";color:#4b9bff;font-size:10px}.api-card-title{font-size:18px;font-weight:600;color:#1a1a2e;margin-bottom:12px;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.api-card-description{font-size:14px;color:#64748b;line-height:1.6;flex-grow:1;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.api-card-icon{text-align:center;margin-top:24px;font-size:48px;opacity:.8;transition:transform .3s ease}.api-card-icon img{max-width:60px;max-height:60px;object-fit:contain}.api-card:nth-child(3n+1) .api-card-icon{color:#60a5fa}.api-card:nth-child(3n+2) .api-card-icon{color:#34d399}.api-card:nth-child(3n+3) .api-card-icon{color:#818cf8}.api-empty-state{text-align:center;padding:80px 24px;color:#64748b}.api-empty-state .empty-icon{font-size:80px;margin-bottom:24px;opacity:.5}.api-empty-state h3{font-size:24px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.api-empty-state p{font-size:16px;color:#64748b}.api-loading{display:flex;justify-content:center;align-items:center;padding:80px}.api-loading .spinner{width:48px;height:48px;border:4px solid #e2e8f0;border-top-color:#4b9bff;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.api-mobile-overlay{display:none;position:fixed;top:60px;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:499;opacity:0;transition:opacity .3s ease;pointer-events:none}@media(max-width: 768px){.api-mobile-overlay{display:block}}.api-mobile-overlay.active{opacity:1;pointer-events:auto}.api-detail-content{display:flex;flex-direction:column;gap:32px}.api-detail-tabs{display:flex;gap:8px;border-bottom:2px solid #e2e8f0;margin-bottom:32px}.api-detail-tabs .tab-button{padding:16px 24px;background:rgba(0,0,0,0);border:none;border-bottom:3px solid rgba(0,0,0,0);font-size:16px;font-weight:500;color:#64748b;cursor:pointer;transition:all .3s ease;position:relative;bottom:-2px}.api-detail-tabs .tab-button:hover{color:#4b9bff;background-color:rgba(75,155,255,.05)}.api-detail-tabs .tab-button.active{color:#4b9bff;font-weight:600;border-bottom-color:#4b9bff}.tab-content{display:none;flex-direction:column;gap:32px;min-height:200px}.tab-content.active{display:flex}.api-overview-card{background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 4px rgba(0,0,0,.05);display:flex;flex-direction:column;gap:24px}.api-overview-card .api-overview-header{display:flex;flex-direction:row;align-items:center;gap:16px}@media(max-width: 768px){.api-overview-card .api-overview-header{flex-direction:column;align-items:flex-start}}.api-overview-card .api-method-badge{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:8px 16px;background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);color:#fff;font-size:14px;font-weight:600;border-radius:6px;text-transform:uppercase;letter-spacing:.5px}.api-overview-card .api-endpoint{flex:1}.api-overview-card .api-endpoint code{display:block;padding:8px 16px;background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;font-size:18px;font-family:"Courier New",monospace;color:#1a1a2e;word-break:break-all}.api-overview-card .api-simple-description{padding:16px 0;border-bottom:1px solid #e2e8f0}.api-overview-card .api-simple-description p{font-size:16px;color:#64748b;line-height:1.6;margin:0}.api-overview-card .api-overview-info h4{font-size:18px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.api-details-grid{display:flex;flex-direction:column;gap:24px}.api-detail-card{background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 4px rgba(0,0,0,.05);transition:all .3s ease}.api-detail-card:hover{box-shadow:0 4px 12px rgba(75,155,255,.1)}.api-detail-card h3{font-size:20px;font-weight:600;color:#1a1a2e;margin-bottom:16px;padding-bottom:8px;border-bottom:2px solid #eff6ff}.api-detail-card .detail-content{font-size:14px;color:#64748b;line-height:1.6}.api-detail-card .detail-content pre{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;overflow-x:auto;margin:0}.api-detail-card .detail-content pre code{font-family:"Courier New",monospace;font-size:14px;color:#1a1a2e;white-space:pre-wrap;word-break:break-word}.api-detail-card .detail-content table{width:100%;border-collapse:collapse;margin:16px 0;background-color:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.api-detail-card .detail-content table thead{background-color:#eff6ff}.api-detail-card .detail-content table th{text-align:left;padding:8px 16px;font-size:14px;font-weight:600;color:#1a1a2e;border-bottom:2px solid #e2e8f0;background-color:rgba(75,155,255,.05)}.api-detail-card .detail-content table th:not(:last-child){border-right:1px solid #e2e8f0}.api-detail-card .detail-content table td{padding:8px 16px;font-size:14px;color:#64748b;border-bottom:1px solid #e2e8f0}.api-detail-card .detail-content table td:not(:last-child){border-right:1px solid #e2e8f0}.api-detail-card .detail-content table tr{transition:all .3s ease}.api-detail-card .detail-content table tr:last-child td{border-bottom:none}.api-detail-card .detail-content table tr:hover{background-color:rgba(75,155,255,.02)}.api-detail-card .detail-content table tbody tr:nth-child(even){background-color:rgba(248,250,252,.3)}.api-info-table{width:100%;border-collapse:collapse}.api-info-table tr{border-bottom:1px solid #e2e8f0}.api-info-table tr:last-child{border-bottom:none}.api-info-table th{text-align:left;padding:8px 16px;font-size:14px;font-weight:600;color:#1a1a2e;width:30%;background-color:#f8fafc}.api-info-table td{padding:8px 16px;font-size:14px;color:#64748b}.api-info-table td code{display:inline-block;padding:2px 8px;background-color:#f8fafc;border-radius:6px;font-family:"Courier New",monospace;font-size:12px;color:#4b9bff}.login-page{min-height:calc(100vh - 140px);display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg, var(--light-bg) 0%, var(--gray-bg) 100%);padding:40px 20px;position:relative;overflow:hidden}.login-page::before{content:"";position:absolute;top:-50%;right:-20%;width:600px;height:600px;background:radial-gradient(circle, var(--accent-cyan) 0%, transparent 70%);opacity:.1;border-radius:50%}.login-page::after{content:"";position:absolute;bottom:-30%;left:-10%;width:400px;height:400px;background:radial-gradient(circle, var(--primary-blue) 0%, transparent 70%);opacity:.1;border-radius:50%}.login-container{width:100%;max-width:480px;margin:0 auto;position:relative;z-index:1}.login-card{background:var(--white);border-radius:24px;box-shadow:var(--shadow-xl);padding:48px 40px;backdrop-filter:blur(10px);border:1px solid hsla(0,0%,100%,.8)}@media(max-width: 480px){.login-card{padding:32px 24px;border-radius:16px}}.login-header{text-align:center;margin-bottom:40px}.login-header .login-logo{display:inline-flex;align-items:center;gap:12px;margin-bottom:24px}.login-header .login-logo img{height:48px;width:auto}.login-header .login-logo .logo-text{font-size:20px;font-weight:700;color:var(--primary-blue);padding:6px 16px;background:var(--light-bg);border-radius:24px}.login-header .login-title{font-size:28px;font-weight:700;color:var(--text-dark);margin-bottom:8px}.login-header .login-subtitle{font-size:15px;color:var(--text-gray)}.login-form{margin-bottom:24px}.login-form .form-group{margin-bottom:20px}.login-form .form-group:last-child{margin-bottom:0}.login-form .form-label{display:block;font-size:14px;font-weight:600;color:var(--text-dark);margin-bottom:8px}.login-form .form-input{width:100%;padding:14px 16px;font-size:15px;border:2px solid var(--border-gray);border-radius:12px;background:var(--white);transition:all .3s ease;outline:none}.login-form .form-input::placeholder{color:var(--text-light)}.login-form .form-input:focus{border-color:var(--primary-blue);box-shadow:0 0 0 4px rgba(75,155,255,.1)}.login-form .form-input.error{border-color:var(--accent-orange)}.login-form .form-input.error:focus{box-shadow:0 0 0 4px rgba(255,107,107,.1)}.login-form .form-checkbox{display:flex;align-items:center;gap:8px;margin-top:16px}.login-form .form-checkbox input[type=checkbox]{width:18px;height:18px;accent-color:var(--primary-blue);cursor:pointer}.login-form .form-checkbox label{font-size:14px;color:var(--text-gray);cursor:pointer;user-select:none}.login-button{width:100%;padding:16px 24px;font-size:16px;font-weight:600;color:var(--white);background:var(--gradient-primary);border:none;border-radius:12px;cursor:pointer;transition:all .3s ease;box-shadow:var(--shadow-md)}.login-button:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}.login-button:active{transform:translateY(0)}.login-button:disabled{opacity:.6;cursor:not-allowed;transform:none}.login-links{display:flex;justify-content:center;align-items:center;gap:16px;margin-top:32px;padding-top:32px;border-top:1px solid var(--border-gray);flex-wrap:wrap}@media(max-width: 480px){.login-links{gap:12px;margin-top:24px;padding-top:24px}}.login-links a{font-size:14px;color:var(--text-gray);text-decoration:none;transition:color .3s ease;display:flex;align-items:center;gap:6px}.login-links a:hover{color:var(--primary-blue)}.login-links a i{font-size:16px}.login-links .link-separator{color:var(--border-gray);font-size:14px}.login-alert{margin-bottom:20px;padding:12px 16px;border-radius:8px;font-size:14px;display:flex;align-items:center;gap:8px}.login-alert.alert-error{background:rgba(255,107,107,.1);color:var(--accent-orange);border:1px solid rgba(255,107,107,.2)}.login-alert.alert-success{background:rgba(107,207,127,.1);color:var(--accent-green);border:1px solid rgba(107,207,127,.2)}.login-alert.alert-info{background:rgba(75,155,255,.1);color:var(--primary-blue);border:1px solid rgba(75,155,255,.2)}.login-alert i{font-size:18px}.login-loading{position:absolute;top:0;left:0;right:0;bottom:0;background:hsla(0,0%,100%,.9);display:flex;align-items:center;justify-content:center;border-radius:24px;z-index:10;opacity:0;pointer-events:none;transition:opacity .3s ease}.login-loading.active{opacity:1;pointer-events:all}.login-loading .spinner{width:40px;height:40px;border:3px solid var(--border-gray);border-top-color:var(--primary-blue);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.container{max-width:1280px;margin:0 auto;padding:0 24px}@media(max-width: 768px){.container{padding:0 16px}}.d-none{display:none !important}.d-block{display:block !important}.d-inline-block{display:inline-block !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-grid{display:grid !important}.flex-center{display:flex;justify-content:center;align-items:center}.flex-between{display:flex;justify-content:space-between;align-items:center}.flex-column{flex-direction:column}.flex-wrap{flex-wrap:wrap}.align-center{align-items:center}.align-start{align-items:flex-start}.align-end{align-items:flex-end}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-xs{gap:4px}.gap-sm{gap:8px}.gap-md{gap:16px}.gap-lg{gap:24px}.gap-xl{gap:32px}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mr-0{margin-right:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-xs{margin:4px !important}.mt-xs{margin-top:4px !important}.mb-xs{margin-bottom:4px !important}.ml-xs{margin-left:4px !important}.mr-xs{margin-right:4px !important}.mx-xs{margin-left:4px !important;margin-right:4px !important}.my-xs{margin-top:4px !important;margin-bottom:4px !important}.m-sm{margin:8px !important}.mt-sm{margin-top:8px !important}.mb-sm{margin-bottom:8px !important}.ml-sm{margin-left:8px !important}.mr-sm{margin-right:8px !important}.mx-sm{margin-left:8px !important;margin-right:8px !important}.my-sm{margin-top:8px !important;margin-bottom:8px !important}.m-md{margin:16px !important}.mt-md{margin-top:16px !important}.mb-md{margin-bottom:16px !important}.ml-md{margin-left:16px !important}.mr-md{margin-right:16px !important}.mx-md{margin-left:16px !important;margin-right:16px !important}.my-md{margin-top:16px !important;margin-bottom:16px !important}.m-lg{margin:24px !important}.mt-lg{margin-top:24px !important}.mb-lg{margin-bottom:24px !important}.ml-lg{margin-left:24px !important}.mr-lg{margin-right:24px !important}.mx-lg{margin-left:24px !important;margin-right:24px !important}.my-lg{margin-top:24px !important;margin-bottom:24px !important}.m-xl{margin:32px !important}.mt-xl{margin-top:32px !important}.mb-xl{margin-bottom:32px !important}.ml-xl{margin-left:32px !important}.mr-xl{margin-right:32px !important}.mx-xl{margin-left:32px !important;margin-right:32px !important}.my-xl{margin-top:32px !important;margin-bottom:32px !important}.m-2xl{margin:40px !important}.mt-2xl{margin-top:40px !important}.mb-2xl{margin-bottom:40px !important}.ml-2xl{margin-left:40px !important}.mr-2xl{margin-right:40px !important}.mx-2xl{margin-left:40px !important;margin-right:40px !important}.my-2xl{margin-top:40px !important;margin-bottom:40px !important}.m-3xl{margin:48px !important}.mt-3xl{margin-top:48px !important}.mb-3xl{margin-bottom:48px !important}.ml-3xl{margin-left:48px !important}.mr-3xl{margin-right:48px !important}.mx-3xl{margin-left:48px !important;margin-right:48px !important}.my-3xl{margin-top:48px !important;margin-bottom:48px !important}.m-4xl{margin:64px !important}.mt-4xl{margin-top:64px !important}.mb-4xl{margin-bottom:64px !important}.ml-4xl{margin-left:64px !important}.mr-4xl{margin-right:64px !important}.mx-4xl{margin-left:64px !important;margin-right:64px !important}.my-4xl{margin-top:64px !important;margin-bottom:64px !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mr-auto{margin-right:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.pr-0{padding-right:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-xs{padding:4px !important}.pt-xs{padding-top:4px !important}.pb-xs{padding-bottom:4px !important}.pl-xs{padding-left:4px !important}.pr-xs{padding-right:4px !important}.px-xs{padding-left:4px !important;padding-right:4px !important}.py-xs{padding-top:4px !important;padding-bottom:4px !important}.p-sm{padding:8px !important}.pt-sm{padding-top:8px !important}.pb-sm{padding-bottom:8px !important}.pl-sm{padding-left:8px !important}.pr-sm{padding-right:8px !important}.px-sm{padding-left:8px !important;padding-right:8px !important}.py-sm{padding-top:8px !important;padding-bottom:8px !important}.p-md{padding:16px !important}.pt-md{padding-top:16px !important}.pb-md{padding-bottom:16px !important}.pl-md{padding-left:16px !important}.pr-md{padding-right:16px !important}.px-md{padding-left:16px !important;padding-right:16px !important}.py-md{padding-top:16px !important;padding-bottom:16px !important}.p-lg{padding:24px !important}.pt-lg{padding-top:24px !important}.pb-lg{padding-bottom:24px !important}.pl-lg{padding-left:24px !important}.pr-lg{padding-right:24px !important}.px-lg{padding-left:24px !important;padding-right:24px !important}.py-lg{padding-top:24px !important;padding-bottom:24px !important}.p-xl{padding:32px !important}.pt-xl{padding-top:32px !important}.pb-xl{padding-bottom:32px !important}.pl-xl{padding-left:32px !important}.pr-xl{padding-right:32px !important}.px-xl{padding-left:32px !important;padding-right:32px !important}.py-xl{padding-top:32px !important;padding-bottom:32px !important}.p-2xl{padding:40px !important}.pt-2xl{padding-top:40px !important}.pb-2xl{padding-bottom:40px !important}.pl-2xl{padding-left:40px !important}.pr-2xl{padding-right:40px !important}.px-2xl{padding-left:40px !important;padding-right:40px !important}.py-2xl{padding-top:40px !important;padding-bottom:40px !important}.p-3xl{padding:48px !important}.pt-3xl{padding-top:48px !important}.pb-3xl{padding-bottom:48px !important}.pl-3xl{padding-left:48px !important}.pr-3xl{padding-right:48px !important}.px-3xl{padding-left:48px !important;padding-right:48px !important}.py-3xl{padding-top:48px !important;padding-bottom:48px !important}.p-4xl{padding:64px !important}.pt-4xl{padding-top:64px !important}.pb-4xl{padding-bottom:64px !important}.pl-4xl{padding-left:64px !important}.pr-4xl{padding-right:64px !important}.px-4xl{padding-left:64px !important;padding-right:64px !important}.py-4xl{padding-top:64px !important;padding-bottom:64px !important}.w-25{width:25%}.w-50{width:50%}.w-75{width:75%}.w-100{width:100%}.w-auto{width:auto}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.h-auto{height:auto}.vh-100{height:100vh}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.position-sticky{position:sticky}.bg-primary{background:#4b9bff}.bg-secondary{background:#2e7ff7}.bg-white{background:#fff}.bg-gray{background:#f8fafc}.bg-light{background:#eff6ff}.bg-gradient-primary{background:linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%)}.bg-gradient-accent{background:linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%)}.bg-gradient-warm{background:linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%)}.border{border:1px solid #e2e8f0}.border-0{border:none !important}.border-top{border-top:1px solid #e2e8f0}.border-bottom{border-bottom:1px solid #e2e8f0}.border-left{border-left:1px solid #e2e8f0}.border-right{border-right:1px solid #e2e8f0}.border-primary{border-color:#4b9bff}.rounded-0{border-radius:0}.rounded-sm{border-radius:6px}.rounded{border-radius:8px}.rounded-lg{border-radius:12px}.rounded-xl{border-radius:16px}.rounded-full{border-radius:50px}.rounded-circle{border-radius:50%}.shadow-none{box-shadow:none !important}.shadow-sm{box-shadow:0 2px 4px rgba(0,0,0,.05)}.shadow{box-shadow:0 4px 12px rgba(75,155,255,.1)}.shadow-lg{box-shadow:0 8px 24px rgba(75,155,255,.15)}.shadow-xl{box-shadow:0 16px 40px rgba(75,155,255,.2)}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}@media(max-width: 768px){.sm-hide{display:none !important}}@media(max-width: 1024px){.md-hide{display:none !important}}@media(min-width: 769px){.mobile-only{display:none !important}}@media(max-width: 768px){.desktop-only{display:none !important}}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-100{opacity:1}.transition{transition:all .3s ease}.transition-fast{transition:all .15s ease}.transition-slow{transition:all .5s ease}.transition-none{transition:none}/*# sourceMappingURL=main.min.css.map */ +*{margin:0;padding:0;box-sizing:border-box}html{font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}body{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;line-height:1.6;color:#1a1a2e;background-color:#fff;overflow-x:hidden}ul,ol{list-style:none}a{text-decoration:none;color:inherit;transition:all .3s ease}img{max-width:100%;height:auto;display:block}button{font-family:inherit;font-size:inherit;line-height:inherit;cursor:pointer;background:rgba(0,0,0,0);border:none;padding:0}input,textarea,select{font-family:inherit;font-size:inherit;line-height:inherit;border:none;outline:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.2}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}::selection{background-color:rgba(0,73,180,.2);color:#1a1a2e}::-moz-selection{background-color:rgba(0,73,180,.2);color:#1a1a2e}body{font-size:16px;font-weight:400;color:#1a1a2e}h1,.h1{font-size:56px;font-weight:800;margin-bottom:24px}@media(max-width: 768px){h1,.h1{font-size:40px}}@media(max-width: 480px){h1,.h1{font-size:32px}}h2,.h2{font-size:48px;font-weight:700;margin-bottom:16px}@media(max-width: 768px){h2,.h2{font-size:32px}}@media(max-width: 480px){h2,.h2{font-size:24px}}h3,.h3{font-size:40px;font-weight:700;margin-bottom:16px}@media(max-width: 768px){h3,.h3{font-size:24px}}h4,.h4{font-size:32px;font-weight:600;margin-bottom:8px}h5,.h5{font-size:24px;font-weight:600;margin-bottom:8px}h6,.h6{font-size:20px;font-weight:600;margin-bottom:8px}p{margin-bottom:16px;line-height:1.6}p:last-child{margin-bottom:0}.text-primary{color:#0049b4}.text-secondary{color:#c3dfea}.text-dark{color:#1a1a2e}.text-gray{color:#64748b}.text-light{color:#94a3b8}.text-white{color:#fff}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-regular{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.text-xs{font-size:12px}.text-sm{font-size:14px}.text-base{font-size:16px}.text-lg{font-size:20px}.text-xl{font-size:24px}.lead{font-size:20px;font-weight:400;line-height:1.8;color:#64748b}.caption{font-size:14px;color:#64748b}.code{font-family:"Fira Code","Courier New",monospace;font-size:14px;background:#f8fafc;padding:2px 6px;border-radius:6px}a{color:#0049b4}a:hover{color:#c3dfea}blockquote{padding:16px;margin:16px 0;border-left:4px solid #0049b4;background:#f8fafc;font-style:italic}blockquote p{margin-bottom:0}hr{border:none;border-top:1px solid #e2e8f0;margin:32px 0}@keyframes float{0%,100%{transform:translateY(0) rotate(0deg)}50%{transform:translateY(-30px) rotate(10deg)}}@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes slideInDown{from{opacity:0;transform:translateY(-30px)}to{opacity:1;transform:translateY(0)}}@keyframes slideInUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@keyframes slideInLeft{from{opacity:0;transform:translateX(-30px)}to{opacity:1;transform:translateX(0)}}@keyframes slideInRight{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeInScale{from{opacity:0;transform:scale(0.9)}to{opacity:1;transform:scale(1)}}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.05)}100%{transform:scale(1)}}@keyframes shimmer{0%{transform:translateX(-100%) rotate(45deg)}100%{transform:translateX(100%) rotate(45deg)}}@keyframes wave{0%{transform:rotate(0deg)}10%{transform:rotate(14deg)}20%{transform:rotate(-8deg)}30%{transform:rotate(14deg)}40%{transform:rotate(-4deg)}50%{transform:rotate(10deg)}60%{transform:rotate(0deg)}100%{transform:rotate(0deg)}}@keyframes popIn{0%{opacity:0;transform:scale(0.5)}80%{transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}@keyframes popupFadeIn{from{opacity:0;transform:scale(0.95)}to{opacity:1;transform:scale(1)}}@keyframes ripple{0%{transform:scale(0);opacity:1}100%{transform:scale(4);opacity:0}}@keyframes gradientShift{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}.animate-float{animation:float 20s ease-in-out infinite}.animate-bounce{animation:bounce 2s infinite}.animate-spin{animation:spin 1s linear infinite}.animate-pulse{animation:pulse 2s ease-in-out infinite}.animate-fade-in{animation:fadeIn .6s ease-out}.animate-slide-up{animation:slideInUp .8s ease-out}.animate-slide-down{animation:slideInDown .6s ease-out}.animate-pop{animation:popIn .5s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.delay-1{animation-delay:.1s}.delay-2{animation-delay:.2s}.delay-3{animation-delay:.3s}.delay-4{animation-delay:.4s}.delay-5{animation-delay:.5s}.duration-fast{animation-duration:.3s}.duration-normal{animation-duration:.6s}.duration-slow{animation-duration:1s}.duration-slower{animation-duration:2s}.hover-grow{transition:transform .3s ease}.hover-grow:hover{transform:scale(1.05)}.hover-lift{transition:transform .3s ease,box-shadow .3s ease}.hover-lift:hover{transform:translateY(-5px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.hover-rotate{transition:transform .3s ease}.hover-rotate:hover{transform:rotate(5deg)}.hover-shine{position:relative;overflow:hidden}.hover-shine::before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;transform:rotate(45deg);transition:transform .6s ease;transform:translateX(-200%)}.hover-shine:hover::before{transform:translateX(200%) rotate(45deg)}:root{--primary-blue: #4B9BFF;--secondary-blue: #2E7FF7;--accent-cyan: #00D4FF;--accent-yellow: #FFD93D;--accent-orange: #FF6B6B;--accent-green: #6BCF7F;--accent-purple: #A78BFA;--text-dark: #1A1A2E;--text-gray: #64748B;--text-light: #94A3B8;--white: #FFFFFF;--gray-bg: #F8FAFC;--light-bg: #EFF6FF;--border-gray: #E2E8F0;--shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05);--shadow-md: 0 4px 12px rgba(75, 155, 255, 0.1);--shadow-lg: 0 8px 24px rgba(75, 155, 255, 0.15);--shadow-xl: 0 16px 40px rgba(75, 155, 255, 0.2)}.blind{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.global-header{position:fixed;top:0;left:0;right:0;background-color:#fff;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);z-index:1000;height:112px;transition:all .3s ease;border-bottom:1px solid #ddd}.header-content{display:flex;align-items:center;justify-content:space-between;height:65px;max-width:1920px;margin:0 auto;padding:0 20px;margin-top:20px}.header-left{display:flex;align-items:center}.header-left .logo{height:22px;width:114px}.logo-wrapper{display:flex;align-items:center;gap:12px}.logo{display:flex;align-items:center;gap:12px;height:22px;z-index:10}.logo a{display:flex;align-items:center;gap:12px;height:100%;text-decoration:none}.logo img{height:22px;width:114px}.logo-text{font-size:16px;font-weight:700;color:var(--text-dark);text-decoration:none;display:inline-block;transition:all .3s ease}.logo-text:hover{color:var(--primary-blue)}.logo-text:visited{color:var(--text-dark)}.logo-link,.mobile-logo-link,.drawer-logo-link{display:inline-block;text-decoration:none;transition:transform .3s ease}.logo-link:hover,.mobile-logo-link:hover,.drawer-logo-link:hover{transform:scale(1.05)}.logo-link img,.mobile-logo-link img,.drawer-logo-link img{display:block}.header-right{display:flex;align-items:center;gap:16px}.search-btn{width:40px;height:40px;background:var(--gray-bg);border:none;border-radius:50%;cursor:pointer;font-size:16px;color:var(--text-gray);transition:all .3s ease}.search-btn:hover{background:var(--light-bg);color:var(--primary-blue);transform:scale(1.1)}.desktop-header{display:flex;align-items:center;justify-content:space-between;width:100%}@media(max-width: 768px){.desktop-header{display:none}}.mobile-header{display:none;align-items:center;justify-content:space-between;width:100%}@media(max-width: 768px){.mobile-header{display:flex}}.mobile-left .mobile-logo{height:32px;width:auto}.mobile-center{flex:1;text-align:center}.mobile-center .mobile-title{font-size:18px;font-weight:700;color:var(--text-dark);margin:0}.mobile-right .mobile-menu-btn{width:40px;height:40px;background:rgba(0,0,0,0);border:none;cursor:pointer;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:4px;padding:8px;border-radius:8px;transition:background-color .3s ease}.mobile-right .mobile-menu-btn:hover{background:var(--gray-bg)}.mobile-right .mobile-menu-btn .hamburger-line{width:24px;height:2px;background:var(--text-dark);transition:all .3s ease;border-radius:1px}.mobile-right .mobile-menu-btn.active .hamburger-line:nth-child(1){transform:rotate(45deg) translateY(6px)}.mobile-right .mobile-menu-btn.active .hamburger-line:nth-child(2){opacity:0}.mobile-right .mobile-menu-btn.active .hamburger-line:nth-child(3){transform:rotate(-45deg) translateY(-6px)}.mobile-drawer{position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999;visibility:hidden;opacity:0;transition:all .3s ease}.mobile-drawer.active{visibility:visible;opacity:1}.mobile-drawer.active .drawer-content{transform:translateY(0)}.mobile-drawer .drawer-overlay{display:none}.mobile-drawer .drawer-content{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;background:var(--white);transform:translateY(100%);transition:transform .3s ease;display:flex;flex-direction:column}.mobile-drawer .drawer-header{display:flex;align-items:center;justify-content:space-between;padding:20px;border-bottom:2px solid var(--border-gray);background:var(--white);box-shadow:var(--shadow-sm);min-height:60px}.mobile-drawer .drawer-header .drawer-logo{display:flex;align-items:center;gap:12px}.mobile-drawer .drawer-header .drawer-logo .logo{height:32px;width:auto}.mobile-drawer .drawer-header .drawer-logo .logo-text{font-size:16px;font-weight:700;color:var(--primary-blue)}.mobile-drawer .drawer-header .drawer-close{width:40px;height:40px;background:rgba(0,0,0,0);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:8px;font-size:18px;color:var(--text-gray);transition:all .3s ease}.mobile-drawer .drawer-header .drawer-close:hover{background:var(--white);color:var(--text-dark)}.mobile-drawer .drawer-nav{flex:1;padding:0;overflow-y:auto;background:var(--white)}.mobile-drawer .drawer-nav .drawer-menu{list-style:none;margin:0;padding:20px 0}.mobile-drawer .drawer-nav .drawer-menu li{margin-bottom:8px}.mobile-drawer .drawer-nav .drawer-menu li .drawer-link{display:block;padding:16px 24px;margin:0 20px;color:var(--text-dark);text-decoration:none;font-size:18px;font-weight:500;border-radius:12px;transition:all .3s ease}.mobile-drawer .drawer-nav .drawer-menu li .drawer-link:hover,.mobile-drawer .drawer-nav .drawer-menu li .drawer-link:active{background:var(--light-bg);color:var(--primary-blue);transform:translateX(4px);box-shadow:var(--shadow-sm)}.mobile-drawer .drawer-actions{padding:24px;border-top:2px solid var(--border-gray);background:var(--white);box-shadow:0 -4px 12px rgba(0,0,0,.05)}.mobile-drawer .drawer-actions .drawer-login-btn{display:block;text-align:center;padding:14px 20px;color:var(--text-dark);text-decoration:none;border:2px solid var(--primary-blue);border-radius:12px;font-weight:600;font-size:16px;margin-bottom:12px;transition:all .3s ease}.mobile-drawer .drawer-actions .drawer-login-btn:hover{background:var(--light-bg);color:var(--primary-blue)}.mobile-drawer .drawer-actions .drawer-signup-btn{display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 20px;color:var(--white);text-decoration:none;border-radius:12px;font-weight:600;font-size:16px;margin-bottom:12px;transition:all .3s ease;box-shadow:var(--shadow-md)}.mobile-drawer .drawer-actions .drawer-signup-btn:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}.mobile-drawer .drawer-actions .drawer-search-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px 20px;background:var(--gray-bg);color:var(--text-dark);border:none;border-radius:12px;font-weight:500;font-size:16px;cursor:pointer;transition:all .3s ease}.mobile-drawer .drawer-actions .drawer-search-btn:hover{background:var(--light-bg);color:var(--primary-blue)}.btn-mobilemenu{position:absolute;right:16px;top:50%;transform:translateY(-50%);width:40px;height:40px;background:rgba(0,0,0,0);border:none;cursor:pointer;padding:8px;z-index:501}.btn-mobilemenu span{display:block;width:24px;height:2px;background:#1a1a2e;position:relative;transition:all all .15s ease;text-indent:-9999px}.btn-mobilemenu span::before,.btn-mobilemenu span::after{content:"";position:absolute;left:0;width:24px;height:2px;background:#1a1a2e;transition:all all .15s ease}.btn-mobilemenu span::before{top:-8px}.btn-mobilemenu span::after{top:8px}.btn-mobilemenu.on span{background:rgba(0,0,0,0)}.btn-mobilemenu.on span::before{top:0;transform:rotate(45deg)}.btn-mobilemenu.on span::after{top:0;transform:rotate(-45deg)}.main-nav.m-nav{position:fixed;top:0;left:0;right:0;bottom:0;background:#fff;z-index:500;right:-100%;transition:none;overflow-y:auto;display:flex;flex-direction:column}.main-nav.m-nav .nav-header{padding:24px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.main-nav.m-nav .nav-list{list-style:none;margin:0;padding:0;flex-grow:1}.main-nav.m-nav .nav-list .nav-item{border-bottom:1px solid #e2e8f0}.main-nav.m-nav .nav-list .nav-item>a{display:flex;align-items:center;padding:24px;color:#1a1a2e;font-size:18px;font-weight:500;text-decoration:none;position:relative}.main-nav.m-nav .nav-list .nav-item.has-submenu>a::after{content:"";position:absolute;right:24px;top:50%;width:8px;height:8px;border-right:2px solid #64748b;border-bottom:2px solid #64748b;transform:translateY(-50%) rotate(45deg);transition:transform all .15s ease}.main-nav.m-nav .nav-list .nav-item.expanded>a::after{transform:translateY(-25%) rotate(-135deg)}.main-nav.m-nav .nav-list .nav-item .sub-menu{display:none;list-style:none;padding:0;margin:0;background:#f8fafc}.main-nav.m-nav .nav-list .nav-item .sub-menu a{display:block;padding:16px 24px 16px 48px;color:#64748b;font-size:14px;text-decoration:none}.main-nav.m-nav .nav-list .nav-item .sub-menu a:hover{background:#fff;color:#0049b4}.main-nav.m-nav .nav-list .nav-item.expanded .sub-menu{display:block}.main-nav.m-nav .info_wrap{padding:32px 24px;background:#fff;border-top:1px solid #e2e8f0;margin-top:auto}.nav-menu{display:flex;list-style:none;gap:8px;margin:0;padding:0}.nav-menu>li{position:relative}.nav-menu>li.submenu-open>.nav-link{background:var(--light-bg);color:var(--primary-blue)}.nav-menu>li.submenu-open .sub-menu{visibility:visible;opacity:1;transform:translateY(0)}.nav-menu>li .sub-menu{position:absolute;top:calc(100% + 8px);left:0;min-width:200px;background:var(--white);border:1px solid var(--border-gray);border-radius:12px;box-shadow:var(--shadow-xl);padding:8px 0;visibility:hidden;opacity:0;transform:translateY(-10px);transition:all .3s ease;z-index:100;list-style:none;margin:0}.nav-menu>li .sub-menu li{margin:0}.nav-menu>li .sub-menu li a{display:block;padding:8px 24px;color:var(--text-dark);text-decoration:none;font-size:14px;font-weight:500;transition:all .3s ease}.nav-menu>li .sub-menu li a:hover{background:var(--light-bg);color:var(--primary-blue)}.nav-link{display:flex;align-items:center;gap:6px;text-decoration:none;color:var(--text-dark);font-weight:500;font-size:15px;padding:8px 16px;border-radius:8px;transition:all .3s ease}.nav-link:hover{color:var(--primary-blue)}.nav-icon{font-size:18px}.signup-btn{display:flex;align-items:center;gap:8px;text-decoration:none;color:var(--white);padding:12px 24px;border-radius:50px;font-weight:600;transition:all .3s ease;box-shadow:var(--shadow-md)}.signup-btn:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}body{padding-top:112px}@media(max-width: 768px){.global-header{height:90px}.global-header .container .header-content{padding:0 16px;height:60px}body{padding-top:60px}}@media(max-width: 480px){.global-header .header-content{padding:0 12px}.logo .logo-text{display:none}}.header-user-info{display:flex;align-items:center;gap:6px;padding:4px 6px;border-radius:6px}.header-user-info .user-identity{display:flex;align-items:center;gap:2px}.header-user-info .user-identity .user-icon{width:16px;height:18px;display:block}.header-user-info .user-identity .user-name{font-family:"Noto Sans CJK KR",sans-serif;font-size:16px;font-weight:400;color:#515961;white-space:nowrap}.header-user-info .divider{font-size:8px;color:var(--text-gray);line-height:1}.header-user-info .header-link{font-family:"Noto Sans CJK KR",sans-serif;font-size:16px;font-weight:400;color:#515961;text-decoration:none;white-space:nowrap;background:none;border:none;padding:0;cursor:pointer;transition:color .3s ease}.header-user-info .header-link:hover{color:var(--primary-blue)}.header-user-info .mypage-dropdown{position:relative}.header-user-info .mypage-dropdown .mypage-toggle{display:flex;align-items:center;gap:4px}.header-user-info .mypage-dropdown .mypage-dropdown-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:200px;background:var(--white);border:1px solid var(--border-gray);border-radius:12px;box-shadow:var(--shadow-xl);padding:8px 0;visibility:hidden;opacity:0;transform:translateY(-10px);transition:all .3s ease;z-index:100}.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list{list-style:none;margin:0;padding:0}.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li{margin:0}.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li a{display:flex;align-items:center;gap:8px;padding:8px 24px;color:var(--text-dark);text-decoration:none;font-size:14px;font-weight:500;transition:all .3s ease}.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li a i{font-size:14px;width:16px;text-align:center}.header-user-info .mypage-dropdown .mypage-dropdown-menu .mypage-menu-list li a:hover{background:var(--light-bg);color:var(--primary-blue)}.header-user-info .mypage-dropdown.active .mypage-dropdown-menu{visibility:visible;opacity:1;transform:translateY(0)}@media(max-width: 768px){.header-user-info{display:none}}.global-footer{background:#fff;border-top:1px solid #e5e7eb}.global-footer .container{max-width:1200px;margin:0 auto;padding:0 20px}.footer-content{display:flex;justify-content:space-between;align-items:center;min-height:200px;padding:40px 0;gap:40px}@media(max-width: 1024px){.footer-content{flex-direction:column;align-items:flex-start;gap:32px;padding:32px 0}}.footer-left{display:flex;flex-direction:column;gap:16px}.footer-left .footer-logo{width:114px;height:auto;object-fit:contain}.footer-left .footer-links{display:flex;align-items:center;gap:8px}.footer-left .footer-links .footer-link{font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#5f666c;text-decoration:none;transition:color .3s ease}.footer-left .footer-links .footer-link:hover{color:#0049b4;text-decoration:underline}.footer-left .footer-links .footer-separator{color:#d1d5db;font-size:16px;user-select:none}.footer-left .footer-copyright{font-family:"Noto Sans KR",sans-serif;font-size:14px;font-weight:400;color:#9ca3af;margin:0;line-height:1.5}.footer-right{display:flex;flex-direction:column;gap:16px;align-items:flex-end}@media(max-width: 1024px){.footer-right{align-items:flex-start;width:100%}}.footer-right .footer-related-sites .related-sites-select{width:240px;height:44px;padding:0 16px;font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#5f666c;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .3s ease;appearance:none;background-image:url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L6 6L11 1' stroke='%235F666C' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 16px center;padding-right:40px}.footer-right .footer-related-sites .related-sites-select:hover{border-color:#0049b4}.footer-right .footer-related-sites .related-sites-select:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}@media(max-width: 1024px){.footer-right .footer-related-sites .related-sites-select{width:100%}}.footer-right .footer-contact{font-family:"Noto Sans KR",sans-serif;font-size:30px;font-weight:700;color:#1f2937;margin:0;line-height:1.2}@media(max-width: 1024px){.footer-right .footer-contact{font-size:24px}}@media(max-width: 576px){.footer-content{padding:24px 0;gap:24px}.footer-left{gap:12px}.footer-left .footer-logo{width:90px}.footer-left .footer-links{flex-wrap:wrap;gap:6px}.footer-left .footer-links .footer-link,.footer-left .footer-links .footer-separator{font-size:14px}.footer-left .footer-copyright{font-size:12px}.footer-right{gap:12px}.footer-right .footer-contact{font-size:20px}}.grid{display:grid;gap:24px}.grid-cols-1{grid-template-columns:1fr}.grid-cols-2{grid-template-columns:repeat(2, 1fr)}.grid-cols-3{grid-template-columns:repeat(3, 1fr)}.grid-cols-4{grid-template-columns:repeat(4, 1fr)}.grid-cols-5{grid-template-columns:repeat(5, 1fr)}.grid-cols-6{grid-template-columns:repeat(6, 1fr)}.grid-cols-12{grid-template-columns:repeat(12, 1fr)}.grid-auto{grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))}.grid-auto-sm{grid-template-columns:repeat(auto-fit, minmax(200px, 1fr))}.grid-auto-lg{grid-template-columns:repeat(auto-fit, minmax(350px, 1fr))}.grid.gap-0{gap:0}.grid.gap-sm{gap:8px}.grid.gap-md{gap:16px}.grid.gap-lg{gap:24px}.grid.gap-xl{gap:32px}@media(max-width: 1024px){.grid-md-cols-1{grid-template-columns:1fr}.grid-md-cols-2{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.grid-sm-cols-1{grid-template-columns:1fr}.grid-sm-cols-2{grid-template-columns:repeat(2, 1fr)}}.col-span-1{grid-column:span 1}.col-span-2{grid-column:span 2}.col-span-3{grid-column:span 3}.col-span-4{grid-column:span 4}.col-span-5{grid-column:span 5}.col-span-6{grid-column:span 6}.col-span-full{grid-column:1/-1}.row-span-1{grid-row:span 1}.row-span-2{grid-row:span 2}.row-span-3{grid-row:span 3}.api-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:24px}@media(max-width: 1024px){.api-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.api-grid{grid-template-columns:1fr}}.experience-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));gap:24px}@media(max-width: 768px){.experience-grid{grid-template-columns:1fr}}.partners-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));gap:40px;align-items:center}@media(max-width: 768px){.partners-grid{grid-template-columns:repeat(2, 1fr)}}.feature-grid{display:grid;grid-template-columns:repeat(2, 1fr);gap:32px}@media(max-width: 768px){.feature-grid{grid-template-columns:1fr}}.demo-wrapper{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:start}@media(max-width: 1024px){.demo-wrapper{grid-template-columns:1fr}}.footer-grid{display:grid;grid-template-columns:2fr 3fr;gap:80px}@media(max-width: 1024px){.footer-grid{grid-template-columns:1fr;gap:40px}}.footer-grid .footer-links{display:grid;grid-template-columns:repeat(4, 1fr);gap:40px}@media(max-width: 1024px){.footer-grid .footer-links{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.footer-grid .footer-links{grid-template-columns:1fr;text-align:center}}.pricing-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:24px;align-items:center}@media(max-width: 1024px){.pricing-grid{grid-template-columns:1fr;gap:32px}}.testimonial-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(350px, 1fr));gap:24px}@media(max-width: 768px){.testimonial-grid{grid-template-columns:1fr}}.stats-grid{display:grid;grid-template-columns:repeat(4, 1fr);gap:32px;text-align:center}@media(max-width: 1024px){.stats-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.stats-grid{grid-template-columns:1fr}}.two-column{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:center}@media(max-width: 1024px){.two-column{grid-template-columns:1fr;gap:32px}}.two-column.reverse{direction:rtl}.two-column.reverse>*{direction:ltr}@media(max-width: 1024px){.two-column.reverse{direction:ltr}}.three-column{display:grid;grid-template-columns:repeat(3, 1fr);gap:32px}@media(max-width: 1024px){.three-column{grid-template-columns:1fr}}.container{max-width:1280px;margin:0 auto;padding:0 24px}@media(max-width: 768px){.container{padding:0 16px}}.container-fluid{max-width:100%;padding:0 24px}.container-narrow{max-width:960px}.container-wide{max-width:1440px}.section{padding:100px 0}@media(max-width: 768px){.section{padding:64px 0}}.section-sm{padding:48px 0}.section-lg{padding:150px 0}.section-no-top{padding-top:0}.section-no-bottom{padding-bottom:0}.section-bg-gray{background:#f8fafc}.section-bg-light{background:#eff6ff}.section-bg-primary{color:#fff}.section-bg-dark{background:#1a1a2e;color:#fff}.section-header{text-align:center;margin-bottom:64px}@media(max-width: 768px){.section-header{margin-bottom:48px}}.section-header .section-badge{display:inline-flex;align-items:center;gap:4px;padding:4px 16px;background:#eff6ff;color:#0049b4;border-radius:50px;font-size:14px;font-weight:600;margin-bottom:16px}.section-header .section-title{font-size:40px;font-weight:700;margin-bottom:16px;color:#1a1a2e}@media(max-width: 768px){.section-header .section-title{font-size:32px}}.section-header .section-subtitle{font-size:18px;color:#64748b;line-height:1.6;max-width:600px;margin:0 auto}@media(max-width: 768px){.section-header .section-subtitle{font-size:16px}}.content-wrapper{position:relative;min-height:100vh;display:flex;flex-direction:column}.content-wrapper .main-content{flex:1;padding-top:80px}.page-wrapper{position:relative;overflow:hidden}.inner-content{position:relative;z-index:1}.btn{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.btn:hover{transform:translateY(-3px)}.btn{position:relative;overflow:hidden}.btn-sm{padding:8px 16px;font-size:14px}.btn-md{padding:16px 24px;font-size:16px}.btn-lg{padding:16px 32px;font-size:18px}.btn-xl{padding:24px 40px;font-size:20px}.btn-primary{background:#0049b4;color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-primary:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-primary:active{transform:translateY(-1px)}.btn-secondary{background:#e5e7eb;color:#5f666c}.btn-secondary:hover{background:#eff6ff;transform:translateY(-3px)}.btn-accent{color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-accent:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-warm{color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-warm:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-success{background:#6bcf7f;color:#fff}.btn-success:hover{background:hsl(132,51.0204081633%,51.568627451%);transform:translateY(-3px)}.btn-danger{background:#ff6b6b;color:#fff}.btn-danger:hover{background:#ff3838;transform:translateY(-3px)}.btn-ghost{background:rgba(0,0,0,0);color:#0049b4;border:2px solid rgba(0,0,0,0)}.btn-ghost:hover{background:rgba(0,73,180,.1);border-color:#0049b4}.btn-outline{background:rgba(0,0,0,0);color:#1a1a2e;border:2px solid #e2e8f0}.btn-outline:hover{border-color:#0049b4;color:#0049b4;transform:translateY(-3px)}.btn:disabled,.btn.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.btn.loading{color:rgba(0,0,0,0);pointer-events:none}.btn.loading::after{content:"";position:absolute;width:16px;height:16px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);border:2px solid #fff;border-radius:50%;border-top-color:rgba(0,0,0,0);animation:spin .6s linear infinite}.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border-radius:50%}.btn-icon.btn-sm{width:32px;height:32px}.btn-icon.btn-lg{width:56px;height:56px}.btn-block{width:100%;justify-content:center}.btn-group{display:inline-flex;gap:-1px}.btn-group .btn{border-radius:0}.btn-group .btn:first-child{border-top-left-radius:12px;border-bottom-left-radius:12px}.btn-group .btn:last-child{border-top-right-radius:12px;border-bottom-right-radius:12px}.fab{position:fixed;bottom:32px;right:32px;width:60px;height:60px;border:none;border-radius:50%;color:#fff;font-size:24px;cursor:pointer;box-shadow:0 8px 24px rgba(75,155,255,.15);transition:all .3s ease;z-index:300;display:flex;justify-content:center;align-items:center}.fab:hover{transform:scale(1.1);box-shadow:0 16px 40px rgba(75,155,255,.2)}.fab:hover .fab-label{opacity:1;transform:translateX(-10px)}.fab .fab-label{position:absolute;right:70px;top:50%;transform:translateY(-50%);background:#1a1a2e;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;white-space:nowrap;opacity:0;transition:all .3s ease;pointer-events:none}.btn-cta-primary{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.btn-cta-primary:hover{transform:translateY(-3px)}.btn-cta-primary{background:#fff;color:#0049b4;padding:16px 40px;font-size:18px;box-shadow:0 8px 24px rgba(75,155,255,.15)}.btn-cta-primary:hover{transform:translateY(-3px);box-shadow:0 16px 40px rgba(75,155,255,.2)}.btn-cta-secondary{display:inline-flex;align-items:center;gap:8px;padding:16px 32px;border-radius:12px;font-weight:600;font-size:16px;text-decoration:none;transition:all .3s ease;cursor:pointer;border:none}.btn-cta-secondary:hover{transform:translateY(-3px)}.btn-cta-secondary{background:rgba(0,0,0,0);color:#fff;border:2px solid #fff;padding:16px 40px;font-size:18px}.btn-cta-secondary:hover{background:hsla(0,0%,100%,.1);transform:translateY(-3px)}.action-btn,.action-btn-new,.action-btn-primary,.action-btn-secondary,.action-btn-edit,.action-btn-delete{padding:16px 40px;border-radius:8px;font-size:16px;font-weight:500;text-decoration:none;transition:all .3s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;cursor:pointer;border:none}@media(max-width: 768px){.action-btn,.action-btn-new,.action-btn-primary,.action-btn-secondary,.action-btn-edit,.action-btn-delete{padding:16px 24px;font-size:14px}}.action-btn i,.action-btn-new i,.action-btn-primary i,.action-btn-secondary i,.action-btn-edit i,.action-btn-delete i{font-size:16px}.action-btn-new,.action-btn-primary{color:#fff}.action-btn-new:hover,.action-btn-primary:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.action-btn-new:active,.action-btn-primary:active{transform:translateY(0)}.action-btn-secondary{background:#fff;color:#1a1a2e;border:1px solid #e2e8f0}.action-btn-secondary:hover{background:#f8fafc;border-color:#0049b4;color:#0049b4}.action-btn-secondary:active{transform:scale(0.98)}.action-btn-edit{background:#0049b4;color:#fff}.action-btn-edit:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1);background:#c3dfea}.action-btn-edit:active{transform:translateY(0)}.action-btn-delete{background:#ff6b6b;color:#fff}.action-btn-delete:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1);background:rgb(255,81.5,81.5)}.action-btn-delete:active{transform:translateY(0)}.action-btn.btn-list{background:#fff;color:#1a1a2e;border:1px solid #e2e8f0}.action-btn.btn-list:hover{background:#f8fafc;border-color:#0049b4;color:#0049b4}.action-btn.btn-edit{color:#fff}.action-btn.btn-edit:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.action-btn.btn-delete{background:#ff6b6b;color:#fff}.action-btn.btn-delete:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-copy{padding:8px 16px;background:rgba(0,73,180,.1);color:#0049b4;border:1px solid rgba(0,73,180,.2);border-radius:6px;font-size:12px;font-weight:500;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:4px}.btn-copy:hover{background:rgba(0,73,180,.2);border-color:#0049b4}.btn-copy i{font-size:12px}.btn-action{padding:8px 24px;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:4px}.btn-action:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-action i{font-size:14px}.btn-cancel{padding:8px 24px;background:#fff;color:#64748b;border:1px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;gap:4px}.btn-cancel:hover{border-color:#0049b4;color:#0049b4}.btn-cancel i{font-size:14px}.btn-input-action{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;min-width:172px;height:60px;padding:10px 24px;border:none;border-radius:12px;font-size:20px;font-weight:700;color:#fff;cursor:pointer;transition:all .3s ease;white-space:nowrap}.btn-input-action.btn-change{background:#a4d6ea}.btn-input-action.btn-change:hover{background:rgb(122.5625,195.3303571429,224.4375);transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-input-action.btn-change:active{transform:translateY(0)}.btn-input-action.btn-auth{background:#a4d6ea}.btn-input-action.btn-auth:hover{background:#c3dfea;transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.btn-input-action.btn-auth:active{transform:translateY(0)}.btn-input-action.btn-auth:disabled{background:#e2e8f0;cursor:not-allowed;transform:none;box-shadow:none}@media(max-width: 768px){.btn-input-action{width:100%;min-width:auto;height:52px;font-size:16px}}.btn-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:60px;padding:10px 24px;background-color:#3ba4ed;color:#fff;border:none;border-radius:12px;font-size:18px;font-weight:700;cursor:pointer;transition:background-color .2s ease}.btn-upload:hover{background-color:#2b94dd}@media(max-width: 1024px){.btn-upload{font-size:16px;height:50px}}.status-badge{display:inline-flex;align-items:center;justify-content:center;padding:4px 16px;border-radius:50px;font-size:12px;font-weight:600;white-space:nowrap;transition:all .3s ease}.status-badge.status-pending{background:rgba(255,107,107,.1);color:#ff6b6b}.status-badge.status-completed{background:rgba(107,207,127,.1);color:#6bcf7f}.status-badge.status-active{background:rgba(0,73,180,.1);color:#0049b4}.status-badge.status-inactive{background:rgba(100,116,139,.1);color:#64748b}.status-badge.status-processing{background:rgba(255,217,61,.1);color:rgb(163,131.0721649485,0)}.status-badge.status-failed{background:rgba(255,107,107,.1);color:#ff6b6b}.status-badge.status-success{background:rgba(107,207,127,.1);color:#6bcf7f}.status-badge-header{display:inline-flex;align-items:center;justify-content:center;padding:4px 16px;border-radius:50px;font-size:12px;font-weight:600;margin-bottom:16px;transition:all .3s ease}.status-badge-header.status-pending{background:rgba(255,107,107,.1);color:#ff6b6b}.status-badge-header.status-completed{background:rgba(107,207,127,.1);color:#6bcf7f}.status-badge-header.status-active{background:rgba(0,73,180,.1);color:#0049b4}.status-badge-header.status-inactive{background:rgba(100,116,139,.1);color:#64748b}.status-badge-header.status-processing{background:rgba(255,217,61,.1);color:rgb(163,131.0721649485,0)}.badge-sm{padding:2px 8px;font-size:10px;border-radius:6px}.badge-lg{padding:8px 24px;font-size:14px;border-radius:8px}.badge-outline{background:rgba(0,0,0,0);border:1px solid currentColor}.badge-outline.status-pending{color:#ff6b6b;border-color:#ff6b6b}.badge-outline.status-completed{color:#6bcf7f;border-color:#6bcf7f}.badge-outline.status-active{color:#0049b4;border-color:#0049b4}.badge-outline.status-inactive{color:#64748b;border-color:#64748b}.badge-icon i{margin-right:4px;font-size:.9em}.notification-badge{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 4px;background:#ff6b6b;color:#fff;border-radius:50%;font-size:11px;font-weight:700;line-height:1}.notification-badge.badge-primary{background:#0049b4}.notification-badge.badge-success{background:#6bcf7f}.notification-badge.badge-warning{background:#ffd93d;color:#1a1a2e}.notification-badge.badge-danger{background:#ff6b6b}.card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15)}.card{position:relative;overflow:hidden}.api-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.api-card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15)}.api-card{text-align:center;border:2px solid #e2e8f0}.api-card:hover{border-color:#0049b4}.api-card-popular{border-color:#ffd93d}.api-card-new{border-color:#6bcf7f}.api-card .api-badge{position:absolute;top:-12px;right:20px;padding:4px 16px;background:#ffd93d;color:#1a1a2e;border-radius:20px;font-size:12px;font-weight:700;text-transform:uppercase}.api-card .api-badge.new{background:#6bcf7f;color:#fff}.api-card .api-badge.beta{background:#a78bfa;color:#fff}.api-card .api-icon{width:60px;height:60px;margin:0 auto 24px;display:flex;justify-content:center;align-items:center;font-size:28px;background:#eff6ff;color:#0049b4;border-radius:16px;transition:all .3s ease}.api-card:hover .api-icon{transform:scale(1.1);color:#fff}.api-card .api-name{font-size:20px;font-weight:700;margin-bottom:16px;color:#1a1a2e}.api-card .api-description{color:#64748b;line-height:1.6;margin-bottom:24px;font-size:14px}.api-card .api-features{display:flex;justify-content:center;gap:8px;margin-bottom:24px;flex-wrap:wrap}.api-card .api-features .feature-tag{padding:4px 8px;background:#f8fafc;color:#64748b;border-radius:20px;font-size:12px;font-weight:500}.api-card .api-link{display:inline-flex;align-items:center;gap:4px;color:#0049b4;font-weight:600;font-size:14px;transition:all .3s ease}.api-card .api-link:hover{gap:8px;color:#c3dfea}.experience-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.experience-card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15)}.experience-card{text-align:center}.experience-card .card-icon{width:56px;height:56px;margin:0 auto 24px;display:flex;justify-content:center;align-items:center;font-size:24px;color:#fff;border-radius:16px}.experience-card h3{font-size:20px;font-weight:700;margin-bottom:16px;color:#1a1a2e}.experience-card p{color:#64748b;line-height:1.6;margin-bottom:24px;font-size:14px}.experience-card .card-metric{display:flex;flex-direction:column;align-items:center;padding-top:24px;border-top:1px solid #e2e8f0}.experience-card .card-metric .metric-value{font-size:24px;font-weight:800;color:#0049b4}.experience-card .card-metric .metric-label{font-size:12px;color:#64748b;font-weight:500}.feature-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.feature-card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15)}.feature-card{display:flex;align-items:flex-start;gap:24px}.feature-card .feature-icon{flex-shrink:0;width:48px;height:48px;display:flex;justify-content:center;align-items:center;color:#fff;border-radius:12px;font-size:24px}.feature-card .feature-content{flex:1}.feature-card .feature-content h4{font-size:18px;font-weight:600;margin-bottom:8px;color:#1a1a2e}.feature-card .feature-content p{color:#64748b;line-height:1.6;font-size:14px}.testimonial-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.testimonial-card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15)}.testimonial-card{position:relative}.testimonial-card::before{content:'"';position:absolute;top:16px;left:16px;font-size:60px;color:#0049b4;opacity:.1;font-weight:700}.testimonial-card .testimonial-content{position:relative;z-index:1;font-size:16px;line-height:1.8;color:#1a1a2e;margin-bottom:24px;font-style:italic}.testimonial-card .testimonial-author{display:flex;align-items:center;gap:16px}.testimonial-card .testimonial-author .author-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover}.testimonial-card .testimonial-author .author-info .author-name{font-weight:600;color:#1a1a2e;margin-bottom:2px}.testimonial-card .testimonial-author .author-info .author-title{font-size:14px;color:#64748b}.pricing-card{background:#fff;border-radius:20px;padding:32px;transition:all .3s ease}.pricing-card:hover{box-shadow:0 8px 24px rgba(75,155,255,.15)}.pricing-card{text-align:center;position:relative}.pricing-card.featured{border:2px solid #0049b4;transform:scale(1.05)}.pricing-card.featured .pricing-badge{position:absolute;top:-14px;left:50%;transform:translateX(-50%);padding:4px 16px;color:#fff;border-radius:50px;font-size:12px;font-weight:700;text-transform:uppercase}.pricing-card .pricing-header{padding-bottom:24px;border-bottom:1px solid #e2e8f0;margin-bottom:24px}.pricing-card .pricing-header h3{font-size:24px;font-weight:700;margin-bottom:8px;color:#1a1a2e}.pricing-card .pricing-header .price{display:flex;align-items:baseline;justify-content:center;gap:4px}.pricing-card .pricing-header .price .currency{font-size:20px;color:#64748b}.pricing-card .pricing-header .price .amount{font-size:48px;font-weight:800}.pricing-card .pricing-header .price .period{font-size:16px;color:#64748b}.pricing-card .pricing-features{list-style:none;margin-bottom:24px}.pricing-card .pricing-features li{padding:8px 0;color:#64748b;font-size:14px;display:flex;align-items:center;gap:8px}.pricing-card .pricing-features li::before{content:"✓";color:#6bcf7f;font-weight:700}.pricing-card .pricing-features li.disabled{opacity:.5}.pricing-card .pricing-features li.disabled::before{content:"×";color:#94a3b8}.pricing-card .pricing-cta{margin-top:auto}.common-container,.org-register-container,.app-management-container,.apikey-detail-container,.apikey-register-container{max-width:1280px;margin:0 auto;padding:60px 24px 80px}@media(max-width: 768px){.common-container,.org-register-container,.app-management-container,.apikey-detail-container,.apikey-register-container{padding:40px 16px 60px}}.common-section-box,.app-list-container,.register-result,.register-form-container{background-color:#f6f9fb;border-radius:12px;padding:30px 45px}@media(max-width: 768px){.common-section-box,.app-list-container,.register-result,.register-form-container{padding:24px}}.common-title-bar,.app-list-title-section,.register-title-bar{background-color:#f6f9fb;border-radius:12px;padding:14px 45px;margin-bottom:30px}@media(max-width: 768px){.common-title-bar,.app-list-title-section,.register-title-bar{padding:12px 24px}}.common-title-bar .common-title,.app-list-title-section .common-title,.register-title-bar .common-title{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:28px;font-weight:700;color:#1a1a2e;margin:0}@media(max-width: 768px){.common-title-bar .common-title,.app-list-title-section .common-title,.register-title-bar .common-title{font-size:22px}}.common-title-bar .common-subtitle,.app-list-title-section .common-subtitle,.register-title-bar .common-subtitle{font-size:16px;font-weight:400;color:#515151}@media(max-width: 768px){.common-title-bar .common-subtitle,.app-list-title-section .common-subtitle,.register-title-bar .common-subtitle{font-size:14px}}.apikey-status-badge,.app-status-badge,.status-badge{display:inline-flex;align-items:center;justify-content:center;padding:5px 14px;border-radius:40px;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:13px;font-weight:700;color:#fff;white-space:nowrap}.apikey-status-badge.status-pending,.status-pending.app-status-badge,.status-pending.status-badge{background-color:#8c959f}.apikey-status-badge.status-approved,.status-approved.app-status-badge,.status-approved.status-badge,.apikey-status-badge.status-active,.status-active.app-status-badge,.status-active.status-badge{background-color:#0049b4}.apikey-status-badge.status-changing,.status-changing.app-status-badge,.status-changing.status-badge{background-color:#88a5f3}.apikey-status-badge.status-inactive,.status-inactive.app-status-badge,.status-inactive.status-badge,.apikey-status-badge.status-rejected,.status-rejected.app-status-badge,.status-rejected.status-badge{background-color:#dc3545}.apikey-status-badge.status-light.status-pending,.status-light.status-pending.app-status-badge,.status-light.status-pending.status-badge{background-color:#fff3cd;color:#856404}.apikey-status-badge.status-light.status-approved,.status-light.status-approved.app-status-badge,.status-light.status-approved.status-badge,.apikey-status-badge.status-light.status-active,.status-light.status-active.app-status-badge,.status-light.status-active.status-badge{background-color:#d4edda;color:#155724}.apikey-status-badge.status-light.status-rejected,.status-light.status-rejected.app-status-badge,.status-light.status-rejected.status-badge,.apikey-status-badge.status-light.status-inactive,.status-light.status-inactive.app-status-badge,.status-light.status-inactive.status-badge{background-color:#f8d7da;color:#721c24}.apikey-status-indicator,.status-indicator{display:inline-flex;align-items:center;gap:8px;padding:4px 16px;border-radius:16px;font-size:14px;font-weight:600}.apikey-status-indicator .status-dot,.status-indicator .status-dot{width:8px;height:8px;border-radius:50%;background-color:currentColor}.apikey-status-indicator.status-active,.status-active.status-indicator{background-color:#d4edda;color:#155724}.apikey-status-indicator.status-inactive,.status-inactive.status-indicator{background-color:#f8d7da;color:#721c24}.apikey-icon-display,.app-list-icon,.app-icon-display{width:120px;height:120px}.apikey-icon-display.icon-sm,.icon-sm.app-list-icon,.icon-sm.app-icon-display{width:70px;height:70px}@media(max-width: 768px){.apikey-icon-display.icon-sm,.icon-sm.app-list-icon,.icon-sm.app-icon-display{width:60px;height:60px}}.apikey-icon-display.icon-md,.icon-md.app-list-icon,.icon-md.app-icon-display{width:100px;height:100px}.apikey-icon-image,.app-list-icon .app-icon-image,.app-icon-image{width:100%;height:100%;object-fit:cover;border-radius:12px;border:2px solid #e2e8f0}.apikey-icon-placeholder,.app-list-icon .app-icon-placeholder,.app-icon-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#e9ecef;border-radius:12px;color:#868e96;font-size:48px}.apikey-icon-placeholder.placeholder-sm,.placeholder-sm.app-icon-placeholder{font-size:24px}.apikey-empty-state,.app-list-empty,.empty-state,.empty-api-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 24px;text-align:center}.apikey-empty-state .empty-icon,.app-list-empty .empty-icon,.empty-state .empty-icon,.empty-api-state .empty-icon{font-size:64px;margin-bottom:24px;opacity:.5}.apikey-empty-state h3,.app-list-empty h3,.empty-state h3,.empty-api-state h3{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:24px;font-weight:700;color:#1a1a2e;margin:0 0 16px}.apikey-empty-state p,.app-list-empty p,.empty-state p,.empty-api-state p{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:16px;color:#6e7780;margin:0}.apikey-action-btn,.btn-app-create,.btn-submit{display:inline-flex;align-items:center;justify-content:center;width:220px;height:60px;border:none;border-radius:12px;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:18px;font-weight:700;cursor:pointer;text-decoration:none;transition:background-color .2s ease,transform .2s ease}.apikey-action-btn:hover,.btn-app-create:hover,.btn-submit:hover{transform:translateY(-2px)}.apikey-action-btn:active,.btn-app-create:active,.btn-submit:active{transform:translateY(0)}.apikey-action-btn.btn-primary,.btn-primary.btn-app-create,.btn-primary.btn-submit{background-color:#0049b4;color:#fff}.apikey-action-btn.btn-primary:hover,.btn-primary.btn-app-create:hover,.btn-primary.btn-submit:hover{background-color:#003a91}.apikey-action-btn.btn-secondary,.btn-secondary.btn-app-create,.btn-secondary.btn-submit{background-color:#e5e7eb;color:#5f666c}.apikey-action-btn.btn-secondary:hover,.btn-secondary.btn-app-create:hover,.btn-secondary.btn-submit:hover{background-color:#d1d5db}.apikey-action-btn.btn-accent,.btn-accent.btn-app-create,.btn-accent.btn-submit{background-color:#3ba4ed;color:#fff}.apikey-action-btn.btn-accent:hover,.btn-accent.btn-app-create:hover,.btn-accent.btn-submit:hover{background-color:#2b94dd}@media(max-width: 768px){.apikey-action-btn,.btn-app-create,.btn-submit{width:100%;max-width:300px;height:54px;font-size:16px}}.apikey-btn-copy,.btn-copy{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;font-size:14px;color:#1a1a2e;cursor:pointer;transition:all .3s ease}.apikey-btn-copy svg,.btn-copy svg{width:16px;height:16px}.apikey-btn-copy:hover,.btn-copy:hover{background:#0049b4;border-color:#0049b4;color:#fff}@media(max-width: 768px){.apikey-btn-copy,.btn-copy{align-self:stretch;justify-content:center}}.apikey-detail-section,.detail-section{background:#fff;border-radius:12px;padding:64px;margin-bottom:24px;box-shadow:0 4px 12px rgba(75,155,255,.1)}@media(max-width: 768px){.apikey-detail-section,.detail-section{padding:32px}}.apikey-detail-section .section-title,.detail-section .section-title{font-size:24px;font-weight:700;color:#1a1a2e;margin-bottom:24px;padding-bottom:16px}.apikey-detail-grid,.detail-grid{display:grid;grid-template-columns:repeat(2, 1fr);gap:24px}@media(max-width: 768px){.apikey-detail-grid,.detail-grid{grid-template-columns:1fr}}.apikey-detail-item,.detail-item{display:flex;flex-direction:column;gap:8px}.apikey-detail-item.full-width,.full-width.detail-item{grid-column:1/-1}.apikey-detail-item .detail-label,.detail-item .detail-label{font-size:14px;font-weight:600;color:#64748b}.apikey-detail-item .detail-value,.detail-item .detail-value{font-size:16px;color:#1a1a2e;word-break:break-word}.apikey-ip-list,.ip-list{display:flex;flex-wrap:wrap;gap:8px}.apikey-ip-tag,.ip-tag{display:inline-block;padding:4px 16px;background-color:#eff6ff;color:#c3dfea;border-radius:6px;font-size:14px;font-family:"Fira Code","Courier New",monospace}.apikey-credential-code,.credential-code{display:inline-block;padding:8px 16px;background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;font-family:"Fira Code","Courier New",monospace;font-size:14px;color:#c3dfea}.apikey-secret-box,.secret-box{display:flex;align-items:center;gap:16px}@media(max-width: 768px){.apikey-secret-box,.secret-box{flex-direction:column;align-items:flex-start}}.apikey-api-list,.api-detail-list{display:flex;flex-direction:column;gap:8px}.apikey-api-item,.api-list-item{display:flex;align-items:center;gap:16px;padding:16px 24px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;transition:all .2s}.apikey-api-item:hover,.api-list-item:hover{border-color:#0049b4;box-shadow:0 2px 4px rgba(0,0,0,.05)}@media(max-width: 768px){.apikey-api-item,.api-list-item{padding:16px;gap:8px}}.apikey-api-item .api-method,.api-list-item .api-method{display:inline-block;padding:4px 16px;border-radius:6px;font-size:14px;font-weight:700;font-family:"Fira Code","Courier New",monospace;min-width:80px;text-align:center}.apikey-api-item .api-method.method-get,.api-list-item .api-method.method-get{background-color:#d1fae5;color:#065f46}.apikey-api-item .api-method.method-post,.api-list-item .api-method.method-post{background-color:#dbeafe;color:#1e40af}.apikey-api-item .api-method.method-put,.api-list-item .api-method.method-put{background-color:#fef3c7;color:#92400e}.apikey-api-item .api-method.method-delete,.api-list-item .api-method.method-delete{background-color:#fee2e2;color:#991b1b}.apikey-api-item .api-method.method-other,.api-list-item .api-method.method-other{background-color:#e2e8f0;color:#1a1a2e}.apikey-api-item .api-name,.api-list-item .api-name{flex:1;font-size:16px;font-weight:500;color:#1a1a2e;margin:0}.apikey-api-item .api-status,.api-list-item .api-status{padding:4px 16px;border-radius:12px;font-size:14px;font-weight:600}.apikey-api-item .api-status.status-pending,.api-list-item .api-status.status-pending{background-color:#fff3cd;color:#856404}.apikey-api-item .api-status.status-active,.api-list-item .api-status.status-active{background-color:#d4edda;color:#155724}.apikey-form-actions,.detail-actions{display:flex;justify-content:center;gap:16px;flex-wrap:wrap;margin-top:64px;padding-top:64px;border-top:1px solid #e2e8f0}@media(max-width: 768px){.apikey-form-actions,.detail-actions{flex-direction:column;align-items:stretch}}@media(max-width: 768px){.apikey-form-actions .btn,.detail-actions .btn{width:100%}}.form-group{margin-bottom:24px}.form-group label{display:block;font-size:14px;font-weight:500;color:#1a1a2e;margin-bottom:8px}.form-group label .required{color:#ff6b6b;margin-left:2px}.form-group .form-hint{font-size:12px;color:#64748b;margin-top:4px}.form-group .form-error{font-size:12px;color:#ff6b6b;margin-top:4px;display:flex;align-items:center;gap:4px}.form-control{width:100%;padding:12px 16px;font-size:16px;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;color:#1a1a2e;background:#fff;border:2px solid #e2e8f0;border-radius:8px;transition:all .3s ease}.form-control::placeholder{color:#94a3b8}.form-control:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.form-control:disabled{background:#f8fafc;color:#64748b;cursor:not-allowed}.form-control-sm{padding:8px 16px;font-size:14px}.form-control-lg{padding:16px 24px;font-size:18px}.form-control.is-valid{border-color:#6bcf7f}.form-control.is-valid:focus{box-shadow:0 0 0 3px rgba(107,207,127,.1)}.form-control.is-invalid{border-color:#ff6b6b}.form-control.is-invalid:focus{box-shadow:0 0 0 3px rgba(255,107,107,.1)}textarea.form-control{min-height:120px;resize:vertical}select.form-control{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M6 8L0 0h12z' fill='%2364748B'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 16px center;background-size:12px;padding-right:40px}.form-check{display:flex;align-items:center;margin-bottom:16px}.form-check input[type=checkbox],.form-check input[type=radio]{width:20px;height:20px;margin-right:8px;cursor:pointer}.form-check label{margin-bottom:0;cursor:pointer;user-select:none}.form-check.disabled{opacity:.5;cursor:not-allowed}.form-check.disabled input,.form-check.disabled label{cursor:not-allowed}.form-switch{display:flex;align-items:center;gap:16px}.form-switch .switch{position:relative;width:48px;height:24px;background:#e2e8f0;border-radius:50px;cursor:pointer;transition:all .3s ease}.form-switch .switch::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:all .3s ease}.form-switch .switch.active{background:#0049b4}.form-switch .switch.active::after{transform:translateX(24px)}.input-group{display:flex;width:100%}.input-group .input-group-text{padding:12px 16px;font-size:16px;color:#64748b;background:#f8fafc;border:2px solid #e2e8f0;border-radius:8px 0 0 8px;border-right:none}.input-group .form-control{border-radius:0 8px 8px 0}.input-group.input-group-append .input-group-text{border-radius:0 8px 8px 0;border-right:2px solid #e2e8f0;border-left:none}.input-group.input-group-append .form-control{border-radius:8px 0 0 8px}.form-inline{display:flex;align-items:flex-end;gap:16px}.form-inline .form-group{margin-bottom:0}@media(max-width: 768px){.form-inline{flex-direction:column;align-items:stretch}.form-inline .form-group{margin-bottom:16px}}.form-row{display:grid;grid-template-columns:repeat(2, 1fr);gap:24px}@media(max-width: 768px){.form-row{grid-template-columns:1fr}}.file-upload-wrapper{display:flex;gap:16px;align-items:center;width:100%}@media(max-width: 768px){.file-upload-wrapper{flex-direction:column;align-items:stretch}}.file-upload-wrapper .file-name-display{flex:1;padding:16px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;font-size:14px;color:#64748b;cursor:default;transition:all .3s ease}.file-upload-wrapper .file-name-display.has-file{color:#1a1a2e;background:rgba(0,73,180,.05);border-color:#0049b4}.file-upload-wrapper .file-name-display:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.file-upload-wrapper .file-upload-btn{padding:16px 24px;color:#fff;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:all .3s ease;white-space:nowrap;display:inline-flex;align-items:center;gap:4px;border:none}@media(max-width: 768px){.file-upload-wrapper .file-upload-btn{justify-content:center}}.file-upload-wrapper .file-upload-btn:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.file-upload-wrapper .file-upload-btn:active{transform:translateY(0)}.file-upload-wrapper .file-upload-btn i{font-size:14px}.file-upload-wrapper .file-remove-btn{padding:16px;background:#ff6b6b;color:#fff;border-radius:8px;border:none;cursor:pointer;transition:all .3s ease;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px}@media(max-width: 768px){.file-upload-wrapper .file-remove-btn{width:100%;height:auto;padding:16px}}.file-upload-wrapper .file-remove-btn:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1);background:rgb(255,81.5,81.5)}.file-upload-wrapper .file-remove-btn:active{transform:translateY(0)}.file-upload-wrapper .file-remove-btn i{font-size:14px}.file-upload-wrapper input[type=file]{display:none}.form-help-text{margin-top:16px;font-size:12px;color:#94a3b8;line-height:1.6}.form-help-text p{margin:4px 0;display:flex;align-items:flex-start;gap:4px}.form-help-text p i{color:#0049b4;margin-top:2px;flex-shrink:0}.form-row{display:flex;align-items:flex-start;gap:40px;margin-bottom:50px}@media(max-width: 1024px){.form-row{flex-direction:column;gap:12px;margin-bottom:30px}}.form-label-wrapper{display:flex;align-items:center;gap:5px;min-width:214px;width:214px;flex-shrink:0}@media(max-width: 1024px){.form-label-wrapper{padding-top:0;width:auto}}.form-label-wrapper.label-offset{margin-top:15px}@media(max-width: 1024px){.form-label-wrapper.label-offset{margin-top:0}}.form-label-text{font-size:20px;font-weight:700;color:#000}@media(max-width: 1024px){.form-label-text{font-size:16px}}.form-label-text.required::after{content:"*";color:#ff6b6b;margin-left:4px}.required-badge{background-color:#3ba4ed;color:#fff;font-size:11px;font-weight:400;padding:3px 4px 4px;border-radius:4px;line-height:1}.form-field-wrapper{flex:1}@media(max-width: 768px){.form-field-wrapper{width:100%}}.char-counter-wrapper{display:block;text-align:right;margin-top:8px}.char-counter-wrapper .char-counter{font-size:14px;color:#94a3b8}.section-divider{margin-top:48px;padding-top:32px;border-top:1px solid #e2e8f0}.compound-input{display:flex;align-items:center;gap:8px;width:100%}.compound-input .form-input,.compound-input .form-select{flex:1;min-width:0}.compound-input .separator{color:#64748b;font-weight:600;user-select:none;flex-shrink:0}.compound-input .phone-number{flex:1;width:100%}.compound-input .biz-reg-number{flex:1;width:100%}@media(max-width: 768px){.compound-input{gap:4px}.compound-input .separator{font-size:14px}}.input-with-button{display:flex;align-items:center;gap:16px}.input-with-button .compound-input,.input-with-button .auth-input-group{flex:1}@media(max-width: 768px){.input-with-button{flex-direction:column;gap:8px}.input-with-button .compound-input,.input-with-button .auth-input-group{width:100%}}.auth-input-group{display:flex;align-items:center;position:relative}.auth-input-group .form-input{flex:1;padding-right:100px}.auth-input-group .auth-timer{position:absolute;right:16px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:600;color:#ff6b6b;white-space:nowrap}.form-actions,.form-actions-center{display:flex;justify-content:center;gap:16px;flex-wrap:wrap;margin-top:64px;padding-top:40px;border-top:1px solid #e2e8f0}@media(max-width: 768px){.form-actions,.form-actions-center{flex-direction:column-reverse;align-items:stretch;gap:8px;margin-top:48px;padding-top:32px}}.form-actions .btn,.form-actions-center .btn,.form-actions .action-btn-primary,.form-actions-center .action-btn-primary,.form-actions .action-btn-secondary,.form-actions-center .action-btn-secondary{min-width:160px;padding:16px 40px}@media(max-width: 768px){.form-actions .btn,.form-actions-center .btn,.form-actions .action-btn-primary,.form-actions-center .action-btn-primary,.form-actions .action-btn-secondary,.form-actions-center .action-btn-secondary{width:100%;min-width:auto}}.form-actions--between{justify-content:space-between}.form-actions--no-border{border-top:none;padding-top:0}.form-actions--compact{margin-top:40px;padding-top:24px}.form-actions--with-withdrawal{position:relative;justify-content:center}.form-actions--with-withdrawal .withdrawal-link{position:absolute;left:0;display:inline-flex;align-items:center;justify-content:center;gap:3px;width:150px;padding:8px;background:#e5f2f8;border-radius:12px;color:#5f666c;font-size:16px;font-weight:400;text-decoration:none;cursor:pointer;transition:all .3s ease}.form-actions--with-withdrawal .withdrawal-link:hover{background:rgb(208.9090909091,231.9545454545,242.5909090909)}.form-actions--with-withdrawal .withdrawal-link img{width:22px;height:22px;object-fit:contain}@media(max-width: 768px){.form-actions--with-withdrawal .withdrawal-link{position:static;width:100%;order:1}}.form-actions--with-withdrawal .form-actions-buttons{display:flex;gap:16px}@media(max-width: 768px){.form-actions--with-withdrawal .form-actions-buttons{flex-direction:column-reverse;width:100%;gap:8px}}@media(max-width: 768px){.form-actions--with-withdrawal{flex-direction:column;gap:16px}}.modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);z-index:400;opacity:0;visibility:hidden;transition:all .3s ease}.modal-backdrop.show{opacity:1;visibility:visible}.modal{position:fixed;top:0;left:0;width:100%;height:100vh;z-index:1000;display:flex;align-items:center;justify-content:center;padding:24px;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease;pointer-events:none;overflow-y:auto}.modal.show{opacity:1;visibility:visible;pointer-events:auto}.modal.show .modal-dialog{transform:scale(1)}@media(max-width: 768px){.modal{padding:16px}}.modal-container{position:relative;max-width:820px;width:100%}.modal-container.modal-sm{max-width:500px}.modal-container.modal-lg{max-width:1000px}.modal-container.modal-xl{max-width:1200px}@media(max-width: 768px){.modal-container{max-width:100%}}.modal-close{position:absolute;top:0;right:0;transform:translate(100%, -100%);width:50px;height:50px;background:#0049b4;border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:500;transition:all .3s ease;box-shadow:0 8px 24px rgba(75,155,255,.15)}.modal-close svg{width:14px;height:14px}.modal-close i{font-size:16px}@media(max-width: 768px){.modal-close{width:40px;height:40px}.modal-close svg{width:12px;height:12px}.modal-close i{font-size:14px}}.modal-dialog{margin-top:150px;position:relative;background:#fff;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.3);max-width:700px;width:calc(100% - 48px);max-height:85vh;display:flex;flex-direction:column;transform:scale(0.95);transition:transform .3s ease;z-index:500;margin-left:auto;margin-right:auto}.modal-dialog.modal-fullscreen{max-width:100%;max-height:100%;height:100%;margin:0;border-radius:0}.modal-header{padding:30px 50px 20px;background:#c7eaff;border-bottom:none;display:flex;align-items:center;justify-content:space-between;border-top-left-radius:12px;border-top-right-radius:12px}.modal-header .modal-title{font-size:24px;font-weight:600;color:#212529;margin:0}@media(max-width: 768px){.modal-header{padding:20px 24px 16px}.modal-header .modal-title{font-size:18px}}.modal-body{padding:30px 50px;flex:1;overflow-y:auto;color:#212529;font-size:20px;line-height:1.6}.modal-body p{margin:0}.modal-body p+p{margin-top:16px}.modal-body.text-center{text-align:center}@media(max-width: 768px){.modal-body{padding:20px 24px;font-size:16px}}.modal-footer{padding:20px 50px 40px;display:flex;gap:10px;justify-content:center;border-top:none}.modal-footer.modal-footer-end{justify-content:flex-end}.modal-footer.modal-footer-between{justify-content:space-between}.modal-footer .btn-modal-cancel{min-width:150px;height:50px;padding:10px 40px;background:#fff;border:1px solid #dadada;border-radius:50px;font-size:16px;font-weight:700;color:#5f666c;cursor:pointer;transition:all .3s ease}.modal-footer .btn-modal-cancel:hover{background:#f5f5f5;border-color:silver}.modal-footer .btn-modal-cancel:active{transform:scale(0.98)}.modal-footer .btn-modal-confirm{min-width:150px;height:50px;padding:10px 40px;background:#0049b4;border:none;border-radius:50px;font-size:16px;font-weight:700;color:#fff;cursor:pointer;transition:all .3s ease}.modal-footer .btn-modal-confirm:hover{background:#003a91}.modal-footer .btn-modal-confirm:active{transform:scale(0.98)}@media(max-width: 768px){.modal-footer{padding:16px 24px 24px;flex-direction:column}.modal-footer .btn-modal-cancel,.modal-footer .btn-modal-confirm{width:100%;height:46px;font-size:15px}}.modal-alert .modal-container{max-width:500px}.modal-alert .modal-body{text-align:center;padding:32px 50px}.modal-alert .modal-body .alert-icon{width:64px;height:64px;margin:0 auto 24px;display:flex;justify-content:center;align-items:center;font-size:32px;border-radius:50%}.modal-alert .modal-body .alert-icon.alert-success{background:rgba(107,207,127,.1);color:#6bcf7f}.modal-alert .modal-body .alert-icon.alert-warning{background:rgba(255,217,61,.1);color:#ffd93d}.modal-alert .modal-body .alert-icon.alert-danger{background:rgba(255,107,107,.1);color:#ff6b6b}.modal-alert .modal-body .alert-icon.alert-info{background:rgba(0,73,180,.1);color:#0049b4}.modal-alert .modal-body .alert-title{font-size:24px;font-weight:600;margin-bottom:8px;color:#1a1a2e}.modal-alert .modal-body .alert-message{color:#64748b;font-size:16px}.breadcrumb{display:flex;align-items:center;gap:8px;padding:16px 0;font-size:14px}.breadcrumb .breadcrumb-item{display:flex;align-items:center;gap:8px;color:#64748b}.breadcrumb .breadcrumb-item a{color:#64748b;transition:all .3s ease}.breadcrumb .breadcrumb-item a:hover{color:#0049b4}.breadcrumb .breadcrumb-item.active{color:#1a1a2e;font-weight:500}.breadcrumb .breadcrumb-item:not(:last-child)::after{content:"/";color:#94a3b8;margin-left:8px}.nav-tabs{display:flex;gap:4px;border-bottom:2px solid #e2e8f0;margin-bottom:32px}.nav-tabs .nav-item{position:relative}.nav-tabs .nav-link{display:flex;align-items:center;gap:8px;padding:16px 24px;color:#64748b;font-weight:500;border-bottom:2px solid rgba(0,0,0,0);margin-bottom:-2px;transition:all .3s ease}.nav-tabs .nav-link:hover{color:#1a1a2e}.nav-tabs .nav-link.active{color:#0049b4;border-bottom-color:#0049b4}.nav-tabs .nav-link .badge{padding:2px 6px;background:#f8fafc;color:#64748b;border-radius:50px;font-size:11px;font-weight:600}.nav-pills{display:flex;gap:8px;padding:4px;background:#f8fafc;border-radius:12px}.nav-pills .nav-link{padding:8px 24px;color:#64748b;font-weight:500;border-radius:8px;transition:all .3s ease}.nav-pills .nav-link:hover{color:#1a1a2e;background:hsla(0,0%,100%,.5)}.nav-pills .nav-link.active{background:#fff;color:#0049b4;box-shadow:0 2px 4px rgba(0,0,0,.05)}.sidebar-nav .nav-section{margin-bottom:32px}.sidebar-nav .nav-section .nav-title{font-size:12px;font-weight:600;text-transform:uppercase;color:#64748b;padding:8px 16px;letter-spacing:.05em}.sidebar-nav .nav-menu{list-style:none}.sidebar-nav .nav-menu .nav-item{margin-bottom:4px}.sidebar-nav .nav-menu .nav-link{display:flex;align-items:center;gap:16px;padding:8px 16px;color:#1a1a2e;border-radius:8px;transition:all .3s ease}.sidebar-nav .nav-menu .nav-link .nav-icon{width:20px;height:20px;display:flex;justify-content:center;align-items:center;font-size:18px;color:#64748b}.sidebar-nav .nav-menu .nav-link:hover{background:#f8fafc;color:#0049b4}.sidebar-nav .nav-menu .nav-link:hover .nav-icon{color:#0049b4}.sidebar-nav .nav-menu .nav-link.active{background:#eff6ff;color:#0049b4;font-weight:500}.sidebar-nav .nav-menu .nav-link.active .nav-icon{color:#0049b4}.sidebar-nav .nav-menu .nav-submenu{margin-left:40px;margin-top:4px;list-style:none}.sidebar-nav .nav-menu .nav-submenu .nav-link{font-size:14px;padding:4px 16px}.pagination{display:flex;align-items:center;gap:4px}.pagination .page-item.disabled .page-link{opacity:.5;cursor:not-allowed;pointer-events:none}.pagination .page-item.active .page-link{background:#0049b4;color:#fff;border-color:#0049b4}.pagination .page-link{display:flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 8px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;color:#1a1a2e;font-size:14px;font-weight:500;transition:all .3s ease}.pagination .page-link:hover{background:#f8fafc;border-color:#0049b4;color:#0049b4}.pagination .page-link.page-prev,.pagination .page-link.page-next{font-size:18px}.pagination .page-dots{padding:0 8px;color:#64748b}.partners{padding:80px 0;background:#fff}.final-cta{position:relative;padding:150px 0;overflow:hidden}#passwordInputPopup .modal-dialog{max-width:450px}#passwordInputPopup .pop_input_group{text-align:left;margin:0}#passwordInputPopup .pop_input_field{width:100%;padding:12px 16px;border:1px solid #e2e8f0;border-radius:8px;font-size:14px;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;transition:all .3s ease;box-sizing:border-box}#passwordInputPopup .pop_input_field:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}#passwordInputPopup .pop_input_field::placeholder{color:#94a3b8}#passwordInputPopup .pop_input_field.error{border-color:#ff6b6b}#passwordInputPopup .pop_input_field.error:focus{border-color:#ff6b6b;box-shadow:0 0 0 3px rgba(255,107,107,.1)}#passwordInputPopup .error-message{color:#ff6b6b;font-size:12px;margin-top:4px;display:none;animation:fadeInDown .3s ease}#passwordInputPopup .error-message.show{display:block}@keyframes fadeInDown{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.auth-group{display:flex;align-items:center;gap:16px}.auth-group.authenticated{gap:0}.login-btn{display:inline-flex;align-items:center;padding:10px 20px;color:#1a1a2e;text-decoration:none;border:2px solid #0049b4;border-radius:50px;font-weight:600;font-size:14px;transition:all .3s ease}.login-btn-box{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:4px 10px;color:#212529;text-decoration:none;border:1px solid #212529;border-radius:6px;font-family:"Noto Sans CJK KR","Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-weight:700;font-size:16px;background:rgba(0,0,0,0);transition:all .3s ease}.login-btn-box .user-icon{width:24px;height:24px;flex-shrink:0}.user-profile-dropdown{position:relative}.user-profile-dropdown .user-profile-btn{display:flex;align-items:center;gap:8px;padding:10px 20px;background:#eff6ff;border:2px solid rgba(0,0,0,0);border-radius:50px;cursor:pointer;transition:all .3s ease;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:14px}.user-profile-dropdown .user-profile-btn .user-name{color:#1a1a2e;font-weight:600}.user-profile-dropdown .user-profile-btn i{color:#64748b;font-size:12px;transition:transform all .15s ease}.user-profile-dropdown .user-profile-btn:hover{background:#fff;border-color:#0049b4;box-shadow:0 4px 12px rgba(75,155,255,.1)}.user-profile-dropdown .user-profile-btn:hover .user-name{color:#0049b4}.user-profile-dropdown .user-profile-btn:hover i{color:#0049b4}.user-profile-dropdown.active .user-profile-btn i{transform:rotate(180deg)}.user-profile-dropdown.active .profile-dropdown-menu{visibility:visible;opacity:1;transform:translateY(0)}.user-profile-dropdown .profile-dropdown-menu{position:absolute;top:calc(100% + 12px);right:0;width:280px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 16px 40px rgba(75,155,255,.2);visibility:hidden;opacity:0;transform:translateY(-10px);transition:all all .3s ease;z-index:100;overflow:hidden}.user-profile-dropdown .profile-header{padding:24px;color:#fff;text-align:center}.user-profile-dropdown .profile-header .user-greeting{margin:0 0 4px 0;font-size:18px;font-weight:700}.user-profile-dropdown .profile-header .user-message{font-size:12px;opacity:.9}.user-profile-dropdown .profile-menu-list{list-style:none;margin:0;padding:8px 0}.user-profile-dropdown .profile-menu-list li{margin:0}.user-profile-dropdown .profile-menu-list li a{display:flex;align-items:center;gap:12px;padding:12px 24px;color:#1a1a2e;text-decoration:none;font-size:14px;transition:all .15s ease}.user-profile-dropdown .profile-menu-list li a i{width:20px;color:#64748b;font-size:14px}.user-profile-dropdown .profile-menu-list li a:hover{background:#eff6ff;color:#0049b4}.user-profile-dropdown .profile-menu-list li a:hover i{color:#0049b4}.user-profile-dropdown .profile-footer{padding:8px 24px 24px;border-top:1px solid #e2e8f0}.user-profile-dropdown .profile-footer .logout-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:12px;background:#f8fafc;color:#1a1a2e;text-decoration:none;border-radius:8px;font-weight:600;font-size:14px;transition:all .3s ease}.user-profile-dropdown .profile-footer .logout-btn i{font-size:14px}.user-profile-dropdown .profile-footer .logout-btn:hover{background:#ff6b6b;color:#fff;transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.drawer-user-info{padding:24px;border-bottom:1px solid hsla(0,0%,100%,.2)}.drawer-user-info .drawer-profile{display:flex;align-items:center;gap:16px}.drawer-user-info .drawer-profile .profile-avatar{width:60px;height:60px;display:flex;align-items:center;justify-content:center;background:hsla(0,0%,100%,.2);border-radius:50%;color:#fff}.drawer-user-info .drawer-profile .profile-avatar i{font-size:32px}.drawer-user-info .drawer-profile .profile-info{flex:1;color:#fff}.drawer-user-info .drawer-profile .profile-info .profile-name{margin:0 0 4px 0;font-size:18px;font-weight:700}.drawer-user-info .drawer-profile .profile-info .profile-greeting{font-size:12px;opacity:.9}.drawer-logout-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px 20px;background:#ff6b6b;color:#fff;text-decoration:none;border-radius:12px;font-weight:600;font-size:16px;transition:all .3s ease;box-shadow:0 4px 12px rgba(75,155,255,.1)}.drawer-logout-btn i{font-size:16px}.drawer-logout-btn:hover{background:#ff3838;transform:translateY(-2px);box-shadow:0 8px 24px rgba(75,155,255,.15)}@media(max-width: 768px){.user-profile-dropdown .profile-dropdown-menu{width:260px;right:-10px}}@media(max-width: 480px){.user-profile-dropdown .user-profile-btn{padding:8px 16px}.user-profile-dropdown .user-profile-btn .user-name{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-profile-dropdown .profile-dropdown-menu{width:240px;right:-20px}}.data-table{width:100%;background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.05)}.data-table-wrapper{overflow-x:auto;margin-bottom:32px}@media(max-width: 768px){.data-table-wrapper{border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.05)}}.data-table table{width:100%;border-collapse:collapse}.data-table table thead{background:#eff6ff}.data-table table thead tr{border-bottom:2px solid #e2e8f0}.data-table table thead th{padding:16px 24px;text-align:left;font-size:14px;font-weight:600;color:#1a1a2e;white-space:nowrap}@media(max-width: 768px){.data-table table thead th{padding:8px 16px;font-size:12px}}.data-table table tbody tr{border-bottom:1px solid #e2e8f0;transition:all .3s ease}.data-table table tbody tr:last-child{border-bottom:none}.data-table table tbody tr:hover{background-color:rgba(0,73,180,.02)}.data-table table tbody td{padding:16px 24px;font-size:14px;color:#64748b}@media(max-width: 768px){.data-table table tbody td{padding:8px 16px;font-size:12px}}.data-table table tbody td a{color:#1a1a2e;text-decoration:none;transition:all .3s ease}.data-table table tbody td a:hover{color:#0049b4}.notice-table{width:100%;background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 4px rgba(0,0,0,.05)}.notice-table-wrapper{overflow-x:auto}@media(max-width: 768px){.notice-table-wrapper{border-radius:0;box-shadow:none}}.notice-table .table-header{display:grid;grid-template-columns:80px 1fr 120px;gap:16px;padding:16px 24px;background:#eff6ff;border-bottom:2px solid #e2e8f0;font-size:14px;font-weight:600;color:#1a1a2e}@media(max-width: 1024px){.notice-table .table-header{grid-template-columns:60px 1fr 100px;padding:8px 16px;font-size:12px}}@media(max-width: 768px){.notice-table .table-header{display:none}}.notice-table .table-header .col-num{text-align:center}.notice-table .table-header .col-title{text-align:left}.notice-table .table-header .col-date{text-align:center}.notice-table .table-row{display:grid;grid-template-columns:80px 1fr 120px;gap:16px;padding:24px;border-bottom:1px solid #e2e8f0;transition:all .3s ease;cursor:pointer}@media(max-width: 1024px){.notice-table .table-row{grid-template-columns:60px 1fr 100px;padding:16px}}@media(max-width: 768px){.notice-table .table-row{grid-template-columns:1fr;gap:8px;padding:16px}}.notice-table .table-row:last-child{border-bottom:none}.notice-table .table-row:hover{background-color:rgba(0,73,180,.02)}.notice-table .table-row .col-num{display:flex;align-items:center;justify-content:center;font-size:14px;color:#64748b;font-weight:500}@media(max-width: 768px){.notice-table .table-row .col-num{display:none}}.notice-table .table-row .col-title{display:flex;align-items:center;font-size:16px;color:#1a1a2e;font-weight:500}@media(max-width: 768px){.notice-table .table-row .col-title{font-size:14px}}.notice-table .table-row .col-title a{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px;transition:all .3s ease}.notice-table .table-row .col-title a:hover{color:#0049b4}.notice-table .table-row .col-title .file-icon{display:inline-flex;align-items:center;margin-left:8px;opacity:.6}.notice-table .table-row .col-title .file-icon img{width:16px;height:16px}.notice-table .table-row .col-date{display:flex;align-items:center;justify-content:center;font-size:14px;color:#94a3b8}@media(max-width: 768px){.notice-table .table-row .col-date{justify-content:flex-start;font-size:12px;padding-top:4px}}@media(max-width: 768px){.notice-table .table-row .col-date::before{content:"등록일: ";color:#64748b;margin-right:4px}}.table-empty{padding:80px 24px;text-align:center;background:#fff;border-radius:12px}.table-empty .empty-icon{margin-bottom:24px}.table-empty .empty-icon img{max-width:200px;opacity:.7}@media(max-width: 768px){.table-empty .empty-icon img{max-width:150px}}.table-empty .empty-text{font-size:16px;color:#64748b}@media(max-width: 768px){.table-empty .empty-text{font-size:14px}}.table-controls{display:flex;justify-content:space-between;align-items:center;margin-bottom:32px;gap:24px}@media(max-width: 768px){.table-controls{flex-direction:column;align-items:stretch;gap:16px}}.table-controls .total-count{font-size:14px;color:#64748b}.table-controls .total-count strong{color:#0049b4;font-weight:600}@media(max-width: 768px){.table-controls .total-count{order:2;text-align:center}}.table-controls .search-box{display:flex;gap:8px}@media(max-width: 768px){.table-controls .search-box{order:1}}.table-controls .search-box input{flex:1;min-width:250px;padding:8px 16px;border:1px solid #e2e8f0;border-radius:8px;font-size:14px;transition:all .3s ease}@media(max-width: 768px){.table-controls .search-box input{min-width:auto}}.table-controls .search-box input:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.table-controls .search-box input::placeholder{color:#94a3b8}.faq-accordion{background:#fff;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.05);overflow:hidden}.faq-accordion .faq-item{border-bottom:1px solid #e2e8f0;transition:all .3s ease}.faq-accordion .faq-item:last-child{border-bottom:none}.faq-accordion .faq-item.active{background:rgba(0,73,180,.02)}.faq-accordion .faq-item.active .faq-question{color:#0049b4}.faq-accordion .faq-item.active .faq-question .faq-icon{transform:rotate(180deg);color:#0049b4}.faq-accordion .faq-question{display:flex;align-items:center;justify-content:space-between;padding:24px 32px;font-size:16px;font-weight:500;color:#1a1a2e;cursor:pointer;transition:all .3s ease;position:relative;gap:16px}@media(max-width: 768px){.faq-accordion .faq-question{padding:16px 24px;font-size:14px}}.faq-accordion .faq-question::before{content:"Q";position:absolute;left:32px;top:50%;transform:translateY(-50%);width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#eff6ff;color:#0049b4;border-radius:50%;font-size:14px;font-weight:700;transition:all .3s ease}@media(max-width: 768px){.faq-accordion .faq-question::before{width:28px;height:28px;font-size:12px}}.faq-accordion .faq-question:hover{background:rgba(0,73,180,.03);color:#0049b4}.faq-accordion .faq-question .faq-question-text{flex:1;padding-left:48px;line-height:1.6}@media(max-width: 768px){.faq-accordion .faq-question .faq-question-text{padding-left:40px}}.faq-accordion .faq-question .faq-icon{flex-shrink:0;font-size:20px;color:#64748b;transition:all .3s ease}@media(max-width: 768px){.faq-accordion .faq-question .faq-icon{font-size:18px}}.faq-accordion .faq-answer{display:none;padding:0 32px 24px;margin-left:48px;margin-right:32px;position:relative}@media(max-width: 768px){.faq-accordion .faq-answer{padding:0 24px 16px;margin-left:40px;margin-right:24px}}.faq-accordion .faq-answer::before{content:"A";position:absolute;left:-48px;top:8px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#0049b4;color:#fff;border-radius:50%;font-size:14px;font-weight:700}@media(max-width: 768px){.faq-accordion .faq-answer::before{left:-40px;width:28px;height:28px;font-size:12px}}.faq-accordion .faq-answer.show{display:block;animation:slideDown .3s ease}.faq-accordion .faq-answer .faq-answer-content{padding:16px 0;font-size:14px;color:#64748b;line-height:1.8}@media(max-width: 768px){.faq-accordion .faq-answer .faq-answer-content{font-size:12px;padding:8px 0}}.faq-accordion .faq-answer .faq-answer-content p{margin-bottom:16px}.faq-accordion .faq-answer .faq-answer-content p:last-child{margin-bottom:0}.faq-accordion .faq-answer .faq-answer-content ul,.faq-accordion .faq-answer .faq-answer-content ol{margin:8px 0;padding-left:24px}.faq-accordion .faq-answer .faq-answer-content li{margin-bottom:4px}.faq-accordion .faq-answer .faq-answer-content a{color:#0049b4;text-decoration:underline}.faq-accordion .faq-answer .faq-answer-content a:hover{color:#c3dfea}.faq-accordion .faq-answer .faq-answer-content code{background:#f8fafc;padding:2px 6px;border-radius:6px;font-family:"Fira Code","Courier New",monospace;font-size:.9em;color:#0049b4}.faq-accordion .faq-answer .faq-answer-content pre{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;overflow-x:auto;margin:16px 0}.faq-accordion .faq-answer .faq-answer-content pre code{background:rgba(0,0,0,0);padding:0;color:#1a1a2e}.faq-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.faq-page{padding:40px 16px}}.faq-container{max-width:1280px;margin:0 auto}.faq-header{margin-bottom:48px}@media(max-width: 768px){.faq-header{margin-bottom:40px}}.faq-header .page-title{font-size:40px;font-weight:700;color:#1a1a2e;margin-bottom:16px;-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}@media(max-width: 768px){.faq-header .page-title{font-size:32px}}.faq-header .page-description{font-size:16px;color:#64748b;line-height:1.6}@media(max-width: 768px){.faq-header .page-description{font-size:14px}}@keyframes slideDown{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.accordion{background:#fff;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.05);overflow:hidden}.accordion .accordion-item{border-bottom:1px solid #e2e8f0}.accordion .accordion-item:last-child{border-bottom:none}.accordion .accordion-item.active .accordion-header{background:rgba(0,73,180,.03);color:#0049b4}.accordion .accordion-item.active .accordion-header .accordion-icon{transform:rotate(180deg)}.accordion .accordion-header{display:flex;align-items:center;justify-content:space-between;padding:24px 32px;font-size:16px;font-weight:500;color:#1a1a2e;cursor:pointer;transition:all .3s ease}@media(max-width: 768px){.accordion .accordion-header{padding:16px 24px;font-size:14px}}.accordion .accordion-header:hover{background:rgba(0,73,180,.02)}.accordion .accordion-header .accordion-title{flex:1}.accordion .accordion-header .accordion-icon{flex-shrink:0;font-size:20px;color:#64748b;transition:all .3s ease}.accordion .accordion-content{display:none;padding:24px 32px;font-size:14px;color:#64748b;line-height:1.6;border-top:1px solid #e2e8f0}@media(max-width: 768px){.accordion .accordion-content{padding:16px 24px}}.accordion .accordion-content.show{display:block;animation:slideDown .3s ease}.page-title-banner{background:#e9f8ff;position:relative;width:100%;height:220px;display:flex;align-items:center;justify-content:center;overflow:hidden}.page-title-banner::before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background-image:url("data:image/svg+xml,%3Csvg width='100' height='100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h100v100H0z' fill='%23ffffff' opacity='0.03'/%3E%3C/svg%3E");background-size:50px 50px;opacity:.5}.page-title-banner .title-image{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);height:220px;width:auto;z-index:1}.page-title-banner h1{position:relative;font-size:40px;font-weight:700;color:#1a1a2e;margin:0;z-index:2;letter-spacing:-0.5px}@media(max-width: 768px){.page-title-banner{height:120px;margin-bottom:32px}.page-title-banner .title-image{height:120px}.page-title-banner h1{font-size:24px}}.alert{display:flex;align-items:flex-start;gap:16px;padding:16px 24px;border-radius:8px;margin-bottom:32px}.alert .alert-icon{font-size:20px;flex-shrink:0}.alert .alert-content{flex:1;text-align:left}.alert .alert-content strong{font-weight:600}.alert.alert-warning{background:rgba(255,217,61,.1);border:1px solid rgba(255,217,61,.3);color:#b89900}.alert.alert-error{background:rgba(255,107,107,.1);border:1px solid rgba(255,107,107,.3);color:#ff3838;align-items:center}.alert.alert-error svg{flex-shrink:0}.alert.alert-error span{flex:1;font-size:14px;font-weight:500}.alert.alert-success{background:rgba(107,207,127,.1);border:1px solid rgba(107,207,127,.3);color:hsl(132,51.0204081633%,41.568627451%)}.alert.alert-info{background:rgba(0,73,180,.1);border:1px solid rgba(0,73,180,.3);color:#c3dfea}.hero-carousel-section{position:relative;width:100%;overflow:hidden}.hero-carousel-container{position:relative;width:100%;height:720px;overflow:hidden}@media(max-width: 1024px){.hero-carousel-container{height:800px}}@media(max-width: 768px){.hero-carousel-container{height:600px}}.hero-carousel-track{position:relative;width:100%;height:100%}.hero-slide{position:absolute;top:0;left:0;width:100%;height:780px;display:flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transition:opacity .6s ease-in-out,visibility .6s ease-in-out}.hero-slide.active{opacity:1;visibility:visible}.hero-slide[data-slide="0"]{background:#e5f8ff}.hero-slide[data-slide="1"]{background:#e5f8ff}.hero-slide[data-slide="2"]{background:#e5f8ff}.hero-slide-content{width:100%;max-width:1280px;height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 80px;position:relative;margin:0 auto}@media(min-width: 1440px){.hero-slide-content{padding:0 320px}}@media(min-width: 1280px){.hero-slide-content{padding:0 160px}}@media(max-width: 1024px){.hero-slide-content{flex-direction:column;padding:80px 40px;justify-content:center;gap:40px}}@media(max-width: 768px){.hero-slide-content{padding:60px 20px;gap:30px}}.hero-text-content{flex:0 0 auto;display:flex;flex-direction:column;gap:46px;z-index:2}@media(max-width: 1024px){.hero-text-content{align-items:center;text-align:center}}.hero-text .hero-subtitle{font-family:"Noto Sans KR",sans-serif;font-size:36px;font-weight:400;line-height:1;color:#212529;margin:0 0 12px 0}@media(max-width: 1024px){.hero-text .hero-subtitle{font-size:28px}}@media(max-width: 768px){.hero-text .hero-subtitle{font-size:24px}}.hero-text .hero-title{font-family:"Noto Sans KR",sans-serif;font-size:50px;font-weight:700;line-height:1.2;color:#000;margin:0}@media(max-width: 1024px){.hero-text .hero-title{font-size:40px}}@media(max-width: 768px){.hero-text .hero-title{font-size:32px}}.btn-hero-signup{display:inline-flex;align-items:center;justify-content:center;width:178px;height:60px;padding:10px;background:#0049b4;color:#fff;font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:700;border-radius:10px;text-decoration:none;transition:all .3s ease}.btn-hero-signup:hover{background:rgb(0,52.3166666667,129);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,73,180,.3)}.btn-hero-signup:active{transform:translateY(0)}@media(max-width: 1024px){.btn-hero-signup{width:200px}}.hero-image-content{flex:0 0 auto;width:556px;height:455px;display:flex;align-items:center;justify-content:center;z-index:1}@media(min-width: 1280px){.hero-image-content{width:450px;height:370px}}@media(max-width: 1024px){.hero-image-content{width:400px;height:330px}}@media(max-width: 768px){.hero-image-content{width:100%;max-width:350px;height:auto}}.hero-image-content .hero-image{width:100%;height:100%;object-fit:contain}.hero-nav-btn{position:absolute;top:50%;transform:translateY(-50%);width:60px;height:60px;background:hsla(0,0%,100%,.5);border:none;border-radius:50px;cursor:pointer;display:none;align-items:center;justify-content:center;z-index:10;transition:all .3s ease}.hero-nav-btn:hover{background:hsla(0,0%,100%,.8);transform:translateY(-50%) scale(1.1)}.hero-nav-btn:active{transform:translateY(-50%) scale(0.95)}.hero-nav-btn svg{width:22px;height:22px}@media(min-width: 1280px){.hero-nav-btn{display:flex}}.hero-nav-prev{left:210px}.hero-nav-prev svg{transform:rotate(180deg)}@media(min-width: 1280px){.hero-nav-prev{left:100px}}@media(max-width: 1024px){.hero-nav-prev{left:40px}}@media(max-width: 768px){.hero-nav-prev{left:20px}}.hero-nav-next{right:210px}@media(min-width: 1280px){.hero-nav-next{right:100px}}@media(max-width: 1024px){.hero-nav-next{right:40px}}@media(max-width: 768px){.hero-nav-next{right:20px}}.hero-carousel-indicators{position:absolute;bottom:160px;left:50%;transform:translateX(-50%);display:flex;gap:12px;z-index:10}@media(max-width: 768px){.hero-carousel-indicators{bottom:30px;gap:8px}}.hero-indicator{width:14px;height:14px;border-radius:50%;background:#f1f1f1;border:none;cursor:pointer;padding:0;transition:all .3s ease}.hero-indicator.active{background:#0049b4}.hero-indicator:hover:not(.active){background:rgba(0,0,0,.5)}@media(max-width: 768px){.hero-indicator{width:10px;height:10px}.hero-indicator.active{width:28px;border-radius:5px}}.hero-autoplay-toggle{display:flex;align-items:center;justify-content:center;margin-left:8px;cursor:pointer;padding:0;transition:all .3s ease;position:relative}.hero-autoplay-toggle svg{position:absolute;opacity:0;transition:opacity .3s ease}.hero-autoplay-toggle svg.active{opacity:1}.hero-autoplay-toggle:hover{background:#fff;border-color:#0049b4;box-shadow:0 2px 8px rgba(0,73,180,.2)}@media(max-width: 768px){.hero-autoplay-toggle{margin-left:6px}.hero-autoplay-toggle svg{width:10px;height:12px}}.api-search-section{position:relative;padding:0;overflow:hidden;background:#e9f9ff}.api-search-section .search-background{position:absolute;inset:0;background-image:url("/img/bg_main_intersect.png");background-size:cover;background-position:center;background-repeat:no-repeat;pointer-events:none}.api-search-section .search-content-wrapper{position:relative;display:flex;align-items:center;justify-content:center;gap:40px;z-index:1}@media(max-width: 1024px){.api-search-section .search-content-wrapper{flex-direction:column;gap:24px;padding-top:40px}}.api-search-section .search-character{width:154px;height:148px;flex-shrink:0}.api-search-section .search-character img{width:100%;height:100%;object-fit:contain}@media(max-width: 1024px){.api-search-section .search-character{width:120px;height:115px}}.api-search-section .search-text-content{text-align:left}@media(max-width: 1024px){.api-search-section .search-text-content{text-align:center}}.api-search-section .search-title{font-family:"Noto Sans KR",sans-serif;font-size:36px;font-weight:700;line-height:1.3;color:#000;margin:0}@media(max-width: 1024px){.api-search-section .search-title{font-size:28px}}@media(max-width: 768px){.api-search-section .search-title{font-size:24px}}.api-search-section .search-input-wrapper{position:relative;display:flex;justify-content:center;padding:0px 0 30px;z-index:1}@media(max-width: 1024px){.api-search-section .search-input-wrapper{padding:30px 20px 20px}}.api-search-section .search-form{width:100%;max-width:816px}.api-search-section .search-box{position:relative;width:100%;height:80px;background:#fff;border:6px solid #0049b4;border-radius:50px;display:flex;align-items:center;padding:0 24px}@media(max-width: 1024px){.api-search-section .search-box{height:60px;border:4px solid #0049b4;padding:0 16px}}.api-search-section .search-input{flex:1;width:100%;height:100%;border:none;outline:none;background:rgba(0,0,0,0);font-family:"Noto Sans KR",sans-serif;font-size:17px;font-weight:500;color:#000;padding:0 20px}.api-search-section .search-input::placeholder{color:#b3b3b3;font-weight:400}@media(max-width: 1024px){.api-search-section .search-input{font-size:15px;padding:0 12px}}.api-search-section .search-icon-button{background:none;border:none;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;width:40px;height:40px;flex-shrink:0;transition:transform .3s ease}.api-search-section .search-icon-button:hover{transform:scale(1.1)}.api-search-section .search-icon-button:active{transform:scale(0.95)}.api-search-section .search-icon-button svg{width:33px;height:34px}@media(max-width: 1024px){.api-search-section .search-icon-button svg{width:28px;height:29px}}.api-search-section .hashtag-section{position:relative;display:flex;align-items:center;justify-content:center;gap:12px;padding:0 20px 0px;z-index:1}@media(max-width: 1024px){.api-search-section .hashtag-section{flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:0 20px 30px}}.api-search-section .hashtag-label{font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:700;color:#000;white-space:nowrap}.api-search-section .hashtag-list{display:flex;align-items:center;gap:14px;flex-wrap:wrap}@media(max-width: 1024px){.api-search-section .hashtag-list{justify-content:center;gap:10px}}.api-search-section .hashtag-link{font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#000;text-decoration:none;white-space:nowrap;transition:color .3s ease}.api-search-section .hashtag-link:hover{color:#0049b4;text-decoration:underline}@media(max-width: 1024px){.api-search-section .hashtag-link{font-size:14px}}.api-search-section .hashtag-separator{font-family:"Noto Sans KR",sans-serif;font-size:16px;color:#000;user-select:none}@media(max-width: 1024px){.api-search-section .hashtag-separator{font-size:14px}}.api-showcase{position:relative;display:flex;align-items:center;padding:175px 0 100px;background:#fff;overflow:hidden}.api-showcase .showcase-background{position:absolute;inset:0;background-image:url("/img/bg_main_recommend_apis.png");background-size:cover;background-position:center;background-repeat:no-repeat;pointer-events:none}.api-showcase .showcase-wrapper{max-width:1228px;margin:0 auto;padding:0 20px;position:relative;width:100%;z-index:1}.api-showcase .section-header{text-align:center;margin-bottom:24px;position:relative;padding-right:150px}@media(max-width: 1024px){.api-showcase .section-header{padding-right:0}}.api-showcase .section-title{font-family:"Noto Sans KR",sans-serif;font-size:44px;font-weight:700;line-height:1.3;color:#000;margin:0}@media(max-width: 1024px){.api-showcase .section-title{font-size:36px}}@media(max-width: 768px){.api-showcase .section-title{font-size:28px}}.api-showcase .section-subtitle{font-family:"Noto Sans KR",sans-serif;font-size:26px;font-weight:400;line-height:1.5;color:#1e1e1e;margin-bottom:30px}@media(max-width: 1024px){.api-showcase .section-subtitle{font-size:20px}}@media(max-width: 768px){.api-showcase .section-subtitle{font-size:18px}}.api-showcase .btn-all-apis{position:absolute;top:50%;right:0;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;gap:21px;padding:12px 24px;font-family:"Noto Sans KR",sans-serif;font-size:15px;font-weight:500;color:#fff;background:#008ae2;text-decoration:none;border-radius:10px;transition:all .3s ease;height:40px;width:135px}@media(max-width: 1024px){.api-showcase .btn-all-apis{position:static;transform:none;margin:24px auto 0}}.api-showcase .btn-all-apis svg{width:11px;height:17px;transition:transform .3s ease}.api-showcase .btn-all-apis svg path{stroke:#fff}.api-showcase .btn-all-apis:hover{background:rgb(0,106.8584070796,175)}.api-showcase .btn-all-apis:hover svg{transform:translateX(4px)}.api-showcase .api-cards-container{display:flex;gap:32px;justify-content:center}@media(min-width: 1280px){.api-showcase .api-cards-container{gap:24px}}@media(max-width: 1024px){.api-showcase .api-cards-container{flex-wrap:wrap;gap:20px;justify-content:center}}.api-showcase .api-card{width:283px;height:320px;background:#fff;border:1px solid #ddd;border-radius:20px;padding:36px 38px;display:flex;flex-direction:column;align-items:flex-start;position:relative;transition:all .3s ease;gap:0px;cursor:pointer}.api-showcase .api-card:hover{transform:translateY(-4px);box-shadow:0 8px 24px rgba(0,0,0,.1);border-color:#008ae2}@media(max-width: 1024px){.api-showcase .api-card{width:calc(50% - 10px);min-width:250px}}@media(max-width: 768px){.api-showcase .api-card{width:100%;max-width:350px}}.api-showcase .card-title{font-family:"Noto Sans KR",sans-serif;font-size:24px;font-weight:700;line-height:1.67;color:#2a2a2a;margin:0 0 20px 0}.api-showcase .card-description{font-family:"Noto Sans KR",sans-serif;font-size:15px;font-weight:400;line-height:1.43;color:#515151;margin:0;flex:1;text-align:left}.api-showcase .card-illustration{width:90px;height:90px;display:flex;align-items:center;justify-content:center;margin-top:auto;align-self:flex-end}.api-showcase .card-illustration img{width:100%;height:100%;object-fit:contain}.info-section{position:relative;padding:100px 0;background:#fff;overflow:hidden;min-height:980px;display:flex;align-items:center}.info-section .info-background{position:absolute;inset:0;background-image:url("/img/bg_api_intro.svg");background-size:cover;background-position:center;pointer-events:none}.info-section .container{position:relative;z-index:1}.info-section .info-wrapper{display:flex;align-items:center;justify-content:space-between;gap:80px}@media(max-width: 1024px){.info-section .info-wrapper{flex-direction:column;gap:64px}}.info-section .info-content{flex:1;max-width:600px}@media(max-width: 1024px){.info-section .info-content{text-align:center;max-width:100%}}.info-section .info-title{font-family:"Noto Sans KR",sans-serif;font-size:28px;font-weight:400;line-height:1.4;color:#000;margin:0 0 24px 0}@media(max-width: 1024px){.info-section .info-title{font-size:36px}}@media(max-width: 768px){.info-section .info-title{font-size:28px}}.info-section .info-title .title-highlight{font-weight:700;color:#0049b4;font-size:36px}.info-section .info-description{font-family:"Noto Sans KR",sans-serif;font-size:18px;font-weight:400;line-height:1.6;color:#000;margin:0 0 48px 0}@media(max-width: 1024px){.info-section .info-description{font-size:16px}}.info-section .action-buttons{display:flex;gap:24px}@media(max-width: 1024px){.info-section .action-buttons{justify-content:center}}@media(max-width: 768px){.info-section .action-buttons{flex-direction:column;align-items:stretch}}.info-section .action-btn{display:inline-flex;align-items:center;justify-content:center;padding:18px 52px;font-family:"Noto Sans KR",sans-serif;font-size:24px;font-weight:700;line-height:56px;border-radius:20px;text-decoration:none;white-space:nowrap;transition:all .3s ease;min-width:310px;height:128px}@media(max-width: 768px){.info-section .action-btn{font-size:20px;padding:12px 32px;min-width:100%}}.info-section .action-btn:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(0,0,0,.15)}.info-section .action-btn:active{transform:translateY(0)}.info-section .action-btn-primary{background:#0049b4;color:#fff}.info-section .action-btn-primary:hover{background:rgb(0,52.3166666667,129)}.info-section .action-btn-secondary{background:#00acdd;color:#fff}.info-section .action-btn-secondary:hover{background:rgb(0,132.3076923077,170)}.info-section .info-image{flex:1;max-width:560px;display:flex;align-items:center;justify-content:center}.info-section .info-image img{width:100%;height:auto;object-fit:contain}@media(max-width: 1024px){.info-section .info-image{max-width:100%}}.support-center{position:relative;padding:150px 0;background:#eef7fd;overflow:hidden;min-height:980px}.support-center .support-background{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%;height:100%;max-width:1920px;pointer-events:none}.support-center .support-background::before{content:"";position:absolute;top:17px;left:46%;width:693px;height:597px;background-image:url("/img/bg_support_center.png");background-size:cover;background-repeat:no-repeat;opacity:.5}.support-center .container{position:relative;z-index:1;max-width:1280px;margin:0 auto;padding:0 40px}.support-center .section-header{margin-bottom:80px;text-align:center}.support-center .section-header .section-title{font-family:"Noto Sans KR",sans-serif;font-size:44px;line-height:1.6;color:#000;margin:0;text-align:left}@media(max-width: 1024px){.support-center .section-header .section-title{font-size:36px;line-height:1.4}}@media(max-width: 768px){.support-center .section-header .section-title{font-size:28px}}.support-center .section-header .section-title .title-regular{font-weight:400}.support-center .section-header .section-title .title-bold{font-weight:700}.support-center .support-grid{display:flex;gap:32px;justify-content:center;align-items:stretch;max-width:1228px;margin:0 auto}@media(max-width: 1024px){.support-center .support-grid{flex-direction:column;align-items:center;gap:20px}}.support-center .support-card{background:#fff;border-radius:20px;text-decoration:none;transition:all .3s ease;display:flex;box-sizing:border-box;position:relative;overflow:hidden;height:377px}@media(max-width: 1024px){.support-center .support-card{width:100%;max-width:598px;height:auto;min-height:260px}}.support-center .support-card:hover{transform:translateY(-5px);box-shadow:0 10px 30px rgba(0,73,180,.15)}.support-center .support-card .card-icon{display:flex;align-items:center;justify-content:center}.support-center .support-card .card-icon img{width:100%;height:100%;object-fit:contain}.support-center .support-card .card-content{display:flex;flex-direction:column;justify-content:center}.support-center .support-card .card-content h3{font-family:"Noto Sans KR",sans-serif;font-size:32px;font-weight:700;color:#212529;margin:0 0 10px 0;line-height:1.3}@media(max-width: 1024px){.support-center .support-card .card-content h3{font-size:28px}}.support-center .support-card .card-content p{font-family:"Noto Sans KR",sans-serif;font-size:18px;font-weight:400;color:#515961;margin:0;line-height:1.4}@media(max-width: 1024px){.support-center .support-card .card-content p{font-size:16px}}.support-center .support-card--notice{width:598px;flex-shrink:0;flex-direction:column;align-items:center;padding:60px 40px;background:#0049b4}@media(max-width: 1024px){.support-center .support-card--notice{width:100%;max-width:598px;padding:50px 40px}}.support-center .support-card--notice .card-icon{width:174px;height:120px;margin-bottom:36px}.support-center .support-card--notice .card-content{align-items:center;text-align:center}.support-center .support-card--notice .card-content h3{color:#fff;font-size:36px}@media(max-width: 1024px){.support-center .support-card--notice .card-content h3{font-size:32px}}.support-center .support-card--notice .card-content p{color:hsla(0,0%,100%,.9);font-size:20px}@media(max-width: 1024px){.support-center .support-card--notice .card-content p{font-size:18px}}.support-center .support-card--notice:hover{background:rgb(0,62.6583333333,154.5)}.support-center .support-card--faq,.support-center .support-card--qna{width:283px;flex-shrink:0;flex-direction:column;align-items:center;padding:60px 40px}@media(max-width: 1024px){.support-center .support-card--faq,.support-center .support-card--qna{width:100%;max-width:598px;padding:40px}}.support-center .support-card--faq .card-icon,.support-center .support-card--qna .card-icon{width:120px;height:120px;margin-bottom:36px}.support-center .support-card--faq .card-content,.support-center .support-card--qna .card-content{align-items:center;text-align:center;flex:none}.support-center .support-card--faq .card-content h3,.support-center .support-card--qna .card-content h3{font-size:36px}@media(max-width: 1024px){.support-center .support-card--faq .card-content h3,.support-center .support-card--qna .card-content h3{font-size:32px}}.support-center .support-card--faq .card-content p,.support-center .support-card--qna .card-content p{font-size:20px}@media(max-width: 1024px){.support-center .support-card--faq .card-content p,.support-center .support-card--qna .card-content p{font-size:18px}}.support-center .support-card--faq{background:#daf0ff}.support-center .support-card--faq .card-content h3{color:#212529}.support-center .support-card--qna{background:#d9f6f8}.support-center .support-card--qna .card-content h3{color:#212529}.api-stats-section{position:relative;min-height:720px;padding:100px 0;overflow:hidden;display:flex;align-items:center;justify-content:center}@media(max-width: 1024px){.api-stats-section{min-height:600px;padding:64px 0}}@media(max-width: 768px){.api-stats-section{min-height:500px;padding:48px 0}}.stats-background{position:absolute;inset:0;background-image:url("/img/bg_main_api_usage.png");background-size:cover;background-position:center;background-repeat:no-repeat;overflow:hidden}.api-stats-section .container{position:relative;z-index:1}.api-stats-section .section-header{text-align:center;margin-bottom:80px}@media(max-width: 768px){.api-stats-section .section-header{margin-bottom:60px}}.api-stats-section .section-title{font-family:"Noto Sans KR",sans-serif;line-height:1.5;margin:0}.api-stats-section .section-title .title-top{display:block;font-size:32px;font-weight:400;color:#e8e8e8;margin-bottom:8px}@media(max-width: 1024px){.api-stats-section .section-title .title-top{font-size:28px}}@media(max-width: 768px){.api-stats-section .section-title .title-top{font-size:24px}}.api-stats-section .section-title .title-highlight{font-size:44px;font-weight:700;color:#81d5ff}@media(max-width: 1024px){.api-stats-section .section-title .title-highlight{font-size:36px}}@media(max-width: 768px){.api-stats-section .section-title .title-highlight{font-size:28px}}.api-stats-section .section-title{font-size:44px;font-weight:400;color:#e8e8e8}@media(max-width: 1024px){.api-stats-section .section-title{font-size:36px}}@media(max-width: 768px){.api-stats-section .section-title{font-size:28px}}.api-stats-section .stats-cards{display:flex;align-items:center;justify-content:center;gap:0;max-width:1200px;margin:0 auto}@media(max-width: 1024px){.api-stats-section .stats-cards{flex-direction:column;gap:40px}}@media(max-width: 768px){.api-stats-section .stats-cards{gap:32px;padding:0 24px}}.api-stats-section .stat-card{display:flex;flex-direction:column;align-items:center;gap:10px;width:145px}@media(max-width: 1024px){.api-stats-section .stat-card{width:auto}}.api-stats-section .stat-card .stat-label{font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:500;color:#fff;line-height:40px;margin:0;white-space:nowrap}@media(max-width: 768px){.api-stats-section .stat-card .stat-label{font-size:18px}}.api-stats-section .stat-card .stat-icon{width:100px;height:100px;display:flex;align-items:center;justify-content:center;transition:transform .3s ease}.api-stats-section .stat-card .stat-icon svg{width:100%;height:100%;filter:drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2))}@media(max-width: 768px){.api-stats-section .stat-card .stat-icon{width:80px;height:80px}}.api-stats-section .stat-card .stat-number{font-family:"Noto Sans KR",sans-serif;font-size:44px;font-weight:700;color:#efdcb2;line-height:61px;margin:0;text-align:center;white-space:nowrap}@media(max-width: 1024px){.api-stats-section .stat-card .stat-number{font-size:40px}}@media(max-width: 768px){.api-stats-section .stat-card .stat-number{font-size:36px}}.api-stats-section .stat-card:hover .stat-icon{transform:scale(1.1)}.api-stats-section .stats-divider{width:1px;height:240px;margin:0 60px;flex-shrink:0}@media(max-width: 1024px){.api-stats-section .stats-divider{display:none}}.stat-number{animation:countUp .6s ease-out forwards}@keyframes countUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.signup-cta-section{position:relative;min-height:329px;display:flex;align-items:center;justify-content:center;overflow:hidden}.signup-cta-section .cta-background{position:absolute;inset:0;background-image:url("/img/bg_main_join.png");background-size:cover;background-position:center;background-repeat:no-repeat;overflow:hidden}.signup-cta-section .container{position:relative;z-index:1}.signup-cta-section .cta-content{display:flex;flex-direction:column;align-items:center;gap:40px;text-align:center}.signup-cta-section .cta-title{font-family:"Noto Sans KR",sans-serif;font-size:40px;font-weight:700;color:#000;line-height:normal;margin:0}@media(max-width: 1024px){.signup-cta-section .cta-title{font-size:32px}}@media(max-width: 768px){.signup-cta-section .cta-title{font-size:24px}}.signup-cta-section .btn-signup-cta{display:inline-flex;align-items:center;justify-content:center;padding:10px;min-height:60px;width:178px;background:#008ae2;color:#fff;font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:700;border-radius:10px;text-decoration:none;transition:all .3s ease}.signup-cta-section .btn-signup-cta:hover{background:rgb(0,106.8584070796,175);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,138,226,.3)}.signup-cta-section .btn-signup-cta:active{transform:translateY(0)}@media(max-width: 768px){.signup-cta-section .btn-signup-cta{width:100%;max-width:300px}}.signup-cta-section .cta-divider{position:absolute;bottom:0;left:0;right:0;height:1px;background:#ddd}.api-market-container{display:flex;min-height:100vh;background-color:#fff;position:relative;margin-bottom:20px}.api-market-sidebar{width:283px;background-color:#f8fbfd;border-radius:20px;padding:40px 24px;position:sticky;top:24px;height:calc(100vh - 32px);flex-shrink:0;margin:16px}@media(max-width: 1024px){.api-market-sidebar{width:240px}}@media(max-width: 768px){.api-market-sidebar{position:fixed;left:0;top:60px;transform:translateX(-100%);transition:transform .3s ease;box-shadow:0 8px 24px rgba(75,155,255,.15);z-index:500;height:calc(100vh - 60px);margin:0;border-radius:0}.api-market-sidebar.mobile-open{transform:translateX(0)}}.api-sidebar-header{display:flex;justify-content:center;margin-bottom:32px;padding-bottom:24px}.api-sidebar-header img{max-width:100%;height:auto}.api-sidebar-nav .menu-section{margin-bottom:0;border-bottom:1px solid #ddd}.api-sidebar-nav .menu-section:last-child{border-bottom:none}.api-sidebar-nav .menu-title{padding:16px 10px;font-size:20px;font-weight:400;color:#1a1a2e;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;justify-content:space-between;position:relative}.api-sidebar-nav .menu-title:hover{background-color:rgba(0,73,180,.05)}.api-sidebar-nav .menu-title.active{font-weight:700;color:#0049b4}.api-sidebar-nav .menu-title .api-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 8px;background-color:rgba(0,73,180,.1);color:#0049b4;font-size:12px;font-weight:600;border-radius:50px;transition:all .3s ease}.api-sidebar-nav .menu-title.active .api-count{background-color:#0049b4;color:#fff}.api-sidebar-nav .accordion-section .menu-title.accordion-trigger .menu-title-text{flex:1}.api-sidebar-nav .accordion-section .menu-title.accordion-trigger .accordion-icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;transition:transform .3s ease}.api-sidebar-nav .accordion-section .menu-title.accordion-trigger .accordion-icon i{font-size:12px;color:#64748b;transition:all .3s ease}.api-sidebar-nav .accordion-section .menu-title.accordion-trigger:hover .accordion-icon i{color:#0049b4}.api-sidebar-nav .accordion-section .menu-title.accordion-trigger.expanded .accordion-icon{transform:rotate(180deg)}.api-sidebar-nav .accordion-section .menu-title.accordion-trigger.active .accordion-icon i{color:#0049b4}.api-sidebar-nav .api-list{padding-left:16px;margin-top:0;margin-bottom:0}.api-sidebar-nav .api-list.accordion-content{max-height:0;overflow:hidden;transition:max-height .3s ease,padding .3s ease,margin .3s ease}.api-sidebar-nav .api-list.accordion-content.expanded{max-height:500px;margin-top:4px;margin-bottom:8px}.api-sidebar-nav .api-item{padding:8px 16px;font-size:14px;color:#64748b;cursor:pointer;border-radius:6px;transition:all .3s ease;display:flex;align-items:center;position:relative;margin-bottom:4px}.api-sidebar-nav .api-item::before{content:"•";margin-right:8px;color:#0049b4;opacity:.5}.api-sidebar-nav .api-item:hover{background-color:rgba(0,73,180,.05);color:#1a1a2e;padding-left:20px}.api-sidebar-nav .api-item:hover::before{opacity:1}.api-sidebar-nav .api-item.active{background-color:rgba(0,73,180,.1);color:#0049b4;font-weight:500}.api-sidebar-nav .api-item.active::before{opacity:1}.api-sidebar-nav .api-item .api-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.api-market-content{flex:1;padding-top:80px;padding-left:8px;padding-right:8px;min-height:100vh;display:flex;flex-direction:column}@media(max-width: 768px){.api-market-content{padding:24px 16px}}.api-market-content .api-result-count{font-size:20px;color:#000;white-space:nowrap}.api-market-content .api-result-count strong{color:#0049b4;font-weight:600}.api-mobile-toggle{display:none;position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;border:none;color:#fff;font-size:24px;cursor:pointer;box-shadow:0 8px 24px rgba(75,155,255,.15);z-index:501;transition:all .3s ease}.api-mobile-toggle:hover{transform:scale(1.05);box-shadow:0 16px 40px rgba(75,155,255,.2)}.api-mobile-toggle:active{transform:scale(0.95)}@media(max-width: 768px){.api-mobile-toggle{display:flex;align-items:center;justify-content:center}}.api-market-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}@media(max-width: 768px){.api-market-header{flex-direction:column;align-items:flex-start;gap:24px}}.api-market-title h1{font-size:14px;color:#64748b;font-weight:400;margin-bottom:4px}.api-market-title h2{font-size:32px;font-weight:700;color:#1a1a2e}.api-market-search{position:relative;width:300px}@media(max-width: 768px){.api-market-search{width:100%}}.api-market-search form{position:relative;display:flex;align-items:center}.api-market-search input{flex:1;padding:12px 48px 12px 16px;border:1px solid #e2e8f0;border-radius:12px;font-size:14px;outline:none;transition:all .3s ease}.api-market-search input:focus{border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.api-market-search input::placeholder{color:#94a3b8}.api-market-search .search-submit-btn{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:36px;height:36px;background:rgba(0,0,0,0);border:none;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;color:#64748b}.api-market-search .search-submit-btn:hover{background:#eff6ff;color:#0049b4;transform:translateY(-50%) scale(1.05)}.api-market-search .search-submit-btn:active{transform:translateY(-50%) scale(0.95)}.api-market-search .search-submit-btn .search-icon{font-size:18px;display:block}.api-card-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:24px}@media(max-width: 1024px){.api-card-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 768px){.api-card-grid{grid-template-columns:1fr}}.api-card{background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 4px rgba(0,0,0,.05);cursor:pointer;display:flex;flex-direction:column;gap:16px;min-height:180px;position:relative;border:1px solid #e2e8f0}.api-card:active{transform:scale(0.98)}.api-card-group{display:flex;align-items:center;gap:8px}.api-card-group-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#f8fafc;border-radius:8px;flex-shrink:0}.api-card-group-icon img{width:20px;height:20px;object-fit:contain}.api-card-group-icon i{font-size:16px;color:#0049b4}.api-card-group-name{font-size:14px;color:#64748b;font-weight:500}.api-card-name{font-size:20px;font-weight:600;color:#1a1a2e;line-height:1.2;margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-align:left}.api-card-description{font-size:14px;color:#64748b;line-height:1.6;margin:0;flex-grow:1;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-align:left}.api-empty-state{text-align:center;padding:80px 24px;color:#64748b}.api-empty-state .empty-icon{font-size:80px;margin-bottom:24px;opacity:.5}.api-empty-state h3{font-size:24px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.api-empty-state p{font-size:16px;color:#64748b}.api-loading{display:flex;justify-content:center;align-items:center;padding:80px}.api-loading .spinner{width:48px;height:48px;border:4px solid #e2e8f0;border-top-color:#0049b4;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.api-mobile-overlay{display:none;position:fixed;top:60px;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:499;opacity:0;transition:opacity .3s ease;pointer-events:none}@media(max-width: 768px){.api-mobile-overlay{display:block}}.api-mobile-overlay.active{opacity:1;pointer-events:auto}.api-detail-content{display:flex;flex-direction:column;gap:32px}.api-detail-tabs{display:flex;gap:8px;border-bottom:2px solid #e2e8f0;margin-bottom:32px}.api-detail-tabs .tab-button{padding:16px 24px;background:rgba(0,0,0,0);border:none;border-bottom:3px solid rgba(0,0,0,0);font-size:16px;font-weight:500;color:#64748b;cursor:pointer;transition:all .3s ease;position:relative;bottom:-2px}.api-detail-tabs .tab-button:hover{color:#0049b4;background-color:rgba(0,73,180,.05)}.api-detail-tabs .tab-button.active{color:#0049b4;font-weight:600;border-bottom-color:#0049b4}.tab-content{display:none;flex-direction:column;gap:32px;min-height:200px}.tab-content.active{display:flex}.api-overview-card{background:rgba(0,0,0,0);border-radius:0;padding:0;padding-bottom:32px;display:flex;flex-direction:column;gap:24px}.api-overview-card .api-overview-header{display:flex;flex-direction:row;align-items:center;gap:16px}@media(max-width: 768px){.api-overview-card .api-overview-header{flex-direction:column;align-items:flex-start}}.api-overview-card .api-method-badge{background:#0049b4;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:8px 16px;height:100%;color:#fff;font-size:14px;font-weight:600;border-radius:6px;text-transform:uppercase;letter-spacing:.5px}.api-overview-card .api-endpoint{flex:1}.api-overview-card .api-endpoint code{display:block;padding:8px 16px;background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;font-size:18px;font-family:"Courier New",monospace;color:#1a1a2e;word-break:break-all}.api-overview-card .api-simple-description{padding:16px 0;border-bottom:1px solid #e2e8f0}.api-overview-card .api-simple-description p{font-size:16px;color:#64748b;line-height:1.6;margin:0}.api-overview-card .api-overview-info h4{font-size:18px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.api-details-grid{display:flex;flex-direction:column;gap:24px}.api-detail-card{background:rgba(0,0,0,0);border-radius:0;padding:0;padding-bottom:32px;border-bottom:1px solid #e2e8f0}.api-detail-card:last-child{border-bottom:none;padding-bottom:0}.api-detail-card h3{font-size:20px;font-weight:600;color:#1a1a2e;margin-bottom:16px;padding-bottom:0;border-bottom:none}.api-detail-card .detail-content{font-size:14px;color:#64748b;line-height:1.6}.api-detail-card .detail-content pre{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;overflow-x:auto;margin:0}.api-detail-card .detail-content pre code{font-family:"Courier New",monospace;font-size:14px;color:#1a1a2e;white-space:pre-wrap;word-break:break-word}.api-detail-card .detail-content table{width:100%;border-collapse:collapse;margin:16px 0;background-color:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.api-detail-card .detail-content table thead{background-color:#eff6ff}.api-detail-card .detail-content table th{text-align:left;padding:8px 16px;font-size:14px;font-weight:600;color:#1a1a2e;border-bottom:2px solid #e2e8f0;background-color:rgba(0,73,180,.05)}.api-detail-card .detail-content table th:not(:last-child){border-right:1px solid #e2e8f0}.api-detail-card .detail-content table td{padding:8px 16px;font-size:14px;color:#64748b;border-bottom:1px solid #e2e8f0}.api-detail-card .detail-content table td:not(:last-child){border-right:1px solid #e2e8f0}.api-detail-card .detail-content table tr{transition:all .3s ease}.api-detail-card .detail-content table tr:last-child td{border-bottom:none}.api-detail-card .detail-content table tr:hover{background-color:rgba(0,73,180,.02)}.api-detail-card .detail-content table tbody tr:nth-child(even){background-color:rgba(248,250,252,.3)}.api-info-table{width:100%;border-collapse:collapse}.api-info-table tr{border-bottom:1px solid #e2e8f0}.api-info-table tr:last-child{border-bottom:none}.api-info-table th{text-align:left;padding:8px 16px;font-size:14px;font-weight:600;color:#1a1a2e;width:30%;background-color:#f8fafc}.api-info-table td{padding:8px 16px;font-size:14px;color:#64748b}.api-info-table td code{display:inline-block;padding:2px 8px;background-color:#f8fafc;border-radius:6px;font-family:"Courier New",monospace;font-size:12px;color:#0049b4}.login-page{display:flex;align-items:center;justify-content:center;background:#edf9fe;padding:40px 20px;position:relative;border-radius:12px;margin-top:60px;margin-bottom:60px}.login-container{width:100%;max-width:504px;margin:0 auto;position:relative}.login-card{background:rgba(0,0,0,0);padding:0;display:flex;flex-direction:column;align-items:center}@media(max-width: 576px){.login-card{padding:0 20px}}.login-logo{width:90px;height:90px;margin-bottom:30px}.login-logo img{width:100%;height:100%;object-fit:contain}.login-message{font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:400;color:#000;text-align:center;margin-bottom:40px;line-height:1}.login-form{width:100%;margin-bottom:0}.login-form .form-group{margin-bottom:24px}.login-form .form-group:last-of-type{margin-bottom:0}.login-form .form-input{width:100%;height:70px;padding:0 32px;font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#5f666c;background:#fff;border:1px solid #ddd;border-radius:12px;outline:none;transition:all .3s ease}.login-form .form-input::placeholder{color:#5f666c}.login-form .form-input:focus{border-color:#0049b4}.login-form .form-input.error{border-color:#ff6b6b}.login-form .form-checkbox{display:flex;align-items:center;justify-content:flex-end;gap:7px;margin-top:24px;margin-bottom:22px;margin-right:10px}.login-form .form-checkbox input[type=checkbox]{width:20px;height:20px;border:1.5px solid #000;border-radius:4px;cursor:pointer;appearance:none;background:#fff;position:relative;flex-shrink:0}.login-form .form-checkbox input[type=checkbox]:checked{background:#fff;border-color:#2c2c2c}.login-form .form-checkbox input[type=checkbox]:checked::after{content:"";position:absolute;left:50%;top:45%;transform:translate(-50%, -50%) rotate(45deg);width:6px;height:12px;border:solid #2c2c2c;border-width:0 2px 2px 0}.login-form .form-checkbox label{font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#000;cursor:pointer;user-select:none;line-height:24px;white-space:nowrap}.login-button{width:100%;height:80px;padding:10px;font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:700;color:#fff;background:#0049b4;border:none;border-radius:12px;cursor:pointer;transition:all .3s ease;margin-bottom:40px;line-height:1}.login-button:hover{background:rgb(0,62.6583333333,154.5)}.login-button:active{background:rgb(0,52.3166666667,129)}.login-button:disabled{opacity:.6;cursor:not-allowed}.login-links{display:flex;justify-content:center;align-items:center;gap:26px;flex-wrap:wrap}.login-links a{font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#000;text-decoration:none;transition:color .3s ease;line-height:1}.login-links a:hover{color:#0049b4;text-decoration:underline}.login-links .link-separator{color:#000;font-size:16px}.login-alert{width:100%;margin-bottom:24px;padding:12px 16px;border-radius:8px;font-size:14px;display:flex;align-items:center;gap:8px}.login-alert.alert-error{background:rgba(255,107,107,.1);color:#ff6b6b;border:1px solid rgba(255,107,107,.2)}.login-alert.alert-success{background:rgba(107,207,127,.1);color:#6bcf7f;border:1px solid rgba(107,207,127,.2)}.login-alert.alert-info{background:rgba(0,73,180,.1);color:#0049b4;border:1px solid rgba(0,73,180,.2)}.login-alert i{font-size:18px}.login-loading{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(237,249,254,.9);display:flex;align-items:center;justify-content:center;z-index:10;opacity:0;pointer-events:none;transition:opacity .3s ease}.login-loading.active{opacity:1;pointer-events:all}.login-loading .spinner{width:40px;height:40px;border:3px solid #ddd;border-top-color:#0049b4;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width: 576px){.login-container{max-width:100%;padding:0 20px}.login-logo{width:70px;height:70px;margin-bottom:24px}.login-message{font-size:18px;margin-bottom:32px}.login-form .form-input{height:60px;padding:0 20px;font-size:15px}.login-form .form-checkbox input[type=checkbox]{width:24px;height:24px}.login-form .form-checkbox label{font-size:14px}.login-button{height:70px;font-size:18px;margin-bottom:32px}.login-links{gap:20px}.login-links a,.login-links .link-separator{font-size:14px}}.account-recovery-page{display:flex;align-items:center;justify-content:center;background:#edf9fe;padding:40px 20px;position:relative;min-height:calc(100vh - 200px);margin-top:60px;margin-bottom:60px;border-radius:12px}.account-recovery-container{width:100%;max-width:540px;margin:0 auto;position:relative}.account-recovery-card{background:rgba(0,0,0,0);padding:0;display:flex;flex-direction:column;align-items:center;position:relative}@media(max-width: 576px){.account-recovery-card{padding:0 20px}}.account-recovery-logo{width:90px;height:90px;margin-bottom:24px}.account-recovery-logo img{width:100%;height:100%;object-fit:contain}.account-recovery-title{font-family:"Noto Sans KR",sans-serif;font-size:28px;font-weight:700;color:#000;text-align:center;margin:0 0 32px 0;line-height:1.3}@media(max-width: 576px){.account-recovery-title{font-size:24px;margin-bottom:24px}}.account-recovery-tabs{display:flex;gap:0;margin-bottom:40px;width:100%;background:#f8f9fa;border-radius:12px;padding:4px}.account-recovery-tabs .tab-link{flex:1;padding:14px 24px;font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:600;color:#64748b;text-decoration:none;text-align:center;background:rgba(0,0,0,0);border-radius:8px;transition:all .3s ease}.account-recovery-tabs .tab-link:hover{color:#0049b4;background:rgba(0,73,180,.05)}.account-recovery-tabs .tab-link.active{color:#fff;background:#0049b4;box-shadow:0 2px 4px rgba(0,73,180,.2)}@media(max-width: 576px){.account-recovery-tabs .tab-link{padding:12px 16px;font-size:15px}}.account-alert{width:100%;margin-bottom:20px;padding:14px 18px;border-radius:12px;font-family:"Noto Sans KR",sans-serif;font-size:15px;display:flex;align-items:center;gap:10px;animation:slideDown .3s ease}.account-alert i{font-size:18px;flex-shrink:0}.account-alert.alert-error{background:rgba(255,107,107,.1);color:#ff6b6b;border:1px solid rgba(255,107,107,.3)}.account-alert.alert-success{background:rgba(107,207,127,.1);color:#6bcf7f;border:1px solid rgba(107,207,127,.3)}.account-alert.alert-info{background:rgba(0,73,180,.1);color:#0049b4;border:1px solid rgba(0,73,180,.3)}.account-recovery-form{width:100%;margin-bottom:0}.account-recovery-form .form-group{margin-bottom:24px}.account-recovery-form .form-group:last-of-type{margin-bottom:0}.account-recovery-form .form-label{display:block;font-family:"Noto Sans KR",sans-serif;font-size:15px;font-weight:600;color:#1a1a2e;margin-bottom:10px}.account-recovery-form .form-input{width:100%;height:70px;padding:0 24px;font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#1a1a2e;background:#fff;border:1px solid #ddd;border-radius:12px;outline:none;transition:all .3s ease}.account-recovery-form .form-input::placeholder{color:#94a3b8}.account-recovery-form .form-input:hover{border-color:#cbd5e1}.account-recovery-form .form-input:focus{border-color:#0049b4;box-shadow:0 0 0 4px rgba(0,73,180,.08)}.account-recovery-form .form-input:disabled{background:#f8f9fa;border-color:#e2e8f0;color:#94a3b8;cursor:not-allowed}.account-recovery-form .form-input.error{border-color:#ff6b6b}.account-recovery-form .form-select{width:100%;height:70px;padding:0 24px;font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#1a1a2e;background:#fff;border:1px solid #ddd;border-radius:12px;outline:none;cursor:pointer;transition:all .3s ease;appearance:none;background-image:url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L6 6L11 1' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 24px center;padding-right:50px}.account-recovery-form .form-select:hover{border-color:#cbd5e1}.account-recovery-form .form-select:focus{border-color:#0049b4;box-shadow:0 0 0 4px rgba(0,73,180,.08)}.account-recovery-form .form-select:disabled{background-color:#f8f9fa;border-color:#e2e8f0;color:#94a3b8;cursor:not-allowed;opacity:.7}.account-recovery-form .form-select option{padding:12px;font-size:16px}.phone-input-group{display:flex;align-items:center;gap:12px}.phone-input-group .phone-prefix{flex:0 0 140px}.phone-input-group .phone-middle,.phone-input-group .phone-last{flex:1}.phone-input-group .phone-separator{font-size:16px;color:#64748b;font-weight:500}@media(max-width: 576px){.phone-input-group .phone-prefix{flex:0 0 110px}.phone-input-group .phone-separator{font-size:14px}}.auth-number-group{margin-top:24px}.auth-input-group{position:relative}.auth-input-group .auth-input{padding-right:100px}.auth-input-group .auth-timer{position:absolute;right:24px;top:50%;transform:translateY(-50%);font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:600;color:#ff6b6b;pointer-events:none}@media(max-width: 576px){.auth-input-group .auth-timer{font-size:14px;right:16px}}.auth-request-button,.auth-verify-button{width:100%;height:70px;padding:0 32px;font-family:"Noto Sans KR",sans-serif;font-size:17px;font-weight:700;color:#fff;background:#0049b4;border:none;border-radius:12px;cursor:pointer;transition:all .3s ease;margin-top:16px;line-height:1}.auth-request-button:hover,.auth-verify-button:hover{background:rgb(0,62.6583333333,154.5)}.auth-request-button:active,.auth-verify-button:active{background:rgb(0,52.3166666667,129)}.auth-request-button:disabled,.auth-verify-button:disabled{opacity:.6;cursor:not-allowed}@media(max-width: 576px){.auth-request-button,.auth-verify-button{height:60px;font-size:16px}}.account-recovery-card .form-actions,.account-recovery-card .form-actions-center{display:flex;gap:12px;margin-top:32px;padding-top:0;border-top:none}.account-recovery-card .form-actions .cancel-button,.account-recovery-card .form-actions-center .cancel-button,.account-recovery-card .form-actions .submit-button,.account-recovery-card .form-actions-center .submit-button{flex:1;height:70px;padding:0 32px;font-family:"Noto Sans KR",sans-serif;font-size:17px;font-weight:700;border:none;border-radius:12px;cursor:pointer;transition:all .3s ease;line-height:1}.account-recovery-card .form-actions .cancel-button,.account-recovery-card .form-actions-center .cancel-button{color:#64748b;background:#fff;border:2px solid #e2e8f0}.account-recovery-card .form-actions .cancel-button:hover,.account-recovery-card .form-actions-center .cancel-button:hover{background:#f8f9fa;border-color:#cbd5e1;color:#475569}.account-recovery-card .form-actions .cancel-button:active,.account-recovery-card .form-actions-center .cancel-button:active{background:#f1f5f9;border-color:#94a3b8}.account-recovery-card .form-actions .submit-button,.account-recovery-card .form-actions-center .submit-button{color:#fff;background:#0049b4}.account-recovery-card .form-actions .submit-button:hover,.account-recovery-card .form-actions-center .submit-button:hover{background:rgb(0,62.6583333333,154.5)}.account-recovery-card .form-actions .submit-button:active,.account-recovery-card .form-actions-center .submit-button:active{background:rgb(0,52.3166666667,129)}.account-recovery-card .form-actions .submit-button:disabled,.account-recovery-card .form-actions-center .submit-button:disabled{opacity:.6;cursor:not-allowed}@media(max-width: 576px){.account-recovery-card .form-actions,.account-recovery-card .form-actions-center{flex-direction:column;gap:12px}.account-recovery-card .form-actions .cancel-button,.account-recovery-card .form-actions-center .cancel-button,.account-recovery-card .form-actions .submit-button,.account-recovery-card .form-actions-center .submit-button{height:60px;font-size:16px}}.loading-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(237,249,254,.9);display:none;align-items:center;justify-content:center;z-index:1000;transition:opacity .3s ease}.loading-overlay.active{display:flex}.loading-overlay .spinner{width:40px;height:40px;border:3px solid #ddd;border-top-color:#0049b4;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@keyframes slideDown{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@media(max-width: 768px){.account-recovery-page{padding:20px 12px;margin-top:40px;margin-bottom:40px}.account-recovery-container{max-width:100%}}@media(max-width: 576px){.account-recovery-logo{width:70px;height:70px;margin-bottom:20px}.account-recovery-form .form-group{margin-bottom:20px}.account-recovery-form .form-label{font-size:14px;margin-bottom:8px}.account-recovery-form .form-input,.account-recovery-form .form-select{height:60px;padding:0 20px;font-size:15px}.auth-request-button,.auth-verify-button{margin-top:12px}.account-recovery-card .form-actions,.account-recovery-card .form-actions-center{margin-top:24px}}.signup-selection-page{min-height:calc(100vh - 140px);display:flex;align-items:center;justify-content:center;background:#edf9fe;padding:60px 20px;position:relative;border-radius:12px;margin-top:60px;margin-bottom:60px}.signup-selection-container{width:100%;max-width:1018px;margin:0 auto;position:relative}.signup-selection-card{background:rgba(0,0,0,0);padding:0;display:flex;flex-direction:column;align-items:center}@media(max-width: 576px){.signup-selection-card{padding:0 20px}}.signup-logo{width:90px;height:90px;margin-bottom:30px}.signup-logo img{width:100%;height:100%;object-fit:contain}.signup-message{font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:400;color:#000;text-align:center;margin-bottom:40px;line-height:1}.signup-buttons{width:100%;max-width:504px;display:flex;flex-direction:column;gap:40px;margin-bottom:60px}.signup-btn{width:100%;height:80px;display:flex;align-items:center;justify-content:center;gap:10px;padding:10px;font-family:"Noto Sans KR",sans-serif;font-size:20px;font-weight:700;color:#fff;text-decoration:none;border-radius:12px;cursor:pointer;transition:all .3s ease;line-height:1;position:relative}.signup-btn:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.15)}.signup-btn:active{transform:translateY(0);box-shadow:0 2px 6px rgba(0,0,0,.1)}.signup-btn .signup-btn-icon{width:26px;height:30px;flex-shrink:0}.signup-btn span{white-space:nowrap}.signup-btn-individual{background:#0049b4}.signup-btn-organization{background:#00a1d7}.signup-navigation{display:flex;justify-content:center;align-items:center;gap:26px;flex-wrap:wrap}.signup-navigation .signup-nav-link{font-family:"Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#000;text-decoration:none;transition:color .3s ease;line-height:1}.signup-navigation .signup-nav-link:hover{color:#0049b4;text-decoration:underline}.signup-navigation .signup-nav-separator{color:#000;font-size:16px;line-height:1}@media(max-width: 576px){.signup-selection-page{padding:40px 20px}.signup-selection-container{max-width:100%;padding:0 20px}.signup-logo{width:70px;height:70px;margin-bottom:24px}.signup-message{font-size:18px;margin-bottom:32px}.signup-buttons{max-width:100%;gap:24px;margin-bottom:48px}.signup-btn{height:70px;font-size:18px}.signup-btn .signup-btn-icon{width:22px;height:26px}.signup-navigation{gap:20px}.signup-navigation .signup-nav-link,.signup-navigation .signup-nav-separator{font-size:14px}}.corporate-transfer-section{margin-top:40px;padding-top:24px}.corporate-transfer-section .btn-block{width:100%}.register-title-bar{padding:18px 45px;display:flex;align-items:baseline;gap:16px}@media(max-width: 1024px){.register-title-bar{flex-direction:column;gap:8px;padding:14px 20px}}.register-title-bar .register-title{font-size:28px;font-weight:700;color:#1a1a2e;margin:0}@media(max-width: 1024px){.register-title-bar .register-title{font-size:22px}}.register-title-bar .register-subtitle{font-size:16px;font-weight:400;color:#515151}@media(max-width: 1024px){.register-title-bar .register-subtitle{font-size:14px}}.register-progress{display:flex;justify-content:center;margin-bottom:40px}.progress-steps{display:flex;align-items:flex-start;gap:50px}.step-dots{display:flex;gap:6px}.step-dots span{width:6px;height:6px;border-radius:50%;background-color:#dadada}@media(max-width: 1024px){.step-dots{display:none}}.progress-step-item{display:flex;flex-direction:column;align-items:center;gap:8px}.progress-step-item .step-icon-wrapper{padding:10px}.progress-step-item .step-icon{width:62px;height:62px;border-radius:50%;background-color:#e6e6e6;display:flex;align-items:center;justify-content:center;color:#999}.progress-step-item.active .step-icon{background-color:#0049b4;color:#fff}.progress-step-item .step-label{font-size:14px;font-weight:400;color:#dadada;text-align:center;white-space:nowrap}.progress-step-item.active .step-label{font-weight:700;color:#0049b4}.register-form-container{padding:50px 45px}@media(max-width: 1024px){.register-form-container{padding:30px 20px}}.register-form-container.with-sidebar{display:flex;gap:0;padding:28px;min-height:600px}@media(max-width: 768px){.register-form-container.with-sidebar{flex-direction:column}}.register-form-container .form-input{width:100%;height:60px;padding:0 20px;border:1px solid #dadada;border-radius:12px;background-color:#fff;font-size:20px;color:#1a1a2e;outline:none;transition:border-color .2s ease}.register-form-container .form-input::placeholder{color:#dadada}.register-form-container .form-input:focus{border-color:#0049b4}@media(max-width: 1024px){.register-form-container .form-input{height:50px;font-size:16px}}.register-form-container .form-textarea{width:100%;min-height:190px;padding:18px 20px;border:1px solid #dadada;border-radius:12px;background-color:#fff;font-size:20px;color:#1a1a2e;outline:none;resize:vertical;transition:border-color .2s ease}.register-form-container .form-textarea::placeholder{color:#dadada}.register-form-container .form-textarea:focus{border-color:#0049b4}@media(max-width: 1024px){.register-form-container .form-textarea{min-height:140px;font-size:16px}}.icon-upload-box{background-color:#fff;border:1px solid #dadada;border-radius:12px;padding:50px 40px;display:flex;flex-direction:column;align-items:center;gap:26px}@media(max-width: 1024px){.icon-upload-box{padding:30px 20px}}.icon-preview-area{width:100px;height:100px;position:relative}.icon-preview-area img{width:100%;height:100%;object-fit:cover;border-radius:8px}.icon-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;border-radius:8px;color:#999}.icon-upload-box .btn-remove-icon{position:absolute;top:-8px;right:-8px;width:24px;height:24px;border-radius:50%;background-color:#dc3545;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s ease}.icon-upload-box .btn-remove-icon:hover{background-color:#c82333}.icon-upload-info{text-align:center}.icon-upload-info .upload-title{font-size:16px;font-weight:700;color:#515961;margin:0 0 11px}.icon-upload-info .upload-hint{font-size:14px;font-weight:400;color:#515961;margin:0}.icon-upload-info .upload-hint strong{font-weight:700}.ip-input-row{display:flex;gap:21px}.ip-input-row .ip-input{flex:1}@media(max-width: 1024px){.ip-input-row{flex-direction:column;gap:12px}}.btn-add-ip{width:158px;height:60px;background-color:#3ba4ed;color:#fff;border:none;border-radius:12px;font-size:20px;font-weight:700;cursor:pointer;transition:background-color .2s ease;flex-shrink:0}.btn-add-ip:hover{background-color:#2b94dd}@media(max-width: 1024px){.btn-add-ip{width:100%;font-size:16px;height:50px}}.register-form-container .ip-list{margin-top:20px;border:none;background:rgba(0,0,0,0)}.register-form-container .ip-list .ip-items{display:flex;flex-direction:column;gap:10px;max-height:none}.register-form-container .ip-list .ip-item{display:flex;gap:21px;padding:0;border-bottom:none}.register-form-container .ip-list .ip-item:hover{background:rgba(0,0,0,0)}@media(max-width: 1024px){.register-form-container .ip-list .ip-item{flex-direction:column;gap:12px}}.register-form-container .ip-list .ip-item .ip-display{flex:1;height:60px;padding:0 20px;border:1px solid #dadada;border-radius:8px;background-color:#fff;display:flex;align-items:center;font-size:20px;color:#1a1a2e}.register-form-container .ip-list .ip-item .btn-remove-ip{width:158px !important;height:60px !important;background-color:#e5e7eb !important;color:#5f666c !important;border:none !important;border-radius:12px !important;font-size:20px !important;font-weight:700;cursor:pointer;transition:background-color .2s ease;flex-shrink:0;display:flex !important;align-items:center;justify-content:center}@media(max-width: 1024px){.register-form-container .ip-list .ip-item .btn-remove-ip{width:100% !important;font-size:16px !important;height:50px !important}}.apikey-register-container{padding:40px 24px}@media(max-width: 768px){.apikey-register-container{padding:24px 16px}}.apikey-register-container.with-sidebar{display:flex;min-height:calc(100vh - 200px);position:relative;padding:0}.register-progress{margin-bottom:48px;padding:0 24px}.register-progress .progress-steps{display:flex;align-items:center;justify-content:center;position:relative}.register-progress .progress-step{display:flex;flex-direction:column;align-items:center;position:relative;z-index:2}.register-progress .progress-step .step-number{width:40px;height:40px;border-radius:50%;background:#fff;border:2px solid #e2e8f0;display:flex;align-items:center;justify-content:center;font-weight:600;color:#64748b;transition:all .3s ease;margin-bottom:8px}.register-progress .progress-step .step-label{font-size:14px;color:#64748b;white-space:nowrap}.register-progress .progress-step.active .step-number{background:#0049b4;border-color:#0049b4;color:#fff;box-shadow:0 0 0 4px rgba(0,73,180,.1)}.register-progress .progress-step.active .step-label{color:#0049b4;font-weight:500}.register-progress .progress-step.completed .step-number{background:#6bcf7f;border-color:#6bcf7f;color:#fff}.register-progress .progress-step.completed .step-label{color:#1a1a2e}.register-progress .progress-line{flex:1;height:2px;background:#e2e8f0;margin:0 16px;margin-bottom:28px;position:relative}.register-progress .progress-line.filled{background:#6bcf7f}.register-header{text-align:center;margin-bottom:48px;padding:0 24px}.register-header h1{font-size:32px;font-weight:700;color:#1a1a2e;margin-bottom:8px}.register-header h2{font-size:24px;font-weight:600;color:#0049b4;margin-bottom:16px}.register-header .header-description{font-size:16px;color:#64748b;max-width:600px;margin:0 auto}.apikey-register-sidebar{width:254px;background-color:#eceff4;border-radius:12px;padding:23px 12px;position:sticky;top:0;height:fit-content;max-height:calc(100vh - 100px);overflow-y:auto;flex-shrink:0}@media(max-width: 1024px){.apikey-register-sidebar{width:240px}}@media(max-width: 768px){.apikey-register-sidebar{position:fixed;left:0;top:60px;transform:translateX(-100%);transition:transform .3s ease;box-shadow:0 8px 24px rgba(75,155,255,.15);z-index:500;height:calc(100vh - 60px);max-height:none;margin:0;border-radius:0}.apikey-register-sidebar.mobile-open{transform:translateX(0)}}.apikey-sidebar-nav .sidebar-title{font-size:20px;font-weight:700;color:#212529;text-align:center;padding:20px 14px 45px}.apikey-sidebar-nav .menu-section{margin-bottom:0;border-bottom:1px solid #dadada}.apikey-sidebar-nav .menu-section:last-child{border-bottom:none}.apikey-sidebar-nav .menu-title{padding:22px 14px;font-size:20px;font-weight:400;color:#212529;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;justify-content:space-between;gap:10px}.apikey-sidebar-nav .menu-title:hover{background-color:rgba(0,0,0,.02)}.apikey-sidebar-nav .menu-title.active{font-weight:700;color:#212529}.apikey-sidebar-nav .menu-title .menu-icon{width:20px;height:20px;flex-shrink:0}.apikey-sidebar-nav .menu-title .menu-icon img{width:100%;height:100%;object-fit:contain}.apikey-sidebar-nav .menu-title .menu-text{flex:1}.apikey-sidebar-nav .menu-title .api-count{width:8px;height:8px;padding:0;min-width:auto;background-color:#dadada;border-radius:50%;font-size:0;flex-shrink:0}.apikey-sidebar-nav .menu-title.active .api-count{background-color:#3ba4ed}.apikey-register-content{flex:1;padding:23px 30px;min-height:auto;display:flex;flex-direction:column}.apikey-register-content .api-result-count{font-size:16px;color:#64748b;margin-bottom:32px}.apikey-register-content .api-result-count strong{color:#0049b4;font-weight:600}@media(max-width: 768px){.apikey-register-content{padding:24px 16px}}.apikey-mobile-toggle{display:none;position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;border:none;color:#fff;font-size:24px;cursor:pointer;box-shadow:0 8px 24px rgba(75,155,255,.15);z-index:501;transition:all .3s ease}.apikey-mobile-toggle:hover{transform:scale(1.05);box-shadow:0 16px 40px rgba(75,155,255,.2)}.apikey-mobile-toggle:active{transform:scale(0.95)}@media(max-width: 768px){.apikey-mobile-toggle{display:flex;align-items:center;justify-content:center}}.apikey-mobile-overlay{display:none;position:fixed;top:60px;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:499;opacity:0;transition:opacity .3s ease;pointer-events:none}@media(max-width: 768px){.apikey-mobile-overlay{display:block}}.apikey-mobile-overlay.active{opacity:1;pointer-events:auto}.api-filter-header{display:flex;justify-content:flex-end;align-items:center;margin-bottom:32px;gap:16px}@media(max-width: 768px){.api-filter-header{justify-content:stretch}}.api-search-box{position:relative;width:228px;height:44px;flex-shrink:0;margin-left:auto}@media(max-width: 768px){.api-search-box{width:100%;margin-left:0}}.api-search-box .search-input{width:100%;height:100%;padding:0 44px 0 17px;border:1px solid #dadada;border-radius:12px;background-color:#fff;font-size:14px;font-family:inherit;outline:none;transition:all .3s ease}.api-search-box .search-input:focus{border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.api-search-box .search-input::placeholder{color:#8c959f}.api-search-box svg{position:absolute;right:17px;top:50%;transform:translateY(-50%);pointer-events:none}.selection-counter{font-size:16px;color:#64748b;white-space:nowrap}.selection-counter .counter-value{font-weight:600;color:#0049b4}.api-filter-header{display:flex;align-items:center;justify-content:space-between;gap:24px;margin-bottom:24px}@media(max-width: 768px){.api-filter-header{flex-direction:column;align-items:stretch;gap:16px}}.api-filter-header .select-all-wrapper{display:flex;align-items:center;flex:1}@media(max-width: 768px){.api-filter-header .select-all-wrapper{order:2}}.api-filter-header .select-all-label{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:16px;color:#1a1a2e;user-select:none}.api-filter-header .select-all-label:hover{color:#0049b4}.api-filter-header .select-all-checkbox{width:18px;height:18px;cursor:pointer;accent-color:#0049b4}.api-filter-header .select-all-checkbox:indeterminate{opacity:.6}@media(max-width: 768px){.api-filter-header .api-search-box{order:1}}.api-selection-card-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:24px;margin-bottom:32px}@media(max-width: 1024px){.api-selection-card-grid{grid-template-columns:repeat(2, 1fr);gap:16px}}@media(max-width: 768px){.api-selection-card-grid{grid-template-columns:1fr;gap:16px}}.custom-checkbox{display:inline-block;width:22px;height:22px;flex-shrink:0;cursor:pointer;background-image:url("/img/checkbox-unchecked.svg");background-size:contain;background-repeat:no-repeat;background-position:center;border-radius:50%}input[type=checkbox]:checked+.custom-checkbox{background-color:#0049b4;background-image:url("/img/checkbox-checked.svg")}.select-all-label .custom-checkbox{margin-right:8px}.api-selection-card{background:#fff;border:1px solid #dadada;border-radius:12px;transition:all .3s ease;cursor:pointer;position:relative}.api-selection-card:hover{border-color:#0049b4;box-shadow:0 4px 12px rgba(75,155,255,.1)}.api-selection-card.selected{border-color:#0049b4;background-color:rgba(0,73,180,.02)}.api-selection-card .api-card-content{display:flex;flex-direction:column;gap:14px;padding:26px 28px;cursor:pointer}.api-selection-card .api-card-content .api-card-header{display:flex;justify-content:space-between;align-items:center;gap:13px}.api-selection-card .api-card-content .api-card-header .api-card-category{font-size:14px;font-weight:400;color:#6e7780;flex:1}.api-selection-card .api-card-content .api-card-header .checkbox-wrapper{flex-shrink:0}.api-selection-card .api-card-content .api-card-header .checkbox-wrapper .api-checkbox{width:22px;height:22px;cursor:pointer;accent-color:#0049b4}.api-selection-card .api-card-content .api-name{font-size:18px;font-weight:700;color:#212529;margin:0;line-height:1}.api-selection-card .api-card-content .api-description{font-size:15px;font-weight:400;color:#515961;margin:0;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.api-selection-card .api-card-content .api-card-icon{display:flex;justify-content:flex-end;margin-top:auto}.api-selection-card .api-card-content .api-card-icon img{width:50px;height:50px;object-fit:contain}.api-selection-card .api-card-content .api-card-icon i{width:50px;height:50px;display:flex;align-items:center;justify-content:center;font-size:32px;color:#999}.selected-summary{background:#eff6ff;border-radius:12px;padding:24px;margin-bottom:32px}.selected-summary h3{font-size:18px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.selected-summary .selected-list{display:flex;flex-wrap:wrap;gap:8px}.selected-summary .selected-list .selected-chip{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;background:#fff;border:1px solid #0049b4;border-radius:50px;font-size:14px;color:#0049b4}.selected-summary .selected-list .selected-chip .remove-chip{background:none;border:none;color:#0049b4;font-size:18px;cursor:pointer;padding:0;margin-left:4px}.selected-summary .selected-list .selected-chip .remove-chip:hover{color:#ff6b6b}.empty-api-state{padding:48px}.loading-state{padding:48px;text-align:center;color:#64748b}.loading-state .loading-spinner{width:48px;height:48px;margin:0 auto 24px;border:4px solid #e2e8f0;border-top-color:#0049b4;border-radius:50%;animation:spin 1s linear infinite}.loading-state p{font-size:16px;color:#64748b}@keyframes spin{to{transform:rotate(360deg)}}.register-form{width:100%;max-width:1021px;margin:0 auto}.register-form .form-card{background:#fff;border-radius:12px;padding:40px;box-shadow:0 2px 4px rgba(0,0,0,.05);margin-bottom:32px}.register-form .form-group{margin-bottom:32px}.register-form .form-group:last-child{margin-bottom:0}.register-form .form-label{display:block;font-size:14px;font-weight:600;color:#1a1a2e;margin-bottom:8px}.register-form .form-label.required .required-mark{color:#ff6b6b;margin-left:4px}.register-form .form-input,.register-form .form-select,.register-form .form-textarea{width:100%;padding:12px 16px;border:1px solid #e2e8f0;border-radius:8px;font-size:16px;transition:all .3s ease;background:#fff}.register-form .form-input:focus,.register-form .form-select:focus,.register-form .form-textarea:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.register-form .form-input::placeholder,.register-form .form-select::placeholder,.register-form .form-textarea::placeholder{color:#94a3b8}.register-form .form-textarea{resize:vertical;min-height:100px;font-family:inherit}.register-form .form-hint{display:block;font-size:12px;color:#64748b;margin-top:4px}.register-form .form-hint .char-counter{float:right;color:#94a3b8}.register-form .radio-group{display:flex;gap:24px;flex-wrap:wrap}.register-form .radio-group .radio-label{display:flex;align-items:center;cursor:pointer}.register-form .radio-group .radio-label input[type=radio]{margin-right:8px}.register-form .radio-group .radio-label .radio-text{font-size:16px;color:#1a1a2e}.register-form .icon-upload-wrapper{display:flex;align-items:center;gap:24px}.register-form .icon-upload-wrapper .icon-preview{width:120px;height:120px;border:2px dashed #e2e8f0;border-radius:12px;display:flex;align-items:center;justify-content:center;background:#f8fafc;overflow:hidden;position:relative;transition:all .3s ease}.register-form .icon-upload-wrapper .icon-preview:hover{border-color:#0049b4;background:rgba(0,73,180,.05)}.register-form .icon-upload-wrapper .icon-preview .icon-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:#64748b;text-align:center;padding:16px}.register-form .icon-upload-wrapper .icon-preview .icon-placeholder svg{opacity:.5}.register-form .icon-upload-wrapper .icon-preview .icon-placeholder span{font-size:12px;font-weight:500}.register-form .icon-upload-wrapper .icon-preview img{width:100%;height:100%;object-fit:cover}.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon{position:absolute;top:8px;right:8px;width:28px;height:28px;padding:0;background:hsla(0,0%,100%,.95);border:1px solid #e2e8f0;border-radius:50%;color:#64748b;cursor:pointer;transition:all .3s ease;display:none;align-items:center;justify-content:center;box-shadow:0 2px 4px rgba(0,0,0,.05);z-index:10}.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon svg{width:14px;height:14px}.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon:hover{background:#ff6b6b;border-color:#ff6b6b;color:#fff;transform:scale(1.1);box-shadow:0 4px 12px rgba(75,155,255,.1)}.register-form .icon-upload-wrapper .icon-preview .btn-remove-icon:active{transform:scale(0.95)}.register-form .icon-upload-wrapper .icon-input{display:none}.register-form .icon-upload-wrapper .btn-icon-select{padding:10px 20px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:500;color:#1a1a2e;cursor:pointer;transition:all .3s ease}.register-form .icon-upload-wrapper .btn-icon-select:hover{background:#0049b4;border-color:#0049b4;color:#fff}.register-form .icon-upload-wrapper .btn-icon-select:active{transform:scale(0.98)}.register-form .ip-input-group{display:flex;gap:8px;margin-bottom:16px}.register-form .ip-input-group .form-input{flex:1}.register-form .ip-input-group .btn-add-ip{display:inline-flex;align-items:center;gap:4px;padding:10px 16px;background:#0049b4;border:none;border-radius:8px;color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:all .3s ease;white-space:nowrap}.register-form .ip-input-group .btn-add-ip svg{flex-shrink:0}.register-form .ip-input-group .btn-add-ip:hover{background:#c3dfea;transform:translateY(-1px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.register-form .ip-input-group .btn-add-ip:active{transform:translateY(0)}.register-form .ip-list{margin-top:16px;overflow:hidden}.register-form .ip-list .ip-list-header{padding:16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.register-form .ip-list .ip-list-header .ip-count{font-size:14px;color:#64748b}.register-form .ip-list .ip-list-header .ip-count strong{color:#0049b4;font-weight:600}.register-form .ip-list .ip-items{max-height:240px;overflow-y:auto}.register-form .ip-list .ip-items::-webkit-scrollbar{width:6px}.register-form .ip-list .ip-items::-webkit-scrollbar-track{background:#f8fafc}.register-form .ip-list .ip-items::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:3px}.register-form .ip-list .ip-items::-webkit-scrollbar-thumb:hover{background:#94a3b8}.register-form .ip-list .ip-item{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;transition:all .3s ease}.register-form .ip-list .ip-item:last-child{border-bottom:none}.register-form .ip-list .ip-item:hover{background:#f8fafc}.register-form .ip-list .ip-item .ip-address{font-family:"Fira Code","Courier New",monospace;font-size:14px;color:#1a1a2e;font-weight:500}.register-form .ip-list .ip-item .btn-remove-ip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:#fff;border:1px solid #e2e8f0;border-radius:6px;color:#64748b;cursor:pointer;transition:all .3s ease}.register-form .ip-list .ip-item .btn-remove-ip svg{width:14px;height:14px}.register-form .ip-list .ip-item .btn-remove-ip:active{transform:scale(0.95)}.register-form-container .form-actions,.register-form-container .form-actions-center{justify-content:space-between;padding:0 24px 24px;margin-top:40px;border-top:none;padding-top:0}@media(max-width: 768px){.register-form-container .form-actions,.register-form-container .form-actions-center{padding:0 16px 16px}}.register-result{text-align:center;margin:0 auto;height:1045px;padding-top:262px}.register-result.success .result-icon img{width:250px;height:250px}.register-result.error .result-icon{background:rgba(255,107,107,.1);color:#ff6b6b}.register-result .result-icon-wrapper{margin-bottom:32px}.register-result .result-icon-wrapper .result-icon{margin:0 auto;display:flex;align-items:center;justify-content:center;font-size:40px}.register-result .result-header{margin-bottom:40px}.register-result .result-header h1{font-size:24px;font-weight:700;color:#0049b4;margin-bottom:16px}.register-result .result-header .result-description{font-size:16px;color:#64748b;margin:0 auto}.key-info-card{background:#fff;border-radius:12px;padding:32px;box-shadow:0 4px 12px rgba(75,155,255,.1);margin-bottom:32px;text-align:left}.key-info-card .info-row{display:flex;align-items:center;justify-content:space-between;padding:16px 0;border-bottom:1px solid #e2e8f0}.key-info-card .info-row:last-child{border-bottom:none}.key-info-card .info-row .info-label{font-size:14px;color:#64748b;font-weight:500;min-width:120px}.key-info-card .info-row .info-value{font-size:16px;color:#1a1a2e;font-weight:500}.key-info-card .info-row .key-display{display:flex;align-items:center;gap:8px;flex:1;justify-content:flex-end}.key-info-card .info-row .key-display .key-value{font-family:"Fira Code","Courier New",monospace;font-size:14px;background:#f8fafc;padding:8px 12px;border-radius:6px;color:#c3dfea;margin-right:8px}.key-info-card .info-row .key-display .btn-copy,.key-info-card .info-row .key-display .btn-toggle-visibility{padding:6px 10px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;cursor:pointer;transition:all .3s ease}.key-info-card .info-row .key-display .btn-copy:hover,.key-info-card .info-row .key-display .btn-toggle-visibility:hover{background:#0049b4;border-color:#0049b4;color:#fff}.key-info-card .info-row .status-badge.active{padding:4px 12px;background:rgba(107,207,127,.15);color:#4fa065;border-radius:50px;font-size:12px;font-weight:600}.selected-apis-summary{background:#f8fafc;border-radius:12px;padding:24px;margin-bottom:32px;text-align:left}.selected-apis-summary h3{font-size:18px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.selected-apis-summary .api-chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.selected-apis-summary .api-chips .api-chip{padding:6px 12px;background:#fff;border:1px solid #0049b4;border-radius:50px;font-size:14px;color:#0049b4}.selected-apis-summary .api-note{font-size:12px;color:#64748b;font-style:italic}.next-steps-card{background:#eff6ff;border-radius:12px;padding:32px;margin-bottom:32px;text-align:left}.next-steps-card h3{font-size:18px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.next-steps-card .steps-list{margin-left:24px;color:#64748b;font-size:14px;line-height:1.8}.next-steps-card .steps-list li{margin-bottom:8px}.result-actions{display:flex;justify-content:center;gap:16px;flex-wrap:wrap}@media(max-width: 768px){.result-actions{flex-direction:column;align-items:stretch;gap:8px;padding:0 16px}}.result-actions .btn-primary,.result-actions .btn-secondary{display:inline-flex;align-items:center;gap:8px;padding:12px 24px;border-radius:8px;font-size:16px;font-weight:500;transition:all .3s ease;text-decoration:none;cursor:pointer;border:none}.result-actions .btn-primary .icon,.result-actions .btn-secondary .icon{font-size:18px}@media(max-width: 768px){.result-actions .btn-primary,.result-actions .btn-secondary{width:100%;min-height:48px;padding:14px 24px;justify-content:center}}.result-actions .btn-primary{color:#fff;box-shadow:0 4px 12px rgba(75,155,255,.1)}.result-actions .btn-primary:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(75,155,255,.15)}.result-actions .btn-secondary{background:#fff;color:#1a1a2e;border:1px solid #e2e8f0}.result-actions .btn-secondary:hover{background:#f8fafc;border-color:#0049b4;color:#0049b4}.floating-cart-btn{position:fixed;bottom:80px;right:40px;width:180px;height:66px;padding:10px 16px 10px 36px;border-radius:60px;background-color:#3ba4ed;border:none;color:#fff;display:flex;align-items:center;justify-content:space-between;cursor:pointer;box-shadow:0 16px 40px rgba(75,155,255,.2);transition:all .3s ease;z-index:300}.floating-cart-btn .cart-label{font-size:14px;font-weight:700;color:#fff;white-space:nowrap}.floating-cart-btn .cart-badge{display:flex;flex-direction:row;align-items:center;justify-content:center;background:#fff;width:57px;height:57px;border-radius:120px;flex-shrink:0;margin-right:-8px}.floating-cart-btn .cart-badge .cart-count{font-size:24px;font-weight:700;color:#212529;line-height:1}.floating-cart-btn .cart-badge .cart-unit{font-size:14px;font-weight:700;color:#212529;line-height:1;margin-top:2px}.floating-cart-btn:hover{transform:translateY(-4px);box-shadow:0 12px 32px rgba(59,164,237,.4)}.floating-cart-btn:active{transform:translateY(-2px)}@media(max-width: 768px){.floating-cart-btn{bottom:100px;right:24px;width:160px;height:56px;padding:8px 12px 8px 28px}.floating-cart-btn .cart-label{font-size:12px}.floating-cart-btn .cart-badge{width:48px;height:48px;margin-right:-6px}.floating-cart-btn .cart-badge .cart-count{font-size:20px}.floating-cart-btn .cart-badge .cart-unit{font-size:12px}}.modal-dialog .selected-apis-list{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-start}.modal-dialog .api-pill{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#f2f2f2;border:none;border-radius:50px;transition:all .2s ease;max-width:100%;height:47px}.modal-dialog .api-pill:hover{background:#e8e8e8}.modal-dialog .api-pill .api-pill-name{font-size:16px;font-weight:400;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px;text-align:center}.modal-dialog .api-pill .api-pill-remove{flex-shrink:0;width:20px;height:20px;padding:0;background:rgba(0,0,0,0);border:none;border-radius:50%;color:#212529;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;overflow:hidden}.modal-dialog .api-pill .api-pill-remove svg{width:12px;height:12px}.modal-dialog .api-pill .api-pill-remove:hover{background:rgba(0,0,0,.1);transform:scale(1.1)}.modal-dialog .api-pill .api-pill-remove:active{transform:scale(0.95)}@media(max-width: 768px){.modal-dialog .api-pill{padding:8px 14px;height:42px}.modal-dialog .api-pill .api-pill-name{font-size:14px;max-width:200px}.modal-dialog .api-pill .api-pill-remove{width:18px;height:18px}.modal-dialog .api-pill .api-pill-remove svg{width:10px;height:10px}}.apikey-detail-container{padding:40px 24px}@media(max-width: 768px){.apikey-detail-container{padding:24px 16px}}.register-header{text-align:center;margin-bottom:80px}.register-header h1{font-size:48px;font-weight:700;color:#1a1a2e;margin-bottom:8px}.register-header .header-description{font-size:16px;color:#64748b}.status-section{text-align:center;margin-bottom:64px}.status-badge.badge-pending{background-color:#fff3cd;color:#856404}.status-badge.badge-approved{background-color:#d4edda;color:#155724}.status-badge.badge-rejected{background-color:#f8d7da;color:#721c24}.section-title{font-size:24px;font-weight:700;color:#1a1a2e;margin-bottom:24px;padding-bottom:16px}.detail-label{font-size:14px;font-weight:600;color:#64748b}.detail-value{font-size:16px;color:#1a1a2e;word-break:break-word}.status-dot{width:8px;height:8px;border-radius:50%;background-color:currentColor}.api-list-item .api-name{flex:1;font-size:16px;font-weight:500;color:#1a1a2e;margin:0}.api-method{display:inline-block;padding:4px 16px;border-radius:6px;font-size:14px;font-weight:700;font-family:"Fira Code","Courier New",monospace;min-width:80px;text-align:center}.api-method.method-get{background-color:#d1fae5;color:#065f46}.api-method.method-post{background-color:#dbeafe;color:#1e40af}.api-method.method-put{background-color:#fef3c7;color:#92400e}.api-method.method-delete{background-color:#fee2e2;color:#991b1b}.api-method.method-other{background-color:#e2e8f0;color:#1a1a2e}.api-status{padding:4px 16px;border-radius:12px;font-size:14px;font-weight:600}.api-status.status-pending{background-color:#fff3cd;color:#856404}.api-status.status-active{background-color:#d4edda;color:#155724}.history-table-wrapper{overflow-x:auto}.history-table{width:100%;border-collapse:collapse}.history-table th{background-color:#f8fafc;padding:16px 16px;text-align:left;font-weight:600;color:#64748b;border-bottom:2px solid #e2e8f0}.history-table td{padding:16px;border-bottom:1px solid #e2e8f0}.history-status{display:inline-block;padding:4px 16px;background-color:#eff6ff;color:#c3dfea;border-radius:12px;font-size:14px;font-weight:600}.empty-state{grid-column:1/-1;padding:48px 24px}@media(max-width: 768px){.btn-action,.btn-secondary,.btn-cancel{width:100%}}.app-info-card{display:flex;align-items:flex-start;gap:32px;padding:0;padding-top:27px;margin-bottom:64px}@media(max-width: 768px){.app-info-card{flex-direction:column;align-items:center;text-align:center;padding:24px 0;gap:24px}}.app-info-icon{flex-shrink:0;width:160px;height:160px;border-radius:16px;overflow:hidden;background:#f8fafc;display:flex;align-items:center;justify-content:center;margin-left:87px}@media(max-width: 768px){.app-info-icon{width:120px;height:120px}}.app-info-icon .app-icon-image{width:100%;height:100%;object-fit:cover}.app-info-icon .app-icon-placeholder{color:#94a3b8;display:flex;align-items:center;justify-content:center}.app-info-content{flex:1;display:flex;flex-direction:column;gap:16px}.app-status-badge{display:inline-block;padding:4px 24px;border-radius:50px;font-size:14px;font-weight:600;width:fit-content}.app-status-badge.status-approved{background-color:#0049b4;color:#fff}.app-status-badge.status-pending{background-color:#fff3cd;color:#856404}.app-status-badge.status-inactive{background-color:#e2e8f0;color:#64748b}.app-status-badge.status-rejected{background-color:#f8d7da;color:#721c24}.app-info-name{font-size:24px;font-weight:700;color:#1a1a2e;margin:0}@media(max-width: 768px){.app-info-name{font-size:20px}}.app-info-description{font-size:18px;color:#515151;margin:0;line-height:1.5}@media(max-width: 768px){.app-info-description{font-size:16px}}.apikey-info-section{background:#f6f9fb;border-radius:12px;padding:48px 40px;margin-bottom:40px}@media(max-width: 768px){.apikey-info-section{padding:24px}}.info-row{display:flex;align-items:center;gap:32px;margin-bottom:32px}.info-row:last-child{margin-bottom:0}@media(max-width: 768px){.info-row{flex-direction:column;align-items:flex-start;gap:8px}}.info-row-vertical{align-items:flex-start}.info-row-vertical .info-value{width:100%}@media(max-width: 768px){.info-row-vertical .info-value{max-width:100%}}.info-label{flex-shrink:0;width:140px;font-size:20px;font-weight:700;color:#212529}@media(max-width: 768px){.info-label{width:100%;font-size:16px}}.info-value{flex:1;font-size:16px;color:#1a1a2e;word-break:break-word}@media(max-width: 768px){.info-value{width:100%}}.info-value-box{display:flex;align-items:center;justify-content:center;height:60px;padding:0 24px;background:#ddd;border-radius:12px;font-size:20px;color:#515151;text-align:center}@media(max-width: 768px){.info-value-box{height:50px;font-size:16px;padding:0 16px}}.info-value-box.with-copy{flex:1}.info-row-with-action .info-value{display:flex;gap:16px;align-items:center}.btn-copy-action{display:flex;align-items:center;justify-content:center;gap:4px;height:60px;width:158px;padding:0 24px;background:#a4d6ea;border:none;border-radius:12px;font-size:20px;font-weight:700;color:#fff;cursor:pointer;white-space:nowrap;transition:background .2s ease}.btn-copy-action:hover{background:rgb(122.5625,195.3303571429,224.4375)}@media(max-width: 768px){.btn-copy-action{height:50px;font-size:16px;padding:0 16px}}.btn-view-secret{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;height:60px;background:#3ba4ed;border:none;border-radius:12px;font-size:20px;font-weight:700;color:#fff;cursor:pointer;transition:background .2s ease}.btn-view-secret:hover{background:rgb(20.6074766355,140.8177570093,224.3925233645)}.btn-view-secret svg{width:20px;height:20px}@media(max-width: 768px){.btn-view-secret{max-width:100%;height:50px;font-size:16px}}.api-list-box{width:100%;background:#fff;border:1px solid #dadada;border-radius:12px;padding:24px}@media(max-width: 768px){.api-list-box{max-width:100%;padding:16px}}.api-list-item-figma{display:flex;align-items:center;justify-content:space-between;padding:16px 0;border-bottom:1px solid #dadada}.api-list-item-figma:last-child{border-bottom:none}.api-list-item-figma .api-item-name{font-size:18px;color:#000}@media(max-width: 768px){.api-list-item-figma .api-item-name{font-size:16px}}.api-list-item-figma .api-item-status{display:flex;align-items:center;justify-content:center;min-width:100px;height:30px;padding:0 24px;background:#eceff4;border-radius:50px;font-size:16px;color:#515151}@media(max-width: 768px){.api-list-item-figma .api-item-status{min-width:80px;font-size:14px;padding:0 16px}}.app-list-title{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:28px;font-weight:700;color:#1a1a2e;margin:0}@media(max-width: 768px){.app-list-title{font-size:22px}}.app-list-container{min-height:400px}.app-list-item{display:flex;align-items:center;gap:24px;padding:40px 0;border-bottom:1px solid #e0e0e0;text-decoration:none;color:inherit;transition:background-color .2s ease}.app-list-item:last-child{border-bottom:none}.app-list-item:hover{background-color:hsla(0,0%,100%,.5);margin:0 -20px;padding-left:20px;padding-right:20px;border-radius:8px}@media(max-width: 768px){.app-list-item{flex-direction:column;align-items:flex-start;padding:30px 0;gap:16px}.app-list-item:hover{margin:0 -10px;padding-left:10px;padding-right:10px}}.app-list-icon{width:70px;height:70px}@media(max-width: 768px){.app-list-icon{width:60px;height:60px}}.app-list-icon .app-icon-image{border:none}.app-list-icon .app-icon-placeholder{font-size:inherit}.app-list-info{display:flex;flex-direction:column;gap:14px;flex:1}.app-list-header{display:flex;align-items:center;gap:12px}@media(max-width: 768px){.app-list-header{flex-wrap:wrap;gap:8px}}.app-list-name{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:22px;font-weight:700;color:#1a1a2e;margin:0}@media(max-width: 768px){.app-list-name{font-size:18px}}.app-list-description{font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;font-size:16px;font-weight:400;color:#6e7780;margin:0;line-height:1.5}@media(max-width: 768px){.app-list-description{font-size:14px}}.app-create-button-wrapper{display:flex;justify-content:center;margin-top:60px}@media(max-width: 768px){.app-create-button-wrapper{margin-top:40px}}.btn-app-create{background-color:#0049b4;color:#fff}.btn-app-create:hover{background-color:#003a91}.notice-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.notice-page{padding:40px 16px}}.notice-container{max-width:1280px;margin:0 auto}.notice-header{margin-bottom:48px}@media(max-width: 768px){.notice-header{margin-bottom:40px}}.notice-header .page-title{font-size:40px;font-weight:700;color:#1a1a2e;margin-bottom:16px;-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}@media(max-width: 768px){.notice-header .page-title{font-size:32px}}.notice-header .page-description{font-size:16px;color:#64748b;line-height:1.6}@media(max-width: 768px){.notice-header .page-description{font-size:14px}}.notice-list-wrapper{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden;margin-bottom:32px}.notice-detail-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.notice-detail-page{padding:40px 16px}}.notice-detail-container{max-width:960px;margin:0 auto}.notice-detail-card{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden;margin-bottom:32px}.notice-detail-card .detail-header{padding:48px 40px 32px;border-bottom:2px solid #e2e8f0}@media(max-width: 768px){.notice-detail-card .detail-header{padding:40px 24px 16px}}.notice-detail-card .detail-header .notice-title{font-size:32px;font-weight:700;color:#1a1a2e;line-height:1.2;margin-bottom:24px}@media(max-width: 768px){.notice-detail-card .detail-header .notice-title{font-size:24px}}.notice-detail-card .detail-header .notice-meta{display:flex;align-items:center;gap:24px;flex-wrap:wrap;font-size:14px;color:#64748b}@media(max-width: 768px){.notice-detail-card .detail-header .notice-meta{font-size:12px;gap:16px}}.notice-detail-card .detail-header .notice-meta .meta-item{display:flex;align-items:center;gap:4px}.notice-detail-card .detail-header .notice-meta .meta-item i{color:#0049b4}.notice-detail-card .detail-header .notice-meta .meta-item strong{color:#1a1a2e;font-weight:500}.notice-detail-card .detail-attachments{padding:24px 40px;background:#f8fafc;border-bottom:1px solid #e2e8f0}@media(max-width: 768px){.notice-detail-card .detail-attachments{padding:16px 24px}}.notice-detail-card .detail-attachments .attachment-list{display:flex;flex-direction:column;gap:8px}.notice-detail-card .detail-attachments .attachment-list .attachment-item{display:flex;align-items:center;gap:8px}.notice-detail-card .detail-attachments .attachment-list .attachment-item a{color:#1a1a2e;text-decoration:none;font-size:14px;transition:all .3s ease;display:flex;align-items:center;gap:4px}@media(max-width: 768px){.notice-detail-card .detail-attachments .attachment-list .attachment-item a{font-size:12px}}.notice-detail-card .detail-attachments .attachment-list .attachment-item a:hover{color:#0049b4}.notice-detail-card .detail-attachments .attachment-list .attachment-item a:hover i{transform:translateY(-2px)}.notice-detail-card .detail-attachments .attachment-list .attachment-item a i{color:#0049b4;transition:all .3s ease}.notice-detail-card .detail-content{padding:48px 40px;min-height:300px}@media(max-width: 768px){.notice-detail-card .detail-content{padding:40px 24px}}.notice-detail-card .detail-content .content-body{font-size:16px;color:#1a1a2e;line-height:1.8}@media(max-width: 768px){.notice-detail-card .detail-content .content-body{font-size:14px}}.notice-detail-card .detail-content .content-body p{margin-bottom:16px}.notice-detail-card .detail-content .content-body p:last-child{margin-bottom:0}.notice-detail-card .detail-content .content-body h1,.notice-detail-card .detail-content .content-body h2,.notice-detail-card .detail-content .content-body h3,.notice-detail-card .detail-content .content-body h4,.notice-detail-card .detail-content .content-body h5,.notice-detail-card .detail-content .content-body h6{margin-top:32px;margin-bottom:16px;font-weight:600;color:#1a1a2e}.notice-detail-card .detail-content .content-body img{max-width:100%;height:auto;border-radius:8px;margin:24px 0}.notice-detail-card .detail-content .content-body a{color:#0049b4;text-decoration:underline}.notice-detail-card .detail-content .content-body a:hover{color:#c3dfea}.notice-detail-card .detail-content .content-body ul,.notice-detail-card .detail-content .content-body ol{margin:16px 0;padding-left:32px}.notice-detail-card .detail-content .content-body li{margin-bottom:8px}.notice-detail-card .detail-content .content-body blockquote{border-left:4px solid #0049b4;padding-left:24px;margin:24px 0;color:#64748b;font-style:italic}.notice-detail-card .detail-content .content-body code{background:#f8fafc;padding:2px 6px;border-radius:6px;font-family:"Fira Code","Courier New",monospace;font-size:.9em;color:#0049b4}.notice-detail-card .detail-content .content-body pre{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;overflow-x:auto;margin:24px 0}.notice-detail-card .detail-content .content-body pre code{background:rgba(0,0,0,0);padding:0;color:#1a1a2e}.notice-detail-card .detail-content .content-body table{width:100%;border-collapse:collapse;margin:24px 0;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.notice-detail-card .detail-content .content-body table th{background:#eff6ff;padding:8px 16px;text-align:left;font-weight:600;border-bottom:2px solid #e2e8f0}.notice-detail-card .detail-content .content-body table td{padding:8px 16px;border-bottom:1px solid #e2e8f0}.notice-detail-card .detail-content .content-body table tr:last-child td{border-bottom:none}.notice-actions{display:flex;justify-content:center;gap:16px;margin-bottom:48px}@media(max-width: 768px){.notice-actions{flex-direction:column;align-items:stretch}}.notice-navigation{background:#fff;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.05);overflow:hidden}.notice-navigation .nav-item{display:flex;align-items:center;justify-content:space-between;padding:24px 40px;border-bottom:1px solid #e2e8f0;transition:all .3s ease;cursor:pointer}@media(max-width: 768px){.notice-navigation .nav-item{flex-direction:column;align-items:flex-start;padding:16px 24px;gap:8px}}.notice-navigation .nav-item:last-child{border-bottom:none}.notice-navigation .nav-item:hover{background:#f8fafc}.notice-navigation .nav-item:hover .nav-title{color:#0049b4}.notice-navigation .nav-item .nav-label{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;color:#64748b;min-width:80px}@media(max-width: 768px){.notice-navigation .nav-item .nav-label{font-size:12px}}.notice-navigation .nav-item .nav-label i{color:#0049b4}.notice-navigation .nav-item .nav-title{flex:1;font-size:16px;color:#1a1a2e;transition:all .3s ease}@media(max-width: 768px){.notice-navigation .nav-item .nav-title{font-size:14px}}.notice-navigation .nav-item .nav-date{font-size:14px;color:#94a3b8;min-width:100px;text-align:right}@media(max-width: 768px){.notice-navigation .nav-item .nav-date{font-size:12px;text-align:left}}.inquiry-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.inquiry-page{padding:40px 16px}}.inquiry-container{max-width:1280px;margin:0 auto}.inquiry-header{margin-bottom:48px}@media(max-width: 768px){.inquiry-header{margin-bottom:40px}}.inquiry-header .page-title{font-size:40px;font-weight:700;color:#1a1a2e;margin-bottom:16px;-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}@media(max-width: 768px){.inquiry-header .page-title{font-size:32px}}.inquiry-header .page-description{font-size:16px;color:#64748b;line-height:1.6}@media(max-width: 768px){.inquiry-header .page-description{font-size:14px}}.inquiry-list-wrapper{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden;margin-bottom:32px}.inquiry-table{width:100%;background:#fff;border-radius:12px;overflow:hidden}.inquiry-table .table-header{display:grid;grid-template-columns:80px 1fr 100px 100px 120px;gap:16px;padding:16px 24px;background:#eff6ff;border-bottom:2px solid #e2e8f0;font-size:14px;font-weight:600;color:#1a1a2e}@media(max-width: 1024px){.inquiry-table .table-header{grid-template-columns:60px 1fr 80px 100px;padding:8px 16px;font-size:12px}.inquiry-table .table-header .col-name{display:none}}@media(max-width: 768px){.inquiry-table .table-header{display:none}}.inquiry-table .table-header .col-num{text-align:center}.inquiry-table .table-header .col-title{text-align:left}.inquiry-table .table-header .col-name{text-align:center}.inquiry-table .table-header .col-status{text-align:center}.inquiry-table .table-header .col-date{text-align:center}.inquiry-table .table-row{display:grid;grid-template-columns:80px 1fr 100px 100px 120px;gap:16px;padding:24px;border-bottom:1px solid #e2e8f0;transition:all .3s ease;cursor:pointer}@media(max-width: 1024px){.inquiry-table .table-row{grid-template-columns:60px 1fr 80px 100px;padding:16px}.inquiry-table .table-row .col-name{display:none}}@media(max-width: 768px){.inquiry-table .table-row{grid-template-columns:1fr;gap:8px;padding:16px}}.inquiry-table .table-row:last-child{border-bottom:none}.inquiry-table .table-row:hover{background-color:rgba(0,73,180,.02)}.inquiry-table .table-row .col-num{display:flex;align-items:center;justify-content:center;font-size:14px;color:#64748b;font-weight:500}@media(max-width: 768px){.inquiry-table .table-row .col-num{display:none}}.inquiry-table .table-row .col-title{display:flex;align-items:center;font-size:16px;color:#1a1a2e;font-weight:500}@media(max-width: 768px){.inquiry-table .table-row .col-title{font-size:14px}}.inquiry-table .table-row .col-title a{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px;transition:all .3s ease}.inquiry-table .table-row .col-title a:hover{color:#0049b4}.inquiry-table .table-row .col-title .file-icon{display:inline-flex;align-items:center;margin-left:8px;opacity:.6}.inquiry-table .table-row .col-title .file-icon img{width:16px;height:16px}.inquiry-table .table-row .col-name{display:flex;align-items:center;justify-content:center;font-size:14px;color:#64748b}@media(max-width: 1024px){.inquiry-table .table-row .col-name{display:none}}.inquiry-table .table-row .col-status{display:flex;align-items:center;justify-content:center}@media(max-width: 768px){.inquiry-table .table-row .col-status{justify-content:flex-start}}.inquiry-table .table-row .col-date{display:flex;align-items:center;justify-content:center;font-size:14px;color:#94a3b8}@media(max-width: 768px){.inquiry-table .table-row .col-date{justify-content:flex-start;font-size:12px;padding-top:4px}}@media(max-width: 768px){.inquiry-table .table-row .col-date::before{content:"등록일: ";color:#64748b;margin-right:4px}}.inquiry-actions{display:flex;justify-content:center;align-items:center;gap:16px;margin-top:32px}@media(max-width: 768px){.inquiry-actions{flex-direction:column;align-items:stretch}}.inquiry-actions .actions-left,.inquiry-actions .actions-right{display:flex;align-items:center;gap:16px}@media(max-width: 768px){.inquiry-actions .actions-left,.inquiry-actions .actions-right{width:100%;justify-content:center}}@media(max-width: 768px){.inquiry-actions{flex-direction:column;align-items:stretch;gap:16px}.inquiry-actions .actions-left,.inquiry-actions .actions-right{flex-direction:column}}.inquiry-detail-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.inquiry-detail-page{padding:40px 16px}}.inquiry-detail-container{max-width:960px;margin:0 auto}.inquiry-detail-card{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden;margin-bottom:32px}.inquiry-detail-card .detail-header{padding:48px 40px 32px;border-bottom:2px solid #e2e8f0}@media(max-width: 768px){.inquiry-detail-card .detail-header{padding:40px 24px 16px}}.inquiry-detail-card .detail-header .inquiry-title{font-size:32px;font-weight:700;color:#1a1a2e;line-height:1.2;margin-bottom:24px}@media(max-width: 768px){.inquiry-detail-card .detail-header .inquiry-title{font-size:24px}}.inquiry-detail-card .detail-header .inquiry-meta{display:flex;align-items:center;gap:24px;flex-wrap:wrap;font-size:14px;color:#64748b}@media(max-width: 768px){.inquiry-detail-card .detail-header .inquiry-meta{font-size:12px;gap:16px}}.inquiry-detail-card .detail-header .inquiry-meta .meta-item{display:flex;align-items:center;gap:4px}.inquiry-detail-card .detail-header .inquiry-meta .meta-item i{color:#0049b4}.inquiry-detail-card .detail-header .inquiry-meta .meta-item strong{color:#1a1a2e;font-weight:500}.inquiry-detail-card .detail-attachments{padding:24px 40px;background:#f8fafc;border-bottom:1px solid #e2e8f0}@media(max-width: 768px){.inquiry-detail-card .detail-attachments{padding:16px 24px}}.inquiry-detail-card .detail-attachments .attachment-list{display:flex;flex-direction:column;gap:8px}.inquiry-detail-card .detail-attachments .attachment-list .attachment-item{display:flex;align-items:center;gap:8px}.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a{color:#1a1a2e;text-decoration:none;font-size:14px;transition:all .3s ease;display:flex;align-items:center;gap:4px}@media(max-width: 768px){.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a{font-size:12px}}.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a:hover{color:#0049b4}.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a:hover i{transform:translateY(-2px)}.inquiry-detail-card .detail-attachments .attachment-list .attachment-item a i{color:#0049b4;transition:all .3s ease}.inquiry-detail-card .detail-content{padding:48px 40px;min-height:200px}@media(max-width: 768px){.inquiry-detail-card .detail-content{padding:40px 24px}}.inquiry-detail-card .detail-content .content-body{font-size:16px;color:#1a1a2e;line-height:1.8;white-space:pre-line}@media(max-width: 768px){.inquiry-detail-card .detail-content .content-body{font-size:14px}}.inquiry-response-card{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden;margin-bottom:32px;border-left:4px solid #6bcf7f}.inquiry-response-card .response-header{padding:32px 40px;background:rgba(107,207,127,.03);border-bottom:1px solid #e2e8f0}@media(max-width: 768px){.inquiry-response-card .response-header{padding:24px}}.inquiry-response-card .response-header .response-title{display:flex;align-items:center;gap:8px;font-size:20px;font-weight:600;color:#1a1a2e;margin-bottom:8px}.inquiry-response-card .response-header .response-title i{color:#6bcf7f}.inquiry-response-card .response-header .response-meta{font-size:14px;color:#64748b}@media(max-width: 768px){.inquiry-response-card .response-header .response-meta{font-size:12px}}.inquiry-response-card .response-content{padding:40px;font-size:16px;color:#1a1a2e;line-height:1.8;white-space:pre-line}@media(max-width: 768px){.inquiry-response-card .response-content{padding:24px;font-size:14px}}.inquiry-detail-actions{display:flex;justify-content:center;gap:16px;margin-bottom:48px;flex-wrap:wrap}@media(max-width: 768px){.inquiry-detail-actions{flex-direction:column;align-items:stretch}}.inquiry-detail-actions .action-btn{padding:16px 40px;border-radius:8px;font-size:16px;font-weight:500;text-decoration:none;transition:all .3s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;cursor:pointer;border:none}@media(max-width: 768px){.inquiry-detail-actions .action-btn{padding:16px 24px;font-size:14px}}.inquiry-detail-actions .action-btn.btn-list{background:#fff;color:#1a1a2e;border:1px solid #e2e8f0}.inquiry-detail-actions .action-btn.btn-list:hover{background:#f8fafc;border-color:#0049b4}.inquiry-detail-actions .action-btn.btn-edit{color:#fff}.inquiry-detail-actions .action-btn.btn-edit:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.inquiry-detail-actions .action-btn.btn-delete{background:#ff6b6b;color:#fff}.inquiry-detail-actions .action-btn.btn-delete:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.inquiry-detail-actions .action-btn i{font-size:16px}.inquiry-form-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.inquiry-form-page{padding:40px 16px}}.inquiry-form-container{max-width:960px;margin:0 auto}.inquiry-form-card{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);padding:48px;margin-bottom:32px}@media(max-width: 768px){.inquiry-form-card{padding:40px 24px}}.inquiry-form-card .form-group{margin-bottom:40px}.inquiry-form-card .form-group:last-child{margin-bottom:0}.inquiry-form-card .form-group .form-label{display:block;font-size:16px;font-weight:600;color:#1a1a2e;margin-bottom:16px}@media(max-width: 768px){.inquiry-form-card .form-group .form-label{font-size:14px}}.inquiry-form-card .form-group .form-label.required::after{content:"*";color:#ff6b6b;margin-left:4px}.inquiry-form-card .form-group .form-input{width:100%;padding:16px;border:1px solid #e2e8f0;border-radius:8px;font-size:16px;transition:all .3s ease}@media(max-width: 768px){.inquiry-form-card .form-group .form-input{font-size:14px;padding:8px 16px}}.inquiry-form-card .form-group .form-input:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.inquiry-form-card .form-group .form-input::placeholder{color:#94a3b8}.inquiry-form-card .form-group .form-textarea{width:100%;min-height:200px;padding:16px;border:1px solid #e2e8f0;border-radius:8px;font-size:16px;font-family:"Pretendard",-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans KR",sans-serif;resize:vertical;transition:all .3s ease}@media(max-width: 768px){.inquiry-form-card .form-group .form-textarea{font-size:14px;padding:8px 16px;min-height:150px}}.inquiry-form-card .form-group .form-textarea:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.inquiry-form-card .form-group .form-textarea::placeholder{color:#94a3b8}.inquiry-form-actions{display:flex;justify-content:center;gap:16px;margin-top:32px}@media(max-width: 768px){.inquiry-form-actions{flex-direction:column-reverse;align-items:stretch}}.org-register-page{min-height:100vh;padding:0}@media(max-width: 768px){.org-register-page{padding:0}}.org-register-container{padding:40px 24px}@media(max-width: 768px){.org-register-container{padding:24px 16px}}.org-register-title{font-size:40px;font-weight:700;color:#1a1a2e;text-align:center;margin-bottom:48px}@media(max-width: 768px){.org-register-title{font-size:32px;margin-bottom:32px}}.org-section-header{display:flex;align-items:center;justify-content:space-between;padding:24px 32px;background:#edf9fe;border-radius:8px;margin-bottom:32px}.org-section-header h3{font-size:20px;font-weight:400;color:#515961;margin:0}.org-section-header .required-badge{background:hsla(0,0%,100%,.2);color:#fff;padding:4px 16px;border-radius:50px;font-size:14px;font-weight:500;display:inline-flex;align-items:center;gap:4px}.org-section-header .required-badge::before{content:"*";color:#ffd93d;font-weight:700}.org-section-header--agreement{background:none;padding:0 0 16px 0;border-radius:0;border-bottom:2px solid #212529;margin-bottom:32px}.org-section-header--agreement h3{font-size:22px;font-weight:700;color:#212529;margin:0}.org-section-header--agreement .required-badge{display:none}@media(max-width: 768px){.org-section-header{padding:16px 24px}.org-section-header h3{font-size:18px}.org-section-header--agreement{padding:0 0 8px 0}.org-section-header--agreement h3{font-size:18px}}.org-info-notice{border-radius:8px;margin-bottom:16px}.org-info-notice ul{list-style:none;padding:0;margin:0}.org-info-notice ul li{position:relative;padding-left:24px;color:#64748b;font-size:14px;line-height:1.6}.org-info-notice ul li::before{content:"•";position:absolute;left:0;color:#0049b4;font-weight:700}.org-info-notice ul li+li{margin-top:8px}.org-form-group{margin-bottom:8px;display:flex;align-items:flex-start;gap:24px}.org-form-group:last-child{margin-bottom:0}@media(max-width: 768px){.org-form-group{flex-direction:column;gap:16px}}.org-form-label{display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:#1a1a2e;min-width:180px;padding-top:16px}.org-form-label .required-badge{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;background:#3ba4ed;color:#fff;font-size:12px;font-weight:500;border-radius:4px;line-height:1.2}@media(max-width: 768px){.org-form-label{min-width:auto;padding-top:0}}.org-form-input-wrapper{flex:1;display:flex;flex-direction:column;gap:8px}@media(max-width: 768px){.org-form-input-wrapper{width:100%}}.org-input-row{display:flex;align-items:center;gap:16px}.org-input-row .org-form-input,.org-input-row .org-compound-input,.org-input-row .org-auth-input-group{flex:1;min-width:0}.org-input-row .org-btn-check,.org-input-row .org-file-label{flex-shrink:0}@media(max-width: 768px){.org-input-row{flex-direction:column;align-items:stretch;gap:8px}.org-input-row .org-form-input,.org-input-row .org-compound-input,.org-input-row .org-auth-input-group{width:100%}.org-input-row .org-btn-check,.org-input-row .org-file-label{width:100%}}.org-form-input{width:100%;padding:16px 24px;border:2px solid #e2e8f0;border-radius:8px;font-size:16px;color:#1a1a2e;transition:all .3s ease;background:#fff}.org-form-input:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(75,155,255,.1)}.org-form-input:disabled{background:#f8fafc;color:#94a3b8;cursor:not-allowed}.org-form-input.is-invalid{border-color:#ff6b6b}.org-form-input.is-valid{border-color:#6bcf7f}.org-form-input::placeholder{color:#94a3b8}.org-compound-input{display:flex;align-items:center;gap:8px;width:100%}.org-compound-input .org-form-input,.org-compound-input .org-form-select{flex:1;min-width:0}.org-compound-input .phone-number{flex:1;width:100%}.org-compound-input .separator{color:#64748b;font-weight:600;user-select:none;flex-shrink:0}@media(max-width: 768px){.org-compound-input{width:100%}.org-compound-input .org-form-input,.org-compound-input .org-form-select{flex:1;min-width:0}}.org-form-select{width:100%;padding:16px 24px;border:2px solid #e2e8f0;border-radius:8px;font-size:16px;color:#1a1a2e;background:#fff;cursor:pointer;transition:all .3s ease;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748B' d='M6 9L1 4h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 24px center;padding-right:48px}.org-form-select:focus{outline:none;border-color:#0049b4;box-shadow:0 0 0 3px rgba(75,155,255,.1)}.org-form-select:disabled{background-color:#f8fafc;color:#94a3b8;cursor:not-allowed}.org-input-button-group{display:flex;gap:16px}.org-input-button-group .org-form-input{flex:1}@media(max-width: 768px){.org-input-button-group{flex-direction:column}.org-input-button-group .org-form-input{flex:none}}.org-auth-input-group{position:relative;display:flex;align-items:center}.org-auth-input-group .org-form-input{padding-right:100px}.org-timer{position:absolute;right:24px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:600;color:#ff6b6b;pointer-events:none;user-select:none}.org-btn{padding:16px 40px;border-radius:8px;font-size:16px;font-weight:600;cursor:pointer;transition:all .3s ease;border:none;display:inline-flex;align-items:center;justify-content:center;gap:8px;white-space:nowrap}.org-btn:disabled{opacity:.5;cursor:not-allowed}.org-btn:not(:disabled):hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(75,155,255,.1)}.org-btn:not(:disabled):active{transform:translateY(0)}.org-btn-primary{color:#fff}.org-btn-secondary{background:#fff;color:#64748b;border:2px solid #e2e8f0}.org-btn-secondary:not(:disabled):hover{border-color:#0049b4;color:#0049b4}.org-btn-check,.org-file-label{padding:16px 24px;width:172px;background:#a4d6ea;color:#fff;border:2px solid #a4d6ea;text-align:center;justify-content:center}.org-btn-check:not(:disabled):hover,.org-file-label:not(:disabled):hover{color:#fff}@media(max-width: 768px){.org-btn-check,.org-file-label{width:100%}}.org-file-upload{display:flex;align-items:center;gap:16px}@media(max-width: 768px){.org-file-upload{flex-direction:column;align-items:stretch}}.org-file-display{flex:1;padding:16px 24px;border:2px dashed #e2e8f0;border-radius:8px;background:#f8fafc;color:#94a3b8;cursor:default;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.org-file-display.has-file{border-style:solid;border-color:#6bcf7f;background:rgba(107,207,127,.05);color:#1a1a2e}.org-file-label{cursor:pointer;background:#3ba4ed;border-radius:12px;border:2px solid #3ba4ed}.org-file-label input[type=file]{display:none}.org-file-remove{padding:16px;background:#ff6b6b;color:#fff;border:none;border-radius:8px;cursor:pointer;transition:all .3s ease}.org-file-remove:hover{background:#ff3838}.org-file-notice{margin-top:16px;padding:16px;border-radius:6px}.org-file-notice p{margin:0;font-size:14px;color:#64748b;line-height:1.5}.org-file-notice p+p{margin-top:4px}.org-file-notice p::before{content:"• ";color:#ffd93d;font-weight:700}.org-action-buttons{display:flex;gap:24px;justify-content:center;margin-top:64px;padding-top:48px;border-top:1px solid #e2e8f0}.org-action-buttons .btn{width:220px;text-align:center;justify-content:center}@media(max-width: 768px){.org-action-buttons{flex-direction:column;margin-top:40px;padding-top:32px}}.org-validation-message{margin-top:8px;padding:8px 16px;border-radius:6px;font-size:14px}.org-validation-message.success{background:rgba(107,207,127,.1);color:#6bcf7f}.org-validation-message.error{background:rgba(255,107,107,.1);color:#ff6b6b}.org-loading-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(26,26,46,.7);display:none;align-items:center;justify-content:center;z-index:9999}.org-loading-overlay.active{display:flex}.org-loading-overlay .spinner{width:50px;height:50px;border:4px solid hsla(0,0%,100%,.2);border-top-color:#fff;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width: 768px){.org-form-input{width:100%}.org-compound-input{width:100%}.org-compound-input .org-form-select,.org-compound-input .org-form-input{flex:1;min-width:0;width:auto;font-size:14px;padding:8px 16px}.org-auth-input-group{width:100%}.org-auth-input-group .org-form-input{width:100%}}.agreement-form{background:#fff;border:1px solid #ddd;border-radius:12px;padding:30px 20px;display:flex;flex-direction:column;gap:20px;margin-bottom:90px}.agreement-all-section{display:flex;align-items:center;padding:10px 0}.agreement-divider{height:1px;background:#ddd;width:100%}.agreement-items-list{display:flex;flex-direction:column;gap:20px}.agreement-item-row{display:flex;align-items:center;justify-content:space-between;gap:4px;height:28px}.agreement-checkbox-label{display:flex;align-items:center;gap:4px;cursor:pointer;flex:1;user-select:none}.agreement-checkbox-input{position:absolute;opacity:0;pointer-events:none}.agreement-checkbox-input:checked+.agreement-checkbox-custom{background-image:url("/img/checkbox-checked.png")}.agreement-checkbox-input:focus+.agreement-checkbox-custom{box-shadow:0 0 0 3px rgba(140,149,159,.1)}.agreement-checkbox-custom{position:relative;width:26px;height:26px;min-width:26px;border:none;border-radius:50%;background-image:url("/img/checkbox-unchecked.png");background-size:contain;background-repeat:no-repeat;background-position:center;transition:all .3s ease;padding:0}.agreement-checkbox-text{font-size:16px;font-weight:400;color:#515961;line-height:100.02%;display:flex;align-items:center;gap:4px}.agreement-checkbox-text.agreement-all-text{font-size:18px;font-weight:700;color:#212529}.agreement-required{color:#0049b4;font-weight:700}.agreement-title{color:#515961}.agreement-toggle-icon{display:flex;align-items:center;justify-content:center;width:22px;height:22px;min-width:22px;border:none;background:rgba(0,0,0,0);color:#64748b;cursor:pointer;transition:all .3s ease;padding:8px 4px 10px 7px}.agreement-toggle-icon i{font-size:12px;transition:transform .3s ease}.agreement-toggle-icon:hover{color:#0049b4}.agreement-toggle-icon.active{color:#0049b4}.agreement-toggle-icon.active i{transform:rotate(180deg)}.agreement-content{margin-top:16px;background:#edf9fe}.agreement-scroll{max-height:300px;overflow-y:auto;padding:24px}.agreement-scroll::-webkit-scrollbar{width:8px}.agreement-scroll::-webkit-scrollbar-track{background:#e2e8f0;border-radius:6px}.agreement-scroll::-webkit-scrollbar-thumb{background:#94a3b8;border-radius:6px}.agreement-scroll::-webkit-scrollbar-thumb:hover{background:#64748b}.agreement-scroll div{font-size:14px;line-height:1.8;color:#64748b}.agreement-scroll div h1,.agreement-scroll div h2,.agreement-scroll div h3,.agreement-scroll div h4,.agreement-scroll div h5,.agreement-scroll div h6{color:#1a1a2e;margin-top:24px;margin-bottom:16px;font-weight:600}.agreement-scroll div p{margin-bottom:16px}.agreement-scroll div ul,.agreement-scroll div ol{margin-left:24px;margin-bottom:16px}.agreement-scroll div table{width:100%;border-collapse:collapse;margin-bottom:16px}.agreement-scroll div table th,.agreement-scroll div table td{border:1px solid #e2e8f0;padding:8px;text-align:left}.agreement-scroll div table th{background:#eff6ff;font-weight:600}@media(max-width: 768px){.agreement-form{padding:20px 16px;gap:16px}.agreement-all-section{padding:8px 0}.agreement-items-list{gap:16px}.agreement-item-row{height:auto;min-height:28px}.agreement-checkbox-text{font-size:14px}.agreement-checkbox-text.agreement-all-text{font-size:16px}.agreement-scroll{max-height:250px;padding:16px}}.page-header{margin-bottom:64px;text-align:center}@media(max-width: 768px){.page-header{margin-bottom:48px}}.page-header .page-header-content{max-width:800px;margin:0 auto}.page-header .page-title{font-size:40px;font-weight:700;color:#1a1a2e;margin-bottom:16px;display:flex;align-items:center;justify-content:center;gap:16px}@media(max-width: 768px){.page-header .page-title{font-size:32px;flex-direction:column;gap:8px}}.page-header .page-title i{color:#0049b4;font-size:40px}@media(max-width: 768px){.page-header .page-title i{font-size:32px}}.page-header .page-description{font-size:20px;color:#64748b;line-height:1.6}@media(max-width: 768px){.page-header .page-description{font-size:16px}}.page-header .page-description .highlight{color:#0049b4;font-weight:600;position:relative}.page-header .page-description .highlight::after{content:"";position:absolute;bottom:-2px;left:0;right:0;height:2px;border-radius:2px}.partnership-form-container{max-width:800px;margin:0 auto}@media(max-width: 768px){.partnership-form-container{padding:0 16px}}.partnership-card{padding:64px;background:#fff;border-radius:16px;box-shadow:0 8px 24px rgba(75,155,255,.15);border:1px solid #e2e8f0}@media(max-width: 768px){.partnership-card{padding:40px 24px;border-radius:8px}}.partnership-card .form-group{margin-bottom:40px}@media(max-width: 768px){.partnership-card .form-group{margin-bottom:32px}}.partnership-card .form-group label{display:flex;align-items:center;gap:8px;font-size:16px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.partnership-card .form-group label i{color:#0049b4;font-size:18px}.partnership-card .form-group label .required{color:#ff6b6b;margin-left:2px}.partnership-card .form-group textarea.form-control{min-height:200px;resize:vertical;line-height:1.6}@media(max-width: 768px){.partnership-card .form-group textarea.form-control{min-height:150px}}.partnership-card .form-hint{display:flex;align-items:flex-start;gap:4px;margin-top:8px;font-size:14px;color:#64748b;line-height:1.6}.partnership-card .form-hint i{color:#0049b4;margin-top:2px;flex-shrink:0}.partnership-card .form-error{display:flex;align-items:flex-start;gap:4px;margin-top:8px;font-size:14px;color:#ff6b6b;line-height:1.6}.partnership-card .form-error i{margin-top:2px;flex-shrink:0}.partnership-card .form-help-text{margin-top:16px}.partnership-card .form-help-text p{display:flex;align-items:flex-start;gap:4px;margin:4px 0;font-size:12px;color:#94a3b8;line-height:1.6}.partnership-card .form-help-text p i{color:#6bcf7f;margin-top:2px;flex-shrink:0}.partnership-card .file-upload-wrapper .file-name-display.has-file{color:#1a1a2e;background:rgba(0,73,180,.05);border-color:#0049b4;font-weight:500}@media(max-width: 768px){.partnership-card .file-upload-wrapper .file-upload-btn{order:1}.partnership-card .file-upload-wrapper .file-name-display{order:2}.partnership-card .file-upload-wrapper .file-remove-btn{order:3}}.partnership-card .form-control:focus{border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1);outline:none}.partnership-card textarea.form-control:focus{box-shadow:0 0 0 4px rgba(0,73,180,.15)}@media print{.page-header{margin-bottom:32px}.partnership-card{box-shadow:none;border:1px solid #e2e8f0;padding:32px}.form-actions,.form-actions-center{display:none}.file-upload-wrapper .file-upload-btn,.file-upload-wrapper .file-remove-btn{display:none}}.user-management-container{max-width:1400px;margin:0 auto;padding:48px 40px;background-color:#f8fafc;min-height:100vh}@media(max-width: 768px){.user-management-container{padding:24px 16px}}.user-management-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:40px}@media(max-width: 768px){.user-management-header{flex-direction:column;align-items:flex-start;gap:24px}}.user-management-title h1{font-size:14px;color:#64748b;font-weight:400;margin-bottom:4px}.user-management-title h2{font-size:32px;font-weight:700;color:#1a1a2e}.user-management-actions{display:flex;gap:16px}.btn-create-user-large{padding:16px 40px;font-size:18px;margin-top:24px}.table-controls{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;padding:0 8px}@media(max-width: 768px){.table-controls{flex-direction:column;align-items:flex-start;gap:16px}}.total-count{font-size:16px;color:#64748b}.total-count strong{color:#0049b4;font-weight:600;font-size:20px}.user-list-wrapper{background:#fff;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.05);overflow:hidden;margin-bottom:40px}.user-table{display:flex;flex-direction:column;width:100%}.table-header{display:grid;grid-template-columns:60px 120px 1fr 150px 120px 200px;gap:16px;padding:16px 24px;background:#eff6ff;border-bottom:2px solid #e2e8f0;font-size:14px;font-weight:600;color:#1a1a2e}@media(max-width: 1280px){.table-header{grid-template-columns:50px 100px 1fr 120px 100px 180px;font-size:12px;padding:8px 16px}}@media(max-width: 1024px){.table-header{display:none}}.table-row{display:grid;grid-template-columns:60px 120px 1fr 150px 120px 200px;gap:16px;padding:24px;border-bottom:1px solid #e2e8f0;align-items:center;transition:all .3s ease;cursor:pointer}.table-row:hover{background-color:rgba(0,73,180,.02)}.table-row:last-child{border-bottom:none}.table-row.row-pending{background-color:rgba(255,217,61,.03);border-left:3px solid #ffd93d}@media(max-width: 1280px){.table-row{grid-template-columns:50px 100px 1fr 120px 100px 180px;padding:16px;font-size:14px}}@media(max-width: 1024px){.table-row{grid-template-columns:1fr;gap:8px;padding:16px}.table-row::before{content:attr(data-label);font-weight:600;color:#64748b}}.col-num{font-size:14px;color:#64748b;text-align:center}@media(max-width: 1024px){.col-num{display:none}}.col-name{font-weight:500}.col-name a{color:#1a1a2e;text-decoration:none;transition:all .3s ease}.col-name a:hover{color:#0049b4}.col-name .pending-label{display:inline-flex;align-items:center;gap:4px;color:#64748b;font-style:italic}.col-name .pending-label i{color:#ffd93d}.col-email{color:#64748b;font-size:14px;word-break:break-all}.col-role{display:flex;align-items:center}.user-role-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background-color:rgba(0,73,180,.1);color:#0049b4;border-radius:6px;font-size:12px;font-weight:500}.user-role-badge i{font-size:12px}.col-status{display:flex;align-items:center;justify-content:center}.col-actions{display:flex;align-items:center;justify-content:flex-start}.user-status-badge{display:inline-flex;align-items:center;justify-content:center;padding:6px 12px;border-radius:50px;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap}.user-status-badge.status-active{background-color:rgba(107,207,127,.1);color:hsl(132,51.0204081633%,51.568627451%)}.user-status-badge.status-inactive{background-color:rgba(100,116,139,.1);color:#64748b}.user-status-badge.status-pending{background-color:rgba(255,217,61,.15);color:rgb(163,131.0721649485,0)}.user-current-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background-color:rgba(167,139,250,.1);color:#a78bfa;border-radius:6px;font-size:12px;font-weight:500}.user-action-buttons{display:flex;flex-wrap:wrap;gap:4px;align-items:center}.user-empty-state{text-align:center;padding:80px 24px;color:#64748b}.user-empty-state .empty-icon{font-size:80px;margin-bottom:24px;opacity:.5}.user-empty-state h3{font-size:24px;font-weight:600;color:#1a1a2e;margin-bottom:16px}.user-empty-state p{font-size:16px;color:#64748b}.user-detail-container{max-width:900px;margin:0 auto;padding:40px}@media(max-width: 768px){.user-detail-container{padding:24px 16px}}.user-profile-card{color:#fff;margin-bottom:32px;position:relative;overflow:hidden}.user-profile-card::before{content:"";position:absolute;top:-50%;right:-20%;width:400px;height:400px;background:hsla(0,0%,100%,.05);border-radius:50%}.user-profile-card .detail-grid{border:none}.user-profile-header{display:flex;align-items:center;gap:32px;position:relative;z-index:1}@media(max-width: 768px){.user-profile-header{flex-direction:column;text-align:center}}.user-profile-avatar{flex-shrink:0}.avatar-circle-large{width:100px;height:100px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:40px;font-weight:700;background:hsla(0,0%,100%,.2);color:#fff;border:4px solid hsla(0,0%,100%,.3);box-shadow:0 8px 24px rgba(75,155,255,.15)}.user-profile-info{flex:1}.user-profile-info h2{font-size:32px;font-weight:700;margin-bottom:8px}.user-profile-info .user-profile-email{font-size:16px;opacity:.9;margin-bottom:16px}.user-profile-badges{display:flex;gap:8px;flex-wrap:wrap}@media(max-width: 768px){.user-profile-badges{justify-content:center}}.user-profile-badges .user-status-badge,.user-profile-badges .user-role-badge{background:hsla(0,0%,100%,.2);color:#fff;backdrop-filter:blur(10px);border:1px solid hsla(0,0%,100%,.3)}.detail-section{background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 4px rgba(0,0,0,.05);margin-bottom:24px}.detail-section h2{font-size:20px;font-weight:600;color:#1a1a2e;margin-bottom:24px;padding-bottom:8px;border-bottom:2px solid #eff6ff}.detail-grid{display:grid;grid-template-columns:repeat(2, 1fr);gap:24px}@media(max-width: 768px){.detail-grid{grid-template-columns:1fr}}.detail-item{display:flex;flex-direction:column;gap:4px}.detail-item.full-width{grid-column:1/-1}.detail-label{font-size:14px;font-weight:600;color:#64748b;display:flex;align-items:center;gap:4px}.detail-label i{color:#0049b4;font-size:14px}.detail-value{font-size:16px;color:#1a1a2e;padding:8px 0}.status-indicator{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border-radius:6px;font-size:14px;font-weight:500}.status-indicator.status-active{background-color:rgba(107,207,127,.1);color:hsl(132,51.0204081633%,51.568627451%)}.status-indicator.status-active .status-dot{background-color:#6bcf7f}.status-indicator.status-inactive{background-color:rgba(100,116,139,.1);color:#64748b}.status-indicator.status-inactive .status-dot{background-color:#64748b}.status-dot{width:8px;height:8px;border-radius:50%;animation:pulse 2s infinite}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}.detail-actions{display:flex;gap:16px;justify-content:center;padding-top:24px}@media(max-width: 768px){.detail-actions{flex-direction:column}}.commission-container{max-width:1400px;margin:0 auto}.wrap{max-width:1400px;margin:0 auto;background:#fff;padding:24px;border-radius:8px;box-shadow:0 4px 12px rgba(75,155,255,.1)}.searchInfo{display:inline-block;margin-right:8px;margin-bottom:16px}.searchBox{background:#f8f9fa;padding:20px;border-radius:8px;margin-top:20px;margin-bottom:20px}.searchBox.row-two{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.searchBox label{font-weight:500;color:#1a1a2e;min-width:80px}.searchBox .form-control{padding:6px 12px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px;min-width:100px}.form-inline{display:flex;align-items:center;gap:10px}.btnBox{margin-left:auto}.btnBox .btn+.btn{margin-left:5px}#printBtn{display:none}.commission-notice{color:#dc3545;margin-top:30px;line-height:1.6}.voffset3{margin-top:30px}.color_red{color:#ff6b6b}.color_blue{color:#007bff}.color_darkRed{color:darkred}.table-responsive{overflow-x:auto;margin-top:30px}.table{width:100%;border-collapse:collapse;font-size:14px}.table th{background:#f8fafc;font-weight:500;color:#1a1a2e;padding:16px;text-align:center;border:1px solid #e2e8f0}.table td{padding:16px;text-align:center;border:1px solid #e2e8f0}.table-bordered{border:1px solid #e2e8f0}.table-bordered th,.table-bordered td{border:1px solid #e2e8f0}.border-type{border:2px solid #dee2e6}.commission-table-wrapper{margin-top:30px}.commission-table-wrapper .table{border:2px solid #dee2e6}.summary-row{background-color:#fff3cd !important}.summary-row td{font-weight:600}.summary-row .summary-amount{font-size:16px;color:#007bff}.text-center{text-align:center}.text-right{text-align:right}.text-left{text-align:left}.bg-warning{background-color:#fff3cd !important}.glyphicon-search::before{content:"🔍"}.info-table{border-top:10px solid #64748b;width:100%;border-bottom:2px solid #1a1a2e;margin-bottom:40px}.info-table th{text-align:left;padding:16px 24px;font-weight:600;background:none;border:none}.info-table td{padding:16px 24px;border:none}.commission-table{width:100%;margin-top:40px}.commission-table th,.commission-table td{border:1px solid #999 !important;padding:16px 24px}.commission-table td{text-align:right}.bg_ygreen{background-color:#7fffd4;text-align:center}.bg_skyBlue{background-color:skyblue;text-align:center}.bg_yellow{background-color:#ff0;text-align:center}@media print{body{padding:0;background:#fff}.searchBox,.searchInfo,#printButton,#backButton,#printBtn{display:none !important}@page{size:auto;margin:0 0cm}html{margin:0 0cm}}@media screen and (max-width: 1024px){.wrap{padding:16px}.searchBox{padding:16px}.searchBox.row-two{flex-direction:column;align-items:flex-start;gap:16px}.form-inline{width:100%;flex-direction:column;align-items:flex-start}.form-inline label{min-width:auto}.form-inline .form-control{width:100%}.btnBox{margin-left:0;width:100%}.btnBox .btn{width:100%}.table-responsive{overflow-x:scroll;-webkit-overflow-scrolling:touch}}body.commission-print-page{font-size:12px;width:600px;margin:90px;font-family:"Noto Sans KR",-apple-system,sans-serif}body.commission-print-page div{position:relative}body.commission-print-page table{border-collapse:collapse}body.commission-print-page table th,body.commission-print-page table td{padding:5px 10px}body.commission-print-page table tr{font-size:12px}body.commission-print-page h1{text-align:center}body.commission-print-page h1 img{width:300px}body.commission-print-page h2{margin-top:40px;float:left}body.commission-print-page p{line-height:1.6}body.commission-print-page p[style*="float: right"]{margin-top:25px}body.commission-print-page .btn{padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font-size:14px}body.commission-print-page .btn-primary{background:#667eea;color:#fff}body.commission-print-page .btn-primary:hover{background:#5a67d8}.terms-page{min-height:calc(100vh - 140px);background:#f8fafc;padding:48px 24px}@media(max-width: 768px){.terms-page{padding:40px 16px}}.terms-container{max-width:1280px;margin:0 auto}.terms-header{margin-bottom:48px}@media(max-width: 768px){.terms-header{margin-bottom:40px}}.terms-header .page-title{font-size:40px;font-weight:700;color:#1a1a2e;margin-bottom:16px;-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);background-clip:text}@media(max-width: 768px){.terms-header .page-title{font-size:32px}}.terms-header .page-description{font-size:16px;color:#64748b;line-height:1.6}@media(max-width: 768px){.terms-header .page-description{font-size:14px}}.terms-content-card{background:#fff;border-radius:12px;box-shadow:0 4px 12px rgba(75,155,255,.1);overflow:hidden}.terms-tabs{display:flex;gap:0;background:#f8fafc;padding:4px;border-bottom:1px solid #e2e8f0}@media(max-width: 768px){.terms-tabs{padding:4px}}.terms-tabs .tab-link{flex:1;display:flex;align-items:center;justify-content:center;gap:8px;padding:16px 24px;font-size:16px;font-weight:600;color:#64748b;text-decoration:none;background:rgba(0,0,0,0);border-radius:8px;transition:all .3s ease;text-align:center}@media(max-width: 768px){.terms-tabs .tab-link{padding:8px 16px;font-size:14px;gap:4px}}.terms-tabs .tab-link i{font-size:18px;transition:all .3s ease}@media(max-width: 768px){.terms-tabs .tab-link i{font-size:16px}}.terms-tabs .tab-link:hover{color:#0049b4;background:rgba(0,73,180,.05)}.terms-tabs .tab-link:hover i{transform:scale(1.1)}.terms-tabs .tab-link.active{color:#fff;background:#0049b4;box-shadow:0 2px 4px rgba(0,0,0,.05)}.terms-tabs .tab-link.active i{color:#fff}.terms-selector{padding:24px 40px;background:#eff6ff;border-bottom:1px solid #e2e8f0}@media(max-width: 768px){.terms-selector{padding:16px 24px}}.terms-selector form{max-width:400px}.terms-selector .custom-select{position:relative;cursor:pointer}.terms-selector .custom-select .select-selected{display:flex;align-items:center;gap:8px;padding:16px 24px;background:#fff;border:2px solid #e2e8f0;border-radius:8px;font-size:14px;font-weight:500;color:#1a1a2e;transition:all .3s ease;cursor:pointer}@media(max-width: 768px){.terms-selector .custom-select .select-selected{padding:8px 16px;font-size:12px}}.terms-selector .custom-select .select-selected i:first-child{color:#0049b4}.terms-selector .custom-select .select-selected i:last-child{margin-left:auto;font-size:12px;color:#64748b;transition:all .3s ease}.terms-selector .custom-select .select-selected span{font-weight:600;color:#0049b4}.terms-selector .custom-select .select-selected:hover{border-color:#0049b4;box-shadow:0 0 0 3px rgba(0,73,180,.1)}.terms-selector .custom-select .select-selected.select-arrow-active{border-color:#0049b4}.terms-selector .custom-select .select-selected.select-arrow-active i:last-child{transform:rotate(180deg)}.terms-selector .custom-select .select-items{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:2px solid #0049b4;border-radius:8px;box-shadow:0 8px 24px rgba(75,155,255,.15);max-height:240px;overflow-y:auto;z-index:100;list-style:none;padding:4px;margin:0}.terms-selector .custom-select .select-items.select-hide{display:none}.terms-selector .custom-select .select-items li{padding:8px 16px;font-size:14px;color:#1a1a2e;border-radius:6px;cursor:pointer;transition:all .3s ease}@media(max-width: 768px){.terms-selector .custom-select .select-items li{padding:4px 8px;font-size:12px}}.terms-selector .custom-select .select-items li:hover{background:#eff6ff;color:#0049b4}.terms-selector .custom-select .select-items li.selected{background:#0049b4;color:#fff;font-weight:600}.terms-content{padding:48px 40px;min-height:400px}@media(max-width: 768px){.terms-content{padding:40px 24px;min-height:300px}}.terms-content .content-body{font-size:16px;color:#1a1a2e;line-height:1.8;white-space:pre-wrap;word-wrap:break-word}@media(max-width: 768px){.terms-content .content-body{font-size:14px}}.terms-content .content-body p{margin-bottom:16px}.terms-content .content-body p:last-child{margin-bottom:0}.terms-content .content-body h1,.terms-content .content-body h2,.terms-content .content-body h3,.terms-content .content-body h4,.terms-content .content-body h5,.terms-content .content-body h6{margin-top:32px;margin-bottom:16px;font-weight:600;color:#1a1a2e;line-height:1.2}.terms-content .content-body h1:first-child,.terms-content .content-body h2:first-child,.terms-content .content-body h3:first-child,.terms-content .content-body h4:first-child,.terms-content .content-body h5:first-child,.terms-content .content-body h6:first-child{margin-top:0}.terms-content .content-body h1{font-size:32px;font-weight:700;padding-bottom:16px;border-bottom:2px solid #e2e8f0}@media(max-width: 768px){.terms-content .content-body h1{font-size:24px}}.terms-content .content-body h2{font-size:24px}@media(max-width: 768px){.terms-content .content-body h2{font-size:20px}}.terms-content .content-body h3{font-size:20px}@media(max-width: 768px){.terms-content .content-body h3{font-size:16px}}.terms-content .content-body strong{font-weight:700;color:#1a1a2e}.terms-content .content-body em{font-style:italic;color:#64748b}.terms-content .content-body a{color:#0049b4;text-decoration:underline;transition:all .3s ease}.terms-content .content-body a:hover{color:#c3dfea}.terms-content .content-body ul,.terms-content .content-body ol{margin:16px 0;padding-left:40px}@media(max-width: 768px){.terms-content .content-body ul,.terms-content .content-body ol{padding-left:24px}}.terms-content .content-body ul{list-style-type:disc}.terms-content .content-body ol{list-style-type:decimal}.terms-content .content-body li{margin-bottom:8px;line-height:1.6}.terms-content .content-body li:last-child{margin-bottom:0}.terms-content .content-body blockquote{border-left:4px solid #0049b4;padding-left:24px;margin:24px 0;color:#64748b;font-style:italic;background:#f8fafc;padding:16px 24px;border-radius:0 8px 8px 0}@media(max-width: 768px){.terms-content .content-body blockquote{padding:8px 16px}}.terms-content .content-body code{background:#f8fafc;padding:2px 6px;border-radius:6px;font-family:"Fira Code","Courier New",monospace;font-size:.9em;color:#0049b4}.terms-content .content-body pre{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:16px;overflow-x:auto;margin:24px 0}@media(max-width: 768px){.terms-content .content-body pre{padding:8px}}.terms-content .content-body pre code{background:rgba(0,0,0,0);padding:0;color:#1a1a2e}.terms-content .content-body table{width:100%;border-collapse:collapse;margin:24px 0;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;font-size:14px}@media(max-width: 768px){.terms-content .content-body table{font-size:12px}}.terms-content .content-body table th{background:#eff6ff;padding:8px 16px;text-align:left;font-weight:600;color:#1a1a2e;border-bottom:2px solid #e2e8f0}@media(max-width: 768px){.terms-content .content-body table th{padding:4px 8px}}.terms-content .content-body table td{padding:8px 16px;border-bottom:1px solid #e2e8f0;color:#1a1a2e}@media(max-width: 768px){.terms-content .content-body table td{padding:4px 8px}}.terms-content .content-body table tr:last-child td{border-bottom:none}.terms-content .content-body table tr:hover{background:#f8fafc}.terms-content .content-body hr{border:none;border-top:1px solid #e2e8f0;margin:40px 0}.terms-content .content-body .article{margin-top:40px;padding-top:24px;border-top:1px solid #e2e8f0}.terms-content .content-body .article:first-child{margin-top:0;padding-top:0;border-top:none}.terms-content .content-body .section-number{display:inline-block;min-width:30px;color:#0049b4;font-weight:700}.terms-selector .select-items::-webkit-scrollbar{width:6px}.terms-selector .select-items::-webkit-scrollbar-track{background:#f8fafc;border-radius:6px}.terms-selector .select-items::-webkit-scrollbar-thumb{background:#0049b4;border-radius:6px}.terms-selector .select-items::-webkit-scrollbar-thumb:hover{background:#c3dfea}.container{max-width:1280px;margin:0 auto;padding:0 24px}@media(max-width: 768px){.container{padding:0 16px}}.d-none{display:none !important}.d-block{display:block !important}.d-inline-block{display:inline-block !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-grid{display:grid !important}.flex-center{display:flex;justify-content:center;align-items:center}.flex-between{display:flex;justify-content:space-between;align-items:center}.flex-column{flex-direction:column}.flex-wrap{flex-wrap:wrap}.align-center{align-items:center}.align-start{align-items:flex-start}.align-end{align-items:flex-end}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-xs{gap:4px}.gap-sm{gap:8px}.gap-md{gap:16px}.gap-lg{gap:24px}.gap-xl{gap:32px}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mr-0{margin-right:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-xs{margin:4px !important}.mt-xs{margin-top:4px !important}.mb-xs{margin-bottom:4px !important}.ml-xs{margin-left:4px !important}.mr-xs{margin-right:4px !important}.mx-xs{margin-left:4px !important;margin-right:4px !important}.my-xs{margin-top:4px !important;margin-bottom:4px !important}.m-sm{margin:8px !important}.mt-sm{margin-top:8px !important}.mb-sm{margin-bottom:8px !important}.ml-sm{margin-left:8px !important}.mr-sm{margin-right:8px !important}.mx-sm{margin-left:8px !important;margin-right:8px !important}.my-sm{margin-top:8px !important;margin-bottom:8px !important}.m-md{margin:16px !important}.mt-md{margin-top:16px !important}.mb-md{margin-bottom:16px !important}.ml-md{margin-left:16px !important}.mr-md{margin-right:16px !important}.mx-md{margin-left:16px !important;margin-right:16px !important}.my-md{margin-top:16px !important;margin-bottom:16px !important}.m-lg{margin:24px !important}.mt-lg{margin-top:24px !important}.mb-lg{margin-bottom:24px !important}.ml-lg{margin-left:24px !important}.mr-lg{margin-right:24px !important}.mx-lg{margin-left:24px !important;margin-right:24px !important}.my-lg{margin-top:24px !important;margin-bottom:24px !important}.m-xl{margin:32px !important}.mt-xl{margin-top:32px !important}.mb-xl{margin-bottom:32px !important}.ml-xl{margin-left:32px !important}.mr-xl{margin-right:32px !important}.mx-xl{margin-left:32px !important;margin-right:32px !important}.my-xl{margin-top:32px !important;margin-bottom:32px !important}.m-2xl{margin:40px !important}.mt-2xl{margin-top:40px !important}.mb-2xl{margin-bottom:40px !important}.ml-2xl{margin-left:40px !important}.mr-2xl{margin-right:40px !important}.mx-2xl{margin-left:40px !important;margin-right:40px !important}.my-2xl{margin-top:40px !important;margin-bottom:40px !important}.m-3xl{margin:48px !important}.mt-3xl{margin-top:48px !important}.mb-3xl{margin-bottom:48px !important}.ml-3xl{margin-left:48px !important}.mr-3xl{margin-right:48px !important}.mx-3xl{margin-left:48px !important;margin-right:48px !important}.my-3xl{margin-top:48px !important;margin-bottom:48px !important}.m-4xl{margin:64px !important}.mt-4xl{margin-top:64px !important}.mb-4xl{margin-bottom:64px !important}.ml-4xl{margin-left:64px !important}.mr-4xl{margin-right:64px !important}.mx-4xl{margin-left:64px !important;margin-right:64px !important}.my-4xl{margin-top:64px !important;margin-bottom:64px !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mr-auto{margin-right:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.pr-0{padding-right:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-xs{padding:4px !important}.pt-xs{padding-top:4px !important}.pb-xs{padding-bottom:4px !important}.pl-xs{padding-left:4px !important}.pr-xs{padding-right:4px !important}.px-xs{padding-left:4px !important;padding-right:4px !important}.py-xs{padding-top:4px !important;padding-bottom:4px !important}.p-sm{padding:8px !important}.pt-sm{padding-top:8px !important}.pb-sm{padding-bottom:8px !important}.pl-sm{padding-left:8px !important}.pr-sm{padding-right:8px !important}.px-sm{padding-left:8px !important;padding-right:8px !important}.py-sm{padding-top:8px !important;padding-bottom:8px !important}.p-md{padding:16px !important}.pt-md{padding-top:16px !important}.pb-md{padding-bottom:16px !important}.pl-md{padding-left:16px !important}.pr-md{padding-right:16px !important}.px-md{padding-left:16px !important;padding-right:16px !important}.py-md{padding-top:16px !important;padding-bottom:16px !important}.p-lg{padding:24px !important}.pt-lg{padding-top:24px !important}.pb-lg{padding-bottom:24px !important}.pl-lg{padding-left:24px !important}.pr-lg{padding-right:24px !important}.px-lg{padding-left:24px !important;padding-right:24px !important}.py-lg{padding-top:24px !important;padding-bottom:24px !important}.p-xl{padding:32px !important}.pt-xl{padding-top:32px !important}.pb-xl{padding-bottom:32px !important}.pl-xl{padding-left:32px !important}.pr-xl{padding-right:32px !important}.px-xl{padding-left:32px !important;padding-right:32px !important}.py-xl{padding-top:32px !important;padding-bottom:32px !important}.p-2xl{padding:40px !important}.pt-2xl{padding-top:40px !important}.pb-2xl{padding-bottom:40px !important}.pl-2xl{padding-left:40px !important}.pr-2xl{padding-right:40px !important}.px-2xl{padding-left:40px !important;padding-right:40px !important}.py-2xl{padding-top:40px !important;padding-bottom:40px !important}.p-3xl{padding:48px !important}.pt-3xl{padding-top:48px !important}.pb-3xl{padding-bottom:48px !important}.pl-3xl{padding-left:48px !important}.pr-3xl{padding-right:48px !important}.px-3xl{padding-left:48px !important;padding-right:48px !important}.py-3xl{padding-top:48px !important;padding-bottom:48px !important}.p-4xl{padding:64px !important}.pt-4xl{padding-top:64px !important}.pb-4xl{padding-bottom:64px !important}.pl-4xl{padding-left:64px !important}.pr-4xl{padding-right:64px !important}.px-4xl{padding-left:64px !important;padding-right:64px !important}.py-4xl{padding-top:64px !important;padding-bottom:64px !important}.w-25{width:25%}.w-50{width:50%}.w-75{width:75%}.w-100{width:100%}.w-auto{width:auto}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.h-auto{height:auto}.vh-100{height:100vh}.position-relative{position:relative}.position-absolute{position:absolute}.position-fixed{position:fixed}.position-sticky{position:sticky}.bg-primary{background:#0049b4}.bg-secondary{background:#c3dfea}.bg-white{background:#fff}.bg-gray{background:#f8fafc}.bg-light{background:#eff6ff}.border{border:1px solid #e2e8f0}.border-0{border:none !important}.border-top{border-top:1px solid #e2e8f0}.border-bottom{border-bottom:1px solid #e2e8f0}.border-left{border-left:1px solid #e2e8f0}.border-right{border-right:1px solid #e2e8f0}.border-primary{border-color:#0049b4}.rounded-0{border-radius:0}.rounded-sm{border-radius:6px}.rounded{border-radius:8px}.rounded-lg{border-radius:12px}.rounded-xl{border-radius:16px}.rounded-full{border-radius:50px}.rounded-circle{border-radius:50%}.shadow-none{box-shadow:none !important}.shadow-sm{box-shadow:0 2px 4px rgba(0,0,0,.05)}.shadow{box-shadow:0 4px 12px rgba(75,155,255,.1)}.shadow-lg{box-shadow:0 8px 24px rgba(75,155,255,.15)}.shadow-xl{box-shadow:0 16px 40px rgba(75,155,255,.2)}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}@media(max-width: 768px){.sm-hide{display:none !important}}@media(max-width: 1024px){.md-hide{display:none !important}}@media(min-width: 769px){.mobile-only{display:none !important}}@media(max-width: 768px){.desktop-only{display:none !important}}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-100{opacity:1}.transition{transition:all .3s ease}.transition-fast{transition:all .15s ease}.transition-slow{transition:all .5s ease}.transition-none{transition:none}.visually-hidden,.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}/*# sourceMappingURL=main.min.css.map */ diff --git a/src/main/resources/static/css/main.min.css.map b/src/main/resources/static/css/main.min.css.map index 7f79bca..a340564 100644 --- a/src/main/resources/static/css/main.min.css.map +++ b/src/main/resources/static/css/main.min.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../sass/base/_reset.scss","../sass/abstracts/_variables.scss","../sass/base/_typography.scss","../sass/abstracts/_mixins.scss","../sass/base/_animations.scss","../sass/layout/_header.scss","../sass/layout/_footer.scss","../sass/layout/_grid.scss","../sass/layout/_container.scss","../sass/components/_buttons.scss","../sass/components/_cards.scss","../sass/components/_forms.scss","../sass/components/_modals.scss","../sass/components/_navigation.scss","../sass/components/_partners.scss","../sass/components/_cta.scss","../sass/pages/_index.scss","../sass/pages/_api-market.scss","../sass/pages/_login.scss","../sass/base/_utilities.scss"],"names":[],"mappings":"CAIA,EACE,SACA,UACA,sBAGF,KACE,eACA,mCACA,kCACA,kCAGF,KACE,YCqBoB,mFDpBpB,YC4CmB,ID3CnB,MCJU,QDKV,iBCFM,KDGN,kBAIF,MACE,gBAIF,EACE,qBACA,cACA,WC4EgB,aDxElB,IACE,eACA,YACA,cAIF,OACE,oBACA,kBACA,oBACA,eACA,yBACA,YACA,UAIF,sBAGE,oBACA,kBACA,oBACA,YACA,aAIF,MACE,yBACA,iBAIF,kBACE,YChBiB,IDiBjB,YCbkB,IDiBpB,2FAGE,cAIF,YACE,qCACA,MCxEU,QD2EZ,iBACE,qCACA,MC7EU,QCXZ,KACE,UDuCe,KCtCf,YDgDoB,IC/CpB,MDQU,QCJZ,OACE,UDuCc,KCtCd,YD6CsB,IC5CtB,cDuDW,KE7DT,yBDGJ,OAMI,UDgCY,ME3CZ,yBDKJ,OAUI,UD2BY,MCvBhB,OACE,UDwBc,KCvBd,YD8BiB,IC7BjB,cDwCW,KE5DT,yBDiBJ,OAMI,UDiBY,ME1CZ,yBDmBJ,OAUI,UDYW,MCRf,OACE,UDSc,KCRd,YDgBiB,ICfjB,cD0BW,KE5DT,yBD+BJ,OAMI,UDEW,MCEf,OACE,UDFc,KCGd,YDKqB,ICJrB,cDeW,ICZb,OACE,UDTa,KCUb,YDDqB,ICErB,cDSW,ICNb,OACE,UDhBa,KCiBb,YDPqB,ICQrB,cDGW,ICCb,EACE,cDDW,KCEX,YDRmB,ICUnB,aACE,gBAKJ,eCTE,WF1CiB,kDE2CjB,6BACA,sCACA,qBDUF,sBCbE,WFzCgB,kDE0ChB,6BACA,sCACA,qBDcF,oBCjBE,WFxCc,kDEyCd,6BACA,sCACA,qBDkBF,cACE,MDrFa,QCwFf,gBACE,MDxFe,QC2FjB,WACE,MDpFU,QCuFZ,WACE,MDvFU,QC0FZ,YACE,MD1FW,QC6Fb,YACE,MD7FM,KCiGR,WACE,gBAGF,aACE,kBAGF,YACE,iBAIF,cACE,YD3EoB,IC8EtB,aACE,YD9EmB,ICiFrB,eACE,YDjFqB,ICoFvB,WACE,YDpFiB,ICuFnB,gBACE,YDvFsB,IC2FxB,SACE,UD5Ga,KC+Gf,SACE,UD/Ga,KCkHf,WACE,UDlHe,KCqHjB,SACE,UDpHa,KCuHf,SACE,UDvHa,KC2Hf,MACE,UD7Ha,KC8Hb,YDtHoB,ICuHpB,YD9GkB,IC+GlB,MD9JU,QCiKZ,SACE,UDvIa,KCwIb,MDnKU,QCsKZ,MACE,YDhJiB,oCCiJjB,UD7Ia,KC8Ib,WDtKQ,QCuKR,gBACA,cD7GiB,ICiHnB,EACE,MD1La,QC4Lb,QACE,MD5La,QCiMjB,WACE,QDrIW,KCsIX,cACA,8BACA,WDzLQ,QC0LR,kBAEA,aACE,gBAKJ,GACE,YACA,6BACA,cEpNF,iBACE,QACE,qCAEF,IACE,2CAKJ,kBACE,QACE,wBAEF,IACE,6BAKJ,uBACE,KACE,UACA,4BAEF,GACE,UACA,yBAKJ,qBACE,KACE,UACA,2BAEF,GACE,UACA,yBAKJ,uBACE,KACE,UACA,4BAEF,GACE,UACA,yBAKJ,wBACE,KACE,UACA,2BAEF,GACE,UACA,yBAKJ,kBACE,KACE,UAEF,GACE,WAKJ,uBACE,KACE,UACA,qBAEF,GACE,UACA,oBAKJ,gBACE,KACE,uBAEF,GACE,0BAKJ,iBACE,GACE,mBAEF,IACE,sBAEF,KACE,oBAKJ,mBACE,GACE,0CAEF,KACE,0CAKJ,gBACE,GACE,uBAEF,IACE,wBAEF,IACE,wBAEF,IACE,wBAEF,IACE,wBAEF,IACE,wBAEF,IACE,uBAEF,KACE,wBAKJ,iBACE,GACE,UACA,qBAEF,IACE,qBAEF,KACE,UACA,oBAKJ,uBACE,KACE,UACA,sBAEF,GACE,UACA,oBAKJ,kBACE,GACE,mBACA,UAEF,KACE,mBACA,WAKJ,yBACE,GACE,2BAEF,IACE,6BAEF,KACE,4BAKJ,eACE,yCAGF,gBACE,6BAGF,cACE,kCAGF,eACE,wCAGF,iBACE,8BAGF,kBACE,iCAGF,oBACE,mCAGF,aACE,2DAIF,SACE,oBAGF,SACE,oBAGF,SACE,oBAGF,SACE,oBAGF,SACE,oBAIF,eACE,uBAGF,iBACE,uBAGF,eACE,sBAGF,iBACE,sBAIF,YACE,8BAEA,kBACE,sBAIJ,YACE,kDAEA,kBACE,2BACA,WHjQQ,gCGqQZ,cACE,8BAEA,oBACE,uBAIJ,aACE,kBACA,gBAEA,qBACE,WACA,kBACA,SACA,UACA,WACA,YACA,kGAMA,wBACA,8BACA,4BAGF,2BACE,yCClUJ,MAEE,wBACA,0BACA,uBACA,yBACA,yBACA,wBACA,yBAGA,qBACA,qBACA,sBACA,iBACA,mBACA,oBACA,uBAGA,sEACA,qEACA,mEAGA,2CACA,gDACA,iDACA,iDAIF,OACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA,SAMF,eACE,eACA,MACA,OACA,QACA,+BACA,2BACA,mCACA,4BACA,aACA,YACA,wBAGF,gBACE,aACA,mBACA,8BACA,YACA,iBACA,cACA,eAQF,aACE,aACA,mBAEA,mBACE,YACA,WAKJ,cACE,aACA,mBACA,SAIF,MACE,aACA,mBACA,SACA,YACA,WAEA,QACE,aACA,mBACA,SACA,YACA,qBAGF,UACE,YACA,WAIJ,WACE,eACA,gBACA,0BACA,iBACA,2BACA,mBACA,qBACA,qBACA,wBAGA,iBACE,+BACA,mBACA,2BACA,4BAGF,mBACE,0BAKJ,+CAGE,qBACA,qBACA,8BAEA,iEACE,sBAGF,2DACE,cAKJ,cACE,aACA,mBACA,SAIF,YACE,WACA,YACA,0BACA,YACA,kBACA,eACA,eACA,uBACA,wBAEA,kBACE,2BACA,0BACA,qBAOJ,gBACE,aACA,mBACA,8BACA,WAEA,yBANF,gBAOI,cAIJ,eACE,aACA,mBACA,8BACA,WAEA,yBANF,eAOI,cAQF,0BACE,YACA,WAIJ,eACE,OACA,kBAEA,6BACE,eACA,gBACA,uBACA,SAKF,+BACE,WACA,YACA,yBACA,YACA,eACA,aACA,sBACA,uBACA,mBACA,QACA,YACA,kBACA,qCAEA,qCACE,0BAGF,+CACE,WACA,WACA,4BACA,wBACA,kBAKE,mEACE,wCAEF,mEACE,UAEF,mEACE,0CAUV,eACE,eACA,MACA,OACA,QACA,SACA,aACA,kBACA,UACA,wBAEA,sBACE,mBACA,UAEA,sCACE,wBAIJ,+BACE,aAGF,+BACE,kBACA,MACA,OACA,QACA,SACA,WACA,YACA,wBACA,2BACA,8BACA,aACA,sBAGF,8BACE,aACA,mBACA,8BACA,aACA,2CACA,wBACA,4BACA,gBAEA,2CACE,aACA,mBACA,SAEA,iDACE,YACA,WAGF,sDACE,eACA,gBACA,0BAIJ,4CACE,WACA,YACA,yBACA,YACA,eACA,aACA,mBACA,uBACA,kBACA,eACA,uBACA,wBAEA,kDACE,wBACA,uBAKN,2BACE,OACA,UACA,gBACA,wBAEA,wCACE,gBACA,SACA,eAEA,2CACE,kBAEA,wDACE,cACA,kBACA,cACA,uBACA,qBACA,eACA,gBACA,mBACA,wBAEA,6HACE,2BACA,0BACA,0BACA,4BAOV,+BACE,aACA,wCACA,wBACA,uCAEA,iDACE,cACA,kBACA,kBACA,uBACA,qBACA,qCACA,mBACA,gBACA,eACA,mBACA,wBAEA,uDACE,2BACA,0BAIJ,kDACE,aACA,mBACA,uBACA,QACA,kBACA,mCACA,mBACA,qBACA,mBACA,gBACA,eACA,mBACA,wBACA,4BAEA,wDACE,2BACA,4BAIJ,kDACE,aACA,mBACA,uBACA,QACA,WACA,kBACA,0BACA,uBACA,YACA,mBACA,gBACA,eACA,eACA,wBAEA,wDACE,2BACA,0BAMR,gBACE,kBACA,MJxZW,KIyZX,QACA,2BACA,WACA,YACA,yBACA,YACA,eACA,YACA,YAEA,qBACE,cACA,WACA,WACA,WJ5dQ,QI6dR,kBACA,6BACA,oBAEA,yDAEE,WACA,kBACA,OACA,WACA,WACA,WJxeM,QIyeN,6BAGF,sCACA,oCAGF,wBACE,yBACA,8DACA,8DAOJ,gBAEE,eACA,MACA,OACA,QACA,SACA,WJ9fM,KI+fN,QJ1ac,II2ad,YACA,gBACA,gBACA,aACA,sBAKA,4BACE,QJvdS,KIwdT,WJ1gBM,QI2gBN,gCAGF,0BACE,gBACA,SACA,UACA,YAEA,oCACE,gCAEA,sCACE,aACA,mBACA,QJxeK,KIyeL,MJ/hBI,QIgiBJ,UJlgBO,KImgBP,YJzfa,II0fb,qBACA,kBAGF,yDACE,WACA,kBACA,MJnfK,KIofL,QACA,UACA,WACA,+BACA,g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aACA,2DACA,INpFW,KE7DT,yBI8IJ,iBAMI,2BAKJ,eACE,aACA,2DACA,IN7FY,KM8FZ,mBJ7JE,yBIyJJ,eAOI,sCAKJ,cACE,aACA,qCACA,IN1GW,KE9DT,yBIqKJ,cAMI,2BAKJ,cACE,aACA,8BACA,INpHY,KMqHZ,kBJlLE,0BI8KJ,cAOI,2BAKJ,aACE,aACA,8BACA,IN7HY,KEhEV,0BI0LJ,aAMI,0BACA,INpIU,MMuIZ,2BACE,aACA,qCACA,IN1IU,KE7DV,0BIoMF,2BAMI,sCJ5MF,yBIsMF,2BAUI,0BACA,mBAMN,cACE,aACA,qCACA,IN7JW,KM8JX,mBJzNE,0BIqNJ,cAOI,0BACA,INjKS,MMsKb,kBACE,aACA,2DACA,IN1KW,KE7DT,yBIoOJ,kBAMI,2BAKJ,YACE,aACA,qCACA,INpLW,KMqLX,kBJjPE,0BI6OJ,YAOI,sCJtPA,yBI+OJ,YAWI,2BAKJ,YACE,aACA,8BACA,INlMY,KMmMZ,mBJjQE,0BI6PJ,YAOI,0BACA,INzMS,MM4MX,oBACE,cAEA,sBACE,cJ5QF,0BIwQF,oBAQI,eAMN,cACE,aACA,qCACA,IN7NW,KE5DT,0BIsRJ,cAMI,2BClSJ,WACE,UPkFoB,OOjFpB,cACA,eLCE,yBKJJ,WAMI,gBAIF,iBACE,eACA,eAGF,kBACE,gBAGF,gBACE,iBAKJ,SACE,gBLtBE,yBKqBJ,SAII,gBAIF,YACE,eAGF,YACE,gBAGF,gBACE,cAGF,mBACE,iBAMF,iBACE,WPtCM,QOyCR,kBACE,WPzCO,QO4CT,qBACE,6DAGF,6BACE,6DAGF,oBACE,WP9Ce,kDO+Cf,MPxDI,KO2DN,iBACE,WP/DQ,QOgER,MP7DI,KOkER,gBACE,kBACA,cPbY,KEjEV,yBK4EJ,gBAKI,cPjBU,MOoBZ,+BACE,oBACA,mBACA,IP7BS,IO8BT,iBACA,WP7EO,QO8EP,MP5FW,QO6FX,cPhBiB,KOiBjB,UPzDW,KO0DX,YP7CmB,IO8CnB,cPlCS,KOqCX,+BACE,UPzDY,KO0DZ,YPlDe,IOmDf,cPxCS,KOyCT,MP9FQ,QEPR,yBKiGF,+BAOI,UPhEU,MOmEZ,gDL9CF,WFzCgB,kDE0ChB,6BACA,sCACA,qBKgDA,kCACE,UP5EW,KO6EX,MP1GQ,QO2GR,YP7DiB,IO8DjB,gBACA,cLrHA,yBKgHF,kCAQI,UPpFW,MO0FjB,iBACE,kBACA,iBACA,aACA,sBAEA,+BACE,OACA,YPtDY,KO2DhB,cACE,kBACA,gBAIF,eACE,kBACA,UCvJF,KNiCE,oBACA,mBACA,IF4BW,IE3BX,kBACA,cFuCiB,KEtCjB,YFcqB,IEbrB,UFCe,0BECf,WFgEgB,aE/DhB,eACA,YAEA,WACE,2BM9CJ,KAEE,kBACA,gBAGA,QACE,iBACA,UR+BW,KQ5Bb,QACE,kBACA,UR2Ba,KQxBf,QACE,kBACA,URuBW,KQpBb,QACE,kBACA,URmBW,KQfb,aACE,WRLe,kDQMf,MRfI,KQgBJ,WRDQ,+BQGR,mBACE,2BACA,WRHM,gCQMR,oBACE,2BAIJ,eACE,WR7BI,KQ8BJ,MR1CW,QQ2CX,yBAEA,qBACE,WRhCK,QQiCL,2BAIJ,YACE,WR9Bc,kDQ+Bd,MRzCI,KQ0CJ,WR3BQ,+BQ6BR,kBACE,2BACA,WR7BM,gCQiCV,UACE,WRxCY,kDQyCZ,MRpDI,KQqDJ,WRtCQ,+BQwCR,gBACE,2BACA,WRxCM,gCQ4CV,aACE,WRrEW,QQsEX,MR/DI,KQiEJ,mBACE,iDACA,2BAIJ,YACE,WRhFY,QQiFZ,MRzEI,KQ2EJ,kBACE,mBACA,2BAIJ,WACE,yBACA,MR/FW,QQgGX,+BAEA,iBACE,+BACA,aRpGS,QQwGb,aACE,yBACA,MRjGQ,QQkGR,yBAEA,mBACE,aR9GS,QQ+GT,MR/GS,QQgHT,2BAKJ,4BAEE,WACA,mBACA,oBAGF,aACE,oBACA,oBAEA,oBACE,WACA,kBACA,WACA,YNtDJ,kBACA,QACA,SACA,gCMqDI,sBACA,kBACA,+BACA,mCAKJ,UACE,oBACA,mBACA,uBACA,WACA,YACA,UACA,cRvEmB,IQyEnB,iBACE,WACA,YAGF,iBACE,WACA,YAKJ,WACE,WACA,uBAIF,WACE,oBACA,SAEA,gBACE,gBAEA,4BACE,uBRvGW,KQwGX,0BRxGW,KQ2Gb,2BACE,wBR5GW,KQ6GX,2BR7GW,KQoHnB,KACE,eACA,ORhIW,KQiIX,MRjIW,KQkIX,WACA,YACA,WR/KiB,kDQgLjB,YACA,cRxHqB,IQyHrB,MR3LM,KQ4LN,UR/Ja,KQgKb,eACA,WR9KU,gCQ+KV,WRpGgB,aQqGhB,QR9Gc,IE5Ed,aACA,uBACA,mBM2LA,WACE,qBACA,WRpLQ,gCQsLR,sBACE,UACA,4BAIJ,gBACE,kBACA,WACA,QACA,2BACA,WRrNQ,QQsNR,MRnNI,KQoNJ,iBACA,cRxJe,IQyJf,UR7LW,KQ8LX,mBACA,UACA,WR9Hc,aQ+Hd,oBAMF,iBN7MA,oBACA,mBACA,IF4BW,IE3BX,kBACA,cFuCiB,KEtCjB,YFcqB,IEbrB,UFCe,0BECf,WFgEgB,aE/DhB,eACA,YAEA,uBACE,2BMgMF,iBAEE,WRlOI,KQmOJ,MR/OW,QQgPX,kBACA,UR1MW,KQ2MX,WRtNQ,gCQwNR,uBACE,2BACA,WRzNM,gCQ6NV,mBN3NA,oBACA,mBACA,IF4BW,IE3BX,kBACA,cFuCiB,KEtCjB,YFcqB,IEbrB,UFCe,0BECf,WFgEgB,aE/DhB,eACA,YAEA,yBACE,2BM8MF,mBAEE,yBACA,MRjPI,KQkPJ,sBACA,kBACA,URzNW,KQ2NX,yBACE,8BACA,2BCtQN,MPoDE,WFtCM,KEuCN,cFyBkB,KExBlB,QF0Da,KEzDb,WFkDgB,aEhDhB,YACE,2BACA,WF7BQ,gCS9BZ,MAEE,kBACA,gBAGA,cACE,WACA,kBACA,SACA,UACA,WACA,YACA,kGAMA,wBACA,WTuFc,aStFd,UAGF,oBACE,2BACA,UAKJ,UPqBE,WFtCM,KEuCN,cFyBkB,KExBlB,QF0Da,KEzDb,WFkDgB,aEhDhB,gBACE,2BACA,WF7BQ,gCSCZ,UAEE,kBACA,yBAEA,gBACE,aTnCW,QSoCX,2BAIF,kBACE,aTtCY,QSuCZ,8EAIF,cACE,aT1CW,QS2CX,+EAIF,qBACE,kBACA,UACA,WACA,iBACA,WTtDY,QSuDZ,MTjDQ,QSkDR,cTiBgB,KShBhB,UTxBW,KSyBX,YTVe,ISWf,yBAEA,yBACE,WT5DS,QS6DT,MTtDE,KSyDJ,0BACE,WThEU,QSiEV,MT3DE,KSgEN,oBACE,WACA,YACA,mBP7DF,aACA,uBACA,mBO6DE,eACA,WTpEO,QSqEP,MTnFW,QSoFX,cTTe,KSUf,WTkBc,aSfhB,0BACE,qBACA,WTrEe,kDSsEf,MT/EI,KSmFN,oBACE,UTxDW,KSyDX,YT9Ce,IS+Cf,cTpCS,KSqCT,MT1FQ,QS6FV,2BACE,MT7FQ,QS8FR,YThDiB,ISiDjB,cT1CS,KS2CT,UTrEW,KSyEb,wBACE,aACA,uBACA,ITpDS,ISqDT,cTnDS,KSoDT,eAEA,qCACE,gBACA,WT1GI,QS2GJ,MT9GM,QS+GN,cT7Cc,KS8Cd,UTtFS,KSuFT,YT1Ee,IS+EnB,oBACE,oBACA,mBACA,ITvES,ISwET,MTpIW,QSqIX,YTnFmB,ISoFnB,UTjGW,KSkGX,WThCc,aSkCd,0BACE,IT7EO,IS8EP,MT1IW,QSgJjB,iBP/FE,WFtCM,KEuCN,cFyBkB,KExBlB,QF0Da,KEzDb,WFkDgB,aEhDhB,uBACE,2BACA,WF7BQ,gCSqHZ,iBAEE,kBAEA,4BACE,WACA,YACA,mBPtIF,aACA,uBACA,mBOsIE,UTjHW,KSkHX,WTtIe,kDSuIf,MThJI,KSiJJ,cTlFe,KSqFjB,oBACE,UTzHW,KS0HX,YT/Ge,ISgHf,cTrGS,KSsGT,MT3JQ,QS8JV,mBACE,MT9JQ,QS+JR,YTjHiB,ISkHjB,cT3GS,KS4GT,UTtIW,KS0Ib,8BACE,aACA,sBACA,mBACA,YTpHS,KSqHT,6BAEA,4CACE,UT9IS,KS+IT,YTpIkB,ISqIlB,MTzLS,QS4LX,4CACE,UTzJS,KS0JT,MTpLM,QSqLN,YT9Ie,ISoJrB,cPnJE,WFtCM,KEuCN,cFyBkB,KExBlB,QF0Da,KEzDb,WFkDgB,aEhDhB,oBACE,2BACA,WF7BQ,gCSyKZ,cAEE,aACA,uBACA,IT1IW,KS4IX,4BACE,cACA,WACA,YP5LF,aACA,uBACA,mBO4LE,WT3Le,kDS4Lf,MTrMI,KSsMJ,cTxIe,KSyIf,UT1KW,KS6Kb,+BACE,OAEA,kCACE,UTnLS,KSoLT,YTzKiB,IS0KjB,cT/JO,ISgKP,MTpNM,QSuNR,iCACE,MTvNM,QSwNN,YT1Ke,IS2Kf,UT9LS,KSoMf,kBPvLE,WFtCM,KEuCN,cFyBkB,KExBlB,QF0Da,KEzDb,WFkDgB,aEhDhB,wBACE,2BACA,WF7BQ,gCS6MZ,kBAEE,kBAEA,0BACE,YACA,kBACA,ITlLS,KSmLT,KTnLS,KSoLT,eACA,MTnPW,QSoPX,WACA,YTlMe,ISqMjB,uCACE,kBACA,UACA,UTrNa,KSsNb,YTnMgB,ISoMhB,MTpPQ,QSqPR,cT/LS,KSgMT,kBAGF,sCACE,aACA,mBACA,ITvMS,KSyMT,qDACE,WACA,YACA,cT5LiB,IS6LjB,iBAIA,gEACE,YT9Ne,IS+Nf,MTxQI,QSyQJ,kBAGF,iEACE,UTjPO,KSkPP,MT7QI,QSoRZ,cP5OE,WFtCM,KEuCN,cFyBkB,KExBlB,QF0Da,KEzDb,WFkDgB,aEhDhB,oBACE,2BACA,WF7BQ,gCSkQZ,cAEE,kBACA,kBAEA,uBACE,yBACA,sBAEA,sCACE,kBACA,UACA,SACA,2BACA,iBACA,WTxRa,kDSyRb,MTlSE,KSmSF,cTlOe,KSmOf,UT5QS,KS6QT,YT9Pa,IS+Pb,yBAIJ,8BACE,eTxPS,KSyPT,gCACA,cT1PS,KS4PT,iCACE,UTnRS,KSoRT,YT1Qa,IS2Qb,cTjQO,ISkQP,MTtTM,QSyTR,qCACE,aACA,qBACA,uBACA,IT1QO,IS4QP,+CACE,UTjSO,KSkSP,MThUI,QSmUN,6CACE,UTlSQ,KSmSR,YT3RgB,IEWtB,WF1CiB,kDE2CjB,6BACA,sCACA,qBOiRI,6CACE,UT9SS,KS+ST,MT3UI,QSgVV,gCACE,gBACA,cT7RS,KS+RT,mCACE,cACA,MTtVM,QSuVN,UT5TS,KS6TT,aACA,mBACA,ITvSO,ISySP,2CACE,YACA,MTnWO,QSoWP,YTtTW,ISyTb,4CACE,WAEA,oDACE,YACA,MTtWG,QS4WX,2BACE,gBC1XJ,YACE,cVgEW,KU9DX,kBACE,cACA,UVkCW,KUjCX,YV6CiB,IU5CjB,MVIQ,QUHR,cVuDS,IUrDT,4BACE,MVLU,QUMV,gBAIJ,uBACE,UVqBW,KUpBX,MVNQ,QUOR,WV2CS,IUxCX,wBACE,UVeW,KUdX,MVlBY,QUmBZ,WVqCS,IUpCT,aACA,mBACA,IVkCS,IU7Bb,cACE,WACA,kBACA,UVIe,KUHf,YVHoB,mFUIpB,MV3BU,QU4BV,WVzBM,KU0BN,yBACA,cVkCiB,IUjCjB,WV+DgB,aU7DhB,2BACE,MVhCS,QUmCX,oBACE,aACA,aVhDW,QUiDX,yCAGF,uBACE,WVxCM,QUyCN,MV5CQ,QU6CR,mBAIF,iBACE,iBACA,UVxBW,KU2Bb,iBACE,kBACA,UV3BW,KU+Bb,uBACE,aVlEW,QUoEX,6BACE,0CAIJ,yBACE,aV3EY,QU6EZ,+BACE,0CAMN,sBACE,iBACA,gBAIF,oBACE,gBACA,qKACA,4BACA,sCACA,qBACA,cVnCY,KUuCd,YACE,aACA,mBACA,cV7CW,KU+CX,+DAEE,WACA,YACA,aVpDS,IUqDT,eAGF,kBACE,gBACA,eACA,iBAGF,qBACE,WACA,mBAEA,sDAEE,mBAMN,aACE,aACA,mBACA,IV5EW,KU8EX,qBACE,kBACA,WACA,YACA,WVjIU,QUkIV,cVpEiB,KUqEjB,eACA,WV5Cc,aU8Cd,4BACE,WACA,kBACA,QACA,SACA,WACA,YACA,WVhJE,KUiJF,cV/EiB,IUgFjB,WVvDY,aU0Dd,4BACE,WVlKS,QUoKT,mCACE,2BAOR,aACE,aACA,WAEA,+BACE,kBACA,UV5Ia,KU6Ib,MVzKQ,QU0KR,WVvKM,QUwKN,yBACA,0BACA,kBAGF,2BACE,0BAIA,kDACE,0BACA,+BACA,iBAGF,8CACE,0BAMN,aACE,aACA,qBACA,IVjJW,KUmJX,yBACE,gBRhNA,yBQ0MJ,aAUI,sBACA,oBAEA,yBACE,cV5JO,MUkKb,UACE,aACA,qCACA,IVpKW,KE7DT,yBQ8NJ,UAMI,2BCxOJ,gBACE,eACA,MACA,OACA,QACA,SACA,0BACA,QX2FuB,IW1FvB,UACA,kBACA,WX+FgB,aW7FhB,qBACE,UACA,mBAKJ,OACE,eACA,MACA,OACA,QACA,SACA,QX0Ec,IWzEd,aACA,mBACA,uBACA,QXoCW,KWnCX,UACA,kBACA,WXyEgB,aWvEhB,YACE,UACA,mBAEA,0BACE,mBAMN,cACE,kBACA,WXjCM,KWkCN,cX6BiB,KW5BjB,WXlBU,gCWmBV,gBACA,WACA,gBACA,aACA,sBACA,sBACA,WXiDgB,aW9ChB,uBACE,gBAGF,uBACE,gBAGF,uBACE,iBAGF,+BACE,eACA,gBACA,YACA,SACA,gBAKJ,cACE,QXjBW,KWkBX,gCACA,aACA,mBACA,8BAEA,2BACE,UX9CW,KW+CX,YXtCmB,IWuCnB,MXhFQ,QWiFR,SAGF,2BACE,WACA,YT7EF,aACA,uBACA,mBS6EE,yBACA,YACA,cX1Be,IW2Bf,MX1FQ,QW2FR,UX5DW,KW6DX,eACA,wBAEA,iCACE,WX7FI,QW8FJ,MXlGM,QWwGZ,YACE,QXnDW,KWoDX,OACA,gBACA,MX5GU,QW6GV,YX9DmB,IWkErB,cACE,QX5DW,KW6DX,6BACA,aACA,IXhEW,KWiEX,yBAEA,kCACE,uBAGF,mCACE,8BAMF,2BACE,gBAGF,yBACE,kBACA,QXlFS,KWoFT,qCACE,WACA,YACA,mBTrIJ,aACA,uBACA,mBSqII,UX/GU,KWgHV,cX5EiB,IW8EjB,mDACE,gCACA,MXzJO,QW4JT,mDACE,+BACA,MXhKQ,QWmKV,kDACE,gCACA,MXpKQ,QWuKV,gDACE,+BACA,MX7KO,QWiLX,sCACE,UXzIS,KW0IT,YXjIiB,IWkIjB,cXvHO,IWwHP,MX5KM,QW+KR,wCACE,MX/KM,QYZZ,YACE,aACA,mBACA,IZ4DW,IY3DX,eACA,UZkCa,KYhCb,6BACE,aACA,mBACA,IZqDS,IYpDT,MZCQ,QYCR,+BACE,MZFM,QYGN,WZ0FY,aYxFZ,qCACE,MZhBO,QYoBX,oCACE,MZZM,QYaN,YZ2Be,IYxBjB,qDACE,YACA,MZhBO,QYiBP,YZiCO,IY3Bb,UACE,aACA,IZwBW,IYvBX,gCACA,cZ0BW,KYxBX,oBACE,kBAGF,oBACE,aACA,mBACA,IZcS,IYbT,kBACA,MZvCQ,QYwCR,YZDiB,IYEjB,sCACA,mBACA,WZkDc,aYhDd,0BACE,MZ/CM,QYkDR,2BACE,MZ5DS,QY6DT,oBZ7DS,QYgEX,2BACE,gBACA,WZrDI,QYsDJ,MZzDM,QY0DN,cZSe,KYRf,eACA,YZpBiB,IY0BvB,WACE,aACA,IZjBW,IYkBX,QZnBW,IYoBX,WZnEQ,QYoER,cZPiB,KYSjB,qBACE,iBACA,MZ3EQ,QY4ER,YZrCiB,IYsCjB,cZde,IYef,WZec,aYbd,2BACE,MZlFM,QYmFN,8BAGF,4BACE,WZpFE,KYqFF,MZjGS,QYkGT,WZxEM,0BY+EV,0BACE,cZ1CS,KY4CT,qCACE,UZzES,KY0ET,YZ5DiB,IY6DjB,yBACA,MZtGM,QYuGN,iBACA,qBAIJ,uBACE,gBAEA,iCACE,cZ9DO,IYiET,iCACE,aACA,mBACA,IZlEO,KYmEP,iBACA,MZzHM,QY0HN,cZ1Da,IY2Db,WZ7BY,aY+BZ,2CACE,WACA,YVtHN,aACA,uBACA,mBUsHM,UZnGO,KYoGP,MZjII,QYoIN,uCACE,WZlIE,QYmIF,MZhJO,QYkJP,iDACE,MZnJK,QYuJT,wCACE,WZ1IG,QY2IH,MZzJO,QY0JP,YZzGa,IY2Gb,kDACE,MZ7JK,QYmKX,oCACE,YZnGQ,KYoGR,WZzGO,IY0GP,gBAEA,8CACE,UZpIO,KYqIP,iBAOR,YACE,aACA,mBACA,IZxHW,IY4HP,2CACE,WACA,mBACA,oBAKF,yCACE,WZjMO,QYkMP,MZtLA,KYuLA,aZnMO,QYwMb,uBACE,aACA,mBACA,uBACA,eACA,YACA,cACA,WZnMI,KYoMJ,yBACA,cZxIe,IYyIf,MZzMQ,QY0MR,UZ9KW,KY+KX,YZnKiB,IYoKjB,WZ9Gc,aYgHd,6BACE,WZ3MI,QY4MJ,aZzNS,QY0NT,MZ1NS,QY6NX,kEAEE,UZxLS,KY4Lb,uBACE,cACA,MZ3NQ,QabZ,UACE,eACA,WbaM,KcfR,WACE,kBACA,gBACA,WdqBiB,kDcpBjB,gBCJF,cACE,kBACA,sBACA,6DACA,gBbCE,yBaLJ,cAOI,sBAKJ,eACE,kBACA,MACA,OACA,QACA,SACA,oBAEA,+BACE,kBACA,kBACA,WAEA,yCb4GF,Ma3G4B,Mb4G5B,Oa5G4B,Mb6G5B,WFlIY,QEmIZ,kBACA,WACA,kBa/GI,WACA,abmEJ,yCa/DE,yCbqGF,MapG4B,MbqG5B,OarG4B,MbsG5B,WFjIc,QEkId,kBACA,WACA,kBaxGI,cACA,WACA,iDAIJ,6BACE,kBACA,QACA,SACA,YACA,aACA,uEACA,0BACA,WAKJ,cACE,kBACA,kBACA,UACA,Uf2BoB,Oe1BpB,cACA,eAIF,YACE,oBACA,mBACA,IfFW,IeGX,iBACA,WfrDM,KesDN,yBACA,cfUmB,KeTnB,cfLW,KeMX,UfhCa,KeiCb,YfpBqB,IeqBrB,Mf9DU,QE2FV,mCa1BA,wBACE,UfnCW,KEwDb,6BafF,eACE,UfrCc,KesCd,Yf/BsB,IegCtB,Yf7BkB,Ie8BlB,cftBW,KeuBX,Mf7EU,QE+FV,iCAtGE,yBa+EJ,eASI,Uf/CY,ME3CZ,yBaiFJ,eAaI,UfpDY,MeuDd,mCblCA,WFzCgB,kDE0ChB,6BACA,sCACA,qBaqCF,cACE,UfhEa,KeiEb,YfzDoB,Ie0DpB,YflDmB,IemDnB,cf1CY,Ke2CZ,MflGU,QemGV,iCb3GE,yBaqGJ,cASI,Uf1Ea,Me+EjB,cACE,aACA,IfzDW,Ke0DX,uBACA,cftDY,KeuDZ,gCbxHE,yBamHJ,cAQI,sBACA,oBAGF,mBblGA,oBACA,mBACA,IF4BW,IE3BX,kBACA,cFuCiB,KEtCjB,YFcqB,IEbrB,UFCe,0BECf,WFgEgB,aE/DhB,eACA,YAEA,yBACE,2BawFA,+BACE,WfhHa,kDeiHb,Mf1HE,Ke2HF,Wf5GM,+Be8GN,qCACE,Wf7GI,gCeiHR,iCACE,WfnIE,KeoIF,MfhJS,QeiJT,yBAEA,uCACE,WftIG,QEdP,yBaiIF,mBAwBI,WACA,wBAMN,YACE,aACA,uBACA,IfhGY,KEyCZ,+BA1GE,yBa8JJ,YAOI,sBACA,IfzGS,Me4GX,uBACE,aACA,sBACA,mBAEA,oCACE,UftIU,KeuIV,Yf9HkB,IEWtB,WF1CiB,kDE2CjB,6BACA,sCACA,qBaoHE,mCACE,UflJS,KemJT,Mf9KM,Qe+KN,YfxIe,Ie8IrB,YACE,kBACA,Wf9HY,Ke+HZ,kBAEA,gBACE,eACA,YACA,cf5He,Ke6Hf,Wf3KQ,gCe8KV,6BACE,kBACA,WACA,YACA,MACA,OACA,oBAEA,yEAEE,WACA,kBACA,kBAGF,qCACE,WACA,YACA,WftMU,kDeuMV,UACA,Ub/HJ,6BamIE,oCACE,WACA,YACA,WfhNY,kD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Bb,Mfl3BM,Qem3BN,Yfn0Bc,Ieo0Bd,cf5zBQ,KE7DV,0Bao3BA,kDAQI,Uft1BQ,MExCZ,yBas3BA,kDAYI,Uf31BO,Ke41BP,gBAGF,mEbz0BJ,WF1CiB,kDE2CjB,6BACA,sCACA,qBaw0BM,Yft1BgB,Ie21BtB,gCACE,aACA,qCACA,Ifj1BU,Kek1BV,iBACA,cACA,kBACA,Ubl5BA,0Ba24BF,gCAUI,0BACA,If11BO,Ke21BP,iBbz5BF,yBa64BF,gCAgBI,gBAIJ,8BACE,Wfx5BI,Key5BJ,cf11Be,Ke21Bf,Qfr2BU,Kes2BV,Wf54BQ,+Be64BR,qCACA,kBACA,gBACA,wBAEA,sCACE,WACA,kBACA,SACA,UACA,WACA,YACA,Wf/5Ba,kDeg6Bb,cf12Ba,Ke22Bb,UACA,WACA,4BAGF,oCACE,wCACA,Wfh6BM,gCek6BN,4CACE,UAGF,+CACE,oCACA,Wfh7BW,kDek7BX,iDACE,Mf57BF,Keg8BF,iDb74BJ,WFzCgB,kDE0ChB,6BACA,sCACA,qBa+4BE,yCACE,WACA,YACA,aACA,mBACA,uBACA,Wfz8BK,Qe08BL,cf34Be,Ke44Bf,cf15BO,Ke25BP,gDAEA,2CACE,eACA,Mf99BO,Qe+9BP,0BAKF,yDACE,Ufz7BQ,Ke07BR,Yfl7BgB,Iem7BhB,Mf99BI,Qe+9BJ,cf36BK,Ie46BL,wBACA,cbx+BJ,yBak+BE,yDASI,Ufl8BM,Mes8BR,gFACE,6BAIJ,wDACE,Uf/8BO,Keg9BP,Yft8Be,Ieu8Bf,Mfh/BI,Qei/BJ,cf97BK,Iei8BP,8DACE,Ufz9BO,Ke09BP,Mfr/BI,Qes/BJ,Yfx8Ba,Ie88Bf,sDACE,8BAEA,wDACE,MfxgCI,Qe4gCR,4DACE,6DAKF,sDACE,gCAEA,wDACE,MfnhCK,QeuhCT,4DACE,sGAKF,sDACE,gCAEA,wDACE,MfhiCM,QeoiCV,4DACE,wGbziCJ,yBai6BF,8BA6II,Qfh/BO,Kek/BP,yCACE,WACA,YAEA,2CACE,gBAQV,mBACE,KACE,UACA,2BAEF,GACE,UACA,yBAIJ,aACE,wCC7kCF,sBACE,aACA,iBACA,iBhBYQ,QgBXR,kBAIF,oBAC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nkBS,KgBokBT,YhBzjBiB,IgB0jBjB,MhBnmBM,QgBomBN,chB/iBO,KgBqjBb,kBACE,aACA,sBACA,IhBvjBW,KgB2jBb,iBACE,WhB/mBM,KgBgnBN,chBljBiB,KgBmjBjB,QhB7jBW,KgB8jBX,WhBpmBU,0BgBqmBV,WhBxhBgB,agB0hBhB,uBACE,WhBvmBQ,+BgB0mBV,oBACE,UhB9lBW,KgB+lBX,YhBrlBmB,IgBslBnB,MhB/nBQ,QgBgoBR,chB3kBS,KgB4kBT,ehB7kBS,IgB8kBT,gCAGF,iCACE,UhB1mBW,KgB2mBX,MhBtoBQ,QgBuoBR,YhBzlBiB,IgB2lBjB,qCACE,iBhBvoBI,QgBwoBJ,yBACA,chB7kBa,IgB8kBb,QhBzlBO,KgB0lBP,gBACA,SAEA,0CACE,oCACA,UhBxnBO,KgBynBP,MhBrpBI,QgBspBJ,qBACA,sBAKJ,uCACE,WACA,yBACA,cACA,iBhB7pBE,KgB8pBF,yBACA,chBlmBa,IgBmmBb,gBAEA,6CACE,iBhBjqBG,QgBoqBL,0CACE,gBACA,iBACA,UhBhpBO,KgBipBP,YhBpoBe,IgBqoBf,MhB9qBI,QgB+qBJ,gCACA,sCAEA,2DACE,+BAIJ,0CACE,iBACA,UhB7pBO,KgB8pBP,MhBzrBI,QgB0rBJ,gCAEA,2DACE,+BAIJ,0CACE,WhBrmBU,agBumBV,wDACE,mBAGF,gDACE,sCAIJ,gEACE,sCAOR,gBACE,WACA,yBAEA,mBACE,gCAEA,8BACE,mBAIJ,mBACE,gBACA,iBACA,UhBzsBW,KgB0sBX,YhB7rBmB,IgB8rBnB,MhBvuBQ,QgBwuBR,UACA,iBhBruBM,QgBwuBR,mBACE,iBACA,UhBltBW,KgBmtBX,MhB9uBQ,QgBgvBR,wBACE,qBACA,gBACA,iBhBhvBI,QgBivBJ,chBtrBa,IgBurBb,oCACA,UhB5tBS,KgB6tBT,MhBjwBS,QiBHf,YACE,+BACA,aACA,mBACA,uBACA,4EACA,kBACA,kBACA,gBAGA,oBACE,WACA,kBACA,SACA,WACA,YACA,aACA,2EACA,WACA,kBAGF,mBACE,WACA,kBACA,YACA,UACA,YACA,aACA,4EACA,WACA,kBAIJ,iBACE,WACA,gBACA,cACA,kBACA,UAGF,YACE,wBACA,mBACA,4BACA,kBACA,2BACA,oCAEA,yBARF,YASI,kBACA,oBAIJ,cACE,kBACA,mBAEA,0BACE,oBACA,mBACA,SACA,mBAEA,8BACE,YACA,WAGF,qCACE,eACA,gBACA,0BACA,iBACA,2BACA,mBAIJ,2BACE,eACA,gBACA,uBACA,kBAGF,8BACE,eACA,uBAIJ,YACE,mBAEA,wBACE,mBAEA,mCACE,gBAIJ,wBACE,cACA,eACA,gBACA,uBACA,kBAGF,wBACE,WACA,kBACA,eACA,oCACA,mBACA,wBACA,wBACA,aAEA,qCACE,wBAGF,8BACE,iCACA,yCAGF,8BACE,kCAEA,oCACE,0CAKN,2BACE,aACA,mBACA,QACA,gBAEA,gDACE,WACA,YACA,iCACA,eAGF,iCACE,eACA,uBACA,eACA,iBAKN,cACE,WACA,kBACA,eACA,gBACA,mBACA,mCACA,YACA,mBACA,eACA,wBACA,4BAEA,oBACE,2BACA,4BAGF,qBACE,wBAGF,uBACE,WACA,mBACA,eAIJ,aACE,aACA,uBACA,mBACA,SACA,gBACA,iBACA,wCACA,eAEA,yBAVF,aAWI,SACA,gBACA,kBAGF,eACE,eACA,uBACA,qBACA,0BACA,aACA,mBACA,QAEA,qBACE,0BAGF,iBACE,eAIJ,6BACE,yBACA,eAKJ,aACE,mBACA,kBACA,kBACA,eACA,aACA,mBACA,QAEA,yBACE,gCACA,2BACA,sCAGF,2BACE,gCACA,0BACA,sCAGF,wBACE,+BACA,0BACA,qCAGF,eACE,eAKJ,eACE,kBACA,MACA,OACA,QACA,SACA,8BACA,aACA,mBACA,uBACA,mBACA,WACA,UACA,oBACA,4BAEA,sBACE,UACA,mBAGF,wBACE,WACA,YACA,oCACA,qCACA,kBACA,kCAIJ,gBACE,GACE,0BC5SJ,WACE,UlBkFoB,OkBjFpB,cACA,ehBCE,yBgBJJ,WAMI,gBAKJ,QACE,wBAGF,SACE,yBAGF,gBACE,gCAGF,QACE,wBAGF,eACE,+BAGF,QACE,wBAIF,ahBhBE,aACA,uBACA,mBgBkBF,chBdE,aACA,8BACA,mBgBgBF,aACE,sBAGF,WACE,eAGF,cACE,mBAGF,aACE,uBAGF,WACE,qBAGF,gBACE,uBAGF,eACE,2BAGF,aACE,yBAGF,iBACE,8BAGF,gBACE,6BAIF,QACE,IlBxBW,IkB2Bb,QACE,IlB3BW,IkB8Bb,QACE,IlB9BW,KkBiCb,QACE,IlBjCW,KkBoCb,QACE,IlBpCW,KkBoDX,KACE,oBAGF,MACE,wBAGF,MACE,2BAGF,MACE,yBAGF,MACE,0BAGF,MACE,yBACA,0BAGF,MACE,wBACA,2BA3BF,MACE,sBAGF,OACE,0BAGF,OACE,6BAGF,OACE,2BAGF,OACE,4BAGF,OACE,2BACA,4BAGF,OACE,0BACA,6BA3BF,MACE,sBAGF,OACE,0BAGF,OACE,6BAGF,OACE,2BAGF,OACE,4BAGF,OACE,2BACA,4BAGF,OACE,0BACA,6BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,OACE,uBAGF,QACE,2BAGF,QACE,8BAGF,QACE,4BAGF,QACE,6BAGF,QACE,4BACA,6BAGF,QACE,2BACA,8BA3BF,OACE,uBAGF,QACE,2BAGF,QACE,8BAGF,QACE,4BAGF,QACE,6BAGF,QACE,4BACA,6BAGF,QACE,2BACA,8BA3BF,OACE,uBAGF,QACE,2BAGF,QACE,8BAGF,QACE,4BAGF,QACE,6BAGF,QACE,4BACA,6BAGF,QACE,2BACA,8BA3BF,QACE,uBAGF,SACE,2BAGF,SACE,8BAGF,SACE,4BAGF,SACE,6BAGF,SACE,4BACA,6BAGF,SACE,2BACA,8BAgBF,KACE,qBAGF,MACE,yBAGF,MACE,4BAGF,MACE,0BAGF,MACE,2BAGF,MACE,0BACA,2BAGF,MACE,yBACA,4BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,wBAGF,OACE,4BAGF,OACE,+BAGF,OACE,6BAGF,OACE,8BAGF,OACE,6BACA,8BAGF,OACE,4BACA,+BA3BF,MACE,wBAGF,OACE,4BAGF,OACE,+BAGF,OACE,6BAGF,OACE,8BAGF,OACE,6BACA,8BAGF,OACE,4BACA,+BA3BF,MACE,wBAGF,OACE,4BAGF,OACE,+BAGF,OACE,6BAGF,OACE,8BAGF,OACE,6BACA,8BAGF,OACE,4BACA,+BA3BF,OACE,wBAGF,QACE,4BAGF,QACE,+BAGF,QACE,6BAGF,QACE,8BAGF,QACE,6BACA,8BAGF,QACE,4BACA,+BA3BF,OACE,wBAGF,QACE,4BAGF,QACE,+BAGF,QACE,6BAGF,QACE,8BAGF,QACE,6BACA,8BAGF,QACE,4BACA,+BA3BF,OACE,wBAGF,QACE,4BAGF,QACE,+BAGF,QACE,6BAGF,QACE,8BAGF,QACE,6BACA,8BAGF,QACE,4BACA,+BAKJ,MACE,UAGF,MACE,UAGF,MACE,UAGF,OACE,WAGF,QACE,WAIF,MACE,WAGF,MACE,WAGF,MACE,WAGF,OACE,YAGF,QACE,YAGF,QACE,aAIF,mBACE,kBAGF,mBACE,kBAGF,gBACE,eAGF,iBACE,gBAIF,YACE,WlB/Pa,QkBkQf,cACE,WlBlQe,QkBqQjB,UACE,WlB3PM,KkB8PR,SACE,WlB9PQ,QkBiQV,UACE,WlBjQS,QkBoQX,qBACE,WlB9PiB,kDkBiQnB,oBACE,WlBjQgB,kDkBoQlB,kBACE,WlBpQc,kDkBwQhB,QACE,yBAGF,UACE,uBAGF,YACE,6BAGF,eACE,gCAGF,aACE,8BAGF,cACE,+BAGF,gBACE,alBxTa,QkB4Tf,WACE,gBAGF,YACE,clBzPiB,IkB4PnB,SACE,clB5PiB,IkB+PnB,YACE,clB/PiB,KkBkQnB,YACE,clBlQiB,KkBqQnB,cACE,clBpQmB,KkBuQrB,gBACE,clBvQqB,IkB2QvB,aACE,2BAGF,WACE,WlBpUU,0BkBuUZ,QACE,WlBvUU,+BkB0UZ,WACE,WlB1UU,gCkB6UZ,WACE,WlB7UU,gCkBiVZ,iBACE,gBAGF,eACE,cAGF,mBACE,kBAGF,mBACE,kBAGF,iBACE,gBAGF,iBACE,gBAIF,KACE,UAGF,MACE,WAGF,MACE,WAGF,MACE,WAGF,MACE,WAGF,MACE,WhB1ZE,yBgB+ZF,SACE,yBhB9ZA,0BgBmaF,SACE,yBAKF,yBADF,aAEI,yBhB5aA,yBgBgbJ,cAEI,yBAKJ,gBACE,eAGF,gBACE,eAGF,oBACE,mBAIF,WACE,UAGF,YACE,YAGF,YACE,WAGF,YACE,YAGF,aACE,UAIF,YACE,WlBrXgB,akBwXlB,iBACE,WlBxXgB,ckB2XlB,iBACE,WlB3XgB,akB8XlB,iBACE","file":"main.min.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../sass/base/_reset.scss","../sass/abstracts/_variables.scss","../sass/base/_typography.scss","../sass/abstracts/_mixins.scss","../sass/base/_animations.scss","../sass/layout/_header.scss","../sass/layout/_footer.scss","../sass/layout/_grid.scss","../sass/layout/_container.scss","../sass/components/_buttons.scss","../sass/components/_badges.scss","../sass/components/_cards.scss","../sass/components/_apikey-common.scss","../sass/components/_forms.scss","../sass/components/_modals.scss","../sass/components/_navigation.scss","../sass/components/_partners.scss","../sass/components/_cta.scss","../sass/components/_password-popup.scss","../sass/components/_header-auth.scss","../sass/components/_tables.scss","../sass/components/_accordion.scss","../sass/components/_page-title-banner.scss","../sass/components/_alerts.scss","../sass/pages/_index.scss","../sass/pages/_api-market.scss","../sass/pages/_login.scss","../sass/pages/_account-recovery.scss","../sass/pages/_signup-selection.scss","../sass/pages/_mypage.scss","../sass/pages/_apikey-register.scss","../sass/pages/_apikey-detail.scss","../sass/pages/_apikey-list.scss","../sass/pages/_notice.scss","../sass/pages/_inquiry.scss","../sass/pages/_org-register.scss","../sass/pages/_partnership.scss","../sass/pages/_user-management.scss","../sass/pages/_commission.scss","../sass/pages/_terms-agreements.scss","../sass/base/_utilities.scss"],"names":[],"mappings":"CAIA,EACE,SACA,UACA,sBAGF,KACE,eACA,mCACA,kCACA,kCAGF,KACE,YCmBoB,mFDlBpB,YC0CmB,IDzCnB,MCFU,QDGV,sBACA,kBAIF,MACE,gBAIF,EACE,qBACA,cACA,WC0EgB,aDtElB,IACE,eACA,YACA,cAIF,OACE,oBACA,kBACA,oBACA,eACA,yBACA,YACA,UAIF,sBAGE,oBACA,kBACA,oBACA,YACA,aAIF,MACE,yBACA,iBAIF,kBACE,YClBiB,IDmBjB,YCfkB,IDmBpB,2FAGE,cAIF,YACE,mCACA,MCtEU,QDyEZ,iBACE,mCACA,MC3EU,QCbZ,KACE,UDqCe,KCpCf,YD8CoB,IC7CpB,MDUU,QCNZ,OACE,UDqCc,KCpCd,YD2CsB,IC1CtB,cDqDW,KE3DT,yBDGJ,OAMI,UD8BY,MEzCZ,yBDKJ,OAUI,UDyBY,MCrBhB,OACE,UDsBc,KCrBd,YD4BiB,IC3BjB,cDsCW,KE1DT,yBDiBJ,OAMI,UDeY,MExCZ,yBDmBJ,OAUI,UDUW,MCNf,OACE,UDOc,KCNd,YDciB,ICbjB,cDwBW,KE1DT,yBD+BJ,OAMI,gBAIJ,OACE,UDJc,KCKd,YDGqB,ICFrB,cDaW,ICVb,OACE,UDXa,KCYb,YDHqB,ICIrB,cDOW,ICJb,OACE,UDlBa,KCmBb,YDTqB,ICUrB,cDCW,ICGb,EACE,cDHW,KCIX,YDVmB,ICYnB,aACE,gBAIJ,cACE,MDxEa,QC2Ef,gBACE,MD3Ee,QC8EjB,WACE,MDrEU,QCwEZ,WACE,MDxEU,QC2EZ,YACE,MD3EW,QC8Eb,YACE,MD9EM,KCkFR,WACE,gBAGF,aACE,kBAGF,YACE,iBAIF,cACE,YDhEoB,ICmEtB,aACE,YDnEmB,ICsErB,eACE,YDtEqB,ICyEvB,WACE,YDzEiB,IC4EnB,gBACE,YD5EsB,ICgFxB,SACE,UDjGa,KCoGf,SACE,UDpGa,KCuGf,WACE,UDvGe,KC0GjB,SACE,UDzGa,KC4Gf,SACE,UD5Ga,KCgHf,MACE,UDlHa,KCmHb,YD3GoB,IC4GpB,YDnGkB,ICoGlB,MD/IU,QCkJZ,SACE,UD5Ha,KC6Hb,MDpJU,QCuJZ,MACE,YDrIiB,oCCsIjB,UDlIa,KCmIb,WDvJQ,QCwJR,gBACA,cDlGiB,ICsGnB,EACE,MD7Ka,QC+Kb,QACE,MD/Ka,QCoLjB,WACE,QD1HW,KC2HX,cACA,8BACA,WD1KQ,QC2KR,kBAEA,aACE,gBAKJ,GACE,YACA,6BACA,cEvMF,iBACE,QACE,qCAEF,IACE,2CAKJ,kBACE,QACE,wBAEF,IACE,6BAKJ,uBACE,KACE,UACA,4BAEF,GACE,UACA,yBAKJ,qBACE,KACE,UACA,2BAEF,GACE,UACA,yBAKJ,uBACE,KACE,UACA,4BAEF,GACE,UACA,yBAKJ,wBACE,KACE,UACA,2BAEF,GACE,UACA,yBAKJ,kBACE,KACE,UAEF,GACE,WAKJ,uBACE,KACE,UACA,qBAEF,GACE,UACA,oBAKJ,gBACE,KACE,uBAEF,GACE,0BAKJ,iBACE,GACE,mBAEF,IACE,sBAEF,KACE,oBAKJ,mBACE,GACE,0CAEF,KACE,0CAKJ,gBACE,GACE,uBAEF,IACE,wBAEF,IACE,wBAEF,IACE,wBAEF,IACE,wBAEF,IACE,wBAEF,IACE,uBAEF,KACE,wBAKJ,iBACE,GACE,UACA,qBAEF,IACE,qBAEF,KACE,UACA,oBAKJ,uBACE,KACE,UACA,sBAEF,GACE,UACA,oBAKJ,kBACE,GACE,mBACA,UAEF,KACE,mBACA,WAKJ,yBACE,GACE,2BAEF,IACE,6BAEF,KACE,4BAKJ,eACE,yCAGF,gBACE,6BAGF,cACE,kCAGF,eACE,wCAGF,iBACE,8BAGF,kBACE,iCAGF,oBACE,mCAGF,aACE,2DAIF,SACE,oBAGF,SACE,oBAGF,SACE,oBAGF,SACE,oBAGF,SACE,oBAIF,eACE,uBAGF,iBACE,uBAGF,eACE,sBAGF,iBACE,sBAIF,YACE,8BAEA,kBACE,sBAIJ,YACE,kDAEA,kBACE,2BACA,WHnQQ,gCGuQZ,cACE,8BAEA,oBACE,uBAIJ,aACE,kBACA,gBAEA,qBACE,WACA,kBACA,SACA,UACA,WACA,YACA,wBACA,8BACA,4BAGF,2BACE,yCC5TJ,MAEE,wBACA,0BACA,uBACA,yBACA,yBACA,wBACA,yBAGA,qBACA,qBACA,sBACA,iBACA,mBACA,oBACA,uBAGA,2CACA,gDACA,iDACA,iDAIF,OACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA,SAMF,eACE,eACA,MACA,OACA,QAEA,sBACA,2BACA,mCACA,aACA,aACA,wBACA,6BAGF,gBACE,aACA,mBACA,8BACA,YACA,iBACA,cACA,eACA,gBAQF,aACE,aACA,mBAEA,mBACE,YACA,YAKJ,cACE,aACA,mBACA,SAIF,MACE,aACA,mBACA,SACA,YACA,WAEA,QACE,aACA,mBACA,SACA,YACA,qBAGF,UACE,YACA,YAIJ,WACE,eACA,gBACA,uBACA,qBACA,qBACA,wBAGA,iBACE,0BAGF,mBACE,uBAKJ,+CAGE,qBACA,qBACA,8BAEA,iEACE,sBAGF,2DACE,cAKJ,cACE,aACA,mBACA,SAIF,YACE,WACA,YACA,0BACA,YACA,kBACA,eACA,eACA,uBACA,wBAEA,kBACE,2BACA,0BACA,qBAOJ,gBACE,aACA,mBACA,8BACA,WAEA,yBANF,gBAOI,cAIJ,eACE,aACA,mBACA,8BACA,WAEA,yBANF,eAOI,cAQF,0BACE,YACA,WAIJ,eACE,OACA,kBAEA,6BACE,eACA,gBACA,uBACA,SAKF,+BACE,WACA,YACA,yBACA,YACA,eACA,aACA,sBACA,uBACA,mBACA,QACA,YACA,kBACA,qCAEA,qCACE,0BAGF,+CACE,WACA,WACA,4BACA,wBACA,kBAKE,mEACE,wCAEF,mEACE,UAEF,mEACE,0CAUV,eACE,eACA,MACA,OACA,QACA,SACA,aACA,kBACA,UACA,wBAEA,sBACE,mBACA,UAEA,sCACE,wBAIJ,+BACE,aAGF,+BACE,kBACA,MACA,OACA,QACA,SACA,WACA,YACA,wBACA,2BACA,8BACA,aACA,sBAGF,8BACE,aACA,mBACA,8BACA,aACA,2CACA,wBACA,4BACA,gBAEA,2CACE,aACA,mBACA,SAEA,iDACE,YACA,WAGF,sDACE,eACA,gBACA,0BAIJ,4CACE,WACA,YACA,yBACA,YACA,eACA,aACA,mBACA,uBACA,kBACA,eACA,uBACA,wBAEA,kDACE,wBACA,uBAKN,2BACE,OACA,UACA,gBACA,wBAEA,wCACE,gBACA,SACA,eAEA,2CACE,kBAEA,wDACE,cACA,kBACA,cACA,uBACA,qBACA,eACA,gBACA,mBACA,wBAEA,6HACE,2BACA,0BACA,0BACA,4BAOV,+BACE,aACA,wCACA,wBACA,uCAEA,iDACE,cACA,kBACA,kBACA,uBACA,qBACA,qCACA,mBACA,gBACA,eACA,mBACA,wBAEA,uDACE,2BACA,0BAIJ,kDACE,aACA,mBACA,uBACA,QACA,kBACA,mBACA,qBACA,mBACA,gBACA,eACA,mBACA,wBACA,4BAEA,wDACE,2BACA,4BAIJ,kDACE,aACA,mBACA,uBACA,QACA,WACA,kBACA,0BACA,uBACA,YACA,mBACA,gBACA,eACA,eACA,wBAEA,wDACE,2BACA,0BAMR,gBACE,kBACA,MJhZW,KIiZX,QACA,2BACA,WACA,YACA,yBACA,YACA,eACA,YACA,YAEA,qBACE,cACA,WACA,WACA,WJhdQ,QIidR,kBACA,6BACA,oBAEA,yDAEE,WACA,kBACA,OACA,WACA,WACA,WJ5dM,QI6dN,6BAGF,sCACA,oCAGF,wBACE,yBACA,8DACA,8DAOJ,gBAEE,eACA,MACA,OACA,QACA,SACA,WJlfM,KImfN,QJlac,IImad,YACA,gBACA,gBACA,aACA,sBAKA,4BACE,QJ/cS,KIgdT,WJ9fM,QI+fN,gCAGF,0BACE,gBACA,SACA,UACA,YAEA,oCACE,gCAEA,sCACE,aACA,mBACA,QJheK,KIieL,MJnhBI,QIohBJ,UJ1fO,KI2fP,YJjfa,IIkfb,qBACA,kBAGF,yDACE,WACA,kBACA,MJ3eK,KI4eL,QACA,UACA,WACA,+BACA,gCACA,yCACA,mCAGF,sDACE,2CAGF,8CACE,aACA,gBACA,UACA,SACA,WJ5iBE,QI8iBF,gDACE,cACA,4BACA,MJpjBE,QIqjBF,UJ9hBK,KI+hBL,qBAEA,sDACE,WJvjBJ,KIwjBI,MJtkBG,QI2kBT,uDACE,cAKN,2BACE,kBACA,WJrkBI,KIskBJ,6BACA,gBAQJ,UACE,aACA,gBACA,QACA,SACA,UAGA,aACE,kBAGE,oCACE,2BACA,0BAGF,oCACE,mBACA,UACA,wBAIJ,uBACE,kBACA,qBACA,OACA,gBACA,wBACA,oCACA,cJpjBa,KIqjBb,4BACA,cACA,kBACA,UACA,4BACA,wBACA,QJziBa,II0iBb,gBACA,SAEA,0BACE,SAEA,4BACE,cACA,iBACA,uBACA,qBACA,UJ5mBK,KI6mBL,YJjmBW,IIkmBX,wBAEA,kCACE,2BACA,0BAQZ,UACE,aACA,mBACA,QACA,qBACA,uBACA,gBACA,eACA,iBACA,kBACA,wBAEA,gBACE,0BAIJ,UACE,eAGF,YACE,aACA,mBACA,QACA,qBACA,mBACA,kBACA,mBACA,gBACA,wBACA,4BAEA,kBACE,2BACA,4BAqEJ,KACE,kBAMF,yBACE,eACE,YAEA,0CACE,eACA,YAIJ,KACE,kBAIJ,yBAEI,+BACE,eAKF,iBACE,cASN,kBACE,aACA,mBACA,QACA,gBACA,kBAEA,iCACE,aACA,mBACA,QAEA,4CACE,WACA,YACA,cAGF,4CACE,0CACA,eACA,gBACA,cACA,mBAIJ,2BACE,cACA,uBACA,cAGF,+BACE,0CACA,eACA,gBACA,cACA,qBACA,mBACA,gBACA,YACA,UACA,eACA,0BAEA,qCACE,0BAIJ,mCACE,kBAEA,kDACE,aACA,mBACA,QAGF,yDACE,kBACA,qBACA,QACA,gBACA,wBACA,oCACA,cJxyBa,KIyyBb,4BACA,cACA,kBACA,UACA,4BACA,wBACA,QJ7xBa,II+xBb,2EACE,gBACA,SACA,UAEA,8EACE,SAEA,gFACE,aACA,mBACA,QACA,iBACA,uBACA,qBACA,UJr2BG,KIs2BH,YJ11BS,II21BT,wBAEA,kFACE,eACA,WACA,kBAGF,sFACE,2BACA,0BAOV,gEACE,mBACA,UACA,wBAMN,yBACE,kBACE,cCz6BJ,eACE,gBACA,6BAEA,0BACE,iBACA,cACA,eAIJ,gBACE,aACA,8BACA,mBACA,iBACA,eACA,SHVE,0BGIJ,gBASI,sBACA,uBACA,SACA,gBAKJ,aACE,aACA,sBACA,SAEA,0BACE,YACA,YACA,mBAGF,2BACE,aACA,mBACA,QAEA,wCACE,sCACA,eACA,gBACA,cACA,qBACA,0BAEA,8CACE,cACA,0BAIJ,6CACE,cACA,eACA,iBAIJ,+BACE,sCACA,eACA,gBACA,cACA,SACA,gBAKJ,cACE,aACA,sBACA,SACA,qBHzEE,0BGqEJ,cAOI,uBACA,YAIA,0DACE,YACA,YACA,eACA,sCACA,eACA,gBACA,cACA,gBACA,yBACA,kBACA,eACA,wBACA,gBACA,uQACA,4BACA,sCACA,mBAEA,gEACE,qBAGF,gEACE,aACA,qBACA,uCH3GJ,0BGiFA,0DA8BI,YAKN,8BACE,sCACA,eACA,gBACA,cACA,SACA,gBH1HA,0BGoHF,8BASI,gBAMN,yBACE,gBACE,eACA,SAGF,aACE,SAEA,0BACE,WAGF,2BACE,eACA,QAEA,qFAEE,eAIJ,+BACE,eAIJ,cACE,SAEA,8BACE,gBCzKN,MACE,aACA,IN6DW,KM1DX,aACE,0BAGF,aACE,qCAGF,aACE,qCAGF,aACE,qCAGF,aACE,qCAGF,aACE,qCAGF,cACE,sCAIF,WACE,2DAGF,cACE,2DAGF,cACE,2DAIF,YACE,MAGF,aACE,INSS,IMNX,aACE,INMS,KMHX,aACE,INGS,kBMCT,SJ1DA,0BI+DA,gBACE,0BAGF,gBACE,sCJtEF,yBI2EA,gBACE,0BAGF,gBACE,sCAMN,YACE,mBAGF,YACE,mBAGF,YACE,mBAGF,YACE,mBAGF,YACE,mBAGF,YACE,mBAGF,eACE,iBAGF,YACE,gBAGF,YACE,gBAGF,YACE,gBAIF,UACE,aACA,2DACA,INvEW,KEzDT,0BI6HJ,UAMI,sCJrIA,yBI+HJ,UAUI,2BAKJ,iBACE,aACA,2DACA,INtFW,KE3DT,yBI8IJ,iBAMI,2BAKJ,eACE,aACA,2DACA,IN/FY,KMgGZ,mBJ7JE,yBIyJJ,eAOI,sCAKJ,cACE,aACA,qCACA,IN5GW,KE5DT,yBIqKJ,cAMI,2BAKJ,cACE,aACA,8BACA,INtHY,KMuHZ,kBJlLE,0BI8KJ,cAOI,2BAKJ,aACE,aACA,8BACA,IN/HY,KE9DV,0BI0LJ,aAMI,0BACA,INtIU,MMyIZ,2BACE,aACA,qCACA,IN5IU,KE3DV,0BIoMF,2BAMI,sCJ5MF,yBIsMF,2BAUI,0BACA,mBAMN,cACE,aACA,qCACA,IN/JW,KMgKX,mBJzNE,0BIqNJ,cAOI,0BACA,INnKS,MMwKb,kBACE,aACA,2DACA,IN5KW,KE3DT,yBIoOJ,kBAMI,2BAKJ,YACE,aACA,qCACA,INtLW,KMuLX,kBJjPE,0BI6OJ,YAOI,sCJtPA,yBI+OJ,YAWI,2BAKJ,YACE,aACA,8BACA,INpMY,KMqMZ,mBJjQE,0BI6PJ,YAOI,0BACA,IN3MS,MM8MX,oBACE,cAEA,sBACE,cJ5QF,0BIwQF,oBAQI,eAMN,cACE,aACA,qCACA,IN/NW,KE1DT,0BIsRJ,cAMI,2BClSJ,WACE,UPgFoB,OO/EpB,cACA,eLCE,yBKJJ,WAMI,gBAIF,iBACE,eACA,eAGF,kBACE,gBAGF,gBACE,iBAKJ,SACE,gBLtBE,yBKqBJ,SAII,gBAIF,YACE,eAGF,YACE,gBAGF,gBACE,cAGF,mBACE,iBAMF,iBACE,WPpCM,QOuCR,kBACE,WPvCO,QO0CT,oBACE,MP7CI,KOgDN,iBACE,WPpDQ,QOqDR,MPlDI,KOuDR,gBACE,kBACA,cPNY,KE/DV,yBKmEJ,gBAKI,cPVU,MOaZ,+BACE,oBACA,mBACA,IPtBS,IOuBT,iBACA,WPlEO,QOmEP,MPnFW,QOoFX,cPTiB,KOUjB,UPlDW,KOmDX,YPtCmB,IOuCnB,cP3BS,KO8BX,+BACE,UPlDY,KOmDZ,YP3Ce,IO4Cf,cPjCS,KOkCT,MPnFQ,QETR,yBKwFF,+BAOI,UPzDU,MOgEd,kCACE,UPpEW,KOqEX,MP9FQ,QO+FR,YPrDiB,IOsDjB,gBACA,cL3GA,yBKsGF,kCAQI,UP5EW,MOkFjB,iBACE,kBACA,iBACA,aACA,sBAEA,+BACE,OACA,YP9CY,KOmDhB,cACE,kBACA,gBAIF,eACE,kBACA,UC7IF,KNiCE,oBACA,mBACA,IF0BW,IEzBX,kBACA,cFqCiB,KEpCjB,YFYqB,IEXrB,UFDe,KEEf,qBACA,WF8DgB,aE7DhB,eACA,YAEA,WACE,2BM9CJ,KAEE,kBACA,gBAGA,QACE,iBACA,UR6BW,KQ1Bb,QACE,kBACA,URyBa,KQtBf,QACE,kBACA,URqBW,KQlBb,QACE,kBACA,URiBW,KQbb,aACE,WR1BW,QQ2BX,MRbI,KQcJ,WRHQ,+BQKR,mBACE,2BACA,WRLM,gCQQR,oBACE,2BAIJ,eACE,mBACA,cAEA,qBACE,WR7BK,QQ8BL,2BAIJ,YACE,MRrCI,KQsCJ,WR3BQ,+BQ6BR,kBACE,2BACA,WR7BM,gCQiCV,UACE,MR/CI,KQgDJ,WRrCQ,+BQuCR,gBACE,2BACA,WRvCM,gCQ2CV,aACE,WRlEW,QQmEX,MR1DI,KQ4DJ,mBACE,iDACA,2BAIJ,YACE,WR7EY,QQ8EZ,MRpEI,KQsEJ,kBACE,mBACA,2BAIJ,WACE,yBACA,MR5FW,QQ6FX,+BAEA,iBACE,6BACA,aRjGS,QQqGb,aACE,yBACA,MR5FQ,QQ6FR,yBAEA,mBACE,aR3GS,QQ4GT,MR5GS,QQ6GT,2BAKJ,4BAEE,WACA,mBACA,oBAGF,aACE,oBACA,oBAEA,oBACE,WACA,kBACA,WACA,YNnDJ,kBACA,QACA,SACA,gCMkDI,sBACA,kBACA,+BACA,mCAKJ,UACE,oBACA,mBACA,uBACA,WACA,YACA,UACA,cRtEmB,IQwEnB,iBACE,WACA,YAGF,iBACE,WACA,YAKJ,WACE,WACA,uBAIF,WACE,oBACA,SAEA,gBACE,gBAEA,4BACE,uBRtGW,KQuGX,0BRvGW,KQ0Gb,2BACE,wBR3GW,KQ4GX,2BR5GW,KQmHnB,KACE,eACA,OR/HW,KQgIX,MRhIW,KQiIX,WACA,YAEA,YACA,cRvHqB,IQwHrB,MRtLM,KQuLN,UR9Ja,KQ+Jb,eACA,WR7KU,gCQ8KV,WRnGgB,aQoGhB,QR7Gc,IE1Ed,aACA,uBACA,mBMwLA,WACE,qBACA,WRnLQ,gCQqLR,sBACE,UACA,4BAIJ,gBACE,kBACA,WACA,QACA,2BACA,WRhNQ,QQiNR,MR9MI,KQ+MJ,iBACA,cRvJe,IQwJf,UR5LW,KQ6LX,mBACA,UACA,WR7Hc,aQ8Hd,oBAMF,iBN1MA,oBACA,mBACA,IF0BW,IEzBX,kBACA,cFqCiB,KEpCjB,YFYqB,IEXrB,UFDe,KEEf,qBACA,WF8DgB,aE7DhB,eACA,YAEA,uBACE,2BM6LF,iBAEE,WR7NI,KQ8NJ,MR5OW,QQ6OX,kBACA,URzMW,KQ0MX,WRrNQ,gCQuNR,uBACE,2BACA,WRxNM,gCQ4NV,mBNxNA,oBACA,mBACA,IF0BW,IEzBX,kBACA,cFqCiB,KEpCjB,YFYqB,IEXrB,UFDe,KEEf,qBACA,WF8DgB,aE7DhB,eACA,YAEA,yBACE,2BM2MF,mBAEE,yBACA,MR5OI,KQ6OJ,sBACA,kBACA,URxNW,KQ0NX,yBACE,8BACA,2BAUN,0GAME,kBACA,cR3MiB,IQ4MjB,UR/Oe,KQgPf,YRrOmB,IQsOnB,qBACA,WRjLgB,aQkLhB,oBACA,mBACA,uBACA,IR/NW,IQgOX,eACA,YAEA,yBAnBF,0GAoBI,kBACA,UR7PW,MQgQb,sHACE,eAKJ,oCAGE,MR9RM,KQgSN,gDACE,2BACA,WRvRQ,+BQ0RV,kDACE,wBAKJ,sBACE,WR5SM,KQ6SN,MRhTU,QQiTV,yBAEA,4BACE,WRhTM,QQiTN,aRhUW,QQiUX,MRjUW,QQoUb,6BACE,sBAKJ,iBACE,WR3Ua,QQ4Ub,MR9TM,KQgUN,uBACE,2BACA,WRvTQ,+BQwTR,WRhVa,QQmVf,wBACE,wBAKJ,mBACE,WRvVc,QQwVd,MR9UM,KQgVN,yBACE,2BACA,WRvUQ,+BQwUR,8BAGF,0BACE,wBAMF,qBACE,WR9VI,KQ+VJ,MRlWQ,QQmWR,yBAEA,2BACE,WRlWI,QQmWJ,aRlXS,QQmXT,MRnXS,QQuXb,qBAEE,MR3WI,KQ6WJ,2BACE,2BACA,WRpWM,+BQwWV,uBACE,WR9XY,QQ+XZ,MRrXI,KQuXJ,6BACE,2BACA,WR9WM,+BQoXZ,UACE,iBACA,6BACA,MRhZa,QQiZb,mCACA,cR5UiB,IQ6UjB,URjXa,KQkXb,YRrWmB,IQsWnB,eACA,WRjTgB,aQkThB,oBACA,mBACA,IR/VW,IQiWX,gBACE,6BACA,aR7ZW,QQgab,YACE,eAIJ,YACE,iBAEA,MR1ZM,KQ2ZN,YACA,cRnWiB,IQoWjB,URxYa,KQyYb,YR7XmB,IQ8XnB,eACA,WRzUgB,aQ0UhB,oBACA,mBACA,IRvXW,IQyXX,kBACE,2BACA,WR5ZQ,+BQ+ZV,cACE,eAIJ,YACE,iBACA,WRjbM,KQkbN,MRpbU,QQqbV,yBACA,cR3XiB,IQ4XjB,URhaa,KQiab,YRrZmB,IQsZnB,eACA,WRjWgB,aQkWhB,oBACA,mBACA,IR/YW,IQiZX,kBACE,aR5cW,QQ6cX,MR7cW,QQgdb,cACE,eAQJ,kBACE,cACA,oBACA,mBACA,uBACA,gBACA,YACA,kBACA,YACA,cR1ZiB,KQ2ZjB,UR7ba,KQ8bb,YRnbiB,IQobjB,MRvdM,KQwdN,eACA,WRlYgB,aQmYhB,mBAGA,6BACE,mBAEA,mCACE,iDACA,2BACA,WRxdM,+BQ2dR,oCACE,wBAKJ,2BACE,mBAEA,iCACE,WR7fW,QQ8fX,2BACA,WRveM,+BQ0eR,kCACE,wBAGF,oCACE,WRvfQ,QQwfR,mBACA,eACA,gBAIJ,yBAtDF,kBAuDI,WACA,eACA,YACA,UR/ea,MQufjB,YACE,oBACA,mBACA,uBACA,QACA,YACA,kBACA,yBACA,MRrhBM,KQshBN,YACA,cR7diB,KQ8djB,eACA,YRtfiB,IQufjB,eACA,qCAEA,kBACE,yBNxiBA,0BMuhBJ,YAqBI,eACA,aCnjBJ,cACE,oBACA,mBACA,uBACA,iBACA,cTwEmB,KSvEnB,UT8Ba,KS7Bb,YT2CqB,IS1CrB,mBACA,WT8FgB,aS3FhB,6BACE,gCACA,MTRY,QSWd,+BACE,gCACA,MTZW,QSeb,4BACE,6BACA,MTtBW,QSyBb,8BACE,gCACA,MTfQ,QSkBV,gCACE,+BACA,gCAGF,4BACE,gCACA,MTjCY,QSoCd,6BACE,gCACA,MTrCW,QS0Cf,qBACE,oBACA,mBACA,uBACA,iBACA,cTuBmB,KStBnB,UTnBa,KSoBb,YTNqB,ISOrB,cTKW,KSJX,WT6CgB,aS3ChB,oCACE,gCACA,MTxDY,QS2Dd,sCACE,gCACA,MT5DW,QS+Db,mCACE,6BACA,MTtEW,QSyEb,qCACE,gCACA,MT/DQ,QSkEV,uCACE,+BACA,gCAKJ,UACE,gBACA,eACA,cTlBiB,ISsBnB,UACE,iBACA,UT3Da,KS4Db,cTxBiB,IS4BnB,eACE,yBACA,8BAEA,8BACE,MTpGY,QSqGZ,aTrGY,QSwGd,gCACE,MTxGW,QSyGX,aTzGW,QS4Gb,6BACE,MTlHW,QSmHX,aTnHW,QSsHb,+BACE,MT3GQ,QS4GR,aT5GQ,QSkHV,cACE,aTrES,ISsET,eAKJ,oBACE,oBACA,mBACA,uBACA,eACA,YACA,cACA,WTxIc,QSyId,MT/HM,KSgIN,cTlEqB,ISmErB,eACA,YT/FiB,ISgGjB,cAEA,kCACE,WTpJW,QSuJb,kCACE,WTnJW,QSsJb,kCACE,WTzJY,QS0JZ,MTlJQ,QSqJV,iCACE,WT7JY,QUNhB,MRoDE,WFpCM,KEqCN,cFuBkB,KEtBlB,QFwDa,KEvDb,WFgDgB,aE9ChB,YAEE,WF/BQ,gCU5BZ,MAEE,kBACA,gBAIF,UR6CE,WFpCM,KEqCN,cFuBkB,KEtBlB,QFwDa,KEvDb,WFgDgB,aE9ChB,gBAEE,WF/BQ,gCUrBZ,UAEE,kBACA,yBAEA,gBACE,aVXW,QUgBb,kBACE,aVdY,QUkBd,cACE,aVjBW,QUqBb,qBACE,kBACA,UACA,WACA,iBACA,WV5BY,QU6BZ,MVrBQ,QUsBR,cVyCgB,KUxChB,eACA,YVce,IUbf,yBAEA,yBACE,WVlCS,QUmCT,MV1BE,KU6BJ,0BACE,WVtCU,QUuCV,MV/BE,KUoCN,oBACE,WACA,YACA,mBRnCF,aACA,uBACA,mBQmCE,eACA,WVxCO,QUyCP,MVzDW,QU0DX,cVee,KUdf,WV0Cc,aUvChB,0BACE,qBAEA,MVnDI,KUuDN,oBACE,UVhCW,KUiCX,YVtBe,IUuBf,cVZS,KUaT,MV9DQ,QUiEV,2BACE,MVjEQ,QUkER,YVxBiB,IUyBjB,cVlBS,KUmBT,UV7CW,KUiDb,wBACE,aACA,uBACA,IV5BS,IU6BT,cV3BS,KU4BT,eAEA,qCACE,gBACA,WV9EI,QU+EJ,MVlFM,QUmFN,cVrBc,KUsBd,UV9DS,KU+DT,YVlDe,IUuDnB,oBACE,oBACA,mBACA,IV/CS,IUgDT,MV1GW,QU2GX,YV3DmB,IU4DnB,UVzEW,KU0EX,WVRc,aUUd,0BACE,IVrDO,IUsDP,MVhHW,QUsHjB,iBRrEE,WFpCM,KEqCN,cFuBkB,KEtBlB,QFwDa,KEvDb,WFgDgB,aE9ChB,uBAEE,WF/BQ,gCU6FZ,iBAEE,kBAEA,4BACE,WACA,YACA,mBR5GF,aACA,uBACA,mBQ4GE,UVzFW,KU2FX,MVpHI,KUqHJ,cV1De,KU6DjB,oBACE,UVjGW,KUkGX,YVvFe,IUwFf,cV7ES,KU8ET,MV/HQ,QUkIV,mBACE,MVlIQ,QUmIR,YVzFiB,IU0FjB,cVnFS,KUoFT,UV9GW,KUkHb,8BACE,aACA,sBACA,mBACA,YV5FS,KU6FT,6BAEA,4CACE,UVtHS,KUuHT,YV5GkB,IU6GlB,MV/JS,QUkKX,4CACE,UVjIS,KUkIT,MVxJM,QUyJN,YVtHe,IU4HrB,cRzHE,WFpCM,KEqCN,cFuBkB,KEtBlB,QFwDa,KEvDb,WFgDgB,aE9ChB,oBAEE,WF/BQ,gCUiJZ,cAEE,aACA,uBACA,IVlHW,KUoHX,4BACE,cACA,WACA,YRlKF,aACA,uBACA,mBQmKE,MVzKI,KU0KJ,cVhHe,KUiHf,UVlJW,KUqJb,+BACE,OAEA,kCACE,UV3JS,KU4JT,YVjJiB,IUkJjB,cVvIO,IUwIP,MVxLM,QU2LR,iCACE,MV3LM,QU4LN,YVlJe,IUmJf,UVtKS,KU4Kf,kBR7JE,WFpCM,KEqCN,cFuBkB,KEtBlB,QFwDa,KEvDb,WFgDgB,aE9ChB,wBAEE,WF/BQ,gCUqLZ,kBAEE,kBAEA,0BACE,YACA,kBACA,IV1JS,KU2JT,KV3JS,KU4JT,eACA,MVzNW,QU0NX,WACA,YV1Ke,IU6KjB,uCACE,kBACA,UACA,UV7La,KU8Lb,YV3KgB,IU4KhB,MVxNQ,QUyNR,cVvKS,KUwKT,kBAGF,sCACE,aACA,mBACA,IV/KS,KUiLT,qDACE,WACA,YACA,cVpKiB,IUqKjB,iBAIA,gEACE,YVtMe,IUuMf,MV5OI,QU6OJ,kBAGF,iEACE,UVzNO,KU0NP,MVjPI,QUwPZ,cRlNE,WFpCM,KEqCN,cFuBkB,KEtBlB,QFwDa,KEvDb,WFgDgB,aE9ChB,oBAEE,WF/BQ,gCU0OZ,cAEE,kBACA,kBAEA,uBACE,yBACA,sBAEA,sCACE,kBACA,UACA,SACA,2BACA,iBAEA,MVtQE,KUuQF,cV1Me,KU2Mf,UVpPS,KUqPT,YVtOa,IUuOb,yBAIJ,8BACE,eVhOS,KUiOT,gCACA,cVlOS,KUoOT,iCACE,UV3PS,KU4PT,YVlPa,IUmPb,cVzOO,IU0OP,MV1RM,QU6RR,qCACE,aACA,qBACA,uBACA,IVlPO,IUoPP,+CACE,UVzQO,KU0QP,MVpSI,QUuSN,6CACE,UV1QQ,KU2QR,YVnQgB,IUsQlB,6CACE,UVrRS,KUsRT,MV9SI,QUmTV,gCACE,gBACA,cVpQS,KUsQT,mCACE,cACA,MVzTM,QU0TN,UVnSS,KUoST,aACA,mBACA,IV9QO,IUgRP,2CACE,YACA,MVxUO,QUyUP,YV7RW,IUgSb,4CACE,WAEA,oDACE,YACA,MVzUG,QU+UX,2BACE,gBChVJ,wHACE,UXiEoB,OWhEpB,cACA,uBTdE,yBSWJ,wHAMI,wBAOJ,kFACE,iBAxBgB,QAyBhB,cX4CiB,KW3CjB,kBT3BE,yBSwBJ,kFAMI,QX6BS,MWtBb,8DACE,iBArCgB,QAsChB,cX+BiB,KW9BjB,kBACA,mBTzCE,yBSqCJ,8DAOI,mBAGF,wGACE,YXpBkB,mFWqBlB,eACA,YXHe,IWIf,MX1CQ,QW2CR,STpDA,yBS+CF,wGAQI,gBAIJ,iHACE,eACA,YXjBkB,IWkBlB,cT9DA,yBS2DF,iHAMI,gBAQN,qDACE,oBACA,mBACA,uBACA,iBACA,mBACA,YXnDoB,mFWoDpB,eACA,YXlCiB,IWmCjB,MXtEM,KWuEN,mBAEA,kGACE,yBAGF,oMAEE,iBAzFkB,QA4FpB,qGACE,yBAGF,0MAEE,yBAKA,yIACE,yBACA,cAGF,kRAEE,yBACA,cAGF,wRAEE,yBACA,cAQN,2CACE,oBACA,mBACA,IXzEW,IW0EX,iBACA,cX7DiB,KW8DjB,UXpGa,KWqGb,YXxFqB,IW0FrB,mEACE,UACA,WACA,cXjEmB,IWkEnB,8BAGF,uEACE,yBACA,cAGF,2EACE,yBACA,cAOJ,sDACE,YACA,aAEA,8EACE,WACA,YTnKA,yBSiKF,8EAKI,WACA,aAIJ,8EACE,YACA,aAIJ,kEACE,WACA,YACA,iBACA,cX/GiB,KWgHjB,yBAGF,oFACE,WACA,YACA,aACA,mBACA,uBACA,yBACA,cX1HiB,KW2HjB,cACA,eAEA,6EACE,eAOJ,kEACE,aACA,sBACA,mBACA,uBACA,kBACA,kBAEA,kHACE,eACA,cX3JS,KW4JT,WAGF,8EACE,YX/LkB,mFWgMlB,UXvLW,KWwLX,YX9Ke,IW+Kf,MXrNQ,QWsNR,gBAGF,0EACE,YXvMkB,mFWwMlB,UXlMa,KWmMb,MAjOoB,QAkOpB,SAOJ,+CACE,oBACA,mBACA,uBACA,YACA,YACA,YACA,cX9KiB,KW+KjB,YXzNoB,mFW0NpB,eACA,YXxMiB,IWyMjB,eACA,qBACA,wDAEA,iEACE,2BAGF,oEACE,wBAGF,mFACE,iBAnQkB,QAoQlB,MX1PI,KW4PJ,qGACE,yBAIJ,yFACE,yBACA,cAEA,2GACE,yBAIJ,gFACE,iBApRoB,QAqRpB,MX5QI,KW8QJ,kGACE,yBT3RF,yBS6OJ,+CAmDI,WACA,gBACA,YACA,UXjQa,MWwQjB,2BACE,oBACA,mBACA,IXrPW,IWsPX,iBACA,WXnSM,KWoSN,yBACA,cX7OiB,IW8OjB,UXjRa,KWkRb,MX1SU,QW2SV,eACA,WXlNgB,aWoNhB,mCACE,WACA,YAGF,uCACE,WX/TW,QWgUX,aXhUW,QWiUX,MXnTI,KWsTN,yBAxBF,2BAyBI,mBACA,wBAOJ,uCACE,WXhUM,KWiUN,cXvQiB,KWwQjB,QX/QY,KWgRZ,cXpRW,KWqRX,WXzTU,+BW2TV,yBAPF,uCAQI,QXvRS,MW0RX,qEACE,UXlTW,KWmTX,YXzSe,IW0Sf,MXhVQ,QWiVR,cX/RS,KWgST,eXjSS,KWwSb,iCACE,aACA,qCACA,IX1SW,KW4SX,yBALF,iCAMI,2BAIJ,iCACE,aACA,sBACA,IXtTW,IWwTX,uDACE,iBAGF,6DACE,UXrVW,KWsVX,YXzUmB,IW0UnB,MX9WQ,QWiXV,6DACE,UX1Va,KW2Vb,MXpXQ,QWqXR,sBAOJ,yBACE,aACA,eACA,IX/UW,IWkVb,uBACE,qBACA,iBACA,iBXhYS,QWiYT,MXhZe,QWiZf,cX5UiB,IW6UjB,UXhXa,KWiXb,YXrXiB,oCW2XnB,yCACE,qBACA,iBACA,iBX9YQ,QW+YR,yBACA,cXzViB,IW0VjB,YXjYiB,oCWkYjB,UX9Xa,KW+Xb,MXjae,QWuajB,+BACE,aACA,mBACA,IX/WW,KWiXX,yBALF,+BAMI,sBACA,wBAOJ,kCACE,aACA,sBACA,IX9XW,IWiYb,gCACE,aACA,mBACA,IXnYW,KWoYX,kBACA,WXnbM,KWobN,yBACA,cX5XiB,IW6XjB,mBAEA,4CACE,aXvcW,QWwcX,WXhbQ,0BWmbV,yBAfF,gCAgBI,QXhZS,KWiZT,IXlZS,KWqZX,wDACE,qBACA,iBACA,cX7Ye,IW8Yf,UXjbW,KWkbX,YXpae,IWqaf,YXvbe,oCWwbf,eACA,kBAEA,8EACE,yBACA,cAGF,gFACE,yBACA,cAGF,8EACE,yBACA,cAGF,oFACE,yBACA,cAGF,kFACE,iBX9dQ,QW+dR,MXreM,QWyeV,oDACE,OACA,UXlda,KWmdb,YXxciB,IWycjB,MX7eQ,QW8eR,SAGF,wDACE,iBACA,cXtbe,KWubf,UX5dW,KW6dX,YXhdmB,IWkdnB,sFACE,yBACA,cAGF,oFACE,yBACA,cAQN,qCACE,aACA,uBACA,IXxdW,KWydX,eACA,WXrdY,KWsdZ,YXtdY,KWudZ,6BAEA,yBATF,qCAUI,sBACA,qBAIA,yBADF,+CAEI,YCniBN,YACE,cZ8DW,KY5DX,kBACE,cACA,UZgCW,KY/BX,YZ2CiB,IY1CjB,MZMQ,QYLR,cZqDS,IYnDT,4BACE,MZLU,QYMV,gBAIJ,uBACE,UZmBW,KYlBX,MZJQ,QYKR,WZyCS,IYtCX,wBACE,UZaW,KYZX,MZlBY,QYmBZ,WZmCS,IYlCT,aACA,mBACA,IZgCS,IY3Bb,cACE,WACA,kBACA,UZEe,KYDf,YZLoB,mFYMpB,MZzBU,QY0BV,WZvBM,KYwBN,yBACA,cZgCiB,IY/BjB,WZ6DgB,aY3DhB,2BACE,MZ9BS,QYiCX,oBACE,aACA,aZhDW,QYiDX,uCAGF,uBACE,WZtCM,QYuCN,MZ1CQ,QY2CR,mBAIF,iBACE,iBACA,UZ1BW,KY6Bb,iBACE,kBACA,UZ7BW,KYiCb,uBACE,aZlEW,QYoEX,6BACE,0CAIJ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+BACE,kBACA,uBAEA,gDACE,kBACA,OACA,oBACA,mBACA,uBACA,QACA,YACA,QZ7jBO,IY8jBP,mBACA,cZljBa,KYmjBb,cACA,UZxlBW,KYylBX,YZ/kBgB,IYglBhB,qBACA,eACA,WZ3hBY,aY6hBZ,sDACE,6DAGF,oDACE,WACA,YACA,mBVvoBJ,yBU8mBA,gDA6BI,gBACA,WACA,SAIJ,qDACE,aACA,IZzlBO,KE1DT,yBUipBA,qDAKI,8BACA,WACA,IZ/lBK,KEzDT,yBU0mBF,+BAmDI,sBACA,IZpmBO,Ma5Db,gBACE,eACA,MACA,OACA,QACA,SACA,0BACA,QbuFuB,IatFvB,UACA,kBACA,Wb2FgB,aazFhB,qBACE,UACA,mBAKJ,OACE,eACA,MACA,OACA,WACA,aACA,aACA,aACA,mBACA,uBACA,QbgCW,Ka/BX,UACA,kBACA,gDACA,oBACA,gBAEA,YACE,UACA,mBACA,oBAEA,0BACE,mBAKJ,yBA5BF,OA6BI,QbYS,MaPb,iBACE,kBACA,gBACA,WAIA,0BACE,gBAGF,0BACE,iBAGF,0BACE,iBAGF,yBAnBF,iBAoBI,gBAKJ,aACE,kBACA,MACA,QACA,iCACA,WACA,YACA,mBACA,YACA,kBACA,Mb1EM,Ka2EN,eACA,aACA,mBACA,uBACA,QbEc,IaDd,WbOgB,aaNhB,WbrEU,gCauEV,iBACE,WACA,YAGF,eACE,eAGF,yBA5BF,aA6BI,WACA,YAEA,iBACE,WACA,YAGF,eACE,gBAMN,cACE,iBACA,kBACA,Wb/GM,KagHN,cbtDiB,KauDjB,sCACA,gBACA,wBACA,gBACA,aACA,sBACA,sBACA,8BACA,QbxCc,IayCd,iBACA,kBAEA,+BACE,eACA,gBACA,YACA,SACA,gBAKJ,cACE,uBACA,mBACA,mBACA,aACA,mBACA,8BACA,uBbpFiB,KaqFjB,wBbrFiB,KauFjB,2BACE,UbzHW,Ka0HX,YbjHmB,IakHnB,cACA,SAGF,yBAjBF,cAkBI,uBAEA,2BACE,gBAMN,YACE,kBACA,OACA,gBACA,cACA,eACA,YbhImB,IakInB,cACE,SAEA,gBACE,WbhIO,KaqIX,wBACE,kBAGF,yBArBF,YAsBI,kBACA,gBAKJ,cACE,uBACA,aACA,SACA,uBACA,gBAEA,+BACE,yBAGF,mCACE,8BAIF,gCACE,gBACA,YACA,kBACA,WblNI,KamNJ,yBACA,mBACA,eACA,YbnLe,IaoLf,cACA,eACA,WblIc,aaoId,sCACE,mBACA,oBAGF,uCACE,sBAKJ,iCACE,gBACA,YACA,kBACA,mBACA,YACA,mBACA,eACA,Yb3Me,Ia4Mf,Mb/OI,KagPJ,eACA,Wb1Jc,aa4Jd,uCACE,mBAGF,wCACE,sBAIJ,yBA9DF,cA+DI,uBACA,sBAEA,iEAEE,WACA,YACA,gBAOJ,8BACE,gBAGF,yBACE,kBACA,kBAEA,qCACE,WACA,YACA,mBXlRJ,aACA,uBACA,mBWkRI,Ub9PU,Ka+PV,cb3NiB,Ia6NjB,mDACE,gCACA,MbtSO,QayST,mDACE,+BACA,Mb7SQ,QagTV,kDACE,gCACA,MbjTQ,QaoTV,gDACE,6BACA,Mb1TO,Qa8TX,sCACE,UbxRS,KayRT,YbhRiB,IaiRjB,cbtQO,IauQP,MbvTM,Qa0TR,wCACE,Mb1TM,Qa2TN,UbnSW,KctCjB,YACE,aACA,mBACA,Id0DW,IczDX,eACA,UdgCa,Kc9Bb,6BACE,aACA,mBACA,IdmDS,IclDT,MdGQ,QcDR,+BACE,cACA,WdwFY,actFZ,qCACE,MdhBO,QcoBX,oCACE,MdVM,QcWN,YdyBe,IctBjB,qDACE,YACA,MddO,QceP,Yd+BO,IczBb,UACE,aACA,IdsBW,IcrBX,gCACA,cdwBW,KctBX,oBACE,kBAGF,oBACE,aACA,mBACA,IdYS,IcXT,kBACA,MdrCQ,QcsCR,YdHiB,IcIjB,sCACA,mBACA,WdgDc,ac9Cd,0BACE,Md7CM,QcgDR,2BACE,Md5DS,Qc6DT,oBd7DS,QcgEX,2BACE,gBACA,WdnDI,QcoDJ,MdvDM,QcwDN,cdOe,KcNf,eACA,YdtBiB,Ic4BvB,WACE,aACA,IdnBW,IcoBX,QdrBW,IcsBX,WdjEQ,QckER,cdTiB,KcWjB,qBACE,iBACA,MdzEQ,Qc0ER,YdvCiB,IcwCjB,cdhBe,IciBf,Wdac,acXd,2BACE,MdhFM,QciFN,8BAGF,4BACE,WdlFE,KcmFF,MdjGS,QckGT,Wd1EM,0BciFV,0BACE,cd5CS,Kc8CT,qCACE,Ud3ES,Kc4ET,Yd9DiB,Ic+DjB,yBACA,MdpGM,QcqGN,iBACA,qBAIJ,uBACE,gBAEA,iCACE,cdhEO,IcmET,iCACE,aACA,mBACA,IdpEO,KcqEP,iBACA,MdvHM,QcwHN,cd5Da,Ic6Db,Wd/BY,aciCZ,2CACE,WACA,YZtHN,aACA,uBACA,mBYsHM,UdrGO,KcsGP,Md/HI,QckIN,uCACE,WdhIE,QciIF,MdhJO,QckJP,iDACE,MdnJK,QcuJT,wCACE,WdxIG,QcyIH,MdzJO,Qc0JP,Yd3Ga,Ic6Gb,kDACE,Md7JK,QcmKX,oCACE,YdrGQ,KcsGR,Wd3GO,Ic4GP,gBAEA,8CACE,UdtIO,KcuIP,iBAOR,YACE,aACA,mBACA,Id1HW,Ic8HP,2CACE,WACA,mBACA,oBAKF,yCACE,WdjMO,QckMP,MdpLA,KcqLA,adnMO,QcwMb,uBACE,aACA,mBACA,uBACA,eACA,YACA,cACA,WdjMI,KckMJ,yBACA,cd1Ie,Ic2If,MdvMQ,QcwMR,UdhLW,KciLX,YdrKiB,IcsKjB,WdhHc,ackHd,6BACE,WdzMI,Qc0MJ,adzNS,Qc0NT,Md1NS,Qc6NX,kEAEE,Ud1LS,Kc8Lb,uBACE,cACA,MdzNQ,QefZ,UACE,eACA,WfeM,KgBjBR,WACE,kBACA,gBAEA,kDCCE,gBAIF,qCACE,gBACA,SAGF,qCACE,WACA,kBACA,yBACA,cjBwDe,IiBvDf,UjBmBW,KiBlBX,YjBakB,mFiBZlB,wBACA,sBAEA,2CACE,aACA,ajBvBS,QiBwBT,uCAGF,kDACE,MjBfO,QiBmBT,2CACE,ajB7BU,QiB+BV,iDACE,ajBhCQ,QiBiCR,0CAKN,mCACE,MjBvCY,QiBwCZ,UjBVW,KiBWX,WjBaS,IiBZT,aACA,8BAEA,wCACE,cAMN,sBACE,KACE,UACA,4BAEF,GACE,UACA,yBC9DJ,YACE,aACA,mBACA,IlBwDW,KkBtDX,0BACE,MAOJ,WACE,oBACA,mBACA,kBACA,MlBPU,QkBQV,qBACA,yBACA,clBsDmB,KkBrDnB,YlB0BqB,IkBzBrB,UlBYa,KkBXb,WlB6EgB,akB1EhB,eACE,oBACA,mBACA,uBACA,QACA,iBACA,cACA,qBACA,yBACA,kBACA,kHACA,YlBWe,IkBVf,UlBHa,KkBIb,yBACA,WlB4Dc,akB1Dd,0BACE,WACA,YACA,cAQN,uBACE,kBAEA,yCACE,aACA,mBACA,IlBDS,IkBET,kBACA,WlB9CO,QkB+CP,+BACA,clBWiB,KkBVjB,eACA,WlBmCc,akBlCd,YlBrCkB,mFkBsClB,UlBjCW,KkBmCX,oDACE,MlB5DM,QkB6DN,YlBxBiB,IkB2BnB,2CACE,MlBhEM,QkBiEN,eACA,mCAGF,+CACE,WlBpEE,KkBqEF,alBnFS,QkBoFT,WlB3DM,+BkB6DN,0DACE,MlBvFO,QkB0FT,iDACE,MlB3FO,QkBiGX,kDACE,yBAGF,qDACE,mBACA,UACA,wBAIJ,8CACE,kBACA,sBACA,QACA,YACA,WlBnGI,KkBoGJ,yBACA,clB3Ce,KkB4Cf,WlBzFQ,gCkB0FR,kBACA,UACA,4BACA,4BACA,QlB/Be,IkBgCf,gBAGF,uCACE,QlBjES,KkBmET,MlBlHI,KkBmHJ,kBAEA,sDACE,iBACA,UlBhGS,KkBiGT,YlBrFa,IkBwFf,qDACE,UlBxGS,KkByGT,WAIJ,0CACE,gBACA,SACA,cAEA,6CACE,SAEA,+CACE,aACA,mBACA,SACA,kBACA,MlBjJI,QkBkJJ,qBACA,UlB3HO,KkB4HP,WlBzDU,ckB2DV,iDACE,WACA,MlBvJE,QkBwJF,eAGF,qDACE,WlBxJC,QkByJD,MlBzKK,QkB2KL,uDACE,MlB5KG,QkBmLb,uCACE,sBACA,6BAEA,mDACE,aACA,mBACA,uBACA,IlBhIO,IkBiIP,WACA,aACA,WlB/KI,QkBgLJ,MlBpLM,QkBqLN,qBACA,clB1Ha,IkB2Hb,YlBlJiB,IkBmJjB,UlBhKS,KkBiKT,WlB/FY,akBiGZ,qDACE,eAGF,yDACE,WlBvMQ,QkBwMR,MlB9LA,KkB+LA,2BACA,WlBrLI,+BkB8LZ,kBACE,QlB3JW,KkB6JX,2CAEA,kCACE,aACA,mBACA,IlBnKS,KkBqKT,kDACE,WACA,YACA,aACA,mBACA,uBACA,8BACA,clB5JiB,IkB6JjB,MlB3NE,KkB6NF,oDACE,eAIJ,gDACE,OACA,MlBpOE,KkBsOF,8DACE,iBACA,UlBjNO,KkBkNP,YlBtMW,IkByMb,kEACE,UlBzNO,KkB0NP,WASR,mBACE,aACA,mBACA,uBACA,IlB9MW,IkB+MX,WACA,kBACA,WlBxQc,QkByQd,MlB/PM,KkBgQN,qBACA,clBvMiB,KkBwMjB,YlBhOqB,IkBiOrB,UlB7Oe,KkB8Of,WlB7KgB,akB8KhB,WlB1PU,+BkB4PV,qBACE,eAGF,yBACE,mBACA,2BACA,WlBlQQ,gCkByQZ,yBAEI,8CACE,YACA,aAKN,yBAEI,yCACE,iBAEA,oDACE,gBACA,gBACA,uBACA,mBAIJ,8CACE,YACA,aC7TN,YACE,WACA,WnBcM,KmBbN,cnBuEiB,KmBtEjB,gBACA,WnBqBU,0BmBlBV,oBACE,gBACA,cnBsDS,KmBpDT,yBAJF,oBAKI,cnB6Da,KmB5Db,WnBYM,2BmBRV,kBACE,WACA,yBAEA,wBACE,WnBLK,QmBOL,2BACE,gCAGF,2BACE,kBACA,gBACA,UnBKO,KmBJP,YnBiBe,ImBhBf,MnBrBI,QmBsBJ,mBAEA,yBARF,2BASI,iBACA,UnBHK,MmBST,2BACE,gCACA,WnBwDU,amBtDV,sCACE,mBAGF,iCACE,oCAIJ,2BACE,kBACA,UnBvBO,KmBwBP,MnB/CI,QmBiDJ,yBALF,2BAMI,iBACA,UnB7BK,MmBgCP,6BACE,MnBxDE,QmByDF,qBACA,WnBgCQ,amB9BR,mCACE,MnBxEG,QmBiFf,cACE,WACA,WnBrEM,KmBsEN,cnBZiB,KmBajB,gBACA,WnB9DU,0BmBgEV,sBACE,gBAEA,yBAHF,sBAII,gBACA,iBAKJ,4BACE,aACA,qCACA,InBzCS,KmB0CT,kBACA,WnBvFO,QmBwFP,gCACA,UnBtEW,KmBuEX,YnB1DmB,ImB2DnB,MnBhGQ,QmBkGR,0BAXF,4BAYI,qCACA,iBACA,UnB9ES,MmBiFX,yBAjBF,4BAkBI,cAGF,qCACE,kBAGF,uCACE,gBAGF,sCACE,kBAKJ,yBACE,aACA,qCACA,InB5ES,KmB6ET,QnB5ES,KmB6ET,gCACA,WnBtCc,amBuCd,eAEA,0BATF,yBAUI,qCACA,QnBpFO,MmBuFT,yBAdF,yBAeI,0BACA,InB1FO,ImB2FP,QnB1FO,MmB6FT,oCACE,mBAGF,+BACE,oCAGF,kCACE,aACA,mBACA,uBACA,UnBlIS,KmBmIT,MnB1JM,QmB2JN,YnBxHe,ImB0Hf,yBARF,kCASI,cAIJ,oCACE,aACA,mBACA,UnB7IW,KmB8IX,MnBvKM,QmBwKN,YnBpIe,ImBsIf,yBAPF,oCAQI,UnBnJO,MmBsJT,sCACE,cACA,qBACA,aACA,mBACA,InBnIK,ImBoIL,WnB1FU,amB4FV,4CACE,MnBlMK,QmBsMT,+CACE,oBACA,mBACA,YnB9IK,ImB+IL,WAEA,mDACE,WACA,YAKN,mCACE,aACA,mBACA,uBACA,UnBpLS,KmBqLT,MnB3MO,QmB6MP,yBAPF,mCAQI,2BACA,UnB1LO,KmB2LP,YnBnKK,KmByKX,yBACE,2CACE,gBACA,MnB1NM,QmB2NN,anB7KO,KmBmLb,aACE,kBACA,kBACA,WnBlOM,KmBmON,cnBzKiB,KmB2KjB,yBACE,cnBvLS,KmByLT,6BACE,gBACA,WAEA,yBAJF,6BAKI,iBAKN,yBACE,UnB7Na,KmB8Nb,MnBtPQ,QmBwPR,yBAJF,yBAKI,UnBlOS,MmBwOf,gBACE,aACA,8BACA,mBACA,cnBjNW,KmBkNX,InBnNW,KmBqNX,yBAPF,gBAQI,sBACA,oBACA,InBzNS,MmB4NX,6BACE,UnBtPW,KmBuPX,MnB9QQ,QmBgRR,oCACE,MnB7RS,QmB8RT,YnB9OiB,ImBiPnB,yBATF,6BAUI,QACA,mBAIJ,4BACE,aACA,InB9OS,ImBgPT,yBAJF,4BAKI,SAGF,kCACE,OACA,gBACA,iBACA,yBACA,cnB7Oa,ImB8Ob,UnBlRS,KmBmRT,WnBjNY,amBmNZ,yBATF,kCAUI,gBAGF,wCACE,aACA,anB9TO,QmB+TP,uCAGF,+CACE,MnBtTK,QoBfb,eACE,WpBeM,KoBdN,cpBwEiB,KoBvEjB,WpBuBU,0BoBtBV,gBAEA,yBACE,gCACA,WpB+Fc,aoB7Fd,oCACE,mBAGF,gCACE,8BAEA,8CACE,MpBhBO,QoBmBP,wDACE,yBACA,MpBrBK,QoB2Bb,6BACE,aACA,mBACA,8BACA,kBACA,UpBIa,KoBHb,YpBciB,IoBbjB,MpBvBQ,QoBwBR,eACA,WpBiEc,aoBhEd,kBACA,IpBsBS,KoBpBT,yBAbF,6BAcI,kBACA,UpBPS,MoBUX,qCACE,YACA,kBACA,KpBcO,KoBbP,QACA,2BACA,WACA,YACA,aACA,mBACA,uBACA,WpBxCK,QoByCL,MpBzDS,QoB0DT,cpBkBiB,IoBjBjB,UpBxBS,KoByBT,YpBXa,IoBYb,WpBwCY,aoBtCZ,yBAlBF,qCAmBI,WACA,YACA,UpBhCO,MoBoCX,mCACE,8BACA,MpBxES,QoB2EX,gDACE,OACA,kBACA,YpBxBe,IoB0Bf,yBALF,gDAMI,mBAIJ,uCACE,cACA,eACA,MpB5EM,QoB6EN,WpBYY,aoBVZ,yBANF,uCAOI,gBAKN,2BACE,aACA,oBACA,iBACA,apBvCS,KoBwCT,kBAEA,yBAPF,2BAQI,oBACA,iBACA,apB9CO,MoBiDT,mCACE,YACA,kBACA,WACA,QACA,WACA,YACA,aACA,mBACA,uBACA,WpBxHS,QoByHT,MpB3GE,KoB4GF,cpB9CiB,IoB+CjB,UpBxFS,KoByFT,YpB3Ea,IoB6Eb,yBAhBF,mCAiBI,WACA,WACA,YACA,UpBhGO,MoBoGX,gCACE,cACA,6BAGF,+CACE,eACA,UpB1GS,KoB2GT,MpBlIM,QoBmIN,YpBxFc,IoB0Fd,yBANF,+CAOI,UpBhHO,KoBiHP,eAIF,iDACE,cpB5FK,KoB8FL,4DACE,gBAIJ,oGACE,aACA,apBpGK,KoBuGP,kDACE,cpB3GK,IoB8GP,iDACE,MpBzKO,QoB0KP,0BAEA,uDACE,MpB5KO,QoBgLX,oDACE,WpBnKE,QoBoKF,gBACA,cpB9GW,IoB+GX,YpBtJW,oCoBuJX,eACA,MpBvLO,QoB0LT,mDACE,WpB5KE,QoB6KF,yBACA,cpBtHW,IoBuHX,QpBlIK,KoBmIL,gBACA,cAEA,wDACE,yBACA,UACA,MpB1LE,QoBkMZ,UACE,+BACA,WpBhMQ,QoBiMR,kBAEA,yBALF,UAMI,mBAIJ,eACE,UpBzIoB,OoB0IpB,cAGF,YACE,cpB7JY,KoB+JZ,yBAHF,YAII,cpBjKU,MoBoKZ,wBACE,UpB3LY,KoB4LZ,YpBpLe,IoBqLf,MpB3NQ,QoB4NR,cpB3KS,KoB6KT,6BACA,sCACA,qBAEA,yBAVF,wBAWI,UpBtMU,MoB0Md,8BACE,UpB/Ma,KoBgNb,MpBxOQ,QoByOR,YpB/LiB,IoBiMjB,yBALF,8BAMI,UpBrNS,MoB2Nf,qBACE,KACE,UACA,4BAEF,GACE,UACA,yBAKJ,WACE,WpB7PM,KoB8PN,cpBpMiB,KoBqMjB,WpBrPU,0BoBsPV,gBAEA,2BACE,gCAEA,sCACE,mBAIA,oDACE,8BACA,MpB1RO,QoB4RP,oEACE,yBAMR,6BACE,aACA,mBACA,8BACA,kBACA,UpBpQa,KoBqQb,YpB1PiB,IoB2PjB,MpB/RQ,QoBgSR,eACA,WpBvMc,aoByMd,yBAXF,6BAYI,kBACA,UpB7QS,MoBgRX,mCACE,8BAGF,8CACE,OAGF,6CACE,cACA,eACA,MpBlTM,QoBmTN,WpB1NY,aoB8NhB,8BACE,aACA,kBACA,UpBnSW,KoBoSX,MpB3TQ,QoB4TR,YpBlRiB,IoBmRjB,6BAEA,yBARF,8BASI,mBAGF,mCACE,cACA,6BClVN,mBACE,mBACA,kBACA,WACA,aACA,aACA,mBACA,uBACA,gBAEA,2BACE,WACA,kBACA,MACA,OACA,QACA,SACA,0LACA,0BACA,WAGF,gCACE,kBACA,QACA,SACA,gCACA,aACA,WACA,UAGF,sBACE,kBACA,UrBQY,KqBPZ,YrBee,IqBdf,MrBxBQ,QqByBR,SACA,UACA,sBnBpCA,yBmBHJ,mBA4CI,aACA,crBkBS,KqBhBT,gCACE,aAGF,sBACE,UrBZS,MsBzCf,OACE,aACA,uBACA,ItB2DW,KsB1DX,kBACA,ctBoEiB,IsBnEjB,ctB0DW,KsBxDX,mBACE,eACA,cAGF,sBACE,OACA,gBAEA,6BACE,YtBgCiB,IsB3BrB,qBACE,+BACA,qCACA,cAIF,mBACE,gCACA,sCACA,cACA,mBAEA,uBACE,cAGF,wBACE,OACA,UtBLS,KsBMT,YtBMe,IsBDnB,qBACE,gCACA,sCACA,4CAIF,kBACE,6BACA,mCACA,MtBvDa,QuBJjB,uBACE,kBACA,WACA,gBAGF,yBACE,kBACA,WACA,aACA,gBrBHE,0BqBDJ,yBAOI,crBRA,yBqBCJ,yBAWI,cAIJ,qBACE,kBACA,WACA,YAIF,YACE,kBACA,MACA,OACA,WACA,aACA,aACA,mBACA,uBACA,UACA,kBACA,8DAEA,mBACE,UACA,mBAIF,4BACE,mBAGF,4BACE,mBAGF,4BACE,mBAIJ,oBACE,WACA,iBACA,YACA,aACA,mBACA,8BACA,eACA,kBACA,crB1DE,0BqBiDJ,oBAYI,iBrB/DA,0BqBmDJ,oBAgBI,iBrBrEA,0BqBqDJ,oBAoBI,sBACA,kBACA,uBACA,UrB9EA,yBqBuDJ,oBA2BI,kBACA,UAIJ,mBACE,cACA,aACA,sBACA,SACA,UrB1FE,0BqBqFJ,mBAQI,mBACA,mBAKF,0BACE,sCACA,eACA,gBACA,cACA,cACA,kBrBzGA,0BqBmGF,0BASI,gBrB9GF,yBqBqGF,0BAaI,gBAIJ,uBACE,sCACA,eACA,gBACA,gBACA,WACA,SrB1HA,0BqBoHF,uBASI,gBrB/HF,yBqBsHF,uBAaI,gBAKN,iBACE,oBACA,mBACA,uBACA,YACA,YACA,aACA,mBACA,WACA,sCACA,eACA,gBACA,mBACA,qBACA,wBAEA,uBACE,oCACA,2BACA,wCAGF,wBACE,wBrB7JA,0BqBsIJ,iBA2BI,aAIJ,oBACE,cACA,YACA,aACA,aACA,mBACA,uBACA,UrB1KE,0BqBmKJ,oBAUI,YACA,crBhLA,0BqBqKJ,oBAeI,YACA,crBvLA,yBqBuKJ,oBAoBI,WACA,gBACA,aAGF,gCACE,WACA,YACA,mBAKJ,cACE,kBACA,QACA,2BACA,WACA,YACA,8BACA,YACA,mBACA,eACA,aACA,mBACA,uBACA,WACA,wBAEA,oBACE,8BACA,sCAGF,qBACE,uCAGF,kBACE,WACA,YrB/NA,0BqBoMJ,cAgCI,cAIJ,eACE,WAEA,mBACE,yBrB5OA,0BqBwOJ,eAQI,YrBlPA,0BqB0OJ,eAYI,WrBxPA,yBqB4OJ,eAgBI,WAIJ,eACE,YrB7PE,0BqB4PJ,eAII,arBlQA,0BqB8PJ,eAQI,YrBxQA,yBqBgQJ,eAYI,YAKJ,0BACE,kBACA,aACA,SACA,2BACA,aACA,SACA,WrBxRE,yBqBiRJ,0BAUI,YACA,SAIJ,gBACE,WACA,YACA,kBACA,mBACA,YACA,eACA,UACA,wBAEA,uBACE,mBAGF,mCACE,0BrB/SA,yBqBgSJ,gBAoBI,WACA,YAEA,uBACE,WACA,mBAMN,sBACE,aACA,mBACA,uBACA,gBACA,eACA,UACA,wBACA,kBAEA,0BACE,kBACA,UACA,4BAEA,iCACE,UAIJ,4BACE,gBACA,qBACA,uCrBtVA,yBqB+TJ,sBA2BI,gBAEA,0BACE,WACA,aASN,oBACE,kBACA,UAEA,gBACA,mBAEA,uCACE,kBACA,QACA,mDACA,sBACA,2BACA,4BACA,oBAGF,4CACE,kBACA,aACA,mBACA,uBACA,SACA,UrB5XA,0BqBsXF,4CASI,sBACA,SACA,kBAIJ,sCACE,YACA,aACA,cAEA,0CACE,WACA,YACA,mBrB7YF,0BqBqYF,sCAYI,YACA,cAIJ,yCACE,gBrBvZA,0BqBsZF,yCAII,mBAIJ,kCACE,sCACA,eACA,gBACA,gBACA,WACA,SrBpaA,0BqB8ZF,kCASI,gBrBzaF,yBqBgaF,kCAaI,gBAIJ,0CACE,kBACA,aACA,uBACA,mBACA,UrBpbA,0BqB+aF,0CAQI,wBAIJ,iCACE,WACA,gBAGF,gCACE,kBACA,WACA,YACA,gBACA,yBACA,mBACA,aACA,mBACA,erBzcA,0BqBgcF,gCAYI,YACA,yBACA,gBAIJ,kCACE,OACA,WACA,YACA,YACA,aACA,yBACA,sCACA,eACA,gBACA,WACA,eAEA,+CACE,cACA,gBrBjeF,0BqBkdF,kCAmBI,eACA,gBAIJ,wCACE,gBACA,YACA,eACA,UACA,aACA,mBACA,uBACA,WACA,YACA,cACA,8BAEA,8CACE,qBAGF,+CACE,sBAGF,4CACE,WACA,YrBjgBF,0BqB+fA,4CAKI,WACA,aAKN,qCACE,kBACA,aACA,mBACA,uBACA,SACA,mBACA,UrBjhBA,0BqB0gBF,qCAUI,sBACA,mBACA,uBACA,QACA,qBAIJ,mCACE,sCACA,eACA,gBACA,WACA,mBAGF,kCACE,aACA,mBACA,SACA,erBxiBA,0BqBoiBF,kCAOI,uBACA,UAIJ,kCACE,sCACA,eACA,gBACA,WACA,qBACA,mBACA,0BAEA,wCACE,cACA,0BrB3jBF,0BqBgjBF,kCAeI,gBAIJ,uCACE,sCACA,eACA,WACA,iBrBvkBA,0BqBmkBF,uCAOI,gBAUN,cACE,kBACA,aACA,mBACA,sBACA,WvB/kBM,KuBglBN,gBAEA,mCACE,kBACA,QACA,wDACA,sBACA,2BACA,4BACA,oBAGF,gCACE,iBACA,cACA,eACA,kBACA,WACA,UAGF,8BACE,kBACA,mBACA,kBACA,oBrBnnBA,0BqB+mBF,8BAOI,iBAIJ,6BACE,sCACA,eACA,gBACA,gBACA,WACA,SrBhoBA,0BqB0nBF,6BASI,gBrBroBF,yBqB4nBF,6BAaI,gBAIJ,gCACE,sCACA,eACA,gBACA,gBACA,cACA,mBrBjpBA,0BqB2oBF,gCASI,gBrBtpBF,yBqB6oBF,gCAcI,gBAIJ,4BACE,kBACA,QACA,QACA,2BACA,oBACA,mBACA,uBACA,SACA,kBACA,sCACA,eACA,gBACA,WACA,mBACA,qBACA,mBACA,wBACA,YACA,YrBhrBA,0BqB6pBF,4BAsBI,gBACA,eACA,oBAGF,gCACE,WACA,YACA,8BAEA,qCACE,YAIJ,kCACE,qCAEA,sCACE,0BAKN,mCACE,aACA,SACA,uBrB5sBA,0BqBysBF,mCAMI,UrBjtBF,0BqB2sBF,mCAUI,eACA,SACA,wBAIJ,wBACE,YACA,aACA,gBACA,sBACA,mBACA,kBACA,aACA,sBACA,uBACA,kBACA,wBACA,QACA,eAEA,8BACE,2BACA,qCACA,qBrB7uBF,0BqB2tBF,wBAsBI,uBACA,iBrBpvBF,yBqB6tBF,wBA2BI,WACA,iBAIJ,0BACE,sCACA,eACA,gBACA,iBACA,cACA,kBAGF,gCACE,sCACA,eACA,gBACA,iBACA,cACA,SACA,OACA,gBAGF,iCACE,WACA,YACA,aACA,mBACA,uBACA,gBACA,oBAEA,qCACE,WACA,YACA,mBAaN,cACE,kBACA,gBACA,gBACA,gBACA,iBACA,aACA,mBAEA,+BACE,kBACA,QACA,8CACA,sBACA,2BACA,oBAYF,yBACE,kBACA,UAGF,4BACE,aACA,mBACA,8BACA,IvB9wBU,KE9DV,0BqBw0BF,4BAOI,sBACA,IvBnxBQ,MuBuxBZ,4BACE,OACA,gBrBt1BA,0BqBo1BF,4BAKI,kBACA,gBAIJ,0BACE,sCACA,eACA,gBACA,gBACA,WACA,kBrBp2BA,0BqB81BF,0BASI,gBrBz2BF,yBqBg2BF,0BAaI,gBAGF,2CACE,gBACA,cACA,eAIJ,gCACE,sCACA,eACA,gBACA,gBACA,WACA,kBrB33BA,0BqBq3BF,gCASI,gBAIJ,8BACE,aACA,IvB30BS,KEzDT,0BqBk4BF,8BAKI,wBrBz4BF,yBqBo4BF,8BASI,sBACA,qBAIJ,0BACE,oBACA,mBACA,uBACA,kBACA,sCACA,eACA,gBACA,iBACA,mBACA,qBACA,mBACA,wBACA,gBACA,arBh6BA,yBqBk5BF,0BAiBI,eACA,kBACA,gBAGF,gCACE,2BACA,sCAGF,iCACE,wBAIJ,kCACE,mBACA,WAEA,wCACE,oCAIJ,oCACE,mBACA,WAEA,0CACE,qCAIJ,0BACE,OACA,gBACA,aACA,mBACA,uBAEA,8BACE,WACA,YACA,mBrB58BF,0BqBk8BF,0BAcI,gBAgBN,gBACE,kBACA,gBACA,mBACA,gBACA,iBAEA,oCACE,kBACA,QACA,SACA,gCACA,WACA,YACA,iBACA,oBAEA,4CACE,WACA,kBACA,SACA,SACA,YACA,aACA,mDACA,sBACA,4BACA,WAIJ,2BACE,kBACA,UACA,iBACA,cACA,eAGF,gCACE,mBACA,kBAEA,+CACE,sCACA,eACA,gBACA,WACA,SACA,gBrBjhCF,0BqB2gCA,+CASI,eACA,iBrBvhCJ,yBqB6gCA,+CAcI,gBAGF,8DACE,gBAGF,2DACE,gBAKN,8BACE,aACA,SACA,uBACA,oBACA,iBACA,crB5iCA,0BqBsiCF,8BASI,sBACA,mBACA,UAKJ,8BACE,gBACA,mBACA,qBACA,wBACA,aACA,sBACA,kBACA,gBACA,arB/jCA,0BqBsjCF,8BAYI,WACA,gBACA,YACA,kBAGF,oCACE,2BACA,0CAGF,yCACE,aACA,mBACA,uBAEA,6CACE,WACA,YACA,mBAIJ,4CACE,aACA,sBACA,uBAEA,+CACE,sCACA,eACA,gBACA,cACA,kBACA,gBrBpmCJ,0BqB8lCE,+CASI,gBAIJ,8CACE,sCACA,eACA,gBACA,cACA,SACA,gBrBjnCJ,0BqB2mCE,8CASI,gBAMN,sCACE,YACA,cACA,sBACA,mBACA,kBACA,mBrBhoCF,0BqB0nCA,sCASI,WACA,gBACA,mBAGF,iDACE,YACA,aACA,mBAGF,oDACE,mBACA,kBAEA,uDACE,WACA,erBppCN,0BqBkpCI,uDAKI,gBAIJ,sDACE,yBACA,erB7pCN,0BqB2pCI,sDAKI,gBAKN,4CACE,sCAKJ,sEACE,YACA,cACA,sBACA,mBACA,kBrBhrCF,0BqB2qCA,sEAQI,WACA,gBACA,cAGF,4FACE,YACA,aACA,mBAIF,kGACE,mBACA,kBACA,UAEA,wGACE,erBrsCN,0BqBosCI,wGAII,gBAIJ,sGACE,erB7sCN,0BqB4sCI,sGAII,gBAOR,mCACE,mBAEA,oDACE,cAKJ,mCACE,mBAEA,oDACE,cAWR,mBACE,kBACA,iBACA,gBACA,gBACA,aACA,mBACA,uBrBtvCE,0BqB+uCJ,mBAUI,iBACA,gBrB5vCA,yBqBivCJ,mBAeI,iBACA,gBAKJ,kBACE,kBACA,QACA,mDACA,sBACA,2BACA,4BACA,gBAIA,8BACE,kBACA,UAGF,mCACE,kBACA,mBrBxxCA,yBqBsxCF,mCAKI,oBAIJ,kCACE,sCACA,gBACA,SAEA,6CACE,cACA,eACA,gBACA,cACA,kBrBvyCF,0BqBkyCA,6CAQI,gBrB5yCJ,yBqBoyCA,6CAYI,gBAIJ,mDACE,eACA,gBACA,crBrzCF,0BqBkzCA,mDAMI,gBrB1zCJ,yBqBozCA,mDAUI,gBA/BN,kCAoCE,eACA,gBACA,crBn0CA,0BqB6xCF,kCAyCI,gBrBx0CF,yBqB+xCF,kCA6CI,gBAKJ,gCACE,aACA,mBACA,uBACA,MACA,iBACA,crBr1CA,0BqB+0CF,gCASI,sBACA,UrB31CF,yBqBi1CF,gCAcI,SACA,gBAKJ,8BACE,aACA,sBACA,mBACA,SACA,YrBx2CA,0BqBm2CF,8BAQI,YAGF,0CACE,sCACA,eACA,gBACA,WACA,iBACA,SACA,mBrBv3CF,yBqBg3CA,0CAUI,gBAIJ,yCACE,YACA,aACA,aACA,mBACA,uBACA,8BAEA,6CACE,WACA,YACA,iDrBz4CJ,yBqB83CA,yCAeI,WACA,aAIJ,2CACE,sCACA,eACA,gBACA,cACA,iBACA,SACA,kBACA,mBrBx5CF,0BqBg5CA,2CAWI,gBrB75CJ,yBqBk5CA,2CAeI,gBAMF,+CACE,qBAMN,kCACE,UACA,aACA,cACA,crBh7CA,0BqB46CF,kCAOI,cAMN,aACE,wCAGF,mBACE,KACE,UACA,2BAEF,GACE,UACA,yBAOJ,oBACE,kBACA,iBACA,aACA,mBACA,uBACA,gBAEA,oCACE,kBACA,QACA,8CACA,sBACA,2BACA,4BACA,gBAGF,+BACE,kBACA,UAGF,iCACE,aACA,sBACA,mBACA,SACA,kBAGF,+BACE,sCACA,eACA,gBACA,WACA,mBACA,SrBh/CA,0BqB0+CF,+BASI,gBrBr/CF,yBqB4+CF,+BAaI,gBAIJ,oCACE,oBACA,mBACA,uBACA,aACA,gBACA,YACA,mBACA,WACA,sCACA,eACA,gBACA,mBACA,qBACA,wBAEA,0CACE,qCACA,2BACA,yCAGF,2CACE,wBrBphDF,yBqB6/CF,oCA2BI,WACA,iBAIJ,iCACE,kBACA,SACA,OACA,QACA,WACA,gBCviDJ,sBACE,aACA,iBACA,iBxBaM,KwBZN,kBACA,mBAIF,oBACE,YACA,yBACA,mBACA,kBACA,gBACA,IxBgDW,KwB/CX,0BACA,cACA,OxB4CW,KwB1CX,0BAXF,oBAYI,aAGF,yBAfF,oBAgBI,eACA,OACA,SACA,4BACA,8BACA,WxBFQ,gCwBGR,QxBkEY,IwBjEZ,0BACA,SAC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A,eACA,sCACA,eACA,gBACA,cACA,gBACA,sBACA,mBACA,aACA,wBAEA,qCACE,cAGF,8BACE,qBAGF,8BACE,qBAIJ,2BACE,aACA,mBACA,yBACA,QACA,gBACA,mBACA,kBAEA,gDACE,WACA,YACA,wBACA,kBACA,eACA,gBACA,gBACA,kBACA,cAEA,wDACE,gBACA,qBAEA,+DACE,WACA,kBACA,SACA,QACA,8CACA,UACA,YACA,qBACA,yBAKN,iCACE,sCACA,eACA,gBACA,WACA,eACA,iBACA,iBACA,mBAKN,cACE,WACA,YACA,aACA,sCACA,eACA,gBACA,WACA,mBACA,YACA,mBACA,eACA,wBACA,mBACA,cAEA,oBACE,sCAGF,qBACE,oCAGF,uBACE,WACA,mBAIJ,aACE,aACA,uBACA,mBACA,SACA,eAEA,eACE,sCACA,eACA,gBACA,WACA,qBACA,0BACA,cAEA,qBACE,cACA,0BAIJ,6BACE,WACA,eAKJ,aACE,WACA,mBACA,kBACA,kBACA,eACA,aACA,mBACA,QAEA,yBACE,gCACA,cACA,sCAGF,2BACE,gCACA,cACA,sCAGF,wBACE,6BACA,cACA,mCAGF,eACE,eAKJ,eACE,eACA,MACA,OACA,QACA,SACA,gCACA,aACA,mBACA,uBACA,WACA,UACA,oBACA,4BAEA,sBACE,UACA,mBAGF,wBACE,WACA,YACA,sBACA,yBACA,kBACA,kCAIJ,gBACE,GACE,0BAKJ,yBACE,iBACE,eACA,eAGF,YACE,WACA,YACA,mBAGF,eACE,eACA,mBAIA,wBACE,YACA,eACA,eAIA,gDACE,WACA,YAGF,iCACE,eAKN,cACE,YACA,eACA,mBAGF,aACE,SAEA,4CACE,gBC9TN,uBACE,aACA,mBACA,uBACA,mBACA,kBACA,kBACA,+BACA,gBACA,mBACA,mBAGF,4BACE,WACA,gBACA,cACA,kBAGF,uBACE,yBACA,UACA,aACA,sBACA,mBACA,kBAEA,yBARF,uBASI,gBAKJ,uBACE,WACA,YACA,mBAEA,2BACE,WACA,YACA,mBAKJ,wBACE,sCACA,eACA,gBACA,WACA,kBACA,kBACA,gBAEA,yBATF,wBAUI,eACA,oBAKJ,uBACE,aACA,MACA,mBACA,WACA,mBACA,mBACA,YAEA,iCACE,OACA,kBACA,sCACA,eACA,gBACA,cACA,qBACA,kBACA,yBACA,kBACA,wBAEA,uCACE,cACA,8BAGF,wCACE,WACA,mBACA,uCAGF,yBAxBF,iCAyBI,kBACA,gBAMN,eACE,WACA,mBACA,kBACA,mBACA,sCACA,eACA,aACA,mBACA,SACA,6BAEA,iBACE,eACA,cAGF,2BACE,gCACA,cACA,sCAGF,6BACE,gCACA,cACA,sCAGF,0BACE,6BACA,cACA,mCAKJ,uBACE,WACA,gBAEA,mCACE,mBAEA,gDACE,gBAIJ,mCACE,cACA,sCACA,eACA,gBACA,cACA,mBAGF,mCACE,WACA,YACA,eACA,sCACA,eACA,gBACA,cACA,gBACA,sBACA,mBACA,aACA,wBAEA,gDACE,cAGF,yCACE,qBAGF,yCACE,qBACA,wCAGF,4CACE,mBACA,qBACA,cACA,mBAGF,yCACE,qBAIJ,oCACE,WACA,YACA,eACA,sCACA,eACA,gBACA,cACA,gBACA,sBACA,mBACA,aACA,eACA,wBACA,gBACA,uQACA,4BACA,sCACA,mBAEA,0CACE,qBAGF,0CACE,qBACA,wCAGF,6CACE,yBACA,qBACA,cACA,mBACA,WAGF,2CACE,aACA,eAMN,mBACE,aACA,mBACA,SAEA,iCACE,eAGF,gEAEE,OAGF,oCACE,eACA,cACA,gBAGF,yBACE,iCACE,eAGF,oCACE,gBAMN,mBACE,gBAGF,kBACE,kBAEA,8BACE,oBAGF,8BACE,kBACA,WACA,QACA,2BACA,sCACA,eACA,gBACA,cACA,oBAEA,yBAXF,8BAYI,eACA,YAMN,yCAEE,WACA,YACA,eACA,sCACA,eACA,gBACA,WACA,mBACA,YACA,mBACA,eACA,wBACA,gBACA,cAEA,qDACE,sCAGF,uDACE,oCAGF,2DACE,WACA,mBAGF,yBA9BF,yCA+BI,YACA,gBAMJ,iFACE,aACA,SACA,gBACA,cACA,gBAEA,8NAEE,OACA,YACA,eACA,sCACA,eACA,gBACA,YACA,mBACA,eACA,wBACA,cAGF,+GACE,cACA,gBACA,yBAEA,2HACE,mBACA,qBACA,cAGF,6HACE,mBACA,qBAIJ,+GACE,WACA,mBAEA,2HACE,sCAGF,6HACE,oCAGF,iIACE,WACA,mBAIJ,yBAzDF,iFA0DI,sBACA,SAEA,8NAEE,YACA,gBAMN,iBACE,eACA,MACA,OACA,QACA,SACA,gCACA,aACA,mBACA,uBACA,aACA,4BAEA,wBACE,aAGF,0BACE,WACA,YACA,sBACA,yBACA,kBACA,kCAKJ,gBACE,GACE,0BAIJ,qBACE,KACE,UACA,4BAEF,GACE,UACA,yBAKJ,yBACE,uBACE,kBACA,gBACA,mBAGF,4BACE,gBAIJ,yBACE,uBACE,WACA,YACA,mBAIA,mCACE,mBAGF,mCACE,eACA,kBAGF,uEAEE,YACA,eACA,eAIJ,yCAEE,gBAGF,iFACE,iBC1fJ,uBACE,+BACA,aACA,mBACA,uBACA,mBACA,kBACA,kBACA,mBACA,gBACA,mBAGF,4BACE,WACA,iBACA,cACA,kBAGF,uBACE,yBACA,UACA,aACA,sBACA,mBAEA,yBAPF,uBAQI,gBAIJ,aACE,WACA,YACA,mBAEA,iBACE,WACA,YACA,mBAIJ,gBACE,sCACA,eACA,gBACA,WACA,kBACA,mBACA,cAGF,gBACE,WACA,gBACA,aACA,sBACA,SACA,mBAGF,YACE,WACA,YACA,aACA,mBACA,uBACA,SACA,aACA,sCACA,eACA,gBACA,WACA,qBACA,mBACA,eACA,wBACA,cACA,kBAEA,kBACE,2BACA,sCAGF,mBACE,wBACA,oCAGF,6BACE,WACA,YACA,cAGF,iBACE,mBAIJ,uBACE,mBAGF,yBACE,mBAGF,mBACE,aACA,uBACA,mBACA,SACA,eAEA,oCACE,sCACA,eACA,gBACA,WACA,qBACA,0BACA,cAEA,0CACE,cACA,0BAIJ,yCACE,WACA,eACA,cAKJ,yBACE,uBACE,kBAGF,4BACE,eACA,eAGF,aACE,WACA,YACA,mBAGF,gBACE,eACA,mBAGF,gBACE,eACA,SACA,mBAGF,YACE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SACA,gBACA,oBACA,qBACA,4BACA,gBAIF,qDACE,aACA,yBACA,gBAEA,yDACE,WACA,YACA,mBAGF,uDACE,WACA,YACA,aACA,mBACA,uBACA,eACA,WAOR,kBACE,W7B78BS,Q6B88BT,c7Bt5BiB,K6Bu5BjB,Q7Bl6BW,K6Bm6BX,c7Bl6BW,K6Bo6BX,qBACE,U7B97BW,K6B+7BX,Y7Bp7BmB,I6Bq7BnB,M7B19BQ,Q6B29BR,c7B16BS,K6B66BX,iCACE,aACA,eACA,I7Bj7BS,I6Bm7BT,gDACE,oBACA,mBACA,I7Bv7BO,I6Bw7BP,iBACA,W7Br+BE,K6Bs+BF,yBACA,c7B16Be,K6B26Bf,U7Bn9BS,K6Bo9BT,M7Bv/BS,Q6By/BT,6DACE,gBACA,YACA,M7B5/BO,Q6B6/BP,eACA,eACA,UACA,gBAEA,mEACE,M7B//BM,Q6BugChB,iBAEE,Q7B78BY,K6Bi9Bd,eACE,Q7Bl9BY,K6Bm9BZ,kBACA,M7BxgCU,Q6B0gCV,gCACE,WACA,YACA,mBACA,yBACA,iB7B3hCW,Q6B4hCX,c7Bh9BmB,I6Bi9BnB,kCAGF,iBACE,U7B7/Ba,K6B8/Bb,M7BthCQ,Q6B0hCZ,gBACE,GACE,0BAKJ,eACE,WACA,iBACA,cAEA,0BACE,W7BriCI,K6BsiCJ,c7B5+Be,K6B6+Bf,Q7Bt/BU,K6Bu/BV,W7B9hCQ,0B6B+hCR,c7Bz/BS,K6B4/BX,2BACE,c7B7/BS,K6B+/BT,sCACE,gBAIJ,2BACE,cACA,U7BjiCW,K6BkiCX,Y7BrhCmB,I6BshCnB,M7B3jCQ,Q6B4jCR,c7B5gCS,I6B8gCT,mDACE,M7BtkCU,Q6BukCV,gBAIJ,qFAGE,WACA,kBACA,yBACA,c7B9gCe,I6B+gCf,U7BljCa,K6BmjCb,W7Bl/Bc,a6Bm/Bd,W7B1kCI,K6B4kCJ,uGACE,aACA,a7B5lCS,Q6B6lCT,uCAGF,4HACE,M7BplCO,Q6BwlCX,8BACE,gBACA,iBACA,oBAGF,0BACE,cACA,U7B3kCW,K6B4kCX,M7BlmCQ,Q6BmmCR,W7BrjCS,I6BujCT,wCACE,YACA,M7BtmCO,Q6B0mCX,4BACE,aACA,I7B5jCS,K6B6jCT,eAEA,yCACE,aACA,mBACA,eAEA,2DACE,a7BvkCK,I6B0kCP,qDACE,U7BlmCS,K6BmmCT,M7B5nCI,Q6BkoCV,oCACE,aACA,mBACA,I7BnlCS,K6BqlCT,kDACE,YACA,aACA,0BACA,c7B9kCa,K6B+kCb,aACA,mBACA,uBACA,W7B3oCI,Q6B4oCJ,gBACA,kBACA,W7BxjCY,a6B0jCZ,wDACE,a7BhqCO,Q6BiqCP,8BAGF,oEACE,aACA,sBACA,mBACA,uBACA,I7B9mCK,I6B+mCL,M7B9pCI,Q6B+pCJ,kBACA,Q7BhnCK,K6BknCL,wEACE,WAGF,yEACE,U7BjpCK,K6BkpCL,Y7BroCW,I6ByoCf,sDACE,WACA,YACA,iBAGF,mEACE,kBACA,QACA,UACA,WACA,YACA,UACA,+BACA,yBACA,c7B3nCe,I6B4nCf,M7B5rCI,Q6B6rCJ,eACA,W7BrmCU,a6BsmCV,aACA,mBACA,uBACA,W7BtrCI,0B6BurCJ,WAEA,uEACE,WACA,YAGF,yEACE,W7BntCM,Q6BotCN,a7BptCM,Q6BqtCN,M7B3sCF,K6B4sCE,qBACA,W7BlsCE,+B6BqsCJ,0EACE,sBAKN,gDACE,aAGF,qDACE,kBACA,W7B5tCE,K6B6tCF,yBACA,c7BrqCa,I6BsqCb,U7B1sCS,K6B2sCT,Y7B/rCe,I6BgsCf,M7BpuCM,Q6BquCN,eACA,W7B5oCY,a6B8oCZ,2DACE,W7BpvCO,Q6BqvCP,a7BrvCO,Q6BsvCP,M7BxuCA,K6B2uCF,4DACE,sBAMN,+BACE,aACA,I7BvsCS,I6BwsCT,c7BvsCS,K6BysCT,2CACE,OAGF,2CACE,oBACA,mBACA,I7BltCO,I6BmtCP,kBACA,W7B9wCS,Q6B+wCT,YACA,c7BzsCa,I6B0sCb,M7BnwCE,K6BowCF,U7B/uCS,K6BgvCT,Y7BpuCe,I6BquCf,eACA,W7BhrCY,a6BirCZ,mBAEA,+CACE,cAGF,iDACE,W7B5xCS,Q6B6xCT,2BACA,W7BtwCI,+B6BywCN,kDACE,wBAKN,wBACE,W7B7uCS,K6B8uCT,gBAEA,wCACE,Q7BjvCO,K6BkvCP,W7B/xCI,Q6BgyCJ,gCAEA,kDACE,U7B/wCO,K6BgxCP,M7BvyCI,Q6ByyCJ,yDACE,M7BtzCK,Q6BuzCL,Y7BvwCa,I6B4wCnB,kCACE,iBACA,gBAEA,qDACE,UAGF,2DACE,W7BtzCE,Q6ByzCJ,2DACE,W7BxzCM,Q6ByzCN,kBAEA,iEACE,W7Bh0CG,Q6Bq0CT,iCACE,aACA,mBACA,8BACA,gCACA,W7BlvCY,a6BovCZ,4CACE,mBAGF,uCACE,W7B/0CE,Q6Bk1CJ,6CACE,Y7Bn0CW,oC6Bo0CX,U7Bh0CO,K6Bi0CP,M7Bz1CI,Q6B01CJ,Y7BtzCa,I6ByzCf,gDACE,oBACA,mBACA,uBACA,WACA,YACA,UACA,W7Bj2CA,K6Bk2CA,yBACA,c7B3yCW,I6B4yCX,M7Bt2CI,Q6Bu2CJ,eACA,W7B/wCU,a6BixCV,oDACE,WACA,YAGF,uDACE,sBASV,qFACE,8BACA,oBACA,W7Bz0CY,K6B00CZ,gBACA,cAEA,yBAPF,qFAQI,qBAKJ,iBAEE,kBACA,cACA,cACA,kBAKI,0CACE,YACA,aAMJ,oCACE,gCACA,M7Bl6CU,Q6Bs6Cd,sCACE,c7B72CS,K6B+2CT,mDACE,cACA,aACA,mBACA,uBACA,eAIJ,gCACE,c7Bx3CU,K6B03CV,mCACE,U7Bn5CS,K6Bo5CT,Y7B14Ca,I6B24Cb,M7B57CS,Q6B67CT,c7Bj4CO,K6Bo4CT,oDACE,U7B75CW,K6B85CX,M7Bt7CM,Q6Bu7CN,cAON,eACE,W7B77CM,K6B87CN,c7Bp4CiB,K6Bq4CjB,Q7B/4CW,K6Bg5CX,W7Br7CU,+B6Bs7CV,c7Bj5CW,K6Bk5CX,gBAEA,yBACE,aACA,mBACA,8BACA,eACA,gCAEA,oCACE,mBAGF,qCACE,U7B37CS,K6B47CT,M7Bn9CM,Q6Bo9CN,Y7Bj7Ce,I6Bk7Cf,gBAGF,qCACE,U7Bj8CW,K6Bk8CX,M7B39CM,Q6B49CN,Y7Bx7Ce,I6B27CjB,sCACE,aACA,mBACA,I7Bl7CO,I6Bm7CP,OACA,yBAEA,iDACE,Y7Bn9CW,oC6Bo9CX,U7Bh9CO,K6Bi9CP,W7Br+CE,Q6Bs+CF,iBACA,c7Bh7CW,I6Bi7CX,M7Bt/CS,Q6Bu/CT,a7B77CK,I6Bg8CP,6GAEE,iBACA,W7Bh/CA,K6Bi/CA,yBACA,c7B17CW,I6B27CX,eACA,W7B75CU,a6B+5CV,yHACE,W7BrgDK,Q6BsgDL,a7BtgDK,Q6BugDL,M7Bz/CF,K6B+/CF,8CACE,iBACA,iCACA,cACA,c7Bt8Ca,K6Bu8Cb,U7Bh/CO,K6Bi/CP,Y7Bn+Ce,I6By+CvB,uBACE,W7B3gDQ,Q6B4gDR,c7Bn9CiB,K6Bo9CjB,Q7B/9CW,K6Bg+CX,c7B/9CW,K6Bg+CX,gBAEA,0BACE,U7B5/CW,K6B6/CX,Y7Bl/CmB,I6Bm/CnB,M7BxhDQ,Q6ByhDR,c7Bx+CS,K6B2+CX,kCACE,aACA,eACA,I7B/+CS,I6Bg/CT,c7B/+CS,K6Bi/CT,4CACE,iBACA,W7BjiDE,K6BkiDF,yBACA,c7Bt+Ce,K6Bu+Cf,U7B/gDS,K6BghDT,M7BnjDS,Q6BujDb,iCACE,U7BthDW,K6BuhDX,M7B7iDQ,Q6B8iDR,kBAIJ,iBACE,W7B/iDS,Q6BgjDT,c7Bx/CiB,K6By/CjB,Q7BngDW,K6BogDX,c7BpgDW,K6BqgDX,gBAEA,oBACE,U7BjiDW,K6BkiDX,Y7BvhDmB,I6BwhDnB,M7B7jDQ,Q6B8jDR,c7B7gDS,K6BghDX,6BACE,Y7BhhDS,K6BihDT,M7BlkDQ,Q6BmkDR,U7B5iDW,K6B6iDX,Y7BzhDgB,I6B2hDhB,gCACE,c7BxhDO,I6B6hDb,gBACE,aACA,uBACA,I7B/hDW,K6BgiDX,eAEA,yBANF,gBAOI,sBACA,oBACA,I7BtiDS,I6BuiDT,gBAGF,4DAEE,oBACA,mBACA,I7B9iDS,I6B+iDT,kBACA,c7BpiDe,I6BqiDf,U7BxkDa,K6BykDb,Y7B9jDiB,I6B+jDjB,W7BzgDc,a6B0gDd,qBACA,eACA,YAEA,wEACE,eAGF,yBAlBF,4DAmBI,WACA,gBACA,kBACA,wBAIJ,6BACE,M7BlnDI,K6BmnDJ,W7BxmDQ,+B6B0mDR,mCACE,2BACA,W7B3mDM,gC6B+mDV,+BACE,W7B5nDI,K6B6nDJ,M7BhoDQ,Q6BioDR,yBAEA,qCACE,W7BhoDI,Q6BioDJ,a7BhpDS,Q6BipDT,M7BjpDS,Q6B0pDf,mBACE,eACA,YACA,WACA,Y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wBAGF,iDACE,UhCjDU,KgCkDV,YhCzCa,IgC0Cb,MhChFM,QgCiFN,YhCvCc,IgCwCd,chChCO,KgCkCP,yBAPF,iDAQI,UhCzDO,MgC6DX,gDACE,aACA,mBACA,IhC1CO,KgC2CP,eACA,UhCtES,KgCuET,MhC9FM,QgCgGN,yBARF,gDASI,UhC3EO,KgC4EP,IhClDK,MgCqDP,2DACE,aACA,mBACA,IhC1DK,IgC4DL,6DACE,MhCvHK,QgC0HP,kEACE,MhChHE,QgCiHF,YhC7EW,IgCoFnB,wCACE,kBACA,WhCtHM,QgCuHN,gCAEA,yBALF,wCAMI,mBAGF,yDACE,aACA,sBACA,IhCpFO,IgCsFP,0EACE,aACA,mBACA,IhCzFK,IgC2FL,4EACE,MhC5IE,QgC6IF,qBACA,UhCtHK,KgCuHL,WhCrDQ,agCsDR,aACA,mBACA,IhCnGG,IgCqGH,yBATF,4EAUI,UhC9HG,MgCiIL,kFACE,MhCpKG,QgCsKH,oFACE,2BAIJ,8EACE,MhC5KG,QgC6KH,WhCxEM,agCgFhB,oCACE,kBACA,iBAEA,yBAJF,oCAKI,mBAGF,kDACE,UhC1JW,KgC2JX,MhCpLM,QgCqLN,YhCzIc,IgC2Id,yBALF,kDAMI,UhChKO,MgCoKT,oDACE,chC5IK,KgC8IL,+DACE,gBAIJ,8TACE,WhClJK,KgCmJL,chCrJK,KgCsJL,YhClKe,IgCmKf,MhCxMI,QgC2MN,sDACE,eACA,YACA,chClJW,IgCmJX,cAGF,oDACE,MhC9NO,QgC+NP,0BAEA,0DACE,MhCjOO,QgCqOX,0GACE,cACA,ahC1KK,KgC6KP,qDACE,chCjLK,IgCoLP,6DACE,8BACA,ahCpLK,KgCqLL,cACA,MhCvOI,QgCwOJ,kBAGF,uDACE,WhCzOE,QgC0OF,gBACA,chCpLW,IgCqLX,YhC5NW,oCgC6NX,eACA,MhC7PO,QgCgQT,sDACE,WhClPE,QgCmPF,yBACA,chC5LW,IgC6LX,QhCxMK,KgCyML,gBACA,cAEA,2DACE,yBACA,UACA,MhChQE,QgCoQN,wDACE,WACA,yBACA,cACA,yBACA,chC7MW,IgC8MX,gBAEA,2DACE,WhCxQC,QgCyQD,iBACA,gBACA,YhC3Oa,IgC4Ob,gCAGF,2DACE,iBACA,gCAGF,yEACE,mBAQV,gBACE,aACA,uBACA,IhCpPW,KgCqPX,chCjPY,KgCmPZ,yBANF,gBAOI,sBACA,qBAOJ,mBACE,WhC/SM,KgCgTN,chCtPiB,KgCuPjB,WhCvSU,0BgCwSV,gBAEA,6BACE,aACA,mBACA,8BACA,kBACA,gCACA,WhCnOc,agCoOd,eAEA,yBATF,6BAUI,sBACA,uBACA,kBACA,IhCpRO,KgCuRT,wCACE,mBAGF,mCACE,WhCxUI,QgC0UJ,8CACE,MhC1VO,QgC8VX,wCACE,aACA,mBACA,IhCtSO,IgCuSP,UhC/TS,KgCgUT,YhCpTe,IgCqTf,MhCxVM,QgCyVN,eAEA,yBATF,wCAUI,UhCtUO,MgCyUT,0CACE,MhC5WO,QgCgXX,wCACE,OACA,UhC9UW,KgC+UX,MhCxWM,QgCyWN,WhC/QY,agCiRZ,yBANF,wCAOI,UhCpVO,MgCwVX,uCACE,UhCzVS,KgC0VT,MhChXO,QgCiXP,gBACA,iBAEA,yBANF,uCAOI,UhChWO,KgCiWP,iBCrYR,cACE,+BACA,WjCeQ,QiCdR,kBAEA,yBALF,cAMI,mBAIJ,mBACE,UjCsEoB,OiCrEpB,cAIF,gBACE,cjCiDY,KiC/CZ,yBAHF,gBAII,cjC6CU,MiC1CZ,4BACE,UjCmBY,KiClBZ,YjC0Be,IiCzBf,MjCbQ,QiCcR,cjCmCS,KiClCT,6BACA,sCACA,qBAEA,yBATF,4BAUI,UjCSU,MiCLd,kCACE,eACA,MjCzBQ,QiC0BR,YjCgBiB,IiCdjB,yBALF,kCAMI,UjCNS,MiCYf,sBACE,WjClCM,KiCmCN,cjCuBiB,KiCtBjB,WjCzBU,+BiC0BV,gBACA,cjCUW,KiCNb,eACE,WACA,WjC5CM,KiC6CN,cjCaiB,KiCZjB,gBAGA,6BACE,aACA,iDACA,IjCNS,KiCOT,kBACA,WjCpDO,QiCqDP,gCACA,UjCnCW,KiCoCX,YjCvBmB,IiCwBnB,MjC7DQ,QiC+DR,0BAXF,6BAYI,0CACA,iBACA,UjC3CS,KiC6CT,uCACE,cAIJ,yBArBF,6BAsBI,cAGF,sCACE,kBAGF,wCACE,gBAGF,uCACE,kBAGF,yCACE,kBAGF,uCACE,kBAKJ,0BACE,aACA,iDACA,IjCrDS,KiCsDT,QjCrDS,KiCsDT,gCACA,WjCfc,aiCgBd,eAEA,0BATF,0BAUI,0CACA,QjC7DO,KiC+DP,oCACE,cAIJ,yBAlBF,0BAmBI,0BACA,IjCvEO,IiCwEP,QjCvEO,MiC0ET,qCACE,mBAGF,gCACE,oCAGF,mCACE,aACA,mBACA,uBACA,UjC/GS,KiCgHT,MjCvIM,QiCwIN,YjCrGe,IiCuGf,yBARF,mCASI,cAIJ,qCACE,aACA,mBACA,UjC1HW,KiC2HX,MjCpJM,QiCqJN,YjCjHe,IiCmHf,yBAPF,qCAQI,UjChIO,MiCmIT,uCACE,cACA,qBACA,aACA,mBACA,IjChHK,IiCiHL,WjCvEU,aiCyEV,6CACE,MjC/KK,QiCmLT,gDACE,oBACA,mBACA,YjC3HK,IiC4HL,WAEA,oDACE,WACA,YAKN,oCACE,aACA,mBACA,uBACA,UjCjKS,KiCkKT,MjCzLM,QiC2LN,0BAPF,oCAQI,cAIJ,sCACE,aACA,mBACA,uBAEA,yBALF,sCAMI,4BAMJ,oCACE,aACA,mBACA,uBACA,UjCzLS,KiC0LT,MjChNO,QiCkNP,yBAPF,oCAQI,2BACA,UjC/LO,KiCgMP,YjCxKK,KiC8KX,yBACE,4CACE,gBACA,MjC/NM,QiCgON,ajClLO,KiC6Lb,iBACE,aACA,uBACA,mBACA,IjC/LW,KiCgMX,WjC9LW,KiCgMX,yBAPF,iBAQI,sBACA,qBAIF,+DAEE,aACA,mBACA,IjC5MS,KiC8MT,yBANF,+DAOI,WACA,wBAIJ,yBAzBF,iBA0BI,sBACA,oBACA,IjCvNS,KiCyNT,+DAEE,uBAQN,qBACE,+BACA,WjClRQ,QiCmRR,kBAEA,yBALF,qBAMI,mBAIJ,0BACE,gBACA,cAIF,qBACE,WjClSM,KiCmSN,cjCzOiB,KiC0OjB,WjCzRU,+BiC0RV,gBACA,cjCtPW,KiCyPX,oCACE,uBACA,gCAEA,yBAJF,oCAKI,wBAKF,mDACE,UjC1RU,KiC2RV,YjClRa,IiCmRb,MjCzTM,QiC0TN,YjChRc,IiCiRd,cjCzQO,KiC2QP,yBAPF,mDAQI,UjClSO,MiCsSX,kDACE,aACA,mBACA,IjCnRO,KiCoRP,eACA,UjC/SS,KiCgTT,MjCvUM,QiCyUN,yBARF,kDASI,UjCpTO,KiCqTP,IjC3RK,MiC8RP,6DACE,aACA,mBACA,IjCnSK,IiCqSL,+DACE,MjChWK,QiCmWP,oEACE,MjCzVE,QiC0VF,YjCtTW,IiC6TnB,yCACE,kBACA,WjC/VM,QiCgWN,gCAEA,yBALF,yCAMI,mBAGF,0DACE,aACA,sBACA,IjC7TO,IiC+TP,2EACE,aACA,mBACA,IjClUK,IiCoUL,6EACE,MjCrXE,QiCsXF,qBACA,UjC/VK,KiCgWL,WjC9RQ,aiC+RR,aACA,mBACA,IjC5UG,IiC8UH,yBATF,6EAUI,UjCvWG,MiC0WL,mFACE,MjC7YG,QiC+YH,qFACE,2BAIJ,+EACE,MjCrZG,QiCsZH,WjCjTM,aiCyThB,qCACE,kBACA,iBAEA,yBAJF,qCAKI,mBAGF,mDACE,UjCnYW,KiCoYX,MjC7ZM,QiC8ZN,YjClXc,IiCmXd,qBAEA,yBANF,mDAOI,UjC1YO,MiCiZf,uBACE,WjCvaM,KiCwaN,cjC9WiB,KiC+WjB,WjC9ZU,+BiC+ZV,gBACA,cjC3XW,KiC4XX,8BAEA,wCACE,kBACA,iCACA,gCAEA,yBALF,wCAMI,QjCrYO,MiCwYT,wDACE,aACA,mBACA,IjC7YO,IiC8YP,UjCnaS,KiCoaT,YjC1ZiB,IiC2ZjB,MjChcM,QiCicN,cjCjZO,IiCmZP,0DACE,MjC1cO,QiC8cX,uDACE,UjCjbS,KiCkbT,MjCzcM,QiC2cN,yBAJF,uDAKI,UjCtbO,MiC2bb,yCACE,QjC/ZU,KiCgaV,UjC3ba,KiC4bb,MjCrdQ,QiCsdR,YjC1agB,IiC2ahB,qBAEA,yBAPF,yCAQI,QjCxaO,KiCyaP,UjCncS,MiCycf,wBACE,aACA,uBACA,IjCnbW,KiCobX,cjChbY,KiCibZ,eAEA,yBAPF,wBAQI,sBACA,qBAGF,oCACE,kBACA,cjCnbe,IiCobf,UjCvda,KiCwdb,YjC7ciB,IiC8cjB,qBACA,WjCzZc,aiC0Zd,oBACA,mBACA,uBACA,IjCvcS,IiCwcT,eACA,YAEA,yBAdF,oCAeI,kBACA,UjCreS,MiCweX,6CACE,WjC9fE,KiC+fF,MjClgBM,QiCmgBN,yBAEA,mDACE,WjClgBE,QiCmgBF,ajClhBO,QiCshBX,6CACE,MjCzgBE,KiC2gBF,mDACE,2BACA,WjClgBI,+BiCsgBR,+CACE,WjC5hBU,QiC6hBV,MjCnhBE,KiCqhBF,qDACE,2BACA,WjC5gBI,+BiCghBR,sCACE,eAQN,mBACE,+BACA,WjCriBQ,QiCsiBR,kBAEA,yBALF,mBAMI,mBAIJ,wBACE,gBACA,cAGF,mBACE,WjCpjBM,KiCqjBN,cjC3fiB,KiC4fjB,WjC3iBU,+BiC4iBV,QjCrgBY,KiCsgBZ,cjCxgBW,KiC0gBX,yBAPF,mBAQI,mBAGF,+BACE,cjC9gBU,KiCghBV,0CACE,gBAGF,2CACE,cACA,UjCjjBW,KiCkjBX,YjCtiBiB,IiCuiBjB,MjC5kBM,QiC6kBN,cjC5hBO,KiC8hBP,yBAPF,2CAQI,UjCxjBO,MiC2jBT,2DACE,YACA,MjC5lBQ,QiC6lBR,YjCviBK,IiC2iBT,2CACE,WACA,QjC3iBO,KiC4iBP,yBACA,cjCliBa,IiCmiBb,UjCtkBW,KiCukBX,WjCtgBY,aiCwgBZ,yBARF,2CASI,UjC3kBO,KiC4kBP,kBAGF,iDACE,aACA,ajCpnBO,QiCqnBP,uCAGF,wDACE,MjC5mBK,QiCgnBT,8CACE,WACA,iBACA,QjCpkBO,KiCqkBP,yBACA,cjC3jBa,IiC4jBb,UjC/lBW,KiCgmBX,YjCtmBgB,mFiCumBhB,gBACA,WjCjiBY,aiCmiBZ,yBAXF,8CAYI,UjCtmBO,KiCumBP,iBACA,kBAGF,oDACE,aACA,ajChpBO,QiCipBP,uCAGF,2DACE,MjCxoBK,QiCipBb,sBACE,aACA,uBACA,IjCrmBW,KiCsmBX,WjCpmBW,KiCsmBX,yBANF,sBAOI,8BACA,qBCtqBJ,mBACE,iBACA,mCAFF,mBAKI,WAIJ,wBAGE,kBAEA,yBALF,wBAMI,mBAKJ,oBACE,UlCoBc,KkCnBd,YlC2BiB,IkC1BjB,MlCZU,QkCaV,kBACA,clCuCY,KE9DV,yBgCkBJ,oBAQI,UlCYY,KkCXZ,clCiCS,MkC5Bb,oBACE,aACA,mBACA,8BACA,kBACA,mBACA,clC+BiB,IkC9BjB,clCqBW,KkCnBX,uBACE,UlCNW,KkCOX,YlCCkB,kBkCClB,SAGF,oCACE,8BACA,MlCtCI,KkCuCJ,iBACA,clCqBiB,KkCpBjB,UlCpBW,KkCqBX,YlCTiB,IkCUjB,oBACA,mBACA,IlCDS,IkCGT,4CACE,YACA,MlC5DU,QkC6DV,YlCfa,IkCoBjB,+BACE,gBACA,mBACA,gBACA,gCACA,clCZS,KkCcT,kCACE,eACA,YlC7Ba,IkC8Bb,cACA,SAGF,+CACE,ahClFF,yBgCgCJ,oBAuDI,kBAEA,uBACE,UlCvDS,KkC0DX,+BACE,kBAEA,kCACE,UlC9DO,MkCqEf,iBACE,clCpCiB,IkCqCjB,clChDW,KkCkDX,oBACE,gBACA,UACA,SAEA,uBACE,kBACA,alCxDO,KkCyDP,MlC1GM,QkC2GN,UlCpFS,KkCqFT,gBAEA,+BACE,YACA,kBACA,OACA,MlC9HO,QkC+HP,YlC9EW,IkCiFb,0BACE,WlCxEK,IkC+Eb,gBACE,clChFW,IkCiFX,aACA,uBACA,IlCjFW,KkCmFX,2BACE,gBhC/IA,yBgCwIJ,gBAWI,sBACA,IlC1FS,MkC8Fb,gBACE,aACA,mBACA,IlClGW,IkCmGX,UlC1He,KkC2Hf,YlC/GqB,IkCgHrB,MlCrJU,QkCsJV,gBACA,YlCtGW,KkCwGX,gCACE,oBACA,mBACA,uBACA,gBACA,mBACA,MlC5JI,KkC6JJ,eACA,YlC7HiB,IkC8HjB,kBACA,gBhC5KA,yBgCwJJ,gBAwBI,eACA,eAIJ,wBACE,OACA,aACA,sBACA,IlChIW,IEzDT,yBgCqLJ,wBAOI,YAKJ,eACE,aACA,mBACA,IlC1IW,KkC4IX,uGAGE,OACA,YAGF,6DACE,chC9MA,yBgCiMJ,eAiBI,sBACA,oBACA,IlC3JS,IkC6JT,uGAGE,WAGF,6DACE,YAMN,gBACE,WACA,kBACA,yBACA,clClKiB,IkCmKjB,UlCtMe,KkCuMf,MlChOU,QkCiOV,WlCvIgB,akCwIhB,WlC/NM,KkCiON,sBACE,aACA,alCjPW,QkCkPX,yCAGF,yBACE,WlCvOM,QkCwON,MlC1OS,QkC2OT,mBAGF,2BACE,alCxPY,QkC2Pd,yBACE,alC3PW,QkC8Pb,6BACE,MlCvPS,QkC4Pb,oBACE,aACA,mBACA,IlCjNW,IkCkNX,WAEA,yEAEE,OACA,YAIF,kCACE,OACA,WAGF,+BACE,MlChRQ,QkCiRR,YlC7OmB,IkC8OnB,iBACA,chC7RA,yBgCuQJ,oBA0BI,WAEA,yEAEE,OACA,aAMN,iBACE,WACA,kBACA,yBACA,clC3OiB,IkC4OjB,UlC/Qe,KkCgRf,MlCzSU,QkC0SV,WlCvSM,KkCwSN,eACA,WlClNgB,akCmNhB,gBACA,0LACA,4BACA,sCACA,clC5PY,KkC8PZ,uBACE,aACA,alChUW,QkCiUX,yCAGF,0BACE,iBlCtTM,QkCuTN,MlCzTS,QkC0TT,mBAKJ,wBACE,aACA,IlClRW,KkCoRX,wCACE,OhC/UA,yBgC0UJ,wBASI,sBAEA,wCACE,WAMN,sBACE,kBACA,aACA,mBAEA,sCACE,oBAIJ,WACE,kBACA,MlC7SW,KkC8SX,QACA,2BACA,UlC1Ua,KkC2Ub,YlC9TqB,IkC+TrB,MlC3Wc,QkC4Wd,oBACA,iBAIF,SACE,kBACA,clChTiB,IkCiTjB,UlCpVe,KkCqVf,YlCzUqB,IkC0UrB,eACA,WlCtRgB,akCuRhB,YACA,oBACA,mBACA,uBACA,IlCrUW,IkCsUX,mBAEA,kBACE,WACA,mBAGF,8BACE,2BACA,WlCjXQ,+BkCoXV,+BACE,wBAIJ,iBACE,MlCrYM,KkCyYR,mBACE,WlC1YM,KkC2YN,MlC7YU,QkC8YV,yBAEA,wCACE,alC7ZW,QkC8ZX,MlC9ZW,QkCkaf,+BACE,kBACA,YACA,mBACA,MlCxZM,KkCyZN,yBACA,kBACA,uBAEA,yEACE,MlC9ZI,KEZJ,yBgCgaJ,+BAcI,YAKJ,iBACE,aACA,mBACA,IlC5XW,KE1DT,yBgCmbJ,iBAMI,sBACA,qBAIJ,kBACE,OACA,kBACA,0BACA,clC7XiB,IkC8XjB,WlCtbQ,QkCubR,MlCzbW,QkC0bX,eACA,gBACA,uBACA,mBAEA,2BACE,mBACA,alCzcW,QkC0cX,iCACA,MlCrcQ,QkCycZ,gBAEE,eACA,mBACA,mBACA,yBAEA,iCACE,aAIJ,iBACE,QlCraW,KkCsaX,WlC9dc,QkC+dd,MlCrdM,KkCsdN,YACA,clC9ZiB,IkC+ZjB,eACA,WlClYgB,akCoYhB,uBACE,mBAKJ,iBACE,WlCpbW,KkCqbX,QlCrbW,KkCsbX,clC5aiB,IkC8ajB,mBACE,SACA,UlCndW,KkCodX,MlC3eQ,QkC4eR,gBAEA,qBACE,WlCjcO,IkCocT,2BACE,aACA,MlC7fU,QkC8fV,YlChda,IkCsdnB,oBACE,aACA,IlC5cW,KkC6cX,uBACA,WlC1cY,KkC2cZ,YlC5cY,KkC6cZ,6BAEA,yBACE,YACA,kBACA,uBhChhBA,yBgCqgBJ,oBAeI,sBACA,WlCxdU,KkCydV,YlC1dS,MkC+db,wBACE,WlCneW,IkCoeX,iBACA,clC1diB,IkC2djB,UlC9fa,KkCggBb,gCACE,gCACA,MlChiBW,QkCmiBb,8BACE,gCACA,MlCtiBY,QkC2iBhB,qBACE,eACA,MACA,OACA,WACA,YACA,6BACA,aACA,mBACA,uBACA,aAEA,4BACE,aAGF,8BACE,WACA,YACA,oCACA,iBlCrjBI,KkCsjBJ,kBACA,kCAIJ,gBACE,GACE,0BhCzkBA,yBgC+kBF,gBACE,WAGF,oBACE,WAEA,yEAEE,OACA,YACA,WACA,UlC1jBS,KkC2jBT,iBAIJ,sBACE,WAEA,sCACE,YAMN,gBACE,WlC/lBM,KkCgmBN,sBACA,mBACA,kBACA,aACA,sBACA,SACA,mBAIF,uBACE,aACA,mBACA,eAIF,mBACE,WACA,gBACA,WAIF,sBACE,aACA,sBACA,SAIF,oBACE,aACA,mBACA,8BACA,QACA,YAIF,0BACE,aACA,mBACA,QACA,eACA,OACA,iBAIF,0BACE,kBACA,UACA,oBAEA,6DACE,kDAGF,2DACE,0CAKJ,2BACE,kBACA,WACA,YACA,eACA,YACA,kBACA,oDACA,wBACA,4BACA,2BACA,WlCrlBgB,akCslBhB,UAIF,yBACE,eACA,gBACA,cACA,oBACA,aACA,mBACA,QAEA,4CACE,eACA,gBACA,cAKJ,oBACE,cACA,gBAIF,iBACE,cAIF,uBACE,aACA,mBACA,uBACA,WACA,YACA,eACA,YACA,yBACA,MlCxtBU,QkCytBV,eACA,WlCjoBgB,akCkoBhB,yBAEA,yBACE,eACA,8BAGF,6BACE,MlC/uBW,QkCkvBb,8BACE,MlCnvBW,QkCqvBX,gCACE,yBAMN,mBACE,WlCjsBW,KkCksBX,WlCtvBQ,QkCyvBV,kBACE,iBACA,gBACA,QlCvsBW,KkCysBX,qCACE,UAGF,2CACE,WlC1vBU,QkC2vBV,clCtsBe,IkCysBjB,2CACE,WlCnwBS,QkCowBT,clC3sBe,IkC6sBf,iDACE,WlCxwBM,QkC6wBV,sBACE,UlCvvBW,KkCwvBX,gBACA,MlChxBQ,QkCkxBR,sJACE,MlCpxBM,QkCqxBN,WlCnuBO,KkCouBP,clCruBO,KkCsuBP,YlClvBiB,IkCqvBnB,wBACE,clC1uBO,KkC6uBT,kDACE,YlC7uBO,KkC8uBP,clC/uBO,KkCkvBT,4BACE,WACA,yBACA,clCrvBO,KkCuvBP,8DACE,yBACA,QlC1vBK,IkC2vBL,gBAGF,+BACE,WlC1yBG,QkC2yBH,YlC3wBe,IE9CnB,yBgCi0BF,gBACE,kBACA,SAGF,uBACE,cAGF,sBACE,SAGF,oBACE,YACA,gBAGF,yBACE,UlCnzBW,KkCqzBX,4CACE,UlCrzBW,KkCyzBf,kBACE,iBACA,QlCnyBS,MmC9Db,aACE,cnCkEY,KmCjEZ,kBjCEE,yBiCJJ,aAKI,cnC6DU,MmC1DZ,kCACE,gBACA,cAGF,yBACE,UnC6BY,KmC5BZ,YnCoCe,ImCnCf,MnCHQ,QmCIR,cnC6CS,KmC5CT,aACA,mBACA,uBACA,InCyCS,KE1DT,yBiCSF,yBAWI,UnCkBU,KmCjBV,sBACA,InCmCO,KmChCT,2BACE,MnC5BS,QmC6BT,UnCYU,KEvCZ,yBiCyBA,2BAKI,UnCQQ,MmCHd,+BACE,eACA,MnC3BQ,QmC4BR,YnCciB,IEpDjB,yBiCmCF,+BAMI,UnCPW,MmCUb,0CACE,MnC/CS,QmCgDT,gBACA,kBAEA,iDACE,WACA,kBACA,YACA,OACA,QACA,WACA,kBAOR,4BACE,gBACA,cjCjEE,yBiC+DJ,4BAKI,gBAKJ,kBACE,QnCXY,KmCYZ,WnC/DM,KmCgEN,cnCLiB,KmCMjB,WnCrDU,gCmCsDV,yBjC9EE,yBiCyEJ,kBAQI,kBACA,cnCbe,KmCiBjB,8BACE,cnC1BU,KE7DV,yBiCsFF,8BAII,cnC9BO,MmCiCT,oCACE,aACA,mBACA,InCvCO,ImCwCP,UnC/DW,KmCgEX,YnCpDiB,ImCqDjB,MnC1FM,QmC2FN,cnC1CO,KmC4CP,sCACE,MnCzGO,QmC0GP,UnCrEO,KmCwET,8CACE,MnC1GQ,QmC2GR,gBAKJ,oDACE,iBACA,gBACA,gBjCrHF,yBiCkHA,oDAMI,kBAMN,6BACE,aACA,uBACA,InCzES,ImC0ET,WnCzES,ImC0ET,UnClGW,KmCmGX,MnC1HQ,QmC2HR,YnCjFiB,ImCmFjB,+BACE,MnC1IS,QmC2IT,eACA,cAKJ,8BACE,aACA,uBACA,InC1FS,ImC2FT,WnC1FS,ImC2FT,UnCnHW,KmCoHX,MnCnJY,QmCoJZ,YnClGiB,ImCoGjB,gCACE,eACA,cAKJ,kCACE,WnCtGS,KmCwGT,oCACE,aACA,uBACA,InC7GO,ImC8GP,aACA,UnCvIS,KmCwIT,MnC7JO,QmC8JP,YnCrHe,ImCuHf,sCACE,MnCzKO,QmC0KP,eACA,cAWJ,mEACE,MnCjLM,QmCkLN,8BACA,anC9LS,QmC+LT,YnChJe,ImCoJnB,yBACE,wDACE,QAGF,0DACE,QAGF,wDACE,SAQJ,sCACE,anCtNW,QmCuNX,uCACA,aAIF,8CACE,wCAKJ,aACE,aACE,cnCtKS,KmCyKX,kBACE,gBACA,yBACA,QnC5KS,KmC+KX,mCACE,aAIA,4EAEE,cCrPN,2BACE,iBACA,cACA,kBACA,iBpCYQ,QoCXR,iBAEA,yBAPF,2BAQI,mBAKJ,wBACE,aACA,8BACA,mBACA,cpC+CY,KoC7CZ,yBANF,wBAOI,sBACA,uBACA,IpCwCS,MoCnCX,0BACE,UpCQW,KoCPX,MpChBQ,QoCiBR,YpCiBkB,IoChBlB,cpC4BS,IoCzBX,0BACE,UpCMY,KoCLZ,YpCce,IoCbf,MpCzBQ,QoC6BZ,yBACE,aACA,IpCkBW,KoCfb,uBACE,kBACA,UpCVa,KoCWb,WpCaW,KoCTb,gBACE,aACA,8BACA,mBACA,cpCKW,KoCJX,cAEA,yBAPF,gBAQI,sBACA,uBACA,IpCFS,MoCMb,aACE,UpC/Be,KoCgCf,MpCxDU,QoC0DV,oBACE,MpCvEW,QoCwEX,YpCxBmB,IoCyBnB,UpCnCW,KoCwCf,mBACE,WpCjEM,KoCkEN,cpCRiB,KoCSjB,WpCzDU,0BoC0DV,gBACA,cpCpBY,KoCuBd,YACE,aACA,sBACA,WAIF,cACE,aACA,uDACA,IpCpCW,KoCqCX,kBACA,WpClFS,QoCmFT,gCACA,UpCjEa,KoCkEb,YpCrDqB,IoCsDrB,MpC3FU,QoC6FV,0BAXF,cAYI,uDACA,UpCxEW,KoCyEX,kBAGF,0BAjBF,cAkBI,cAKJ,WACE,aACA,uDACA,IpC3DW,KoC4DX,QpC3DW,KoC4DX,gCACA,mBACA,WpCtBgB,aoCuBhB,eAEA,iBACE,oCAGF,sBACE,mBAGF,uBACE,sCACA,8BAGF,0BAvBF,WAwBI,uDACA,QpCjFS,KoCkFT,UpC3GW,MoC8Gb,0BA7BF,WA8BI,0BACA,IpCxFS,IoCyFT,QpCxFS,KoC0FT,mBACE,yBACA,YpCxGiB,IoCyGjB,MpC7IM,SoCmJZ,SACE,UpC7Ha,KoC8Hb,MpCrJU,QoCsJV,kBAEA,0BALF,SAMI,cAIJ,UACE,YpC3HmB,IoC6HnB,YACE,MpClKQ,QoCmKR,qBACA,WpC1Ec,aoC4Ed,kBACE,MpClLS,QoCsLb,yBACE,oBACA,mBACA,IpC/HS,IoCgIT,MpC9KQ,QoC+KR,kBAEA,2BACE,MpC3LU,QoCgMhB,WACE,MpCxLU,QoCyLV,UpClKa,KoCmKb,qBAGF,UACE,aACA,mBAGF,iBACE,oBACA,mBACA,QACA,iBACA,mCACA,MpCpNa,QoCqNb,cpC/IiB,IoCgJjB,UpCpLa,KoCqLb,YpCxKmB,IoC0KnB,mBACE,UpCxLW,KoC6Lf,YACE,aACA,mBACA,uBAGF,aACE,aACA,mBACA,2BAGF,mBACE,oBACA,mBACA,uBACA,iBACA,cpCrKm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S,KsCmDT,ItC5BO,KsC+BT,wBACE,UtCrDS,KsCsDT,WtCUY,asCRZ,yBAJF,wBAKI,UtC1DS,MsC8Db,4BACE,MtCnGS,QsCoGT,8BAEA,8BACE,qBAIJ,6BACE,MtC9FE,KsC+FF,WtC7GS,QsC8GT,WtCtFM,0BsCwFN,+BACE,MtCnGA,KsC0GR,gBACE,kBACA,WtC1GS,QsC2GT,gCAEA,yBALF,gBAMI,mBAGF,qBACE,gBAGF,+BACE,kBACA,eAEA,gDACE,aACA,mBACA,ItCjFO,IsCkFP,kBACA,WtChIE,KsCiIF,yBACA,ctCzEa,IsC0Eb,UtC9GS,KsC+GT,YtCnGe,IsCoGf,MtCxIM,QsCyIN,WtC/CY,asCgDZ,eAEA,yBAdF,gDAeI,iBACA,UtCvHO,MsC2HP,8DACE,MtC9JK,QsCiKP,6DACE,iBACA,UtCjIK,KsCkIL,MtCxJE,QsCyJF,WtChEQ,asCoEZ,qDACE,YtC1He,IsC2Hf,MtC3KO,QsC8KT,sDACE,atC/KO,QsCgLP,uCAGF,oEACE,atCpLO,QsCsLP,iFACE,yBAKN,6CACE,kBACA,qBACA,OACA,QACA,WtCnLE,KsCoLF,yBACA,ctC5Ha,IsC6Hb,WtC1KM,gCsC2KN,iBACA,gBACA,QtC7Ga,IsC8Gb,gBACA,QtC/IO,IsCgJP,SAEA,yDACE,aAGF,gDACE,iBACA,UtC/KO,KsCgLP,MtCxMI,QsCyMJ,ctC9IW,IsC+IX,eACA,WtCjHU,asCmHV,yBARF,gDASI,gBACA,UtCxLK,MsC2LP,sDACE,WtC9MC,QsC+MD,MtC/NK,QsCkOP,yDACE,WtCnOK,QsCoOL,MtCtNF,KsCuNE,YtCrLa,IsC6LvB,eACE,kBACA,iBAEA,yBAJF,eAKI,kBACA,kBAGF,6BACE,UtCnNa,KsCoNb,MtC7OQ,QsC8OR,YtClMgB,IsCmMhB,qBACA,qBAEA,yBAPF,6BAQI,UtC3NS,MsC+NX,+BACE,ctCvMO,KsCyMP,0CACE,gBAIJ,gMACE,WtC7MO,KsC8MP,ctChNO,KsCiNP,YtC7NiB,IsC8NjB,MtCnQM,QsCoQN,YtC1Nc,IsC4Nd,wQACE,aAIJ,gCACE,UtC/OU,KsCgPV,YtCvOa,IsCwOb,etC7NO,KsC8NP,gCAEA,yBANF,gCAOI,UtCtPO,MsC0PX,gCACE,UtC3PS,KsC6PT,yBAHF,gCAII,UtC/PO,MsCmQX,gCACE,UtCpQS,KsCsQT,yBAHF,gCAII,UtCzQS,MsC6Qb,oCACE,YtCjQa,IsCkQb,MtCxSM,QsC2SR,gCACE,kBACA,MtC5SM,QsC+SR,+BACE,MtC5TS,QsC6TT,0BACA,WtCzNY,asC2NZ,qCACE,MtChUS,QsCoUb,gEACE,cACA,atCxQQ,KsC0QR,yBAJF,gEAKI,atC7QK,MsCiRT,gCACE,qBAGF,gCACE,wBAGF,gCACE,ctC5RO,IsC6RP,YtClSe,IsCoSf,2CACE,gBAIJ,wCACE,8BACA,atCpSO,KsCqSP,cACA,MtCvVM,QsCwVN,kBACA,WtCtVI,QsCuVJ,kBACA,0BAEA,yBAVF,wCAWI,kBAIJ,kCACE,WtChWI,QsCiWJ,gBACA,ctC3Sa,IsC4Sb,YtCnVa,oCsCoVb,eACA,MtCpXS,QsCuXX,iCACE,WtCzWI,QsC0WJ,yBACA,ctCnTa,IsCoTb,QtC/TO,KsCgUP,gBACA,cAEA,yBARF,iCASI,QtCrUK,KsCwUP,sCACE,yBACA,UACA,MtC3XI,QsC+XR,mCACE,WACA,yBACA,cACA,yBACA,ctCxUa,IsCyUb,gBACA,UtC9WS,KsCgXT,yBATF,mCAUI,UtClXO,MsCqXT,sCACE,WtCxYG,QsCyYH,iBACA,gBACA,YtC3We,IsC4Wf,MtCjZI,QsCkZJ,gCAEA,yBARF,sCASI,iBAIJ,sCACE,iBACA,gCACA,MtC5ZI,QsC8ZJ,yBALF,sCAMI,iBAKF,oDACE,mBAGF,4CACE,WtCraA,QsC0aN,gCACE,YACA,6BACA,cAIF,sCACE,WtClYQ,KsCmYR,YtCrYO,KsCsYP,6BAEA,kDACE,aACA,cACA,gBAIJ,6CACE,qBACA,eACA,MtC/cS,QsCgdT,YtC/Za,IsCsajB,iDACE,UAGF,uDACE,WtC7cM,QsC8cN,ctCvZe,IsC0ZjB,uDACE,WtCjeW,QsCkeX,ctC5Ze,IsC8Zf,6DACE,WtCpeW,QuCHjB,WACE,UvCgFoB,OuC/EpB,cACA,erCCE,yBqCJJ,WAMI,gBAKJ,QACE,wBAGF,SACE,yBAGF,gBACE,gCAGF,QACE,wBAGF,eACE,+BAGF,QACE,wBAIF,arChBE,aACA,uBACA,mBqCkBF,crCdE,aACA,8BACA,mBqCgBF,aACE,sBAGF,WACE,eAGF,cACE,mBAGF,aACE,uBAGF,WACE,qBAGF,gBACE,uBAGF,eACE,2BAGF,aACE,yBAGF,iBACE,8BAGF,gBACE,6BAIF,QACE,IvC1BW,IuC6Bb,QACE,IvC7BW,IuCgCb,QACE,IvChCW,KuCmCb,QACE,IvCnCW,KuCsCb,QACE,IvCtCW,KuCsDX,KACE,oBAGF,MACE,wBAGF,MACE,2BAGF,MACE,yBAGF,MACE,0BAGF,MACE,yBACA,0BAGF,MACE,wBACA,2BA3BF,MACE,sBAGF,OACE,0BAGF,OACE,6BAGF,OACE,2BAGF,OACE,4BAGF,OACE,2BACA,4BAGF,OACE,0BACA,6BA3BF,MACE,sBAGF,OACE,0BAGF,OACE,6BAGF,OACE,2BAGF,OACE,4BAGF,OACE,2BACA,4BAGF,OACE,0BACA,6BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,OACE,uBAGF,QACE,2BAGF,QACE,8BAGF,QACE,4BAGF,QACE,6BAGF,QACE,4BACA,6BAGF,QACE,2BACA,8BA3BF,OACE,uBAGF,QACE,2BAGF,QACE,8BAGF,QACE,4BAGF,QACE,6BAGF,QACE,4BACA,6BAGF,QACE,2BACA,8BA3BF,OACE,uBAGF,QACE,2BAGF,QACE,8BAGF,QACE,4BAGF,QACE,6BAGF,QACE,4BACA,6BAGF,QACE,2BACA,8BA3BF,QACE,uBAGF,SACE,2BAGF,SACE,8BAGF,SACE,4BAGF,SACE,6BAGF,SACE,4BACA,6BAGF,SACE,2BACA,8BAgBF,KACE,qBAGF,MACE,yBAGF,MACE,4BAGF,MACE,0BAGF,MACE,2BAGF,MACE,0BACA,2BAGF,MACE,yBACA,4BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,uBAGF,OACE,2BAGF,OACE,8BAGF,OACE,4BAGF,OACE,6BAGF,OACE,4BACA,6BAGF,OACE,2BACA,8BA3BF,MACE,wBAGF,OACE,4BAGF,OACE,+BAGF,OACE,6BAGF,OACE,8BAGF,OACE,6BACA,8BAGF,OACE,4BACA,+BA3BF,MACE,wBAGF,OACE,4BAGF,OACE,+BAGF,OACE,6BAGF,OACE,8BAGF,OACE,6BACA,8BAGF,OACE,4BACA,+BA3BF,MACE,wBAGF,OACE,4BAGF,OACE,+BAGF,OACE,6BAGF,OACE,8BAGF,OACE,6BACA,8BAGF,OACE,4BACA,+BA3BF,OACE,wBAGF,QACE,4BAGF,QACE,+BAGF,QACE,6BAGF,QACE,8BAGF,QACE,6BACA,8BAGF,QACE,4BACA,+BA3BF,OACE,wBAGF,QACE,4BAGF,QACE,+BAGF,QACE,6BAGF,QACE,8BAGF,QACE,6BACA,8BAGF,QACE,4BACA,+BA3BF,OACE,wBAGF,QACE,4BAGF,QACE,+BAGF,QACE,6BAGF,QACE,8BAGF,QACE,6BACA,8BAGF,QACE,4BACA,+BAKJ,MACE,UAGF,MACE,UAGF,MACE,UAGF,OACE,WAGF,QACE,WAIF,MACE,WAGF,MACE,WAGF,MACE,WAGF,OACE,YAGF,QACE,YAGF,QACE,aAIF,mBACE,kBAGF,mBACE,kBAGF,gBACE,eAGF,iBACE,gBAIF,YACE,WvC/Pa,QuCkQf,cACE,WvClQe,QuCqQjB,UACE,WvCzPM,KuC4PR,SACE,WvC5PQ,QuC+PV,UACE,WvC/PS,QuCwQX,QACE,yBAGF,UACE,uBAGF,YACE,6BAGF,eACE,gCAGF,aACE,8BAGF,cACE,+BAGF,gBACE,avCjTa,QuCqTf,WACE,gBAGF,YACE,cvCpPiB,IuCuPnB,SACE,cvCvPiB,IuC0PnB,YACE,cvC1PiB,KuC6PnB,YACE,cvC7PiB,KuCgQnB,cACE,cvC/PmB,KuCkQrB,gBACE,cvClQqB,IuCsQvB,aACE,2BAGF,WACE,WvC/TU,0BuCkUZ,QACE,WvClUU,+BuCqUZ,WACE,WvCrUU,gCuCwUZ,WACE,WvCxUU,gCuC4UZ,iBACE,gBAGF,eACE,cAGF,mBACE,kBAGF,mBACE,kBAGF,iBACE,gBAGF,iBACE,gBAIF,KACE,UAGF,MACE,WAGF,MACE,WAGF,MACE,WAGF,MACE,WAGF,MACE,WrCnZE,yBqCwZF,SACE,yBrCvZA,0BqC4ZF,SACE,yBAKF,yBADF,aAEI,yBrCraA,yBqCyaJ,cAEI,yBAKJ,gBACE,eAGF,gBACE,eAGF,oBACE,mBAIF,WACE,UAGF,YACE,YAGF,YACE,WAGF,YACE,YAGF,aACE,UAIF,YACE,WvChXgB,auCmXlB,iBACE,WvCnXgB,cuCsXlB,iBACE,WvCtXgB,auCyXlB,iBACE,gBAIF,0BACE,kBACA,UACA,WACA,UACA,YACA,gBACA,sBACA,mBACA","file":"main.min.css"} \ No newline at end of file diff --git a/src/main/resources/static/img/api_icon_finance.png b/src/main/resources/static/img/api_icon_finance.png new file mode 100644 index 0000000..ec776c4 Binary files /dev/null and b/src/main/resources/static/img/api_icon_finance.png differ diff --git a/src/main/resources/static/img/api_icon_loan.png b/src/main/resources/static/img/api_icon_loan.png new file mode 100644 index 0000000..3377abd Binary files /dev/null and b/src/main/resources/static/img/api_icon_loan.png differ diff --git a/src/main/resources/static/img/api_icon_p2p.png b/src/main/resources/static/img/api_icon_p2p.png new file mode 100644 index 0000000..a1267f4 Binary files /dev/null and b/src/main/resources/static/img/api_icon_p2p.png differ diff --git a/src/main/resources/static/img/api_icon_remittance.png b/src/main/resources/static/img/api_icon_remittance.png new file mode 100644 index 0000000..46facc4 Binary files /dev/null and b/src/main/resources/static/img/api_icon_remittance.png differ diff --git a/src/main/resources/static/img/api_sidebar.png b/src/main/resources/static/img/api_sidebar.png new file mode 100644 index 0000000..efb5193 Binary files /dev/null and b/src/main/resources/static/img/api_sidebar.png differ diff --git a/src/main/resources/static/img/apikey_step1.png b/src/main/resources/static/img/apikey_step1.png new file mode 100644 index 0000000..09a53b6 Binary files /dev/null and b/src/main/resources/static/img/apikey_step1.png differ diff --git a/src/main/resources/static/img/apikey_step2.png b/src/main/resources/static/img/apikey_step2.png new file mode 100644 index 0000000..212eee1 Binary files /dev/null and b/src/main/resources/static/img/apikey_step2.png differ diff --git a/src/main/resources/static/img/apikey_step3.png b/src/main/resources/static/img/apikey_step3.png new file mode 100644 index 0000000..221d1a1 Binary files /dev/null and b/src/main/resources/static/img/apikey_step3.png differ diff --git a/src/main/resources/static/img/bg_api.png b/src/main/resources/static/img/bg_api.png deleted file mode 100644 index 0a0d033..0000000 Binary files a/src/main/resources/static/img/bg_api.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_api_intro.svg b/src/main/resources/static/img/bg_api_intro.svg new file mode 100644 index 0000000..de39a48 --- /dev/null +++ b/src/main/resources/static/img/bg_api_intro.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/main/resources/static/img/bg_api_visual.png b/src/main/resources/static/img/bg_api_visual.png deleted file mode 100644 index 977b21a..0000000 Binary files a/src/main/resources/static/img/bg_api_visual.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_api_visual02.png b/src/main/resources/static/img/bg_api_visual02.png deleted file mode 100644 index b86071a..0000000 Binary files a/src/main/resources/static/img/bg_api_visual02.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_api_visual03.png b/src/main/resources/static/img/bg_api_visual03.png deleted file mode 100644 index c741645..0000000 Binary files a/src/main/resources/static/img/bg_api_visual03.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_main_api_usage.png b/src/main/resources/static/img/bg_main_api_usage.png new file mode 100644 index 0000000..42331d1 Binary files /dev/null and b/src/main/resources/static/img/bg_main_api_usage.png differ diff --git a/src/main/resources/static/img/bg_main_intersect.png b/src/main/resources/static/img/bg_main_intersect.png new file mode 100644 index 0000000..9c0348a Binary files /dev/null and b/src/main/resources/static/img/bg_main_intersect.png differ diff --git a/src/main/resources/static/img/bg_main_join.png b/src/main/resources/static/img/bg_main_join.png new file mode 100644 index 0000000..9778af7 Binary files /dev/null and b/src/main/resources/static/img/bg_main_join.png differ diff --git a/src/main/resources/static/img/bg_main_recommend_apis.png b/src/main/resources/static/img/bg_main_recommend_apis.png new file mode 100644 index 0000000..ae7d41a Binary files /dev/null and b/src/main/resources/static/img/bg_main_recommend_apis.png differ diff --git a/src/main/resources/static/img/bg_portal_info01.png b/src/main/resources/static/img/bg_portal_info01.png deleted file mode 100644 index 6558029..0000000 Binary files a/src/main/resources/static/img/bg_portal_info01.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_info02.png b/src/main/resources/static/img/bg_portal_info02.png deleted file mode 100644 index e0e8f68..0000000 Binary files a/src/main/resources/static/img/bg_portal_info02.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_info03.png b/src/main/resources/static/img/bg_portal_info03.png deleted file mode 100644 index e994230..0000000 Binary files a/src/main/resources/static/img/bg_portal_info03.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_info04.png b/src/main/resources/static/img/bg_portal_info04.png deleted file mode 100644 index 74d0eec..0000000 Binary files a/src/main/resources/static/img/bg_portal_info04.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_info05.png b/src/main/resources/static/img/bg_portal_info05.png deleted file mode 100644 index f79eee7..0000000 Binary files a/src/main/resources/static/img/bg_portal_info05.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_info06.png b/src/main/resources/static/img/bg_portal_info06.png deleted file mode 100644 index d41a21f..0000000 Binary files a/src/main/resources/static/img/bg_portal_info06.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_sinfo01.png b/src/main/resources/static/img/bg_portal_sinfo01.png deleted file mode 100644 index c09eedc..0000000 Binary files a/src/main/resources/static/img/bg_portal_sinfo01.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_sinfo02.png b/src/main/resources/static/img/bg_portal_sinfo02.png deleted file mode 100644 index 4141dbf..0000000 Binary files a/src/main/resources/static/img/bg_portal_sinfo02.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_sinfo03.png b/src/main/resources/static/img/bg_portal_sinfo03.png deleted file mode 100644 index da830fa..0000000 Binary files a/src/main/resources/static/img/bg_portal_sinfo03.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_portal_sinfo04.png b/src/main/resources/static/img/bg_portal_sinfo04.png deleted file mode 100644 index 9c4f4b9..0000000 Binary files a/src/main/resources/static/img/bg_portal_sinfo04.png and /dev/null differ diff --git a/src/main/resources/static/img/bg_support_center.png b/src/main/resources/static/img/bg_support_center.png new file mode 100644 index 0000000..e36b03e Binary files /dev/null and b/src/main/resources/static/img/bg_support_center.png differ diff --git a/src/main/resources/static/img/btn_withdrawal.png b/src/main/resources/static/img/btn_withdrawal.png new file mode 100644 index 0000000..cf00c29 Binary files /dev/null and b/src/main/resources/static/img/btn_withdrawal.png differ diff --git a/src/main/resources/static/img/checkbox-checked.png b/src/main/resources/static/img/checkbox-checked.png new file mode 100644 index 0000000..468fc4f Binary files /dev/null and b/src/main/resources/static/img/checkbox-checked.png differ diff --git a/src/main/resources/static/img/checkbox-checked.svg b/src/main/resources/static/img/checkbox-checked.svg new file mode 100644 index 0000000..47ef9ad --- /dev/null +++ b/src/main/resources/static/img/checkbox-checked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/resources/static/img/checkbox-unchecked.png b/src/main/resources/static/img/checkbox-unchecked.png new file mode 100644 index 0000000..2400ad1 Binary files /dev/null and b/src/main/resources/static/img/checkbox-unchecked.png differ diff --git a/src/main/resources/static/img/checkbox-unchecked.svg b/src/main/resources/static/img/checkbox-unchecked.svg new file mode 100644 index 0000000..28a2e74 --- /dev/null +++ b/src/main/resources/static/img/checkbox-unchecked.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/img/error_3d.png b/src/main/resources/static/img/error_3d.png new file mode 100644 index 0000000..67ea2a6 Binary files /dev/null and b/src/main/resources/static/img/error_3d.png differ diff --git a/src/main/resources/static/img/hero_image_1.png b/src/main/resources/static/img/hero_image_1.png new file mode 100644 index 0000000..c0ec1c4 Binary files /dev/null and b/src/main/resources/static/img/hero_image_1.png differ diff --git a/src/main/resources/static/img/hero_image_2.png b/src/main/resources/static/img/hero_image_2.png new file mode 100644 index 0000000..ccf69bc Binary files /dev/null and b/src/main/resources/static/img/hero_image_2.png differ diff --git a/src/main/resources/static/img/hero_image_3.png b/src/main/resources/static/img/hero_image_3.png new file mode 100644 index 0000000..a400f48 Binary files /dev/null and b/src/main/resources/static/img/hero_image_3.png differ diff --git a/src/main/resources/static/img/icon/icon_api_info01.png b/src/main/resources/static/img/icon/icon_api_info01.png deleted file mode 100644 index c60ced6..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info01.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info01_hover.png b/src/main/resources/static/img/icon/icon_api_info01_hover.png deleted file mode 100644 index e988419..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info01_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info02.png b/src/main/resources/static/img/icon/icon_api_info02.png deleted file mode 100644 index 1c70a58..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info02.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info02_hover.png b/src/main/resources/static/img/icon/icon_api_info02_hover.png deleted file mode 100644 index 1673183..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info02_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info03.png b/src/main/resources/static/img/icon/icon_api_info03.png deleted file mode 100644 index 16a7a5a..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info03.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info03_hover.png b/src/main/resources/static/img/icon/icon_api_info03_hover.png deleted file mode 100644 index d66f92c..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info03_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info04.png b/src/main/resources/static/img/icon/icon_api_info04.png deleted file mode 100644 index 9e96af4..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info04.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info04_hover.png b/src/main/resources/static/img/icon/icon_api_info04_hover.png deleted file mode 100644 index 1b6235e..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info04_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info05.png b/src/main/resources/static/img/icon/icon_api_info05.png deleted file mode 100644 index a3ea4b0..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info05.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info05_hover.png b/src/main/resources/static/img/icon/icon_api_info05_hover.png deleted file mode 100644 index c799c3e..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info05_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info06.png b/src/main/resources/static/img/icon/icon_api_info06.png deleted file mode 100644 index 938031e..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info06.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info06_hover.png b/src/main/resources/static/img/icon/icon_api_info06_hover.png deleted file mode 100644 index d9a3229..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info06_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info07.png b/src/main/resources/static/img/icon/icon_api_info07.png deleted file mode 100644 index 624fa78..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info07.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info07_hover.png b/src/main/resources/static/img/icon/icon_api_info07_hover.png deleted file mode 100644 index 209b235..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info07_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info08.png b/src/main/resources/static/img/icon/icon_api_info08.png deleted file mode 100644 index 187a263..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info08.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info08_hover.png b/src/main/resources/static/img/icon/icon_api_info08_hover.png deleted file mode 100644 index eca41cd..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info08_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info09.png b/src/main/resources/static/img/icon/icon_api_info09.png deleted file mode 100644 index be29fe4..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info09.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info09_hover.png b/src/main/resources/static/img/icon/icon_api_info09_hover.png deleted file mode 100644 index bccbc71..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info09_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info10.png b/src/main/resources/static/img/icon/icon_api_info10.png deleted file mode 100644 index 7ec850a..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info10.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info10_hover.png b/src/main/resources/static/img/icon/icon_api_info10_hover.png deleted file mode 100644 index dca6918..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info10_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info11.png b/src/main/resources/static/img/icon/icon_api_info11.png deleted file mode 100644 index fee170d..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info11.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info11_hover.png b/src/main/resources/static/img/icon/icon_api_info11_hover.png deleted file mode 100644 index 5d5af46..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info11_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info12.png b/src/main/resources/static/img/icon/icon_api_info12.png deleted file mode 100644 index 5fe7911..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info12.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_api_info12_hover.png b/src/main/resources/static/img/icon/icon_api_info12_hover.png deleted file mode 100644 index 1c514ad..0000000 Binary files a/src/main/resources/static/img/icon/icon_api_info12_hover.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_petals01.png b/src/main/resources/static/img/icon/icon_petals01.png deleted file mode 100644 index a596d35..0000000 Binary files a/src/main/resources/static/img/icon/icon_petals01.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_petals02.png b/src/main/resources/static/img/icon/icon_petals02.png deleted file mode 100644 index bb4fbf1..0000000 Binary files a/src/main/resources/static/img/icon/icon_petals02.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_petals03.png b/src/main/resources/static/img/icon/icon_petals03.png deleted file mode 100644 index b50d883..0000000 Binary files a/src/main/resources/static/img/icon/icon_petals03.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_portal_circle01.png b/src/main/resources/static/img/icon/icon_portal_circle01.png deleted file mode 100644 index 45a2ba7..0000000 Binary files a/src/main/resources/static/img/icon/icon_portal_circle01.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_portal_circle02.png b/src/main/resources/static/img/icon/icon_portal_circle02.png deleted file mode 100644 index 47e0580..0000000 Binary files a/src/main/resources/static/img/icon/icon_portal_circle02.png and /dev/null differ diff --git a/src/main/resources/static/img/icon/icon_portal_circle03.png b/src/main/resources/static/img/icon/icon_portal_circle03.png deleted file mode 100644 index 4036f9e..0000000 Binary files a/src/main/resources/static/img/icon/icon_portal_circle03.png and /dev/null differ diff --git a/src/main/resources/static/img/icon_faq.png b/src/main/resources/static/img/icon_faq.png new file mode 100644 index 0000000..de506c4 Binary files /dev/null and b/src/main/resources/static/img/icon_faq.png differ diff --git a/src/main/resources/static/img/icon_notice.png b/src/main/resources/static/img/icon_notice.png new file mode 100644 index 0000000..67bdcef Binary files /dev/null and b/src/main/resources/static/img/icon_notice.png differ diff --git a/src/main/resources/static/img/icon_qna.png b/src/main/resources/static/img/icon_qna.png new file mode 100644 index 0000000..61aebaf Binary files /dev/null and b/src/main/resources/static/img/icon_qna.png differ diff --git a/src/main/resources/static/img/img_api_intro.png b/src/main/resources/static/img/img_api_intro.png new file mode 100644 index 0000000..4a6593e Binary files /dev/null and b/src/main/resources/static/img/img_api_intro.png differ diff --git a/src/main/resources/static/img/img_app_complete.png b/src/main/resources/static/img/img_app_complete.png new file mode 100644 index 0000000..4efd0b7 Binary files /dev/null and b/src/main/resources/static/img/img_app_complete.png differ diff --git a/src/main/resources/static/img/img_con_tit.png b/src/main/resources/static/img/img_con_tit.png deleted file mode 100644 index 0079bed..0000000 Binary files a/src/main/resources/static/img/img_con_tit.png and /dev/null differ diff --git a/src/main/resources/static/img/img_con_tit2.png b/src/main/resources/static/img/img_con_tit2.png deleted file mode 100644 index 80d4fa1..0000000 Binary files a/src/main/resources/static/img/img_con_tit2.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mainslick2_m.png b/src/main/resources/static/img/img_mainslick2_m.png deleted file mode 100644 index 0e5b291..0000000 Binary files a/src/main/resources/static/img/img_mainslick2_m.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mainslick2_pc.png b/src/main/resources/static/img/img_mainslick2_pc.png deleted file mode 100644 index 38fa528..0000000 Binary files a/src/main/resources/static/img/img_mainslick2_pc.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mainslick3_m.png b/src/main/resources/static/img/img_mainslick3_m.png deleted file mode 100644 index ac7980b..0000000 Binary files a/src/main/resources/static/img/img_mainslick3_m.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mainslick3_pc.png b/src/main/resources/static/img/img_mainslick3_pc.png deleted file mode 100644 index c0e3f0a..0000000 Binary files a/src/main/resources/static/img/img_mainslick3_pc.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mainslick_m.png b/src/main/resources/static/img/img_mainslick_m.png deleted file mode 100644 index c16e3eb..0000000 Binary files a/src/main/resources/static/img/img_mainslick_m.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mainslick_pc.png b/src/main/resources/static/img/img_mainslick_pc.png deleted file mode 100644 index 5f85a35..0000000 Binary files a/src/main/resources/static/img/img_mainslick_pc.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mask_group.png b/src/main/resources/static/img/img_mask_group.png deleted file mode 100644 index 6827368..0000000 Binary files a/src/main/resources/static/img/img_mask_group.png and /dev/null differ diff --git a/src/main/resources/static/img/img_mask_group2.png b/src/main/resources/static/img/img_mask_group2.png deleted file mode 100644 index 1bd5477..0000000 Binary files a/src/main/resources/static/img/img_mask_group2.png and /dev/null differ diff --git a/src/main/resources/static/img/img_nodata.png b/src/main/resources/static/img/img_nodata.png deleted file mode 100644 index 8ca6040..0000000 Binary files a/src/main/resources/static/img/img_nodata.png and /dev/null differ diff --git a/src/main/resources/static/img/img_nodata2.png b/src/main/resources/static/img/img_nodata2.png deleted file mode 100644 index 38052ba..0000000 Binary files a/src/main/resources/static/img/img_nodata2.png and /dev/null differ diff --git a/src/main/resources/static/img/img_search_character.png b/src/main/resources/static/img/img_search_character.png new file mode 100644 index 0000000..40eb171 Binary files /dev/null and b/src/main/resources/static/img/img_search_character.png differ diff --git a/src/main/resources/static/img/img_title_bg.png b/src/main/resources/static/img/img_title_bg.png new file mode 100644 index 0000000..af0fa1d Binary files /dev/null and b/src/main/resources/static/img/img_title_bg.png differ diff --git a/src/main/resources/static/img/logo/img_email_logo.png b/src/main/resources/static/img/logo/img_email_logo.png deleted file mode 100644 index 87d27d4..0000000 Binary files a/src/main/resources/static/img/logo/img_email_logo.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_email_logo2.png b/src/main/resources/static/img/logo/img_email_logo2.png deleted file mode 100644 index 61664ef..0000000 Binary files a/src/main/resources/static/img/logo/img_email_logo2.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_logo.png b/src/main/resources/static/img/logo/img_logo.png deleted file mode 100644 index ff3ff5d..0000000 Binary files a/src/main/resources/static/img/logo/img_logo.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_logo2.png b/src/main/resources/static/img/logo/img_logo2.png deleted file mode 100644 index 87d27d4..0000000 Binary files a/src/main/resources/static/img/logo/img_logo2.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_logo3.png b/src/main/resources/static/img/logo/img_logo3.png deleted file mode 100644 index 812bfd0..0000000 Binary files a/src/main/resources/static/img/logo/img_logo3.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_logo4.png b/src/main/resources/static/img/logo/img_logo4.png deleted file mode 100644 index ff3ff5d..0000000 Binary files a/src/main/resources/static/img/logo/img_logo4.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_logo5.png b/src/main/resources/static/img/logo/img_logo5.png deleted file mode 100644 index e10e5c7..0000000 Binary files a/src/main/resources/static/img/logo/img_logo5.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_mlogo.png b/src/main/resources/static/img/logo/img_mlogo.png deleted file mode 100644 index f7888e8..0000000 Binary files a/src/main/resources/static/img/logo/img_mlogo.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/img_mlogo2.png b/src/main/resources/static/img/logo/img_mlogo2.png deleted file mode 100644 index 647d99b..0000000 Binary files a/src/main/resources/static/img/logo/img_mlogo2.png and /dev/null differ diff --git a/src/main/resources/static/img/logo/logo.png b/src/main/resources/static/img/logo/logo.png index d84af84..a165d0c 100644 Binary files a/src/main/resources/static/img/logo/logo.png and b/src/main/resources/static/img/logo/logo.png differ diff --git a/src/main/resources/static/img/logo/logo_box.png b/src/main/resources/static/img/logo/logo_box.png new file mode 100644 index 0000000..7fd87f3 Binary files /dev/null and b/src/main/resources/static/img/logo/logo_box.png differ diff --git a/src/main/resources/static/img/m_keyvisual_img.png b/src/main/resources/static/img/m_keyvisual_img.png deleted file mode 100644 index 932bc15..0000000 Binary files a/src/main/resources/static/img/m_keyvisual_img.png and /dev/null differ diff --git a/src/main/resources/static/img/pc_keyvisual_img.png b/src/main/resources/static/img/pc_keyvisual_img.png deleted file mode 100644 index 490fe09..0000000 Binary files a/src/main/resources/static/img/pc_keyvisual_img.png and /dev/null differ diff --git a/src/main/resources/static/img/user_icon.svg b/src/main/resources/static/img/user_icon.svg new file mode 100644 index 0000000..c2ccbf1 --- /dev/null +++ b/src/main/resources/static/img/user_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/js/front2.js b/src/main/resources/static/js/front2.js index 645acf1..79dec57 100644 --- a/src/main/resources/static/js/front2.js +++ b/src/main/resources/static/js/front2.js @@ -297,16 +297,6 @@ const createCustomSelect = (targetElement, options = {}) => { }; }; -function activateSelect() { - const customSelects = document.querySelectorAll('.custom_select'); - customSelects.forEach(select => { - let selector = createCustomSelect(select); - console.log(selector); - }); -} - -/* 디자인 select box */ -// document.addEventListener('DOMContentLoaded',activateSelect); /* footer */ function adjustLayout() { diff --git a/src/main/resources/static/js/login-success-handler.js b/src/main/resources/static/js/login-success-handler.js new file mode 100644 index 0000000..a811257 --- /dev/null +++ b/src/main/resources/static/js/login-success-handler.js @@ -0,0 +1,127 @@ +/** + * 로그인 성공 후 처리 핸들러 + * + * PortalAuthenticationSuccessHandler에서 세션에 설정한 값들을 읽어 + * 적절한 팝업을 표시하고 리다이렉트를 처리합니다. + * + * 필요한 세션 속성: + * - success: 일반 성공 메시지 + * - session.emailVerificationRequired: 이메일 인증 필요 여부 + * - session.dormantAccount: 휴면 계정 여부 + * - session.passwordExpired: 비밀번호 만료 여부 + * - session.pendingInvitation: 법인 초대 대기 여부 + * - session.pendingInvitationToken: 초대 토큰 + * - session.pendingInvitationOrgName: 초대 기관명 + * - session.redirectUrl: 리다이렉트 URL + * + * 의존성: + * - jQuery ($) + * - customPopups (custom-popups.js) + * + * @see PortalAuthenticationSuccessHandler.java + */ +var LoginSuccessHandler = (function() { + 'use strict'; + + var config = { + successMsg: null, + emailVerificationRequired: false, + dormantAccount: false, + passwordExpired: false, + pendingInvitation: false, + pendingInvitationToken: '', + pendingInvitationOrgName: '', + sessionSuccessMsg: '', + redirectUrl: '' + }; + + /** + * 핸들러 초기화 + * @param {Object} options - Thymeleaf에서 전달받은 세션 값들 + */ + function init(options) { + if (!options) { + console.warn('LoginSuccessHandler: options not provided'); + return; + } + + config = $.extend({}, config, options); + + console.log('LoginSuccessHandler initialized:', config); + + handleLoginSuccess(); + } + + /** + * 로그인 성공 후 처리 로직 실행 + */ + function handleLoginSuccess() { + // 1. 기존 success 메시지 처리 + if (config.successMsg) { + console.log("Success message:", config.successMsg); + customPopups.showAlert(config.successMsg); + } + + // 2. 이메일 인증 체크 + if (config.emailVerificationRequired) { + console.log('emailVerifyMsg:', config.sessionSuccessMsg); + console.log('redirectUrl:', config.redirectUrl); + + customPopups.showAlert(config.sessionSuccessMsg); + $('#customAlertOkButton').off('click.loginHandler').on('click.loginHandler', function() { + customPopups.hideAlert('#customAlert'); + window.location.href = config.redirectUrl; + }); + return; // 다른 체크 중단 + } + + // 3. 장기미사용 계정 체크 + if (config.dormantAccount) { + console.log('dormantMsg:', config.sessionSuccessMsg); + console.log('redirectUrl:', config.redirectUrl); + + customPopups.showAlert(config.sessionSuccessMsg); + $('#customAlertOkButton').off('click.loginHandler').on('click.loginHandler', function() { + customPopups.hideAlert('#customAlert'); + window.location.href = config.redirectUrl; + }); + return; // 다른 체크 중단 + } + + // 4. 비밀번호 만료 체크 + if (config.passwordExpired) { + var formattedMsg = config.sessionSuccessMsg ? config.sessionSuccessMsg.replace(/\n/g, '
') : ''; + console.log('pwdExpiredMsg:', config.sessionSuccessMsg); + console.log('redirectUrl:', config.redirectUrl); + + $('#customAlertMessage').html(formattedMsg); + $('#customAlert').css('display', 'flex'); + + $('#customAlertOkButton').off('click.loginHandler').on('click.loginHandler', function() { + customPopups.hideAlert('#customAlert'); + window.location.href = config.redirectUrl; + }); + return; // 다른 체크 중단 + } + + // 5. 초대 대기 확인 (로그인할 때마다 표시) + if (config.pendingInvitation) { + var orgName = config.pendingInvitationOrgName || '알 수 없는 기관'; + var token = config.pendingInvitationToken; + + customPopups.showConfirm( + '' + orgName + '에서 초대가 도착했습니다.
초대를 확인하시겠습니까?', + function(selection) { + if (selection) { + window.location.href = '/signup/decision?invitation=' + token; + } + } + ); + } + } + + // Public API + return { + init: init + }; +})(); diff --git a/src/main/resources/static/js/popup/custom-popups.js b/src/main/resources/static/js/popup/custom-popups.js index 6df17c0..98b2c09 100644 --- a/src/main/resources/static/js/popup/custom-popups.js +++ b/src/main/resources/static/js/popup/custom-popups.js @@ -1,42 +1,305 @@ const customPopups = { + /** + * 알림 팝업 표시 + * @param {string} message - 알림 메시지 + * @param {Function} callback - 확인 버튼 클릭 시 호출되는 콜백 (선택사항) + */ showAlert: function (message, callback) { + // 메시지 설정 $('#customAlertMessage').text(message); - $('#customAlert').css('display', 'flex'); - // Enter 키 이벤트 리스너 추가 - $(document).on('keydown.customAlert', function (e) { + // 팝업 표시 (modal 구조 사용) + $('#customAlert').show(); + setTimeout(function() { + $('#customAlertBackdrop').addClass('show'); + $('#customAlertModal').addClass('show'); + }, 10); + + // Body 스크롤 방지 + $('body').css('overflow', 'hidden'); + + // 확인 버튼에 포커스 + setTimeout(function() { + $('#customAlertOkButton').focus(); + }, 350); + + // 확인 버튼 클릭 이벤트 (기존 이벤트 제거 후 재등록) + $('#customAlertOkButton').off('click').on('click', function () { + customPopups.hideAlert(); + if (typeof callback === 'function') { + callback(); + } + }); + + // 닫기 버튼 클릭 이벤트 + $('#customAlertCloseButton').off('click').on('click', function () { + customPopups.hideAlert(); + if (typeof callback === 'function') { + callback(); + } + }); + + // Enter 키 이벤트 + $(document).off('keydown.customAlert').on('keydown.customAlert', function (e) { if (e.key === 'Enter') { - customPopups.hideAlert('#customAlert'); + customPopups.hideAlert(); if (typeof callback === 'function') { callback(); } } }); - // 확인 버튼 클릭 시 콜백 호출 - $('#customAlertOkButton').off('click').on('click', function () { - customPopups.hideAlert('#customAlert'); - if (typeof callback === 'function') { - callback(); + // Escape 키 이벤트 + $(document).off('keydown.customAlertEsc').on('keydown.customAlertEsc', function (e) { + if (e.key === 'Escape') { + customPopups.hideAlert(); + if (typeof callback === 'function') { + callback(); + } } }); }, - hideAlert: function (id) { - $(id).hide(); + + /** + * 알림 팝업 숨기기 + */ + hideAlert: function () { + // Modal 숨김 애니메이션 + $('#customAlertBackdrop').removeClass('show'); + $('#customAlertModal').removeClass('show'); + + // 애니메이션 완료 후 숨김 + setTimeout(function() { + $('#customAlert').hide(); + }, 300); + + // Body 스크롤 복원 + $('body').css('overflow', ''); + // 이벤트 리스너 제거 + $('#customAlertOkButton').off('click'); + $('#customAlertCloseButton').off('click'); $(document).off('keydown.customAlert'); + $(document).off('keydown.customAlertEsc'); }, + + /** + * 비밀번호 입력 팝업 표시 + * @param {Object} options - 팝업 옵션 + * @param {string} options.title - 팝업 제목 (기본값: "비밀번호 입력") + * @param {string} options.message - 안내 메시지 (기본값: "계속하려면 비밀번호를 입력해주세요.") + * @param {Function} options.onConfirm - 확인 버튼 클릭 시 호출되는 콜백 (파라미터: password) + * @param {Function} options.onCancel - 취소 버튼 클릭 시 호출되는 콜백 (선택사항) + */ + showPasswordInput: function (options) { + options = options || {}; + + // 기본값 설정 + const title = options.title || '비밀번호 입력'; + const message = options.message || '계속하려면 비밀번호를 입력해주세요.'; + const onConfirm = options.onConfirm; + const onCancel = options.onCancel; + + // 팝업 내용 설정 + $('#passwordPopupTitle').text(title); + $('#passwordPopupMessage').text(message); + + // 입력 필드 및 에러 초기화 + $('#passwordPopupInput').val('').removeClass('error'); + $('#passwordPopupError').removeClass('show').text(''); + + // 팝업 표시 (modal 구조 사용) + $('#passwordInputPopup').show(); + setTimeout(function() { + $('#passwordModalBackdrop').addClass('show'); + $('#passwordModal').addClass('show'); + }, 10); + + // Body 스크롤 방지 + $('body').css('overflow', 'hidden'); + + // 입력 필드에 포커스 + setTimeout(function() { + $('#passwordPopupInput').focus(); + }, 350); + + // 확인 버튼 이벤트 (기존 이벤트 제거 후 재등록) + $('#passwordPopupConfirmButton').off('click').on('click', function () { + const password = $('#passwordPopupInput').val().trim(); + + if (!password) { + customPopups.showPasswordError('비밀번호를 입력해주세요.'); + return; + } + + if (typeof onConfirm === 'function') { + onConfirm(password); + } + }); + + // 취소 버튼 이벤트 + $('#passwordPopupCancelButton').off('click').on('click', function () { + customPopups.hidePasswordInput(); + if (typeof onCancel === 'function') { + onCancel(); + } + }); + + // 닫기 버튼 이벤트 + $('#passwordPopupCloseButton').off('click').on('click', function () { + customPopups.hidePasswordInput(); + if (typeof onCancel === 'function') { + onCancel(); + } + }); + + // Enter 키 이벤트 + $('#passwordPopupInput').off('keypress').on('keypress', function (e) { + if (e.which === 13) { + $('#passwordPopupConfirmButton').click(); + } + }); + + // 입력 시 에러 초기화 + $('#passwordPopupInput').off('input').on('input', function () { + customPopups.clearPasswordError(); + }); + }, + + /** + * 비밀번호 입력 팝업 숨기기 + */ + hidePasswordInput: function () { + // Modal 숨김 애니메이션 + $('#passwordModalBackdrop').removeClass('show'); + $('#passwordModal').removeClass('show'); + + // 애니메이션 완료 후 숨김 + setTimeout(function() { + $('#passwordInputPopup').hide(); + }, 300); + + // Body 스크롤 복원 + $('body').css('overflow', ''); + + // 입력 필드 초기화 + $('#passwordPopupInput').val('').removeClass('error'); + $('#passwordPopupError').removeClass('show').text(''); + + // 이벤트 리스너 제거 + $('#passwordPopupConfirmButton').off('click'); + $('#passwordPopupCancelButton').off('click'); + $('#passwordPopupCloseButton').off('click'); + $('#passwordPopupInput').off('keypress').off('input'); + }, + + /** + * 비밀번호 입력 에러 메시지 표시 + * @param {string} message - 에러 메시지 + */ + showPasswordError: function (message) { + $('#passwordPopupError').text(message).addClass('show'); + $('#passwordPopupInput').addClass('error'); + }, + + /** + * 비밀번호 입력 에러 메시지 제거 + */ + clearPasswordError: function () { + $('#passwordPopupError').removeClass('show'); + $('#passwordPopupInput').removeClass('error'); + }, + /** + * 확인 팝업 표시 + * @param {string} message - 확인 메시지 + * @param {Function} callback - 버튼 클릭 시 호출되는 콜백 (파라미터: boolean - true는 확인, false는 취소) + */ showConfirm: function (message, callback) { + // 메시지 설정 $('#customConfirmMessage').text(message); - $('#customConfirm').css('display', 'flex'); - $('#customConfirmYesButton').one('click', function () { - $('#customConfirm').hide(); - if (callback) callback(true); + + // 팝업 표시 (modal 구조 사용) + $('#customConfirm').show(); + setTimeout(function() { + $('#customConfirmBackdrop').addClass('show'); + $('#customConfirmModal').addClass('show'); + }, 10); + + // Body 스크롤 방지 + $('body').css('overflow', 'hidden'); + + // 확인 버튼에 포커스 + setTimeout(function() { + $('#customConfirmYesButton').focus(); + }, 350); + + // 확인 버튼 클릭 이벤트 (기존 이벤트 제거 후 재등록) + $('#customConfirmYesButton').off('click').on('click', function () { + customPopups.hideConfirm(); + if (typeof callback === 'function') { + callback(true); + } }); - $('#customConfirmNoButton').one('click', function () { - $('#customConfirm').hide(); - if (callback) callback(false); + + // 취소 버튼 클릭 이벤트 + $('#customConfirmNoButton').off('click').on('click', function () { + customPopups.hideConfirm(); + if (typeof callback === 'function') { + callback(false); + } }); + + // 닫기 버튼 클릭 이벤트 + $('#customConfirmCloseButton').off('click').on('click', function () { + customPopups.hideConfirm(); + if (typeof callback === 'function') { + callback(false); + } + }); + + // Enter 키 이벤트 (확인 버튼 실행) + $(document).off('keydown.customConfirm').on('keydown.customConfirm', function (e) { + if (e.key === 'Enter') { + customPopups.hideConfirm(); + if (typeof callback === 'function') { + callback(true); + } + } + }); + + // Escape 키 이벤트 (취소) + $(document).off('keydown.customConfirmEsc').on('keydown.customConfirmEsc', function (e) { + if (e.key === 'Escape') { + customPopups.hideConfirm(); + if (typeof callback === 'function') { + callback(false); + } + } + }); + }, + + /** + * 확인 팝업 숨기기 + */ + hideConfirm: function () { + // Modal 숨김 애니메이션 + $('#customConfirmBackdrop').removeClass('show'); + $('#customConfirmModal').removeClass('show'); + + // 애니메이션 완료 후 숨김 + setTimeout(function() { + $('#customConfirm').hide(); + }, 300); + + // Body 스크롤 복원 + $('body').css('overflow', ''); + + // 이벤트 리스너 제거 + $('#customConfirmYesButton').off('click'); + $('#customConfirmNoButton').off('click'); + $('#customConfirmCloseButton').off('click'); + $(document).off('keydown.customConfirm'); + $(document).off('keydown.customConfirmEsc'); }, showEmailValidationPopup: function (message, onConvertCallback, onChangeEmailCallback) { $('#emailValidationPopupMessage').text(message); @@ -61,17 +324,223 @@ const customPopups = { $('#userLoginId').val(loginId); $('#emailResend').show(); }, + + /** + * 사용자 초대 팝업 표시 + * @param {Object} options - 팝업 옵션 + * @param {Function} options.onConfirm - 확인 버튼 클릭 시 호출되는 콜백 (파라미터: email) + * @param {Function} options.onCancel - 취소 버튼 클릭 시 호출되는 콜백 (선택사항) + */ + showUserInvite: function (options) { + options = options || {}; + + const onConfirm = options.onConfirm; + const onCancel = options.onCancel; + + // 입력 필드 및 에러 초기화 + $('#userInviteEmailInput').val('').removeClass('error'); + $('#userInvitePopupError').removeClass('show').text(''); + + // 팝업 표시 (modal 구조 사용) + $('#userInvitePopup').show(); + setTimeout(function() { + $('#userInviteModalBackdrop').addClass('show'); + $('#userInviteModal').addClass('show'); + }, 10); + + // Body 스크롤 방지 + $('body').css('overflow', 'hidden'); + + // 입력 필드에 포커스 + setTimeout(function() { + $('#userInviteEmailInput').focus(); + }, 350); + + // 확인 버튼 이벤트 (기존 이벤트 제거 후 재등록) + $('#userInvitePopupConfirmButton').off('click').on('click', function () { + const email = $('#userInviteEmailInput').val().trim(); + + // 이메일 유효성 검사 + if (!email) { + customPopups.showUserInviteError('이메일 주소를 입력해주세요.'); + return; + } + + // 이메일 형식 검증 + const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailPattern.test(email)) { + customPopups.showUserInviteError('올바른 이메일 형식이 아닙니다.'); + return; + } + + if (typeof onConfirm === 'function') { + onConfirm(email); + } + }); + + // 취소 버튼 이벤트 + $('#userInvitePopupCancelButton').off('click').on('click', function () { + customPopups.hideUserInvite(); + if (typeof onCancel === 'function') { + onCancel(); + } + }); + + // 닫기 버튼 이벤트 + $('#userInvitePopupCloseButton').off('click').on('click', function () { + customPopups.hideUserInvite(); + if (typeof onCancel === 'function') { + onCancel(); + } + }); + + // Enter 키 이벤트 + $('#userInviteEmailInput').off('keypress').on('keypress', function (e) { + if (e.which === 13) { + $('#userInvitePopupConfirmButton').click(); + } + }); + + // 입력 시 에러 초기화 + $('#userInviteEmailInput').off('input').on('input', function () { + customPopups.clearUserInviteError(); + }); + }, + + /** + * 사용자 초대 팝업 숨기기 + */ + hideUserInvite: function () { + // Modal 숨김 애니메이션 + $('#userInviteModalBackdrop').removeClass('show'); + $('#userInviteModal').removeClass('show'); + + // 애니메이션 완료 후 숨김 + setTimeout(function() { + $('#userInvitePopup').hide(); + }, 300); + + // Body 스크롤 복원 + $('body').css('overflow', ''); + + // 입력 필드 초기화 + $('#userInviteEmailInput').val('').removeClass('error'); + $('#userInvitePopupError').removeClass('show').text(''); + + // 이벤트 리스너 제거 + $('#userInvitePopupConfirmButton').off('click'); + $('#userInvitePopupCancelButton').off('click'); + $('#userInvitePopupCloseButton').off('click'); + $('#userInviteEmailInput').off('keypress').off('input'); + }, + + /** + * 사용자 초대 에러 메시지 표시 + * @param {string} message - 에러 메시지 + */ + showUserInviteError: function (message) { + $('#userInvitePopupError').text(message).addClass('show'); + $('#userInviteEmailInput').addClass('error'); + }, + + /** + * 사용자 초대 에러 메시지 제거 + */ + clearUserInviteError: function () { + $('#userInvitePopupError').removeClass('show'); + $('#userInviteEmailInput').removeClass('error'); + }, + + /** + * 권한 변경 팝업 표시 + * @param {Object} options - 팝업 옵션 + * @param {string} options.userName - 사용자 이름 + * @param {string} options.userEmail - 사용자 이메일 + * @param {string} options.userId - 사용자 ID + * @param {Function} options.onConfirm - 확인 버튼 클릭 시 호출되는 콜백 (파라미터: userId) + * @param {Function} options.onCancel - 취소 버튼 클릭 시 호출되는 콜백 (선택사항) + */ + showChangeRole: function (options) { + options = options || {}; + + const userName = options.userName || ''; + const userEmail = options.userEmail || ''; + const userId = options.userId; + const onConfirm = options.onConfirm; + const onCancel = options.onCancel; + + // 사용자 정보 설정 + $('#changeRoleUserName').text(userName); + $('#changeRoleUserEmail').text(userEmail ? `(${userEmail})` : ''); + + // 팝업 표시 (modal 구조 사용) + $('#changeRolePopup').show(); + setTimeout(function() { + $('#changeRoleModalBackdrop').addClass('show'); + $('#changeRoleModal').addClass('show'); + }, 10); + + // Body 스크롤 방지 + $('body').css('overflow', 'hidden'); + + // 확인 버튼 이벤트 (기존 이벤트 제거 후 재등록) + $('#changeRolePopupConfirmButton').off('click').on('click', function () { + if (typeof onConfirm === 'function') { + onConfirm(userId); + } + }); + + // 취소 버튼 이벤트 + $('#changeRolePopupCancelButton').off('click').on('click', function () { + customPopups.hideChangeRole(); + if (typeof onCancel === 'function') { + onCancel(); + } + }); + + // 닫기 버튼 이벤트 + $('#changeRolePopupCloseButton').off('click').on('click', function () { + customPopups.hideChangeRole(); + if (typeof onCancel === 'function') { + onCancel(); + } + }); + + // Escape 키 이벤트 + $(document).off('keydown.changeRole').on('keydown.changeRole', function (e) { + if (e.key === 'Escape') { + customPopups.hideChangeRole(); + if (typeof onCancel === 'function') { + onCancel(); + } + } + }); + }, + + /** + * 권한 변경 팝업 숨기기 + */ + hideChangeRole: function () { + // Modal 숨김 애니메이션 + $('#changeRoleModalBackdrop').removeClass('show'); + $('#changeRoleModal').removeClass('show'); + + // 애니메이션 완료 후 숨김 + setTimeout(function() { + $('#changeRolePopup').hide(); + }, 300); + + // Body 스크롤 복원 + $('body').css('overflow', ''); + + // 이벤트 리스너 제거 + $('#changeRolePopupConfirmButton').off('click'); + $('#changeRolePopupCancelButton').off('click'); + $('#changeRolePopupCloseButton').off('click'); + $(document).off('keydown.changeRole'); + }, + init: function () { - // customAlert 팝업의 닫기 버튼에 이벤트 리스너 추가 - $('#customAlertOkButton, #customAlert .btn_close').on('click', function () { - customPopups.hideAlert('#customAlert'); - }); - - // customConfirm 팝업의 닫기 버튼에 이벤트 리스너 추가 - $('#customConfirmNoButton').on('click', function () { - customPopups.hideAlert('#customConfirm'); - }); - // emailValidationPopup 팝업의 닫기 버튼에 이벤트 리스너 추가 $('#emailValidationPopupCloseButton').on('click', function () { $('#emailValidationPopup').hide(); @@ -81,11 +550,13 @@ const customPopups = { $('#emailResend').hide(); }); - // 다른 팝업의 닫기 버튼에 이벤트 리스너 추가 - $('.btn_close:not(#customAlert .btn_close)').on('click', function () { - $(this).closest('.popup_total').hide(); + // 다른 팝업의 닫기 버튼에 이벤트 리스너 추가 (modernized popups 제외) + $('.btn_close').on('click', function () { + const $popup = $(this).closest('.popup_total'); + if ($popup.length) { + $popup.hide(); + } }); - } }; diff --git a/src/main/resources/static/plugins/swaggerUI/index.css b/src/main/resources/static/plugins/swaggerUI/index.css index a08298f..3202501 100644 --- a/src/main/resources/static/plugins/swaggerUI/index.css +++ b/src/main/resources/static/plugins/swaggerUI/index.css @@ -12,5 +12,4 @@ html { body { margin: 0; - background: #fafafa; } diff --git a/src/main/resources/static/sass/abstracts/_mixins.scss b/src/main/resources/static/sass/abstracts/_mixins.scss index 9ce7bcc..4a25c3c 100644 --- a/src/main/resources/static/sass/abstracts/_mixins.scss +++ b/src/main/resources/static/sass/abstracts/_mixins.scss @@ -61,7 +61,7 @@ transition: $transition-base; &:hover { - transform: translateY(-5px); + //transform: translateY(-5px); box-shadow: $shadow-lg; } } @@ -141,4 +141,4 @@ border-radius: 50%; opacity: 0.1; position: absolute; -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/abstracts/_variables.scss b/src/main/resources/static/sass/abstracts/_variables.scss index 2cce307..d380a09 100644 --- a/src/main/resources/static/sass/abstracts/_variables.scss +++ b/src/main/resources/static/sass/abstracts/_variables.scss @@ -5,14 +5,16 @@ // Color Palette - Vibrant and Modern // Primary colors -$primary-blue: #4B9BFF; // Bright blue (main brand color) -$secondary-blue: #2E7FF7; // Deep blue +$primary-blue: #0049b4; // 광주은행 블루 +$secondary-blue: #c3dfea; // Deep blue $accent-cyan: #00D4FF; // Sky blue accent $accent-yellow: #FFD93D; // Yellow accent $accent-orange: #FF6B6B; // Orange accent $accent-green: #6BCF7F; // Green accent $accent-purple: #A78BFA; // Purple accent +$main-bg: #EDF9FE; + // Neutral colors $text-dark: #1A1A2E; // Main text color $text-gray: #64748B; // Secondary text @@ -25,10 +27,6 @@ $black: #000000; // Pure black $gray-800: #1F2937; // Dark gray $gray-900: #111827; // Darker gray -// Gradients -$gradient-primary: linear-gradient(135deg, $primary-blue 0%, $secondary-blue 100%); -$gradient-accent: linear-gradient(135deg, $accent-cyan 0%, $primary-blue 100%); -$gradient-warm: linear-gradient(135deg, $accent-yellow 0%, $accent-orange 100%); // Shadows $shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05); @@ -118,4 +116,4 @@ $button-padding-y: 16px; $card-padding: 32px; $input-padding-x: 16px; $input-padding-y: 12px; -$input-height: 48px; \ No newline at end of file +$input-height: 48px; diff --git a/src/main/resources/static/sass/base/_animations.scss b/src/main/resources/static/sass/base/_animations.scss index b61b61a..36d4709 100644 --- a/src/main/resources/static/sass/base/_animations.scss +++ b/src/main/resources/static/sass/base/_animations.scss @@ -313,12 +313,6 @@ left: -50%; width: 200%; height: 200%; - background: linear-gradient( - 45deg, - transparent 30%, - rgba(255, 255, 255, 0.2) 50%, - transparent 70% - ); transform: rotate(45deg); transition: transform 0.6s ease; transform: translateX(-200%); @@ -327,4 +321,4 @@ &:hover::before { transform: translateX(200%) rotate(45deg); } -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/base/_typography.scss b/src/main/resources/static/sass/base/_typography.scss index 5a6f5c7..c405da1 100644 --- a/src/main/resources/static/sass/base/_typography.scss +++ b/src/main/resources/static/sass/base/_typography.scss @@ -76,19 +76,6 @@ p { } } -// Text utilities -.text-gradient { - @include gradient-text($gradient-primary); -} - -.text-gradient-accent { - @include gradient-text($gradient-accent); -} - -.text-gradient-warm { - @include gradient-text($gradient-warm); -} - .text-primary { color: $primary-blue; } @@ -216,4 +203,4 @@ hr { border: none; border-top: 1px solid $border-gray; margin: $spacing-xl 0; -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/base/_utilities.scss b/src/main/resources/static/sass/base/_utilities.scss index c8ce4ab..ad4a661 100644 --- a/src/main/resources/static/sass/base/_utilities.scss +++ b/src/main/resources/static/sass/base/_utilities.scss @@ -280,16 +280,9 @@ } .bg-gradient-primary { - background: $gradient-primary; + } -.bg-gradient-accent { - background: $gradient-accent; -} - -.bg-gradient-warm { - background: $gradient-warm; -} // Border utilities .border { @@ -494,4 +487,21 @@ .transition-none { transition: none; -} \ No newline at end of file +} + +// Accessibility utilities +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only { + @extend .visually-hidden; +} diff --git a/src/main/resources/static/sass/components/_accordion.scss b/src/main/resources/static/sass/components/_accordion.scss new file mode 100644 index 0000000..0116ec1 --- /dev/null +++ b/src/main/resources/static/sass/components/_accordion.scss @@ -0,0 +1,296 @@ +// ----------------------------------------------------------------------------- +// Accordion Component - FAQ and Collapsible Sections +// Figma Design: node 984-2146 +// ----------------------------------------------------------------------------- + +// FAQ Accordion - Figma Design +.faq-accordion { + background: #F6F9FB; + border-radius: $border-radius-lg; + overflow: hidden; + margin-bottom: $spacing-2xl; + + .faq-item { + border-bottom: 1px solid #DADADA; + transition: $transition-base; + + &:last-child { + border-bottom: none; + } + + // Active state - when accordion is open + &.active { + .faq-question { + .faq-icon { + transform: rotate(180deg); + } + } + + .faq-answer { + display: block; + animation: slideDown 0.3s ease; + } + } + } + + // Question row - Figma: 18px bold, #212529 + .faq-question { + display: flex; + align-items: center; + justify-content: space-between; + padding: $spacing-lg 20px; + font-size: 18px; + font-weight: $font-weight-bold; + color: #212529; + cursor: pointer; + transition: $transition-base; + gap: 95px; + min-height: 54px; + + @media (max-width: $breakpoint-md) { + padding: $spacing-md $spacing-lg; + font-size: 16px; + gap: $spacing-lg; + } + + &:hover { + background: rgba($primary-blue, 0.02); + } + + .faq-question-text { + flex: 1; + line-height: $line-height-normal; + } + + // Chevron icon + .faq-icon { + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + color: #212529; + transition: transform 0.3s ease; + + svg { + width: 14px; + height: 8px; + } + } + } + + // Answer section - white background + .faq-answer { + display: none; + background: #F6F9FB; + padding: $spacing-lg 20px $spacing-xl; + border-top: none; + + @media (max-width: $breakpoint-md) { + padding: $spacing-md $spacing-lg $spacing-lg; + } + + .faq-answer-content { + font-size: 18px; + font-weight: $font-weight-regular; + color: #515151; + background-color: #ffffff; + padding: $spacing-lg; + line-height: $line-height-loose; + + @media (max-width: $breakpoint-md) { + font-size: 14px; + } + + // Content formatting + p { + margin-bottom: $spacing-md; + + &:last-child { + margin-bottom: 0; + } + } + + ul, ol { + margin: $spacing-sm 0; + padding-left: $spacing-lg; + } + + li { + margin-bottom: $spacing-xs; + } + + a { + color: $primary-blue; + text-decoration: underline; + + &:hover { + color: $secondary-blue; + } + } + + code { + background: $gray-bg; + padding: 2px 6px; + border-radius: $border-radius-sm; + font-family: $font-family-mono; + font-size: 0.9em; + color: $primary-blue; + } + + pre { + background: $gray-bg; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + padding: $spacing-md; + overflow-x: auto; + margin: $spacing-md 0; + + code { + background: transparent; + padding: 0; + color: $text-dark; + } + } + } + } +} + +// FAQ Page specific styles (legacy - for backward compatibility) +.faq-page { + min-height: calc(100vh - 140px); + background: $gray-bg; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-md; + } +} + +.faq-container { + max-width: $container-max-width; + margin: 0 auto; +} + +.faq-header { + margin-bottom: $spacing-3xl; + + @media (max-width: $breakpoint-sm) { + margin-bottom: $spacing-2xl; + } + + .page-title { + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-md; + + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-2xl; + } + } + + .page-description { + font-size: $font-size-base; + color: $text-gray; + line-height: $line-height-normal; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } +} + +// Slide down animation +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +// Generic accordion (for reuse) +.accordion { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-sm; + overflow: hidden; + + .accordion-item { + border-bottom: 1px solid $border-gray; + + &:last-child { + border-bottom: none; + } + + &.active { + .accordion-header { + background: rgba($primary-blue, 0.03); + color: $primary-blue; + + .accordion-icon { + transform: rotate(180deg); + } + } + } + } + + .accordion-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: $spacing-lg $spacing-xl; + font-size: $font-size-base; + font-weight: $font-weight-medium; + color: $text-dark; + cursor: pointer; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + font-size: $font-size-sm; + } + + &:hover { + background: rgba($primary-blue, 0.02); + } + + .accordion-title { + flex: 1; + } + + .accordion-icon { + flex-shrink: 0; + font-size: 20px; + color: $text-gray; + transition: $transition-base; + } + } + + .accordion-content { + display: none; + padding: $spacing-lg $spacing-xl; + font-size: $font-size-sm; + color: $text-gray; + line-height: $line-height-normal; + border-top: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + } + + &.show { + display: block; + animation: slideDown 0.3s ease; + } + } +} diff --git a/src/main/resources/static/sass/components/_alerts.scss b/src/main/resources/static/sass/components/_alerts.scss new file mode 100644 index 0000000..d904152 --- /dev/null +++ b/src/main/resources/static/sass/components/_alerts.scss @@ -0,0 +1,66 @@ +// ----------------------------------------------------------------------------- +// Alert Components +// Used in: Form validation, system messages, notifications +// ----------------------------------------------------------------------------- + +.alert { + display: flex; + align-items: flex-start; + gap: $spacing-md; + padding: $spacing-md $spacing-lg; + border-radius: $border-radius-md; + margin-bottom: $spacing-xl; + + .alert-icon { + font-size: 20px; + flex-shrink: 0; + } + + .alert-content { + flex: 1; + text-align: left; + + strong { + font-weight: $font-weight-semibold; + } + } + + // Warning alert - yellow/amber style + &.alert-warning { + background: rgba($accent-yellow, 0.1); + border: 1px solid rgba($accent-yellow, 0.3); + color: #B89900; + } + + // Error alert - red/orange style + &.alert-error { + background: rgba($accent-orange, 0.1); + border: 1px solid rgba($accent-orange, 0.3); + color: darken($accent-orange, 10%); + align-items: center; + + svg { + flex-shrink: 0; + } + + span { + flex: 1; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + } + } + + // Success alert - green style + &.alert-success { + background: rgba($accent-green, 0.1); + border: 1px solid rgba($accent-green, 0.3); + color: darken($accent-green, 20%); + } + + // Info alert - blue style + &.alert-info { + background: rgba($primary-blue, 0.1); + border: 1px solid rgba($primary-blue, 0.3); + color: $secondary-blue; + } +} diff --git a/src/main/resources/static/sass/components/_apikey-common.scss b/src/main/resources/static/sass/components/_apikey-common.scss new file mode 100644 index 0000000..640f1df --- /dev/null +++ b/src/main/resources/static/sass/components/_apikey-common.scss @@ -0,0 +1,575 @@ +@charset "utf-8"; + +// ============================================================================= +// API Key Common Styles +// Shared styles across apikey-list, apikey-detail, apikey-register pages +// ============================================================================= + +// ----------------------------------------------------------------------------- +// Common Variables +// ----------------------------------------------------------------------------- +$apikey-bg-color: #f6f9fb; +$apikey-primary-blue: #0049b4; +$apikey-secondary-blue: #3ba4ed; +$apikey-text-secondary: #6e7780; +$apikey-text-dark: #212529; +$apikey-border-color: #dadada; + +// ----------------------------------------------------------------------------- +// Common Container +// ----------------------------------------------------------------------------- +.common-container { + max-width: $container-max-width; + margin: 0 auto; + padding: 60px $spacing-lg 80px; + + @include respond-to('sm') { + padding: 40px $spacing-md 60px; + } +} + +// ----------------------------------------------------------------------------- +// Common Section Box (Background container) +// ----------------------------------------------------------------------------- +.common-section-box { + background-color: $apikey-bg-color; + border-radius: $border-radius-lg; + padding: 30px 45px; + + @include respond-to('sm') { + padding: $spacing-lg; + } +} + +// ----------------------------------------------------------------------------- +// Common Title Bar +// ----------------------------------------------------------------------------- +.common-title-bar { + background-color: $apikey-bg-color; + border-radius: $border-radius-lg; + padding: 14px 45px; + margin-bottom: 30px; + + @include respond-to('sm') { + padding: 12px $spacing-lg; + } + + .common-title { + font-family: $font-family-primary; + font-size: 28px; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0; + + @include respond-to('sm') { + font-size: 22px; + } + } + + &--simple { + background: none; + padding: 0 0 $spacing-md 0; + border-radius: 0; + border-bottom: 2px solid #212529; + margin-bottom: $spacing-xl; + + h3 { + font-size: 22px; + font-weight: $font-weight-bold; + color: #212529; + margin: 0; + } + + .required-badge { + display: none; + } + } + + .common-subtitle { + font-size: 16px; + font-weight: $font-weight-regular; + color: #515151; + + @include respond-to('sm') { + font-size: 14px; + } + } +} + +// ----------------------------------------------------------------------------- +// Common Status Badge +// ----------------------------------------------------------------------------- +.apikey-status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 5px 14px; + border-radius: 40px; + font-family: $font-family-primary; + font-size: 13px; + font-weight: $font-weight-bold; + color: $white; + white-space: nowrap; + + &.status-pending { + background-color: #8c959f; + } + + &.status-approved, + &.status-active { + background-color: $apikey-primary-blue; + } + + &.status-changing { + background-color: #88a5f3; + } + + &.status-inactive, + &.status-rejected { + background-color: #dc3545; + } + + // Alternative light style (for detail pages) + &.status-light { + &.status-pending { + background-color: #FFF3CD; + color: #856404; + } + + &.status-approved, + &.status-active { + background-color: #D4EDDA; + color: #155724; + } + + &.status-rejected, + &.status-inactive { + background-color: #F8D7DA; + color: #721C24; + } + } +} + +// ----------------------------------------------------------------------------- +// Common Status Indicator (with dot) +// ----------------------------------------------------------------------------- +.apikey-status-indicator { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-xl; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + + .status-dot { + width: 8px; + height: 8px; + border-radius: $border-radius-circle; + background-color: currentColor; + } + + &.status-active { + background-color: #D4EDDA; + color: #155724; + } + + &.status-inactive { + background-color: #F8D7DA; + color: #721C24; + } +} + +// ----------------------------------------------------------------------------- +// Common App Icon +// ----------------------------------------------------------------------------- +.apikey-icon-display { + width: 120px; + height: 120px; + + &.icon-sm { + width: 70px; + height: 70px; + + @include respond-to('sm') { + width: 60px; + height: 60px; + } + } + + &.icon-md { + width: 100px; + height: 100px; + } +} + +.apikey-icon-image { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: $border-radius-lg; + border: 2px solid $border-gray; +} + +.apikey-icon-placeholder { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background-color: #e9ecef; + border-radius: $border-radius-lg; + color: #868e96; + font-size: 48px; + + &.placeholder-sm { + font-size: 24px; + } +} + +// ----------------------------------------------------------------------------- +// Common Empty State +// ----------------------------------------------------------------------------- +.apikey-empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 80px $spacing-lg; + text-align: center; + + .empty-icon { + font-size: 64px; + margin-bottom: $spacing-lg; + opacity: 0.5; + } + + h3 { + font-family: $font-family-primary; + font-size: $font-size-xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0 0 $spacing-md; + } + + p { + font-family: $font-family-primary; + font-size: $font-size-base; + color: $apikey-text-secondary; + margin: 0; + } +} + +// ----------------------------------------------------------------------------- +// Common Action Button +// ----------------------------------------------------------------------------- +.apikey-action-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 220px; + height: 60px; + border: none; + border-radius: $border-radius-lg; + font-family: $font-family-primary; + font-size: 18px; + font-weight: $font-weight-bold; + cursor: pointer; + text-decoration: none; + transition: background-color 0.2s ease, transform 0.2s ease; + + &:hover { + transform: translateY(-2px); + } + + &:active { + transform: translateY(0); + } + + &.btn-primary { + background-color: $apikey-primary-blue; + color: $white; + + &:hover { + background-color: #003a91; + } + } + + &.btn-secondary { + background-color: #e5e7eb; + color: #5f666c; + + &:hover { + background-color: #d1d5db; + } + } + + &.btn-accent { + background-color: $apikey-secondary-blue; + color: $white; + + &:hover { + background-color: #2b94dd; + } + } + + @include respond-to('sm') { + width: 100%; + max-width: 300px; + height: 54px; + font-size: $font-size-base; + } +} + +// ----------------------------------------------------------------------------- +// Common Copy Button +// ----------------------------------------------------------------------------- +.apikey-btn-copy { + display: inline-flex; + align-items: center; + gap: $spacing-xs; + padding: 6px 12px; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + color: $text-dark; + cursor: pointer; + transition: $transition-base; + + svg { + width: 16px; + height: 16px; + } + + &:hover { + background: $primary-blue; + border-color: $primary-blue; + color: $white; + } + + @media (max-width: $breakpoint-sm) { + align-self: stretch; + justify-content: center; + } +} + +// ----------------------------------------------------------------------------- +// Common Detail Section +// ----------------------------------------------------------------------------- +.apikey-detail-section { + background: $white; + border-radius: $border-radius-lg; + padding: $spacing-4xl; + margin-bottom: $spacing-lg; + box-shadow: $shadow-md; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-xl; + } + + .section-title { + font-size: $font-size-xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-lg; + padding-bottom: $spacing-md; + } +} + +// ----------------------------------------------------------------------------- +// Common Detail Grid +// ----------------------------------------------------------------------------- +.apikey-detail-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + grid-template-columns: 1fr; + } +} + +.apikey-detail-item { + display: flex; + flex-direction: column; + gap: $spacing-sm; + + &.full-width { + grid-column: 1 / -1; + } + + .detail-label { + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-gray; + } + + .detail-value { + font-size: $font-size-base; + color: $text-dark; + word-break: break-word; + } +} + +// ----------------------------------------------------------------------------- +// Common IP Tag +// ----------------------------------------------------------------------------- +.apikey-ip-list { + display: flex; + flex-wrap: wrap; + gap: $spacing-sm; +} + +.apikey-ip-tag { + display: inline-block; + padding: $spacing-xs $spacing-md; + background-color: $light-bg; + color: $secondary-blue; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + font-family: $font-family-mono; +} + +// ----------------------------------------------------------------------------- +// Common Credential Code +// ----------------------------------------------------------------------------- +.apikey-credential-code { + display: inline-block; + padding: $spacing-sm $spacing-md; + background-color: $gray-bg; + border: 1px solid $border-gray; + border-radius: $border-radius-sm; + font-family: $font-family-mono; + font-size: $font-size-sm; + color: $secondary-blue; +} + +// ----------------------------------------------------------------------------- +// Common Secret Box +// ----------------------------------------------------------------------------- +.apikey-secret-box { + display: flex; + align-items: center; + gap: $spacing-md; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: flex-start; + } +} + +// ----------------------------------------------------------------------------- +// Common API List Item +// ----------------------------------------------------------------------------- +.apikey-api-list { + display: flex; + flex-direction: column; + gap: $spacing-sm; +} + +.apikey-api-item { + display: flex; + align-items: center; + gap: $spacing-md; + padding: $spacing-md $spacing-lg; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + transition: all 0.2s; + + &:hover { + border-color: $primary-blue; + box-shadow: $shadow-sm; + } + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md; + gap: $spacing-sm; + } + + .api-method { + display: inline-block; + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + font-weight: $font-weight-bold; + font-family: $font-family-mono; + min-width: 80px; + text-align: center; + + &.method-get { + background-color: #D1FAE5; + color: #065F46; + } + + &.method-post { + background-color: #DBEAFE; + color: #1E40AF; + } + + &.method-put { + background-color: #FEF3C7; + color: #92400E; + } + + &.method-delete { + background-color: #FEE2E2; + color: #991B1B; + } + + &.method-other { + background-color: $border-gray; + color: $text-dark; + } + } + + .api-name { + flex: 1; + font-size: $font-size-base; + font-weight: $font-weight-medium; + color: $text-dark; + margin: 0; + } + + .api-status { + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-lg; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + + &.status-pending { + background-color: #FFF3CD; + color: #856404; + } + + &.status-active { + background-color: #D4EDDA; + color: #155724; + } + } +} + +// ----------------------------------------------------------------------------- +// Common Form Actions +// ----------------------------------------------------------------------------- +.apikey-form-actions { + display: flex; + justify-content: center; + gap: $spacing-md; + flex-wrap: wrap; + margin-top: $spacing-4xl; + padding-top: $spacing-4xl; + border-top: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + } + + .btn { + @media (max-width: $breakpoint-sm) { + width: 100%; + } + } +} diff --git a/src/main/resources/static/sass/components/_badges.scss b/src/main/resources/static/sass/components/_badges.scss new file mode 100644 index 0000000..69e5a99 --- /dev/null +++ b/src/main/resources/static/sass/components/_badges.scss @@ -0,0 +1,171 @@ +// ----------------------------------------------------------------------------- +// Badge Component Styles - Status badges and labels +// ----------------------------------------------------------------------------- + +// Base status badge +.status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-full; + font-size: $font-size-xs; + font-weight: $font-weight-semibold; + white-space: nowrap; + transition: $transition-base; + + // Status variants + &.status-pending { + background: rgba($accent-orange, 0.1); + color: $accent-orange; + } + + &.status-completed { + background: rgba($accent-green, 0.1); + color: $accent-green; + } + + &.status-active { + background: rgba($primary-blue, 0.1); + color: $primary-blue; + } + + &.status-inactive { + background: rgba($text-gray, 0.1); + color: $text-gray; + } + + &.status-processing { + background: rgba($accent-yellow, 0.1); + color: darken($accent-yellow, 30%); + } + + &.status-failed { + background: rgba($accent-orange, 0.1); + color: $accent-orange; + } + + &.status-success { + background: rgba($accent-green, 0.1); + color: $accent-green; + } +} + +// Header variant (larger, with margin) +.status-badge-header { + display: inline-flex; + align-items: center; + justify-content: center; + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-full; + font-size: $font-size-xs; + font-weight: $font-weight-semibold; + margin-bottom: $spacing-md; + transition: $transition-base; + + &.status-pending { + background: rgba($accent-orange, 0.1); + color: $accent-orange; + } + + &.status-completed { + background: rgba($accent-green, 0.1); + color: $accent-green; + } + + &.status-active { + background: rgba($primary-blue, 0.1); + color: $primary-blue; + } + + &.status-inactive { + background: rgba($text-gray, 0.1); + color: $text-gray; + } + + &.status-processing { + background: rgba($accent-yellow, 0.1); + color: darken($accent-yellow, 30%); + } +} + +// Small badge variant +.badge-sm { + padding: 2px $spacing-sm; + font-size: 10px; + border-radius: $border-radius-sm; +} + +// Large badge variant +.badge-lg { + padding: $spacing-sm $spacing-lg; + font-size: $font-size-sm; + border-radius: $border-radius-md; +} + +// Outline badge variant +.badge-outline { + background: transparent; + border: 1px solid currentColor; + + &.status-pending { + color: $accent-orange; + border-color: $accent-orange; + } + + &.status-completed { + color: $accent-green; + border-color: $accent-green; + } + + &.status-active { + color: $primary-blue; + border-color: $primary-blue; + } + + &.status-inactive { + color: $text-gray; + border-color: $text-gray; + } +} + +// Badge with icon +.badge-icon { + i { + margin-right: $spacing-xs; + font-size: 0.9em; + } +} + +// Notification badge (for counts) +.notification-badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 20px; + height: 20px; + padding: 0 $spacing-xs; + background: $accent-orange; + color: $white; + border-radius: $border-radius-circle; + font-size: 11px; + font-weight: $font-weight-bold; + line-height: 1; + + &.badge-primary { + background: $primary-blue; + } + + &.badge-success { + background: $accent-green; + } + + &.badge-warning { + background: $accent-yellow; + color: $text-dark; + } + + &.badge-danger { + background: $accent-orange; + } +} diff --git a/src/main/resources/static/sass/components/_buttons.scss b/src/main/resources/static/sass/components/_buttons.scss index 36de4c5..32092b5 100644 --- a/src/main/resources/static/sass/components/_buttons.scss +++ b/src/main/resources/static/sass/components/_buttons.scss @@ -31,7 +31,7 @@ // Button variants &-primary { - background: $gradient-primary; + background: $primary-blue; color: $white; box-shadow: $shadow-md; @@ -46,9 +46,8 @@ } &-secondary { - background: $white; - color: $primary-blue; - border: 2px solid $primary-blue; + background: #E5E7EB; + color: #5F666C; &:hover { background: $light-bg; @@ -57,7 +56,6 @@ } &-accent { - background: $gradient-accent; color: $white; box-shadow: $shadow-md; @@ -68,7 +66,6 @@ } &-warm { - background: $gradient-warm; color: $white; box-shadow: $shadow-md; @@ -201,7 +198,7 @@ right: $spacing-xl; width: 60px; height: 60px; - background: $gradient-primary; + border: none; border-radius: $border-radius-circle; color: $white; @@ -268,4 +265,307 @@ transform: translateY(-3px); } } -} \ No newline at end of file +} + +// ----------------------------------------------------------------------------- +// Action Buttons - Unified button system for all pages +// ----------------------------------------------------------------------------- + +// Base action button styles +.action-btn, +.action-btn-new, +.action-btn-primary, +.action-btn-secondary, +.action-btn-edit, +.action-btn-delete { + padding: $spacing-md $spacing-2xl; + border-radius: $border-radius-md; + font-size: $font-size-base; + font-weight: $font-weight-medium; + text-decoration: none; + transition: $transition-base; + display: inline-flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + cursor: pointer; + border: none; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + font-size: $font-size-sm; + } + + i { + font-size: 16px; + } +} + +// Primary action buttons (new, submit, confirm) +.action-btn-new, +.action-btn-primary { + + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + + &:active { + transform: translateY(0); + } +} + +// Secondary action button (cancel, back, list) +.action-btn-secondary { + background: $white; + color: $text-dark; + border: 1px solid $border-gray; + + &:hover { + background: $gray-bg; + border-color: $primary-blue; + color: $primary-blue; + } + + &:active { + transform: scale(0.98); + } +} + +// Edit button +.action-btn-edit { + background: $primary-blue; + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + background: $secondary-blue; + } + + &:active { + transform: translateY(0); + } +} + +// Delete button +.action-btn-delete { + background: $accent-orange; + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + background: darken($accent-orange, 5%); + } + + &:active { + transform: translateY(0); + } +} + +// Notice page specific button variants +.action-btn { + &.btn-list { + background: $white; + color: $text-dark; + border: 1px solid $border-gray; + + &:hover { + background: $gray-bg; + border-color: $primary-blue; + color: $primary-blue; + } + } + + &.btn-edit { + + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + } + + &.btn-delete { + background: $accent-orange; + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + } +} + +// API Key page specific buttons +.btn-copy { + padding: $spacing-sm $spacing-md; + background: rgba($primary-blue, 0.1); + color: $primary-blue; + border: 1px solid rgba($primary-blue, 0.2); + border-radius: $border-radius-sm; + font-size: $font-size-xs; + font-weight: $font-weight-medium; + cursor: pointer; + transition: $transition-base; + display: inline-flex; + align-items: center; + gap: $spacing-xs; + + &:hover { + background: rgba($primary-blue, 0.2); + border-color: $primary-blue; + } + + i { + font-size: 12px; + } +} + +.btn-action { + padding: $spacing-sm $spacing-lg; + + color: $white; + border: none; + border-radius: $border-radius-md; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + cursor: pointer; + transition: $transition-base; + display: inline-flex; + align-items: center; + gap: $spacing-xs; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + + i { + font-size: 14px; + } +} + +.btn-cancel { + padding: $spacing-sm $spacing-lg; + background: $white; + color: $text-gray; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + cursor: pointer; + transition: $transition-base; + display: inline-flex; + align-items: center; + gap: $spacing-xs; + + &:hover { + border-color: $primary-blue; + color: $primary-blue; + } + + i { + font-size: 14px; + } +} + +// ----------------------------------------------------------------------------- +// Input Action Button - Figma Design (node 985:1649) +// Button at the end of input field (변경, 인증번호 받기, etc.) +// ----------------------------------------------------------------------------- +.btn-input-action { + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 172px; + height: 60px; + padding: 10px $spacing-lg; + border: none; + border-radius: $border-radius-lg; + font-size: $font-size-lg; + font-weight: $font-weight-bold; + color: $white; + cursor: pointer; + transition: $transition-base; + white-space: nowrap; + + // "변경" button style - light blue (#a4d6ea) + &.btn-change { + background: #a4d6ea; + + &:hover { + background: darken(#a4d6ea, 10%); + transform: translateY(-2px); + box-shadow: $shadow-md; + } + + &:active { + transform: translateY(0); + } + } + + // "인증번호 받기/확인" button style - primary blue + &.btn-auth { + background: #A4D6EA; + + &:hover { + background: $secondary-blue; + transform: translateY(-2px); + box-shadow: $shadow-md; + } + + &:active { + transform: translateY(0); + } + + &:disabled { + background: $border-gray; + cursor: not-allowed; + transform: none; + box-shadow: none; + } + } + + @media (max-width: $breakpoint-sm) { + width: 100%; + min-width: auto; + height: 52px; + font-size: $font-size-base; + } +} + +// ----------------------------------------------------------------------------- +// Upload Button - File upload trigger button +// Used in: Icon upload, file attachment areas +// ----------------------------------------------------------------------------- +.btn-upload { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + height: 60px; + padding: 10px 24px; + background-color: #3ba4ed; + color: $white; + border: none; + border-radius: $border-radius-lg; + font-size: 18px; + font-weight: $font-weight-bold; + cursor: pointer; + transition: background-color 0.2s ease; + + &:hover { + background-color: #2b94dd; + } + + @include respond-to('md') { + font-size: 16px; + height: 50px; + } +} diff --git a/src/main/resources/static/sass/components/_cards.scss b/src/main/resources/static/sass/components/_cards.scss index 4470c8d..57b5993 100644 --- a/src/main/resources/static/sass/components/_cards.scss +++ b/src/main/resources/static/sass/components/_cards.scss @@ -7,30 +7,6 @@ @include card; position: relative; overflow: hidden; - - // Card hover effect - &::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient( - 45deg, - transparent 30%, - rgba($primary-blue, 0.03) 50%, - transparent 70% - ); - transform: rotate(45deg); - transition: $transition-slow; - opacity: 0; - } - - &:hover::before { - animation: shimmer 0.6s ease; - opacity: 1; - } } // API showcase cards @@ -41,19 +17,17 @@ &:hover { border-color: $primary-blue; - transform: translateY(-8px); + //transform: translateY(-8px); } // Popular variant &-popular { border-color: $accent-yellow; - background: linear-gradient(180deg, rgba($accent-yellow, 0.05) 0%, $white 100%); } // New variant &-new { border-color: $accent-green; - background: linear-gradient(180deg, rgba($accent-green, 0.05) 0%, $white 100%); } // API badge @@ -95,7 +69,7 @@ &:hover .api-icon { transform: scale(1.1); - background: $gradient-primary; + color: $white; } @@ -160,7 +134,7 @@ margin: 0 auto $spacing-lg; @include flex-center; font-size: $font-size-xl; - background: $gradient-primary; + color: $white; border-radius: $border-radius-xl; } @@ -213,7 +187,7 @@ width: 48px; height: 48px; @include flex-center; - background: $gradient-primary; + color: $white; border-radius: $border-radius-lg; font-size: $font-size-xl; @@ -306,7 +280,7 @@ left: 50%; transform: translateX(-50%); padding: $spacing-xs $spacing-md; - background: $gradient-primary; + color: $white; border-radius: $border-radius-full; font-size: $font-size-xs; @@ -341,7 +315,6 @@ .amount { font-size: $font-size-4xl; font-weight: $font-weight-extrabold; - @include gradient-text($gradient-primary); } .period { @@ -383,4 +356,4 @@ .pricing-cta { margin-top: auto; } -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/components/_cta.scss b/src/main/resources/static/sass/components/_cta.scss index c1486f2..1fc3d93 100644 --- a/src/main/resources/static/sass/components/_cta.scss +++ b/src/main/resources/static/sass/components/_cta.scss @@ -5,6 +5,6 @@ .final-cta { position: relative; padding: $spacing-6xl * 1.5 0; - background: $gradient-primary; + overflow: hidden; -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/components/_forms.scss b/src/main/resources/static/sass/components/_forms.scss index 5ae7173..1fe0e99 100644 --- a/src/main/resources/static/sass/components/_forms.scss +++ b/src/main/resources/static/sass/components/_forms.scss @@ -237,4 +237,606 @@ select.form-control { @include respond-to('sm') { grid-template-columns: 1fr; } -} \ No newline at end of file +} + +// ----------------------------------------------------------------------------- +// File Upload Component +// ----------------------------------------------------------------------------- + +// File upload field wrapper +.file-upload-wrapper { + display: flex; + gap: $spacing-md; + align-items: center; + width: 100%; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + } + + // File name display input + .file-name-display { + flex: 1; + padding: $spacing-md; + background: $gray-bg; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-sm; + color: $text-gray; + cursor: default; + transition: $transition-base; + + &.has-file { + color: $text-dark; + background: rgba($primary-blue, 0.05); + border-color: $primary-blue; + } + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + } + + // File upload button (label) + .file-upload-btn { + padding: $spacing-md $spacing-lg; + + color: $white; + border-radius: $border-radius-md; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + cursor: pointer; + transition: $transition-base; + white-space: nowrap; + display: inline-flex; + align-items: center; + gap: $spacing-xs; + border: none; + + @media (max-width: $breakpoint-sm) { + justify-content: center; + } + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + + &:active { + transform: translateY(0); + } + + i { + font-size: 14px; + } + } + + // File remove button + .file-remove-btn { + padding: $spacing-md; + background: $accent-orange; + color: $white; + border-radius: $border-radius-md; + border: none; + cursor: pointer; + transition: $transition-base; + display: inline-flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + + @media (max-width: $breakpoint-sm) { + width: 100%; + height: auto; + padding: $spacing-md; + } + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + background: darken($accent-orange, 5%); + } + + &:active { + transform: translateY(0); + } + + i { + font-size: 14px; + } + } + + // Hidden file input + input[type="file"] { + display: none; + } +} + +// File help text +.form-help-text { + margin-top: $spacing-md; + font-size: $font-size-xs; + color: $text-light; + line-height: $line-height-normal; + + p { + margin: $spacing-xs 0; + display: flex; + align-items: flex-start; + gap: $spacing-xs; + + i { + color: $primary-blue; + margin-top: 2px; + flex-shrink: 0; + } + } +} + +// ----------------------------------------------------------------------------- +// Form Row Layout - Horizontal Label-Field Layout +// Used in: API Key registration, User profile forms +// ----------------------------------------------------------------------------- +.form-row { + display: flex; + align-items: flex-start; + gap: 40px; + margin-bottom: 50px; + + //&:last-child { + // margin-bottom: 0; + //} + + @include respond-to('md') { + flex-direction: column; + gap: 12px; + margin-bottom: 30px; + } +} + +.form-label-wrapper { + display: flex; + align-items: center; + gap: 5px; + min-width: 214px; + width: 214px; + flex-shrink: 0; + + @include respond-to('md') { + padding-top: 0; + width: auto; + } + + &.label-offset { + margin-top: 15px; + + @include respond-to('md') { + margin-top: 0; + } + } +} + +.form-label-text { + font-size: 20px; + font-weight: $font-weight-bold; + color: #000000; + + @include respond-to('md') { + font-size: 16px; + } + + // Required indicator (asterisk style) + &.required::after { + content: '*'; + color: $accent-orange; + margin-left: 4px; + } +} + +.required-badge { + background-color: #3ba4ed; + color: $white; + font-size: 11px; + font-weight: $font-weight-regular; + padding: 3px 4px 4px; + border-radius: 4px; + line-height: 1; +} + +.form-field-wrapper { + flex: 1; + @include respond-to('sm') { + width: 100%; + } +} + +// ----------------------------------------------------------------------------- +// Character Counter - Text input character count display +// ----------------------------------------------------------------------------- +.char-counter-wrapper { + display: block; + text-align: right; + margin-top: 8px; + + .char-counter { + font-size: 14px; + color: #94A3B8; + } +} + +// ----------------------------------------------------------------------------- +// Section Divider - Section separator with border +// Used for separating form sections (e.g., "법인 관리자 정보") +// ----------------------------------------------------------------------------- +.section-divider { + margin-top: $spacing-3xl; + padding-top: $spacing-xl; + border-top: 1px solid $border-gray; +} + +// ----------------------------------------------------------------------------- +// Compound Input - Multi-part input fields (phone numbers, registration numbers) +// Used in: updateCorporateManager.html, updateCorporateUser.html, etc. +// ----------------------------------------------------------------------------- +.compound-input { + display: flex; + align-items: center; + gap: $spacing-sm; + width: 100%; + + .form-input, + .form-select { + flex: 1; + min-width: 0; + } + + .separator { + color: $text-gray; + font-weight: $font-weight-semibold; + user-select: none; + flex-shrink: 0; + } + + // Phone number specific + .phone-number { + flex: 1; + width: 100%; + } + + // Business registration number specific + .biz-reg-number { + flex: 1; + width: 100%; + } + + @media (max-width: $breakpoint-sm) { + gap: $spacing-xs; + + .separator { + font-size: $font-size-sm; + } + } +} + +// ----------------------------------------------------------------------------- +// Input with Button Pattern - Figma Design (node 985:1546) +// Input field with action button at the end (e.g., phone number + "변경" button) +// ----------------------------------------------------------------------------- +.input-with-button { + display: flex; + align-items: center; + gap: $spacing-md; + + .compound-input, + .auth-input-group { + flex: 1; + } + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + gap: $spacing-sm; + + .compound-input, + .auth-input-group { + width: 100%; + } + } +} + +// ----------------------------------------------------------------------------- +// Auth Input Group - Input with timer for verification codes +// ----------------------------------------------------------------------------- +.auth-input-group { + display: flex; + align-items: center; + position: relative; + + .form-input { + flex: 1; + padding-right: 100px; // Space for timer + } + + .auth-timer { + position: absolute; + right: $spacing-md; + top: 50%; + transform: translateY(-50%); + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $accent-orange; + white-space: nowrap; + } +} + +// ----------------------------------------------------------------------------- +// Form Actions - Button container for form submissions +// Used in: Partnership, API Key registration, User profile forms +// ----------------------------------------------------------------------------- +.form-actions { + display: flex; + justify-content: center; + gap: $spacing-md; + flex-wrap: wrap; + padding-top: $spacing-2xl; + + @include respond-to('sm') { + flex-direction: column-reverse; + align-items: stretch; + gap: $spacing-sm; + margin-top: $spacing-3xl; + padding-top: $spacing-xl; + } + + // Button base styles + .btn, + .action-btn-primary, + .action-btn-secondary { + min-width: 160px; + padding: $spacing-md $spacing-2xl; + + @include respond-to('sm') { + width: 100%; + min-width: auto; + } + } + + // Modifier: space-between layout + &--between { + justify-content: space-between; + } + + // Modifier: no border top + &--no-border { + border-top: none; + padding-top: 0; + } + + // Modifier: compact spacing + &--compact { + margin-top: $spacing-2xl; + padding-top: $spacing-lg; + } + + // Modifier: with withdrawal link layout + // [회원탈퇴(좌측)] <-- 공백 --> [버튼][버튼](가운데)] + &--with-withdrawal { + position: relative; + justify-content: center; + + .withdrawal-link { + position: absolute; + left: 0; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 3px; + width: 150px; + padding: $spacing-sm; + background: #E5F2F8; + border-radius: $border-radius-lg; + color: #5F666C; + font-size: $font-size-base; + font-weight: $font-weight-regular; + text-decoration: none; + cursor: pointer; + transition: $transition-base; + + &:hover { + background: darken(#E5F2F8, 5%); + } + + img { + width: 22px; + height: 22px; + object-fit: contain; + } + + @include respond-to('sm') { + position: static; + width: 100%; + order: 1; + } + } + + .form-actions-buttons { + display: flex; + gap: $spacing-md; + + @include respond-to('sm') { + flex-direction: column-reverse; + width: 100%; + gap: $spacing-sm; + } + } + + @include respond-to('sm') { + flex-direction: column; + gap: $spacing-md; + } + } +} + +// Centered form actions (alias) +.form-actions-center { + @extend .form-actions; +} + +// ----------------------------------------------------------------------------- +// Search Field - Figma Design (node 1041:1670) +// Rounded search input with icon button +// ----------------------------------------------------------------------------- +.search-field { + position: relative; + display: flex; + align-items: center; + width: 340px; + height: 44px; + background: $white; + border: 1px solid #dadada; + border-radius: 12px; + overflow: hidden; + + @include respond-to('sm') { + width: 100%; + } + + input { + flex: 1; + height: 100%; + padding: 0 44px 0 16px; + border: none; + background: transparent; + font-family: $font-family-primary; + font-size: 14px; + font-weight: $font-weight-regular; + color: $text-dark; + outline: none; + + &::placeholder { + color: #8c959f; + } + } + + .search-field-btn { + position: absolute; + right: 0; + top: 0; + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 100%; + background: transparent; + border: none; + cursor: pointer; + color: #515961; + transition: $transition-fast; + + &:hover { + color: $primary-blue; + } + + svg { + width: 20px; + height: 20px; + } + } + + &:focus-within { + border-color: $primary-blue; + box-shadow: 0 0 0 2px rgba($primary-blue, 0.1); + } +} + +// ----------------------------------------------------------------------------- +// Notice Content Box - For notice detail page content display +// ----------------------------------------------------------------------------- +.notice-content-box { + padding: $spacing-lg; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + min-height: 300px; + line-height: $line-height-loose; + font-size: $font-size-base; + color: $text-dark; + + @include respond-to('sm') { + padding: $spacing-md; + min-height: 200px; + } + + // Rich text content styling + p { + margin-bottom: $spacing-md; + } + + img { + max-width: 100%; + height: auto; + } + + a { + color: $primary-blue; + text-decoration: underline; + + &:hover { + color: darken($primary-blue, 10%); + } + } +} + +// Form row modifier for content area +.form-row--content { + .form-label-wrapper { + align-self: flex-start; + } +} + +// ----------------------------------------------------------------------------- +// Attachment Link - For downloadable file links in detail pages +// ----------------------------------------------------------------------------- +.attachment-link { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-md; + background: $light-bg; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + color: $text-dark; + font-size: $font-size-sm; + text-decoration: none; + transition: $transition-base; + + &:hover { + background: rgba($primary-blue, 0.05); + border-color: $primary-blue; + color: $primary-blue; + } + + svg { + flex-shrink: 0; + color: $text-gray; + } + + &:hover svg { + color: $primary-blue; + } +} + +// Attachment list container +.attachment-list { + display: flex; + flex-direction: column; + gap: $spacing-sm; +} + +.attachment-item { + display: flex; + align-items: center; +} diff --git a/src/main/resources/static/sass/components/_header-auth.scss b/src/main/resources/static/sass/components/_header-auth.scss new file mode 100644 index 0000000..73021f0 --- /dev/null +++ b/src/main/resources/static/sass/components/_header-auth.scss @@ -0,0 +1,326 @@ +// ----------------------------------------------------------------------------- +// Header Authentication Component Styles +// Login/Logout button groups and user profile dropdown +// ----------------------------------------------------------------------------- + +// =========================== +// Authentication Group +// =========================== +.auth-group { + display: flex; + align-items: center; + gap: $spacing-md; + + &.authenticated { + gap: 0; + } +} + +// =========================== +// Login Button +// =========================== +.login-btn { + display: inline-flex; + align-items: center; + padding: 10px 20px; + color: $text-dark; + text-decoration: none; + border: 2px solid $primary-blue; + border-radius: $border-radius-full; + font-weight: $font-weight-semibold; + font-size: $font-size-sm; + transition: $transition-base; + + // Box style for Figma design (node-id: 721-1489) + &-box { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; // 아이콘-텍스트 간격 + padding: 4px 10px; + color: #212529; // 강조 텍스트 색상 + text-decoration: none; + border: 1px solid #212529; + border-radius: 6px; + font-family: 'Noto Sans CJK KR', $font-family-primary; + font-weight: $font-weight-bold; // 700 + font-size: $font-size-base; // 16px + background: transparent; + transition: $transition-base; + + .user-icon { + width: 24px; + height: 24px; + flex-shrink: 0; + } + } +} + +// =========================== +// User Profile Dropdown (Desktop) +// =========================== +.user-profile-dropdown { + position: relative; + + .user-profile-btn { + display: flex; + align-items: center; + gap: $spacing-sm; + padding: 10px 20px; + background: $light-bg; + border: 2px solid transparent; + border-radius: $border-radius-full; + cursor: pointer; + transition: $transition-base; + font-family: $font-family-primary; + font-size: $font-size-sm; + + .user-name { + color: $text-dark; + font-weight: $font-weight-semibold; + } + + i { + color: $text-gray; + font-size: 12px; + transition: transform $transition-fast; + } + + &:hover { + background: $white; + border-color: $primary-blue; + box-shadow: $shadow-md; + + .user-name { + color: $primary-blue; + } + + i { + color: $primary-blue; + } + } + } + + &.active { + .user-profile-btn i { + transform: rotate(180deg); + } + + .profile-dropdown-menu { + visibility: visible; + opacity: 1; + transform: translateY(0); + } + } + + .profile-dropdown-menu { + position: absolute; + top: calc(100% + 12px); + right: 0; + width: 280px; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-lg; + box-shadow: $shadow-xl; + visibility: hidden; + opacity: 0; + transform: translateY(-10px); + transition: all $transition-base; + z-index: $z-index-dropdown; + overflow: hidden; + } + + .profile-header { + padding: $spacing-lg; + + color: $white; + text-align: center; + + .user-greeting { + margin: 0 0 $spacing-xs 0; + font-size: $font-size-md; + font-weight: $font-weight-bold; + } + + .user-message { + font-size: $font-size-xs; + opacity: 0.9; + } + } + + .profile-menu-list { + list-style: none; + margin: 0; + padding: $spacing-sm 0; + + li { + margin: 0; + + a { + display: flex; + align-items: center; + gap: 12px; + padding: 12px $spacing-lg; + color: $text-dark; + text-decoration: none; + font-size: $font-size-sm; + transition: $transition-fast; + + i { + width: 20px; + color: $text-gray; + font-size: 14px; + } + + &:hover { + background: $light-bg; + color: $primary-blue; + + i { + color: $primary-blue; + } + } + } + } + } + + .profile-footer { + padding: $spacing-sm $spacing-lg $spacing-lg; + border-top: 1px solid $border-gray; + + .logout-btn { + display: flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + width: 100%; + padding: 12px; + background: $gray-bg; + color: $text-dark; + text-decoration: none; + border-radius: $border-radius-md; + font-weight: $font-weight-semibold; + font-size: $font-size-sm; + transition: $transition-base; + + i { + font-size: 14px; + } + + &:hover { + background: $accent-orange; + color: $white; + transform: translateY(-2px); + box-shadow: $shadow-md; + } + } + } +} + +// =========================== +// Mobile Drawer User Info +// =========================== +.drawer-user-info { + padding: $spacing-lg; + + border-bottom: 1px solid rgba(255, 255, 255, 0.2); + + .drawer-profile { + display: flex; + align-items: center; + gap: $spacing-md; + + .profile-avatar { + width: 60px; + height: 60px; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255, 255, 255, 0.2); + border-radius: $border-radius-circle; + color: $white; + + i { + font-size: 32px; + } + } + + .profile-info { + flex: 1; + color: $white; + + .profile-name { + margin: 0 0 $spacing-xs 0; + font-size: $font-size-md; + font-weight: $font-weight-bold; + } + + .profile-greeting { + font-size: $font-size-xs; + opacity: 0.9; + } + } + } +} + +// =========================== +// Mobile Drawer Actions +// =========================== +.drawer-logout-btn { + display: flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + width: 100%; + padding: 14px 20px; + background: $accent-orange; + color: $white; + text-decoration: none; + border-radius: $border-radius-lg; + font-weight: $font-weight-semibold; + font-size: $font-size-base; + transition: $transition-base; + box-shadow: $shadow-md; + + i { + font-size: 16px; + } + + &:hover { + background: darken($accent-orange, 10%); + transform: translateY(-2px); + box-shadow: $shadow-lg; + } +} + +// =========================== +// Responsive Adjustments +// =========================== +@media (max-width: $breakpoint-sm) { + .user-profile-dropdown { + .profile-dropdown-menu { + width: 260px; + right: -10px; + } + } +} + +@media (max-width: $breakpoint-xs) { + .user-profile-dropdown { + .user-profile-btn { + padding: 8px 16px; + + .user-name { + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + .profile-dropdown-menu { + width: 240px; + right: -20px; + } + } +} diff --git a/src/main/resources/static/sass/components/_modals.scss b/src/main/resources/static/sass/components/_modals.scss index 18d015a..9a67c40 100644 --- a/src/main/resources/static/sass/components/_modals.scss +++ b/src/main/resources/static/sass/components/_modals.scss @@ -1,5 +1,7 @@ // ----------------------------------------------------------------------------- -// Modal styles +// Modal styles - KJBank Design (Figma node 985:1912) +// Close button positioned outside the modal (top-right) +// Gradient header with light blue to white // ----------------------------------------------------------------------------- // Modal backdrop @@ -9,9 +11,9 @@ left: 0; right: 0; bottom: 0; - background: rgba(0, 0, 0, 0.5); + background: #385670; z-index: $z-index-modal-backdrop; - opacity: 0; + opacity: 0.9; visibility: hidden; transition: $transition-base; @@ -26,8 +28,8 @@ position: fixed; top: 0; left: 0; - right: 0; - bottom: 0; + width: 100%; + height: 100vh; z-index: $z-index-modal; display: flex; align-items: center; @@ -35,44 +37,112 @@ padding: $spacing-lg; opacity: 0; visibility: hidden; - transition: $transition-base; + transition: opacity 0.3s ease, visibility 0.3s ease; + pointer-events: none; + overflow-y: auto; &.show { opacity: 1; visibility: visible; + pointer-events: auto; .modal-dialog { transform: scale(1); } } + + // Responsive adjustments + @media (max-width: $breakpoint-sm) { + padding: $spacing-md; + } +} + +// Modal container (includes close button outside) +.modal-container { + position: relative; + max-width: 820px; + width: 100%; + + + // Size variations + &.modal-sm { + max-width: 500px; + } + + &.modal-lg { + max-width: 1000px; + } + + &.modal-xl { + max-width: 1200px; + } + + @media (max-width: $breakpoint-sm) { + max-width: 100%; + } +} + +// Close button - positioned outside modal (top-right) +.modal-close { + position: absolute; + top: 0; + right: 0; + transform: translate(100%, -100%); + width: 50px; + height: 50px; + background: #0049b4; + border: none; + border-radius: 50%; + color: $white; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + z-index: $z-index-modal; + transition: $transition-base; + box-shadow: $shadow-lg; + + svg { + width: 14px; + height: 14px; + } + + i { + font-size: 16px; + } + + @media (max-width: $breakpoint-sm) { + width: 40px; + height: 40px; + + svg { + width: 12px; + height: 12px; + } + + i { + font-size: 14px; + } + } } // Modal dialog .modal-dialog { position: relative; background: $white; - border-radius: $border-radius-xl; - box-shadow: $shadow-xl; - max-width: 500px; - width: 100%; - max-height: 90vh; + padding: 0 $spacing-lg; + border-radius: $border-radius-lg; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + max-width: 700px; + width: calc(100% - 2 * $spacing-lg); + max-height: 85vh; display: flex; flex-direction: column; transform: scale(0.95); - transition: $transition-base; - - // Size variations - &.modal-sm { - max-width: 400px; - } - - &.modal-lg { - max-width: 800px; - } - - &.modal-xl { - max-width: 1200px; - } + transition: transform 0.3s ease; + z-index: $z-index-modal; + margin-left: auto; + margin-right: auto; &.modal-fullscreen { max-width: 100%; @@ -83,75 +153,130 @@ } } -// Modal header +// Modal header with gradient background .modal-header { - padding: $spacing-lg; - border-bottom: 1px solid $border-gray; + padding: 30px 50px 20px; display: flex; align-items: center; justify-content: space-between; + border-bottom: 1px solid black; + border-top-left-radius: $border-radius-lg; + border-top-right-radius: $border-radius-lg; .modal-title { font-size: $font-size-xl; font-weight: $font-weight-semibold; - color: $text-dark; + color: #212529; margin: 0; } - .modal-close { - width: 32px; - height: 32px; - @include flex-center; - background: transparent; - border: none; - border-radius: $border-radius-md; - color: $text-gray; - font-size: $font-size-xl; - cursor: pointer; - transition: $transition-base; + @media (max-width: $breakpoint-sm) { + padding: 20px 24px 16px; - &:hover { - background: $gray-bg; - color: $text-dark; + .modal-title { + font-size: 18px; } } } // Modal body .modal-body { - padding: $spacing-lg; + padding: 30px 50px; flex: 1; overflow-y: auto; - color: $text-dark; + color: #212529; + font-size: 20px; line-height: $line-height-normal; + + p { + margin: 0; + + & + p { + margin-top: $spacing-md; + } + } + + // Center text variant + &.text-center { + text-align: center; + } + + @media (max-width: $breakpoint-sm) { + padding: 20px 24px; + font-size: 16px; + } } -// Modal footer +// Modal footer with buttons .modal-footer { - padding: $spacing-lg; - border-top: 1px solid $border-gray; + padding: 20px 50px 40px; display: flex; - gap: $spacing-md; - justify-content: flex-end; + gap: 10px; + justify-content: center; + border-top: none; - &.modal-footer-center { - justify-content: center; + &.modal-footer-end { + justify-content: flex-end; } &.modal-footer-between { justify-content: space-between; } + + + @media (max-width: $breakpoint-sm) { + padding: 16px 24px 24px; + flex-direction: column; + + .btn-modal-cancel, + .btn-modal-confirm { + width: 100%; + height: 46px; + font-size: 15px; + } + } +} + +.pop_input_field { + width: 100%; + padding: 12px $spacing-md; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-sm; + font-family: $font-family-primary; + transition: all 0.3s ease; + box-sizing: border-box; + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &::placeholder { + color: $text-light; + } + + // Error state + &.error { + border-color: $accent-orange; + + &:focus { + border-color: $accent-orange; + box-shadow: 0 0 0 3px rgba($accent-orange, 0.1); + } + } } // Alert modal .modal-alert { - .modal-dialog { - max-width: 400px; + .modal-container { + max-width: 500px; } .modal-body { text-align: center; - padding: $spacing-xl; + padding: $spacing-xl 50px; .alert-icon { width: 64px; @@ -191,6 +316,7 @@ .alert-message { color: $text-gray; + font-size: $font-size-base; } } -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/components/_page-title-banner.scss b/src/main/resources/static/sass/components/_page-title-banner.scss new file mode 100644 index 0000000..f4b742d --- /dev/null +++ b/src/main/resources/static/sass/components/_page-title-banner.scss @@ -0,0 +1,62 @@ +// Page Title Banner Component +// Reusable banner for page titles across the portal + +@import '../abstracts/variables'; +@import '../abstracts/mixins'; + +.page-title-banner { + background: #E9F8FF; + position: relative; + width: 100%; + height: 220px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h100v100H0z' fill='%23ffffff' opacity='0.03'/%3E%3C/svg%3E"); + background-size: 50px 50px; + opacity: 0.5; + } + + .title-image { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 220px; + width: auto; + z-index: 1; + } + + h1 { + position: relative; + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0; + z-index: 2; + letter-spacing: -0.5px; + } + + // Responsive + @include respond-to('sm') { + height: 120px; + margin-bottom: $spacing-xl; + + .title-image { + height: 120px; + } + + h1 { + font-size: $font-size-xl; + } + } +} diff --git a/src/main/resources/static/sass/components/_pagination.scss b/src/main/resources/static/sass/components/_pagination.scss new file mode 100644 index 0000000..904a989 --- /dev/null +++ b/src/main/resources/static/sass/components/_pagination.scss @@ -0,0 +1,102 @@ +// ----------------------------------------------------------------------------- +// Pagination Component +// Based on Figma design: node-id=985-1102 +// ----------------------------------------------------------------------------- + +// Pagination variables +$pagination-gap: 13px; +$pagination-icon-size: 24px; +$pagination-font-size: 18px; +$pagination-text-active: #212529; +$pagination-text-inactive: #5f666c; +$pagination-text-disabled: #adb5bd; + +.pagination { + display: flex; + align-items: center; + justify-content: center; + gap: $pagination-gap; + + // Page navigation buttons (first, prev, next, last) + .page-first, + .page-prev, + .page-next, + .page-last { + display: flex; + align-items: center; + justify-content: center; + width: $pagination-icon-size; + height: $pagination-icon-size; + color: $pagination-text-active; + text-decoration: none; + cursor: pointer; + transition: $transition-fast; + + &:hover:not(.disabled) { + color: $primary-blue; + } + + &.disabled { + color: $pagination-text-disabled; + cursor: not-allowed; + pointer-events: none; + } + + // SVG icons inherit color from parent + svg { + width: $pagination-icon-size; + height: $pagination-icon-size; + flex-shrink: 0; + } + } + + // Page number links + .page-num { + display: flex; + align-items: center; + justify-content: center; + min-width: 10px; + height: 21px; + font-family: $font-family-primary; + font-size: $pagination-font-size; + font-weight: $font-weight-regular; + color: $pagination-text-inactive; + text-decoration: none; + text-align: center; + line-height: 1; + cursor: pointer; + transition: $transition-fast; + + &:hover:not(.page-current) { + color: $primary-blue; + } + + // Current active page + &.page-current { + font-weight: $font-weight-bold; + color: $pagination-text-active; + cursor: default; + } + } + + // Screen reader only text + .blind { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } +} + +// Pagination wrapper for alignment +.pagination-wrapper { + display: flex; + justify-content: center; + padding: $spacing-lg 0; + margin-top: $spacing-lg; +} \ No newline at end of file diff --git a/src/main/resources/static/sass/components/_password-popup.scss b/src/main/resources/static/sass/components/_password-popup.scss new file mode 100644 index 0000000..13d250c --- /dev/null +++ b/src/main/resources/static/sass/components/_password-popup.scss @@ -0,0 +1,42 @@ +// ============================================ +// Password Input Popup Component +// Extends base modal styles from _modals.scss +// ============================================ + +// Password popup specific styles (using modal structure) +#passwordInputPopup { + // Modal dialog size override + //.modal-dialog { + // max-width: 450px; + //} + + // Password input group + .pop_input_group { + text-align: left; + margin: 0; + } + + .error-message { + color: $accent-orange; + font-size: $font-size-xs; + margin-top: $spacing-xs; + display: none; + animation: fadeInDown 0.3s ease; + + &.show { + display: block; + } + } +} + +// Animation for error message +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} diff --git a/src/main/resources/static/sass/components/_tables.scss b/src/main/resources/static/sass/components/_tables.scss new file mode 100644 index 0000000..fe0abb1 --- /dev/null +++ b/src/main/resources/static/sass/components/_tables.scss @@ -0,0 +1,650 @@ +// ----------------------------------------------------------------------------- +// Table Component Styles - Reusable table designs +// ----------------------------------------------------------------------------- + +// Base table styles +.data-table { + width: 100%; + background: $white; + border-radius: $border-radius-lg; + overflow: hidden; + box-shadow: $shadow-sm; + + // Table wrapper for responsive scrolling + &-wrapper { + overflow-x: auto; + margin-bottom: $spacing-xl; + + @media (max-width: $breakpoint-sm) { + border-radius: $border-radius-lg; + box-shadow: $shadow-sm; + } + } + + table { + width: 100%; + border-collapse: collapse; + + thead { + background: $light-bg; + + tr { + border-bottom: 2px solid $border-gray; + } + + th { + padding: $spacing-md $spacing-lg; + text-align: left; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-dark; + white-space: nowrap; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-sm $spacing-md; + font-size: $font-size-xs; + } + } + } + + tbody { + tr { + border-bottom: 1px solid $border-gray; + transition: $transition-base; + + &:last-child { + border-bottom: none; + } + + &:hover { + background-color: rgba($primary-blue, 0.02); + } + } + + td { + padding: $spacing-md $spacing-lg; + font-size: $font-size-sm; + color: $text-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-sm $spacing-md; + font-size: $font-size-xs; + } + + a { + color: $text-dark; + text-decoration: none; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + } + } + } + } +} + +// Notice board table (list view with columns) +.notice-table { + width: 100%; + background: $white; + border-radius: $border-radius-lg; + overflow: hidden; + box-shadow: $shadow-sm; + + &-wrapper { + overflow-x: auto; + + @media (max-width: $breakpoint-sm) { + border-radius: 0; + box-shadow: none; + } + } + + // Table header + .table-header { + display: grid; + grid-template-columns: 80px 1fr 120px; + gap: $spacing-md; + padding: $spacing-md $spacing-lg; + background: $light-bg; + border-bottom: 2px solid $border-gray; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-dark; + + @media (max-width: $breakpoint-md) { + grid-template-columns: 60px 1fr 100px; + padding: $spacing-sm $spacing-md; + font-size: $font-size-xs; + } + + @media (max-width: $breakpoint-sm) { + display: none; // Hide header on mobile + } + + .col-num { + text-align: center; + } + + .col-title { + text-align: left; + } + + .col-date { + text-align: center; + } + } + + // Table rows + .table-row { + display: grid; + grid-template-columns: 80px 1fr 120px; + gap: $spacing-md; + padding: $spacing-lg; + border-bottom: 1px solid $border-gray; + transition: $transition-base; + cursor: pointer; + + @media (max-width: $breakpoint-md) { + grid-template-columns: 60px 1fr 100px; + padding: $spacing-md; + } + + @media (max-width: $breakpoint-sm) { + grid-template-columns: 1fr; + gap: $spacing-sm; + padding: $spacing-md; + } + + &:last-child { + border-bottom: none; + } + + &:hover { + background-color: rgba($primary-blue, 0.02); + } + + .col-num { + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-sm; + color: $text-gray; + font-weight: $font-weight-medium; + + @media (max-width: $breakpoint-sm) { + display: none; + } + } + + .col-title { + display: flex; + align-items: center; + font-size: $font-size-base; + color: $text-dark; + font-weight: $font-weight-medium; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + + a { + color: inherit; + text-decoration: none; + display: flex; + align-items: center; + gap: $spacing-sm; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + } + + .file-icon { + display: inline-flex; + align-items: center; + margin-left: $spacing-sm; + opacity: 0.6; + + img { + width: 16px; + height: 16px; + } + } + } + + .col-date { + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-sm; + color: $text-light; + + @media (max-width: $breakpoint-sm) { + justify-content: flex-start; + font-size: $font-size-xs; + padding-top: $spacing-xs; + } + } + } + + // Mobile label for date + @media (max-width: $breakpoint-sm) { + .table-row .col-date::before { + content: '등록일: '; + color: $text-gray; + margin-right: $spacing-xs; + } + } +} + +// Empty state for tables +.table-empty { + padding: $spacing-5xl $spacing-lg; + text-align: center; + background: $white; + border-radius: $border-radius-lg; + + .empty-icon { + margin-bottom: $spacing-lg; + + img { + max-width: 200px; + opacity: 0.7; + + @media (max-width: $breakpoint-sm) { + max-width: 150px; + } + } + } + + .empty-text { + font-size: $font-size-base; + color: $text-gray; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } +} + +// ----------------------------------------------------------------------------- +// List Table - Modern design with colored header (Figma: 984-2173) +// Used in: User management, API key list, etc. +// ----------------------------------------------------------------------------- +.list-table { + width: 100%; + background: $white; + border-radius: $border-radius-lg; + overflow: hidden; + + &-wrapper { + overflow-x: auto; + margin-bottom: $spacing-xl; + } + + // Table Header - Blue background with white text + .list-table-header { + display: flex; + align-items: center; + background: #3BA4ED; + height: 72px; + padding: 0 $spacing-lg; + + @media (max-width: $breakpoint-md) { + display: none; + } + + .header-cell { + display: flex; + align-items: center; + justify-content: center; + padding: $spacing-sm $spacing-md; + font-size: 20px; + font-weight: $font-weight-bold; + color: $white; + text-align: center; + } + } + + // Table Body + .list-table-body { + display: flex; + flex-direction: column; + } + + // Table Row + .list-table-row { + display: flex; + align-items: center; + height: 54px; + padding: $spacing-sm $spacing-lg; + transition: $transition-base; + + // Alternating row colors + &:nth-child(even) { + background-color: #EDF5FD; + } + + &:nth-child(odd) { + background-color: $white; + } + + &:hover { + background-color: rgba($primary-blue, 0.08); + } + + @media (max-width: $breakpoint-md) { + flex-direction: column; + align-items: flex-start; + gap: $spacing-sm; + padding: $spacing-md; + } + + .row-cell { + display: flex; + align-items: center; + justify-content: center; + padding: $spacing-sm $spacing-md; + font-size: 18px; + color: #515151; + text-align: center; + + @media (max-width: $breakpoint-md) { + font-size: $font-size-sm; + padding: $spacing-xs 0; + + &::before { + content: attr(data-label); + font-weight: $font-weight-semibold; + color: $text-gray; + margin-right: $spacing-sm; + min-width: 80px; + text-align: left; + } + } + + // Title cell with inline file icon + &--title { + justify-content: flex-start; + + @media (max-width: $breakpoint-md) { + &::before { + display: none; // Hide data-label for title on mobile + } + } + + .notice-title-link { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + color: inherit; + text-decoration: none; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + + // Mobile number prefix [1] [2] etc + .notice-number { + display: none; + font-weight: $font-weight-medium; + color: $text-gray; + flex-shrink: 0; + + @media (max-width: $breakpoint-md) { + display: inline; + } + } + } + + .file-icon { + display: inline-flex; + align-items: center; + flex-shrink: 0; + color: #212529; + + svg { + width: 24px; + height: 24px; + } + } + } + + // Number cell for notice list + &--number { + @media (max-width: $breakpoint-md) { + display: none; // Hide separate number cell on mobile + } + } + } + + // Action buttons container + .row-actions { + display: flex; + align-items: center; + justify-content: center; + gap: 14px; + flex-wrap: wrap; + + @media (max-width: $breakpoint-md) { + width: 100%; + justify-content: flex-start; + padding-top: $spacing-sm; + } + } + } +} + +// List table action buttons +.list-table-btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: $spacing-sm $spacing-md; + height: 40px; + border-radius: $border-radius-md; + font-size: $font-size-base; + font-weight: $font-weight-regular; + color: #000000; + border: none; + cursor: pointer; + transition: $transition-base; + white-space: nowrap; + + &:hover { + transform: translateY(-1px); + box-shadow: $shadow-sm; + } + + &:active { + transform: translateY(0); + } + + // Button variants + &--default { + background-color: #DADADA; + + &:hover { + background-color: darken(#DADADA, 5%); + } + } + + &--primary { + background-color: #A4D6EA; + + &:hover { + background-color: darken(#A4D6EA, 5%); + } + } + + &--secondary { + background-color: #CDD4F0; + + &:hover { + background-color: darken(#CDD4F0, 5%); + } + } +} + +// ----------------------------------------------------------------------------- +// Pagination - Table pagination controls +// ----------------------------------------------------------------------------- +.table-pagination { + display: flex; + align-items: center; + justify-content: center; + gap: 13px; + padding: $spacing-xl 0; + + .pagination-btn { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + background: none; + border: none; + cursor: pointer; + color: #212529; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } + + i { + font-size: $font-size-base; + } + } + + .pagination-numbers { + display: flex; + align-items: center; + gap: 13px; + } + + .pagination-number { + display: flex; + align-items: center; + justify-content: center; + min-width: 10px; + height: 21px; + font-size: 18px; + color: #5F666C; + background: none; + border: none; + cursor: pointer; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + + &.active { + font-weight: $font-weight-bold; + color: #212529; + } + } +} + +// Search and filter section for tables +.table-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: $spacing-lg; + padding: 0 $spacing-sm; + gap: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + gap: $spacing-md; + } + + .total-count { + font-size: $font-size-base; + color: $text-gray; + margin-bottom: 0; + + strong { + color: $primary-blue; + font-weight: $font-weight-semibold; + font-size: $font-size-lg; + } + + @media (max-width: $breakpoint-sm) { + order: 2; + text-align: center; + } + } + + .search-box { + display: flex; + gap: $spacing-sm; + + @media (max-width: $breakpoint-sm) { + order: 1; + } + + input { + flex: 1; + min-width: 250px; + padding: $spacing-sm $spacing-md; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-sm; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + min-width: auto; + } + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &::placeholder { + color: $text-light; + } + } + + //button { + // padding: $spacing-sm $spacing-lg; + // + // color: $white; + // border: none; + // border-radius: $border-radius-md; + // font-size: $font-size-sm; + // font-weight: $font-weight-medium; + // cursor: pointer; + // transition: $transition-base; + // white-space: nowrap; + // + // &:hover { + // transform: translateY(-2px); + // box-shadow: $shadow-md; + // } + // + // &:active { + // transform: translateY(0); + // } + // + // i { + // margin-right: $spacing-xs; + // } + //} + } +} diff --git a/src/main/resources/static/sass/layout/_container.scss b/src/main/resources/static/sass/layout/_container.scss index 085df22..c17047d 100644 --- a/src/main/resources/static/sass/layout/_container.scss +++ b/src/main/resources/static/sass/layout/_container.scss @@ -63,16 +63,7 @@ background: $light-bg; } - &-gradient { - background: linear-gradient(180deg, $white 0%, $light-bg 100%); - } - - &-gradient-reverse { - background: linear-gradient(180deg, $light-bg 0%, $white 100%); - } - &-primary { - background: $gradient-primary; color: $white; } @@ -115,7 +106,6 @@ } .title-highlight { - @include gradient-text($gradient-accent); } } @@ -155,4 +145,4 @@ .inner-content { position: relative; z-index: 1; -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/layout/_footer.scss b/src/main/resources/static/sass/layout/_footer.scss index 48d087e..ec864f7 100644 --- a/src/main/resources/static/sass/layout/_footer.scss +++ b/src/main/resources/static/sass/layout/_footer.scss @@ -1,282 +1,178 @@ // ----------------------------------------------------------------------------- -// Footer styles - Modern vibrant design +// Footer Styles - Figma Design Implementation // ----------------------------------------------------------------------------- .global-footer { - background: $text-dark; - color: $white; - padding: $spacing-5xl 0 $spacing-2xl; + background: #FFFFFF; + border-top: 1px solid #E5E7EB; - @include respond-to('sm') { - padding: $spacing-3xl 0 $spacing-xl; + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 20px; } } -.footer-top { - display: grid; - grid-template-columns: 2fr 3fr; - gap: $spacing-5xl; - margin-bottom: $spacing-4xl; - max-width: $container-max-width; - margin-left: auto; - margin-right: auto; - padding: 0 $spacing-lg; - - @include respond-to('md') { - grid-template-columns: 1fr; - gap: $spacing-2xl; - } -} - -// Footer brand section -.footer-brand { - max-width: 360px; - - .footer-logo { - height: 48px; - margin-bottom: $spacing-lg; - } - - .footer-desc { - font-size: $font-size-sm; - line-height: $line-height-loose; - color: rgba($white, 0.7); - margin-bottom: $spacing-lg; - } - - .footer-newsletter { - margin-bottom: $spacing-xl; - - h4 { - font-size: $font-size-md; - font-weight: $font-weight-semibold; - margin-bottom: $spacing-md; - } - - .newsletter-form { - display: flex; - gap: $spacing-sm; - - input { - flex: 1; - padding: $spacing-sm $spacing-md; - background: rgba($white, 0.1); - border: 1px solid rgba($white, 0.2); - border-radius: $border-radius-md; - color: $white; - font-size: $font-size-sm; - - &::placeholder { - color: rgba($white, 0.5); - } - - &:focus { - background: rgba($white, 0.15); - border-color: $primary-blue; - outline: none; - } - } - - button { - padding: $spacing-sm $spacing-lg; - background: $gradient-primary; - color: $white; - border-radius: $border-radius-md; - font-weight: $font-weight-semibold; - font-size: $font-size-sm; - transition: $transition-base; - - &:hover { - transform: translateY(-2px); - box-shadow: $shadow-md; - } - } - } - } -} - -// Social links -.social-links { - display: flex; - gap: $spacing-md; - - a { - width: 44px; - height: 44px; - background: rgba($white, 0.1); - border-radius: $border-radius-lg; - @include flex-center; - color: $white; - transition: $transition-base; - font-size: $font-size-lg; - - &:hover { - background: $primary-blue; - transform: translateY(-3px); - } - - &.facebook:hover { - background: #1877f2; - } - - &.twitter:hover { - background: #1da1f2; - } - - &.linkedin:hover { - background: #0077b5; - } - - &.github:hover { - background: #333; - } - - &.youtube:hover { - background: #ff0000; - } - } -} - -// Footer links -.footer-links { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: $spacing-2xl; - - @include respond-to('md') { - grid-template-columns: repeat(2, 1fr); - } - - @include respond-to('sm') { - grid-template-columns: 1fr; - text-align: center; - } -} - -.footer-column { - h4 { - font-size: $font-size-base; - font-weight: $font-weight-bold; - margin-bottom: $spacing-lg; - color: $white; - } - - ul { - list-style: none; - - li { - margin-bottom: $spacing-md; - - a { - color: rgba($white, 0.7); - font-size: $font-size-sm; - transition: $transition-base; - position: relative; - - &::after { - content: ''; - position: absolute; - bottom: -2px; - left: 0; - width: 0; - height: 1px; - background: $accent-cyan; - transition: $transition-base; - } - - &:hover { - color: $accent-cyan; - - &::after { - width: 100%; - } - } - } - } - } - - // Special badges - .footer-badge { - display: inline-flex; - align-items: center; - gap: $spacing-xs; - padding: $spacing-xs $spacing-sm; - background: rgba($accent-green, 0.2); - color: $accent-green; - border-radius: $border-radius-full; - font-size: $font-size-xs; - font-weight: $font-weight-semibold; - margin-left: $spacing-sm; - } -} - -// Footer bottom -.footer-bottom { - padding-top: $spacing-2xl; - border-top: 1px solid rgba($white, 0.1); - max-width: $container-max-width; - margin: 0 auto; - padding-left: $spacing-lg; - padding-right: $spacing-lg; -} - -.footer-legal { +.footer-content { display: flex; justify-content: space-between; align-items: center; + min-height: 200px; + padding: 40px 0; + gap: 40px; - @include respond-to('sm') { + @include respond-to('md') { flex-direction: column; - gap: $spacing-lg; - text-align: center; + align-items: flex-start; + gap: 32px; + padding: 32px 0; + } +} + +// Left Section +.footer-left { + display: flex; + flex-direction: column; + gap: 16px; + + .footer-logo { + width: 114px; + height: auto; + object-fit: contain; } - p { - color: rgba($white, 0.5); - font-size: $font-size-sm; - margin: 0; - } - - .legal-links { + .footer-links { display: flex; - gap: $spacing-lg; + align-items: center; + gap: 8px; - a { - color: rgba($white, 0.7); - font-size: $font-size-sm; - transition: $transition-base; + .footer-link { + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #5F666C; + text-decoration: none; + transition: color 0.3s ease; &:hover { - color: $white; + color: #0049B4; + text-decoration: underline; } } + + .footer-separator { + color: #D1D5DB; + font-size: 16px; + user-select: none; + } + } + + .footer-copyright { + font-family: 'Noto Sans KR', sans-serif; + font-size: 14px; + font-weight: 400; + color: #9CA3AF; + margin: 0; + line-height: 1.5; + } +} + +// Right Section +.footer-right { + display: flex; + flex-direction: column; + gap: 16px; + align-items: flex-end; + + @include respond-to('md') { + align-items: flex-start; + width: 100%; + } + + .footer-related-sites { + .related-sites-select { + width: 240px; + height: 44px; + padding: 0 16px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #5F666C; + background: #FFFFFF; + border: 1px solid #D1D5DB; + border-radius: 6px; + cursor: pointer; + transition: all 0.3s ease; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L6 6L11 1' stroke='%235F666C' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 16px center; + padding-right: 40px; + + &:hover { + border-color: #0049B4; + } + + &:focus { + outline: none; + border-color: #0049B4; + box-shadow: 0 0 0 3px rgba(0, 73, 180, 0.1); + } + + @include respond-to('md') { + width: 100%; + } + } + } + + .footer-contact { + font-family: 'Noto Sans KR', sans-serif; + font-size: 30px; + font-weight: 700; + color: #1F2937; + margin: 0; + line-height: 1.2; + + @include respond-to('md') { + font-size: 24px; + } } } -// Footer decoration -.footer-decoration { - position: relative; - overflow: hidden; - - &::before { - content: ''; - position: absolute; - top: -100px; - right: -100px; - width: 300px; - height: 300px; - background: radial-gradient(circle, rgba($primary-blue, 0.1) 0%, transparent 70%); - border-radius: 50%; +// Mobile responsive adjustments +@media (max-width: 576px) { + .footer-content { + padding: 24px 0; + gap: 24px; } - &::after { - content: ''; - position: absolute; - bottom: -150px; - left: -150px; - width: 400px; - height: 400px; - background: radial-gradient(circle, rgba($accent-cyan, 0.05) 0%, transparent 70%); - border-radius: 50%; + .footer-left { + gap: 12px; + + .footer-logo { + width: 90px; + } + + .footer-links { + flex-wrap: wrap; + gap: 6px; + + .footer-link, + .footer-separator { + font-size: 14px; + } + } + + .footer-copyright { + font-size: 12px; + } + } + + .footer-right { + gap: 12px; + + .footer-contact { + font-size: 20px; + } } } diff --git a/src/main/resources/static/sass/layout/_header.scss b/src/main/resources/static/sass/layout/_header.scss index aaa8acd..2777586 100644 --- a/src/main/resources/static/sass/layout/_header.scss +++ b/src/main/resources/static/sass/layout/_header.scss @@ -22,11 +22,6 @@ --light-bg: #EFF6FF; --border-gray: #E2E8F0; - // Gradients - --gradient-primary: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%); - --gradient-accent: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%); - --gradient-warm: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%); - // Shadows --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 12px rgba(75, 155, 255, 0.1); @@ -55,23 +50,25 @@ top: 0; left: 0; right: 0; - background: rgba(255, 255, 255, 0.95); + //background-color: #C3DFEA; + background-color: #ffffff; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); - box-shadow: var(--shadow-sm); - z-index: 1000; - height: 80px; + z-index: $z-index-header; + height: 112px; transition: all 0.3s ease; + border-bottom: 1px solid #dddddd; } .header-content { display: flex; align-items: center; justify-content: space-between; - height: 80px; - max-width: 1280px; + height: 65px; + max-width: 1920px; margin: 0 auto; padding: 0 20px; + margin-top: 20px; } // =========================== @@ -84,8 +81,8 @@ align-items: center; .logo { - height: 45px; - width: auto; + height: 22px; + width: 114px; } } @@ -101,7 +98,7 @@ display: flex; align-items: center; gap: 12px; - height: 45px; + height: 22px; z-index: 10; a { @@ -113,32 +110,26 @@ } img { - height: 45px; - width: auto; + height: 22px; + width: 114px; } } .logo-text { font-size: 16px; font-weight: 700; - color: var(--primary-blue); - padding: 4px 12px; - background: var(--light-bg); - border-radius: 20px; + color: var(--text-dark); text-decoration: none; display: inline-block; transition: all 0.3s ease; // When logo-text is a link &:hover { - background: var(--primary-blue); - color: var(--white); - transform: translateY(-1px); - box-shadow: var(--shadow-md); + color: var(--primary-blue); } &:visited { - color: var(--primary-blue); + color: var(--text-dark); } } @@ -433,7 +424,6 @@ justify-content: center; gap: 8px; padding: 14px 20px; - background: var(--gradient-primary); color: var(--white); text-decoration: none; border-radius: 12px; @@ -626,6 +616,62 @@ gap: 8px; margin: 0; padding: 0; + + // Navigation item with submenu + > li { + position: relative; + + &.submenu-open { + > .nav-link { + background: var(--light-bg); + color: var(--primary-blue); + } + + .sub-menu { + visibility: visible; + opacity: 1; + transform: translateY(0); + } + } + + .sub-menu { + position: absolute; + top: calc(100% + 8px); + left: 0; + min-width: 200px; + background: var(--white); + border: 1px solid var(--border-gray); + border-radius: $border-radius-lg; + box-shadow: var(--shadow-xl); + padding: $spacing-sm 0; + visibility: hidden; + opacity: 0; + transform: translateY(-10px); + transition: all 0.3s ease; + z-index: $z-index-dropdown; + list-style: none; + margin: 0; + + li { + margin: 0; + + a { + display: block; + padding: $spacing-sm $spacing-lg; + color: var(--text-dark); + text-decoration: none; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + transition: all 0.3s ease; + + &:hover { + background: var(--light-bg); + color: var(--primary-blue); + } + } + } + } + } } .nav-link { @@ -641,9 +687,7 @@ transition: all 0.3s ease; &:hover { - background: var(--light-bg); color: var(--primary-blue); - transform: translateY(-2px); } } @@ -656,7 +700,6 @@ align-items: center; gap: 8px; text-decoration: none; - background: var(--gradient-primary); color: var(--white); padding: 12px 24px; border-radius: 50px; @@ -727,38 +770,6 @@ } &.has-submenu > a::after { display: none; } - - .sub-menu { - position: absolute; - top: 100%; - left: 0; - background: var(--white); - border: 1px solid var(--border-gray); - border-radius: 8px; - box-shadow: var(--shadow-lg); - min-width: 200px; - padding: 8px 0; - display: none; - z-index: 1001; - - a { - display: block; - padding: 8px 16px; - color: var(--text-dark); - font-size: 14px; - text-decoration: none; - transition: all 0.3s ease; - - &:hover { - background: var(--light-bg); - color: var(--primary-blue); - } - } - } - - &:hover .sub-menu { - display: block; - } } } } @@ -768,7 +779,7 @@ // Body Layout Compensation // =========================== body { - padding-top: 80px; // Compensate for fixed header + padding-top: 112px; // Compensate for fixed header (112px height) } // =========================== @@ -776,7 +787,7 @@ body { // =========================== @media (max-width: 768px) { .global-header { - height: 60px; + height: 90px; .container .header-content { padding: 0 16px; @@ -803,3 +814,131 @@ body { } } + +// =========================== +// Header User Info (Authenticated State) +// =========================== +.header-user-info { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 6px; + border-radius: 6px; + + .user-identity { + display: flex; + align-items: center; + gap: 2px; + + .user-icon { + width: 16px; + height: 18px; + display: block; + } + + .user-name { + font-family: 'Noto Sans CJK KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #515961; + white-space: nowrap; + } + } + + .divider { + font-size: 8px; + color: var(--text-gray); + line-height: 1; + } + + .header-link { + font-family: 'Noto Sans CJK KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #515961; + text-decoration: none; + white-space: nowrap; + background: none; + border: none; + padding: 0; + cursor: pointer; + transition: color 0.3s ease; + + &:hover { + color: var(--primary-blue); + } + } + + .mypage-dropdown { + position: relative; + + .mypage-toggle { + display: flex; + align-items: center; + gap: 4px; + } + + .mypage-dropdown-menu { + position: absolute; + top: calc(100% + 8px); + right: 0; + min-width: 200px; + background: var(--white); + border: 1px solid var(--border-gray); + border-radius: $border-radius-lg; + box-shadow: var(--shadow-xl); + padding: $spacing-sm 0; + visibility: hidden; + opacity: 0; + transform: translateY(-10px); + transition: all 0.3s ease; + z-index: $z-index-dropdown; + + .mypage-menu-list { + list-style: none; + margin: 0; + padding: 0; + + li { + margin: 0; + + a { + display: flex; + align-items: center; + gap: 8px; + padding: $spacing-sm $spacing-lg; + color: var(--text-dark); + text-decoration: none; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + transition: all 0.3s ease; + + i { + font-size: 14px; + width: 16px; + text-align: center; + } + + &:hover { + background: var(--light-bg); + color: var(--primary-blue); + } + } + } + } + } + + &.active .mypage-dropdown-menu { + visibility: visible; + opacity: 1; + transform: translateY(0); + } + } +} + +// Mobile responsive +@media (max-width: 768px) { + .header-user-info { + display: none; // Hide on mobile, use drawer instead + } +} diff --git a/src/main/resources/static/sass/main.scss b/src/main/resources/static/sass/main.scss index f8cc42c..db6dcf4 100644 --- a/src/main/resources/static/sass/main.scss +++ b/src/main/resources/static/sass/main.scss @@ -22,12 +22,21 @@ // 4. Components @import 'components/buttons'; +@import 'components/badges'; @import 'components/cards'; +@import 'components/apikey-common'; @import 'components/forms'; @import 'components/modals'; @import 'components/navigation'; @import 'components/partners'; @import 'components/cta'; +@import 'components/password-popup'; +@import 'components/header-auth'; +@import 'components/tables'; +@import 'components/accordion'; +@import 'components/page-title-banner'; +@import 'components/alerts'; +@import 'components/pagination'; // 5. Page-specific styles @import 'pages/index'; @@ -36,6 +45,19 @@ @import 'pages/api-market'; @import 'pages/documentation'; @import 'pages/login'; +@import 'pages/account-recovery'; +@import 'pages/signup-selection'; +@import 'pages/mypage'; +@import 'pages/apikey-register'; +@import 'pages/apikey-detail'; +@import 'pages/apikey-list'; +@import 'pages/notice'; +@import 'pages/inquiry'; +@import 'pages/org-register'; +@import 'pages/partnership'; +@import 'pages/user-management'; +@import 'pages/commission'; +@import 'pages/terms-agreements'; // 6. Themes @import 'themes/dark'; diff --git a/src/main/resources/static/sass/pages/_account-recovery.scss b/src/main/resources/static/sass/pages/_account-recovery.scss new file mode 100644 index 0000000..fd6437c --- /dev/null +++ b/src/main/resources/static/sass/pages/_account-recovery.scss @@ -0,0 +1,513 @@ +// ----------------------------------------------------------------------------- +// Account Recovery Page Styles (Find ID / Reset Password) - Modern Design +// Matches login.html design system for consistency +// ----------------------------------------------------------------------------- + +.account-recovery-page { + display: flex; + align-items: center; + justify-content: center; + background: #EDF9FE; + padding: 40px 20px; + position: relative; + min-height: calc(100vh - 200px); + margin-top: 60px; + margin-bottom: 60px; + border-radius: 12px; +} + +.account-recovery-container { + width: 100%; + max-width: 540px; + margin: 0 auto; + position: relative; +} + +.account-recovery-card { + background: transparent; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + + @media (max-width: 576px) { + padding: 0 20px; + } +} + +// Logo +.account-recovery-logo { + width: 90px; + height: 90px; + margin-bottom: 24px; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } +} + +// Title +.account-recovery-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 28px; + font-weight: 700; + color: #000000; + text-align: center; + margin: 0 0 32px 0; + line-height: 1.3; + + @media (max-width: 576px) { + font-size: 24px; + margin-bottom: 24px; + } +} + +// Tab Navigation +.account-recovery-tabs { + display: flex; + gap: 0; + margin-bottom: 40px; + width: 100%; + background: #F8F9FA; + border-radius: 12px; + padding: 4px; + + .tab-link { + flex: 1; + padding: 14px 24px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 600; + color: #64748B; + text-decoration: none; + text-align: center; + background: transparent; + border-radius: 8px; + transition: all 0.3s ease; + + &:hover { + color: #0049B4; + background: rgba(0, 73, 180, 0.05); + } + + &.active { + color: #FFFFFF; + background: #0049B4; + box-shadow: 0 2px 4px rgba(0, 73, 180, 0.2); + } + + @media (max-width: 576px) { + padding: 12px 16px; + font-size: 15px; + } + } +} + +// Alert Messages +.account-alert { + width: 100%; + margin-bottom: 20px; + padding: 14px 18px; + border-radius: 12px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 15px; + display: flex; + align-items: center; + gap: 10px; + animation: slideDown 0.3s ease; + + i { + font-size: 18px; + flex-shrink: 0; + } + + &.alert-error { + background: rgba(255, 107, 107, 0.1); + color: #FF6B6B; + border: 1px solid rgba(255, 107, 107, 0.3); + } + + &.alert-success { + background: rgba(107, 207, 127, 0.1); + color: #6BCF7F; + border: 1px solid rgba(107, 207, 127, 0.3); + } + + &.alert-info { + background: rgba(0, 73, 180, 0.1); + color: #0049B4; + border: 1px solid rgba(0, 73, 180, 0.3); + } +} + +// Form +.account-recovery-form { + width: 100%; + margin-bottom: 0; + + .form-group { + margin-bottom: 24px; + + &:last-of-type { + margin-bottom: 0; + } + } + + .form-label { + display: block; + font-family: 'Noto Sans KR', sans-serif; + font-size: 15px; + font-weight: 600; + color: #1A1A2E; + margin-bottom: 10px; + } + + .form-input { + width: 100%; + height: 70px; + padding: 0 24px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #1A1A2E; + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 12px; + outline: none; + transition: all 0.3s ease; + + &::placeholder { + color: #94A3B8; + } + + &:hover { + border-color: #CBD5E1; + } + + &:focus { + border-color: #0049B4; + box-shadow: 0 0 0 4px rgba(0, 73, 180, 0.08); + } + + &:disabled { + background: #F8F9FA; + border-color: #E2E8F0; + color: #94A3B8; + cursor: not-allowed; + } + + &.error { + border-color: #FF6B6B; + } + } + + .form-select { + width: 100%; + height: 70px; + padding: 0 24px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #1A1A2E; + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 12px; + outline: none; + cursor: pointer; + transition: all 0.3s ease; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L6 6L11 1' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 24px center; + padding-right: 50px; + + &:hover { + border-color: #CBD5E1; + } + + &:focus { + border-color: #0049B4; + box-shadow: 0 0 0 4px rgba(0, 73, 180, 0.08); + } + + &:disabled { + background-color: #F8F9FA; + border-color: #E2E8F0; + color: #94A3B8; + cursor: not-allowed; + opacity: 0.7; + } + + option { + padding: 12px; + font-size: 16px; + } + } +} + +// Phone Input Group +.phone-input-group { + display: flex; + align-items: center; + gap: 12px; + + .phone-prefix { + flex: 0 0 140px; + } + + .phone-middle, + .phone-last { + flex: 1; + } + + .phone-separator { + font-size: 16px; + color: #64748B; + font-weight: 500; + } + + @media (max-width: 576px) { + .phone-prefix { + flex: 0 0 110px; + } + + .phone-separator { + font-size: 14px; + } + } +} + +// Auth Number Group +.auth-number-group { + margin-top: 24px; +} + +.auth-input-group { + position: relative; + + .auth-input { + padding-right: 100px; + } + + .auth-timer { + position: absolute; + right: 24px; + top: 50%; + transform: translateY(-50%); + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 600; + color: #FF6B6B; + pointer-events: none; + + @media (max-width: 576px) { + font-size: 14px; + right: 16px; + } + } +} + +// Buttons +.auth-request-button, +.auth-verify-button { + width: 100%; + height: 70px; + padding: 0 32px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 17px; + font-weight: 700; + color: #FFFFFF; + background: #0049B4; + border: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + margin-top: 16px; + line-height: 1; + + &:hover { + background: darken(#0049B4, 5%); + } + + &:active { + background: darken(#0049B4, 10%); + } + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + + @media (max-width: 576px) { + height: 60px; + font-size: 16px; + } +} + +// Form Actions - Account Recovery specific styles +// Scoped to avoid conflict with common .form-actions in _forms.scss +.account-recovery-card .form-actions { + display: flex; + gap: 12px; + margin-top: 32px; + padding-top: 0; + border-top: none; + + .cancel-button, + .submit-button { + flex: 1; + height: 70px; + padding: 0 32px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 17px; + font-weight: 700; + border: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + line-height: 1; + } + + .cancel-button { + color: #64748B; + background: #FFFFFF; + border: 2px solid #E2E8F0; + + &:hover { + background: #F8F9FA; + border-color: #CBD5E1; + color: #475569; + } + + &:active { + background: #F1F5F9; + border-color: #94A3B8; + } + } + + .submit-button { + color: #FFFFFF; + background: #0049B4; + + &:hover { + background: darken(#0049B4, 5%); + } + + &:active { + background: darken(#0049B4, 10%); + } + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + } + + @media (max-width: 576px) { + flex-direction: column; + gap: 12px; + + .cancel-button, + .submit-button { + height: 60px; + font-size: 16px; + } + } +} + +// Loading Overlay +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(237, 249, 254, 0.9); + display: none; + align-items: center; + justify-content: center; + z-index: 1000; + transition: opacity 0.3s ease; + + &.active { + display: flex; + } + + .spinner { + width: 40px; + height: 40px; + border: 3px solid #DDDDDD; + border-top-color: #0049B4; + border-radius: 50%; + animation: spin 1s linear infinite; + } +} + +// Animations +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +// Responsive adjustments +@media (max-width: 768px) { + .account-recovery-page { + padding: 20px 12px; + margin-top: 40px; + margin-bottom: 40px; + } + + .account-recovery-container { + max-width: 100%; + } +} + +@media (max-width: 576px) { + .account-recovery-logo { + width: 70px; + height: 70px; + margin-bottom: 20px; + } + + .account-recovery-form { + .form-group { + margin-bottom: 20px; + } + + .form-label { + font-size: 14px; + margin-bottom: 8px; + } + + .form-input, + .form-select { + height: 60px; + padding: 0 20px; + font-size: 15px; + } + } + + .auth-request-button, + .auth-verify-button { + margin-top: 12px; + } + + .account-recovery-card .form-actions { + margin-top: 24px; + } +} diff --git a/src/main/resources/static/sass/pages/_api-market.scss b/src/main/resources/static/sass/pages/_api-market.scss index 2f76dde..4ef9da8 100644 --- a/src/main/resources/static/sass/pages/_api-market.scss +++ b/src/main/resources/static/sass/pages/_api-market.scss @@ -6,21 +6,22 @@ .api-market-container { display: flex; min-height: 100vh; - background-color: $gray-bg; + background-color: $white; position: relative; + margin-bottom: 20px; } // Sidebar Navigation .api-market-sidebar { - width: 280px; - background-color: $white; - border-right: 1px solid $border-gray; + width: 283px; + background-color: #F8FBFD; + border-radius: 20px; padding: $spacing-2xl $spacing-lg; position: sticky; - top: 0; - height: 100vh; - overflow-y: auto; + top: $spacing-lg; + height: calc(100vh - 32px); flex-shrink: 0; + margin: $spacing-md; @media (max-width: $breakpoint-md) { width: 240px; @@ -35,6 +36,8 @@ box-shadow: $shadow-lg; z-index: $z-index-modal; height: calc(100vh - 60px); // Full height minus header + margin: 0; + border-radius: 0; &.mobile-open { transform: translateX(0); @@ -42,30 +45,47 @@ } } +.api-sidebar-header { + display: flex; + justify-content: center; + margin-bottom: $spacing-xl; + padding-bottom: $spacing-lg; + + img { + max-width: 100%; + height: auto; + } +} + .api-sidebar-nav { .menu-section { - margin-bottom: $spacing-xs; + margin-bottom: 0; + border-bottom: 1px solid #DDDDDD; + + &:last-child { + border-bottom: none; + } } .menu-title { - padding: 12px $spacing-md; - font-size: $font-size-sm; - font-weight: $font-weight-semibold; - color: $secondary-blue; + padding: 16px 10px; + font-size: $font-size-lg; + font-weight: $font-weight-regular; + color: $text-dark; cursor: pointer; - border-radius: $border-radius-md; transition: $transition-base; display: flex; align-items: center; justify-content: space-between; + position: relative; &:hover { - background-color: $gray-bg; + background-color: rgba($primary-blue, 0.05); } &.active { - background-color: $light-bg; - color: $secondary-blue; + font-weight: $font-weight-bold; + color: $primary-blue; } .api-count { @@ -89,11 +109,60 @@ } } - // Level 2: API List + // Accordion Section + .accordion-section { + .menu-title.accordion-trigger { + .menu-title-text { + flex: 1; + } + + .accordion-icon { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + transition: transform 0.3s ease; + + i { + font-size: 12px; + color: $text-gray; + transition: $transition-base; + } + } + + &:hover .accordion-icon i { + color: $primary-blue; + } + + &.expanded .accordion-icon { + transform: rotate(180deg); + } + + &.active .accordion-icon i { + color: $primary-blue; + } + } + } + + // Level 2: API List (Accordion Content) .api-list { padding-left: $spacing-md; - margin-top: $spacing-xs; - margin-bottom: $spacing-sm; + margin-top: 0; + margin-bottom: 0; + + // Accordion animation + &.accordion-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease, padding 0.3s ease, margin 0.3s ease; + + &.expanded { + max-height: 500px; // Enough height for content + margin-top: $spacing-xs; + margin-bottom: $spacing-sm; + } + } } .api-item { @@ -147,7 +216,9 @@ // Main Content Area .api-market-content { flex: 1; - padding: $spacing-2xl $spacing-3xl; + padding-top: $spacing-5xl; + padding-left: $spacing-sm; + padding-right: $spacing-sm; min-height: 100vh; display: flex; flex-direction: column; @@ -155,6 +226,18 @@ @media (max-width: $breakpoint-sm) { padding: $spacing-lg $spacing-md; } + + // Result Count (inside header) + .api-result-count { + font-size: $font-size-lg; + color: $black; + white-space: nowrap; + + strong { + color: $primary-blue; + font-weight: $font-weight-semibold; + } + } } // Mobile Menu Toggle @@ -165,7 +248,7 @@ right: $spacing-lg; width: 56px; height: 56px; - background: $gradient-primary; + border-radius: $border-radius-circle; border: none; color: $white; @@ -196,7 +279,7 @@ display: flex; justify-content: space-between; align-items: center; - margin-bottom: $spacing-2xl; + margin-bottom: $spacing-lg; @media (max-width: $breakpoint-sm) { flex-direction: column; @@ -288,24 +371,20 @@ } } -// Result Count -.api-result-count { - font-size: $font-size-base; - color: $text-gray; - margin-bottom: $spacing-xl; - strong { - color: $primary-blue; - font-weight: $font-weight-semibold; - } -} // Card Grid .api-card-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + grid-template-columns: repeat(3, 1fr); // 3 cards per row on desktop gap: $spacing-lg; + // Tablet view - 2 cards per row + @media (max-width: $breakpoint-md) { + grid-template-columns: repeat(2, 1fr); + } + + // Mobile view - 1 card per row @media (max-width: $breakpoint-sm) { grid-template-columns: 1fr; } @@ -317,119 +396,80 @@ border-radius: $border-radius-lg; padding: $spacing-xl; box-shadow: $shadow-sm; - transition: $transition-base; cursor: pointer; display: flex; flex-direction: column; - justify-content: space-between; - min-height: 220px; + gap: $spacing-md; + min-height: 180px; position: relative; - overflow: hidden; - - &::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: $gradient-primary; - transform: scaleX(0); - transform-origin: left; - transition: transform 0.3s ease; - } - - &:hover { - box-shadow: $shadow-lg; - transform: translateY(-5px); - - &::before { - transform: scaleX(1); - } - - .api-card-icon { - transform: scale(1.1); - } - } + border: 1px solid $border-gray; &:active { - transform: translateY(-3px); + transform: scale(0.98); } } -.api-card-header { +// Group Info Section (Icon + Name) +.api-card-group { display: flex; align-items: center; gap: $spacing-sm; - margin-bottom: $spacing-md; } -.api-card-badge { - display: inline-flex; +.api-card-group-icon { + width: 32px; + height: 32px; + display: flex; align-items: center; - gap: 6px; - padding: 6px 12px; - background-color: $gray-bg; - border-radius: $border-radius-sm; - font-size: $font-size-xs; - color: $text-gray; - font-weight: $font-weight-medium; + justify-content: center; + background: $gray-bg; + border-radius: $border-radius-md; + flex-shrink: 0; - &::before { - content: "◉"; + img { + width: 20px; + height: 20px; + object-fit: contain; + } + + i { + font-size: 16px; color: $primary-blue; - font-size: 10px; } } -.api-card-title { - font-size: $font-size-md; +.api-card-group-name { + font-size: $font-size-sm; + color: $text-gray; + font-weight: $font-weight-medium; +} + +// API Name (Title) +.api-card-name { + font-size: $font-size-lg; font-weight: $font-weight-semibold; color: $text-dark; - margin-bottom: 12px; line-height: $line-height-tight; + margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; + text-align: left; } +// API Description .api-card-description { font-size: $font-size-sm; color: $text-gray; line-height: $line-height-normal; + margin: 0; flex-grow: 1; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; -} - -.api-card-icon { - text-align: center; - margin-top: $spacing-lg; - font-size: 48px; - opacity: 0.8; - transition: transform 0.3s ease; - - img { - max-width: 60px; - max-height: 60px; - object-fit: contain; - } -} - -// Icon color variations -.api-card:nth-child(3n+1) .api-card-icon { - color: #60a5fa; -} - -.api-card:nth-child(3n+2) .api-card-icon { - color: #34d399; -} - -.api-card:nth-child(3n+3) .api-card-icon { - color: #818cf8; + text-align: left; } // Empty State @@ -556,12 +596,12 @@ } } -// API Overview Card +// API Overview Card (Flat Style) .api-overview-card { - background: $white; - border-radius: $border-radius-lg; - padding: $spacing-xl; - box-shadow: $shadow-sm; + background: transparent; + border-radius: 0; + padding: 0; + padding-bottom: $spacing-xl; display: flex; flex-direction: column; gap: $spacing-lg; @@ -579,12 +619,14 @@ } .api-method-badge { + background: $primary-blue; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; padding: 8px 16px; - background: $gradient-primary; + height: 100%; + color: $white; font-size: $font-size-sm; font-weight: $font-weight-semibold; @@ -638,16 +680,17 @@ gap: $spacing-lg; } -// API Detail Card +// API Detail Card (Flat Style) .api-detail-card { - background: $white; - border-radius: $border-radius-lg; - padding: $spacing-xl; - box-shadow: $shadow-sm; - transition: $transition-base; + background: transparent; + border-radius: 0; + padding: 0; + padding-bottom: $spacing-xl; + border-bottom: 1px solid $border-gray; - &:hover { - box-shadow: $shadow-md; + &:last-child { + border-bottom: none; + padding-bottom: 0; } h3 { @@ -655,8 +698,8 @@ font-weight: $font-weight-semibold; color: $text-dark; margin-bottom: $spacing-md; - padding-bottom: $spacing-sm; - border-bottom: 2px solid $light-bg; + padding-bottom: 0; + border-bottom: none; } .detail-content { @@ -777,4 +820,4 @@ color: $primary-blue; } } -} \ No newline at end of file +} diff --git a/src/main/resources/static/sass/pages/_apikey-detail.scss b/src/main/resources/static/sass/pages/_apikey-detail.scss new file mode 100644 index 0000000..12912ad --- /dev/null +++ b/src/main/resources/static/sass/pages/_apikey-detail.scss @@ -0,0 +1,603 @@ +@charset "utf-8"; + +// ==================================== +// API Key Detail Pages Styles +// For appRequestDetail.html and credentialDetail.html +// Uses common styles from components/_apikey-common.scss +// ==================================== + +// Container Styles - extends common +.apikey-detail-container { + @extend .common-container; + padding: $spacing-2xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg $spacing-md; + } +} + +.register-header { + text-align: center; + margin-bottom: $spacing-5xl; + + h1 { + font-size: $font-size-4xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-sm; + } + + .header-description { + font-size: $font-size-base; + color: $text-gray; + } +} + +// Status Section +.status-section { + text-align: center; + margin-bottom: $spacing-4xl; +} + +// Status Badge - extends common with light style +.status-badge { + @extend .apikey-status-badge; + + &.badge-pending { + background-color: #FFF3CD; + color: #856404; + } + + &.badge-approved { + background-color: #D4EDDA; + color: #155724; + } + + &.badge-rejected { + background-color: #F8D7DA; + color: #721C24; + } +} + +// Detail Section - extends common +.detail-section { + @extend .apikey-detail-section; +} + +.section-title { + font-size: $font-size-xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-lg; + padding-bottom: $spacing-md; +} + +// Detail Grid - extends common +.detail-grid { + @extend .apikey-detail-grid; +} + +.detail-item { + @extend .apikey-detail-item; +} + +.detail-label { + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-gray; +} + +.detail-value { + font-size: $font-size-base; + color: $text-dark; + word-break: break-word; +} + +// App Icon - extends common +.app-icon-display { + @extend .apikey-icon-display; +} + +.app-icon-image { + @extend .apikey-icon-image; +} + +.app-icon-placeholder { + @extend .apikey-icon-placeholder; +} + +// IP List - extends common +.ip-list { + @extend .apikey-ip-list; +} + +.ip-tag { + @extend .apikey-ip-tag; +} + +// Credential Code - extends common +.credential-code { + @extend .apikey-credential-code; +} + +// Secret Box - extends common +.secret-box { + @extend .apikey-secret-box; +} + +// Copy Button - extends common +.btn-copy { + @extend .apikey-btn-copy; +} + +// Status Indicator - extends common +.status-indicator { + @extend .apikey-status-indicator; +} + +.status-dot { + width: 8px; + height: 8px; + border-radius: $border-radius-circle; + background-color: currentColor; +} + +// API Detail List - extends common +.api-detail-list { + @extend .apikey-api-list; +} + +.api-list-item { + @extend .apikey-api-item; + + .api-name { + flex: 1; + font-size: $font-size-base; + font-weight: $font-weight-medium; + color: $text-dark; + margin: 0; + } +} + +.api-method { + display: inline-block; + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + font-weight: $font-weight-bold; + font-family: $font-family-mono; + min-width: 80px; + text-align: center; + + &.method-get { + background-color: #D1FAE5; + color: #065F46; + } + + &.method-post { + background-color: #DBEAFE; + color: #1E40AF; + } + + &.method-put { + background-color: #FEF3C7; + color: #92400E; + } + + &.method-delete { + background-color: #FEE2E2; + color: #991B1B; + } + + &.method-other { + background-color: $border-gray; + color: $text-dark; + } +} + +.api-status { + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-lg; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + + &.status-pending { + background-color: #FFF3CD; + color: #856404; + } + + &.status-active { + background-color: #D4EDDA; + color: #155724; + } +} + +// History Table +.history-table-wrapper { + overflow-x: auto; +} + +.history-table { + width: 100%; + border-collapse: collapse; + + th { + background-color: $gray-bg; + padding: $spacing-md $spacing-md; + text-align: left; + font-weight: $font-weight-semibold; + color: $text-gray; + border-bottom: 2px solid $border-gray; + } + + td { + padding: $spacing-md; + border-bottom: 1px solid $border-gray; + } +} + +.history-status { + display: inline-block; + padding: $spacing-xs $spacing-md; + background-color: $light-bg; + color: $secondary-blue; + border-radius: $border-radius-lg; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; +} + +// Empty State - extends common +.empty-state { + @extend .apikey-empty-state; + grid-column: 1 / -1; + padding: 48px $spacing-lg; +} + +// Action Buttons - extends common +.detail-actions { + @extend .apikey-form-actions; +} + +// Note: Button styles now in components/_buttons.scss +// Keeping page-specific overrides only +.btn-action, +.btn-secondary, +.btn-cancel { + @media (max-width: $breakpoint-sm) { + width: 100%; + } +} + +// ==================================== +// App Info Card (Figma Design) +// For credentialDetail.html and appRequestDetail.html +// ==================================== + +.app-info-card { + display: flex; + align-items: flex-start; + gap: $spacing-xl; + padding: 0; + padding-top: 27px; + margin-bottom: $spacing-4xl; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: center; + text-align: center; + padding: $spacing-lg 0; + gap: $spacing-lg; + } +} + +.app-info-icon { + flex-shrink: 0; + width: 160px; + height: 160px; + border-radius: $border-radius-xl; + overflow: hidden; + background: $gray-bg; + display: flex; + align-items: center; + justify-content: center; + margin-left: 87px; + + @media (max-width: $breakpoint-sm) { + width: 120px; + height: 120px; + } + + .app-icon-image { + width: 100%; + height: 100%; + object-fit: cover; + } + + .app-icon-placeholder { + color: $text-light; + display: flex; + align-items: center; + justify-content: center; + } +} + +.app-info-content { + flex: 1; + display: flex; + flex-direction: column; + gap: $spacing-md; +} + +.app-status-badge { + display: inline-block; + padding: $spacing-xs $spacing-lg; + border-radius: $border-radius-full; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + width: fit-content; + + &.status-approved { + background-color: #0049b4; + color: $white; + } + + &.status-pending { + background-color: #FFF3CD; + color: #856404; + } + + &.status-inactive { + background-color: $border-gray; + color: $text-gray; + } + + &.status-rejected { + background-color: #F8D7DA; + color: #721C24; + } +} + +.app-info-name { + font-size: 24px; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0; + + @media (max-width: $breakpoint-sm) { + font-size: 20px; + } +} + +.app-info-description { + font-size: 18px; + color: #515151; + margin: 0; + line-height: 1.5; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-base; + } +} + +// ==================================== +// API Key Info Section +// For credential details display +// Figma Design: node 985-1365 +// ==================================== + +.apikey-info-section { + background: #F6F9FB; + border-radius: $border-radius-lg; + padding: $spacing-3xl $spacing-2xl; + margin-bottom: $spacing-2xl; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg; + } +} + +.info-row { + display: flex; + align-items: center; + gap: $spacing-xl; + margin-bottom: $spacing-xl; + + &:last-child { + margin-bottom: 0; + } + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: flex-start; + gap: $spacing-sm; + } +} + +.info-row-vertical { + align-items: flex-start; + + .info-value { + width: 100%; + + @media (max-width: $breakpoint-sm) { + max-width: 100%; + } + } +} + +.info-label { + flex-shrink: 0; + width: 140px; + font-size: 20px; + font-weight: $font-weight-bold; + color: #212529; + + @media (max-width: $breakpoint-sm) { + width: 100%; + font-size: $font-size-base; + } +} + +.info-value { + flex: 1; + font-size: $font-size-base; + color: $text-dark; + word-break: break-word; + + @media (max-width: $breakpoint-sm) { + width: 100%; + } +} + +// Info Value Box Styles (Figma) +.info-value-box { + display: flex; + align-items: center; + justify-content: center; + height: 60px; + padding: 0 $spacing-lg; + background: #DDDDDD; + border-radius: $border-radius-lg; + font-size: 20px; + color: #515151; + text-align: center; + + @media (max-width: $breakpoint-sm) { + height: 50px; + font-size: $font-size-base; + padding: 0 $spacing-md; + } + + &.with-copy { + flex: 1; + } +} + +// Client ID Row with Copy Button +.info-row-with-action { + .info-value { + display: flex; + gap: $spacing-md; + align-items: center; + } +} + +.btn-copy-action { + display: flex; + align-items: center; + justify-content: center; + gap: $spacing-xs; + height: 60px; + width: 158px; + padding: 0 $spacing-lg; + background: #A4D6EA; + border: none; + border-radius: $border-radius-lg; + font-size: 20px; + font-weight: $font-weight-bold; + color: $white; + cursor: pointer; + white-space: nowrap; + transition: background 0.2s ease; + + &:hover { + background: darken(#A4D6EA, 10%); + } + + @media (max-width: $breakpoint-sm) { + height: 50px; + font-size: $font-size-base; + padding: 0 $spacing-md; + } +} + +// Client Secret View Button +.btn-view-secret { + display: flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + width: 100%; + height: 60px; + background: #3BA4ED; + border: none; + border-radius: $border-radius-lg; + font-size: 20px; + font-weight: $font-weight-bold; + color: $white; + cursor: pointer; + transition: background 0.2s ease; + + &:hover { + background: darken(#3BA4ED, 10%); + } + + svg { + width: 20px; + height: 20px; + } + + @media (max-width: $breakpoint-sm) { + max-width: 100%; + height: 50px; + font-size: $font-size-base; + } +} + +// API List Box (White background) +.api-list-box { + width: 100%; + background: $white; + border: 1px solid #DADADA; + border-radius: $border-radius-lg; + padding: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + max-width: 100%; + padding: $spacing-md; + } +} + +// API List Item (Figma style) +.api-list-item-figma { + display: flex; + align-items: center; + justify-content: space-between; + padding: $spacing-md 0; + border-bottom: 1px solid #DADADA; + + &:last-child { + border-bottom: none; + } + + .api-item-name { + font-size: 18px; + color: #000; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-base; + } + } + + .api-item-status { + display: flex; + align-items: center; + justify-content: center; + min-width: 100px; + height: 30px; + padding: 0 $spacing-lg; + background: #ECEFF4; + border-radius: $border-radius-full; + font-size: $font-size-base; + color: #515151; + + @media (max-width: $breakpoint-sm) { + min-width: 80px; + font-size: $font-size-sm; + padding: 0 $spacing-md; + } + } +} + +// ==================================== +// .form-actions-center moved to components/_forms.scss diff --git a/src/main/resources/static/sass/pages/_apikey-list.scss b/src/main/resources/static/sass/pages/_apikey-list.scss new file mode 100644 index 0000000..0dcee62 --- /dev/null +++ b/src/main/resources/static/sass/pages/_apikey-list.scss @@ -0,0 +1,172 @@ +@charset "utf-8"; + +// ==================================== +// API Key List Page Styles +// For apiKeyList.html +// Uses common styles from components/_apikey-common.scss +// ==================================== + +// App Management Container - extends common +.app-management-container { + @extend .common-container; +} + +// App List Title Section - extends common +.app-list-title-section { + @extend .common-title-bar; +} + +.app-list-title { + font-family: $font-family-primary; + font-size: 28px; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0; + + @include respond-to('sm') { + font-size: 22px; + } +} + +// App List Container - extends common +.app-list-container { + @extend .common-section-box; + min-height: 400px; +} + +// App List Item +.app-list-item { + display: flex; + align-items: center; + gap: $spacing-lg; + padding: 40px 0; + border-bottom: 1px solid #e0e0e0; + text-decoration: none; + color: inherit; + transition: background-color 0.2s ease; + + &:last-child { + border-bottom: none; + } + + &:hover { + background-color: rgba(255, 255, 255, 0.5); + margin: 0 -20px; + padding-left: 20px; + padding-right: 20px; + border-radius: $border-radius-md; + } + + @include respond-to('sm') { + flex-direction: column; + align-items: flex-start; + padding: 30px 0; + gap: $spacing-md; + + &:hover { + margin: 0 -10px; + padding-left: 10px; + padding-right: 10px; + } + } +} + +// App Icon - uses common icon styles +.app-list-icon { + @extend .apikey-icon-display; + width: 70px; + height: 70px; + + @include respond-to('sm') { + width: 60px; + height: 60px; + } + + .app-icon-image { + @extend .apikey-icon-image; + border: none; + } + + .app-icon-placeholder { + @extend .apikey-icon-placeholder; + font-size: inherit; + } +} + +// App Info +.app-list-info { + display: flex; + flex-direction: column; + gap: 14px; + flex: 1; +} + +.app-list-header { + display: flex; + align-items: center; + gap: $border-radius-lg; + + @include respond-to('sm') { + flex-wrap: wrap; + gap: $spacing-sm; + } +} + +// Status Badge - extends common +.app-status-badge { + @extend .apikey-status-badge; +} + +// App Name +.app-list-name { + font-family: $font-family-primary; + font-size: 22px; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0; + + @include respond-to('sm') { + font-size: 18px; + } +} + +// App Description +.app-list-description { + font-family: $font-family-primary; + font-size: $font-size-base; + font-weight: $font-weight-regular; + color: #6e7780; + margin: 0; + line-height: 1.5; + + @include respond-to('sm') { + font-size: $font-size-sm; + } +} + +// Empty State - extends common +.app-list-empty { + @extend .apikey-empty-state; +} + +// Create App Button Wrapper +.app-create-button-wrapper { + display: flex; + justify-content: center; + margin-top: 60px; + + @include respond-to('sm') { + margin-top: 40px; + } +} + +// Create App Button - extends common +.btn-app-create { + @extend .apikey-action-btn; + background-color: #0049b4; + color: $white; + + &:hover { + background-color: #003a91; + } +} diff --git a/src/main/resources/static/sass/pages/_apikey-register.scss b/src/main/resources/static/sass/pages/_apikey-register.scss new file mode 100644 index 0000000..a03b85a --- /dev/null +++ b/src/main/resources/static/sass/pages/_apikey-register.scss @@ -0,0 +1,1893 @@ +// ----------------------------------------------------------------------------- +// API Key Registration Wizard Styles +// Reference: apps/mypage/apiKeyRegisterStep1.html, Step2, Step3 +// Uses common styles from components/_apikey-common.scss +// ----------------------------------------------------------------------------- + +// ============================================================================= +// STEP 1: App Information Input (New Figma Design) +// ============================================================================= + +// Title Bar - extends common with flex layout +.register-title-bar { + @extend .common-title-bar; + padding: 18px 45px; + display: flex; + align-items: baseline; + gap: 16px; + + @include respond-to('md') { + flex-direction: column; + gap: 8px; + padding: 14px 20px; + } + + .register-title { + font-size: 28px; + font-weight: $font-weight-bold; + color: $text-dark; + margin: 0; + + @include respond-to('md') { + font-size: 22px; + } + } + + .register-subtitle { + font-size: 16px; + font-weight: $font-weight-regular; + color: #515151; + + @include respond-to('md') { + font-size: 14px; + } + } +} + +// Progress Steps Container +.register-progress { + display: flex; + justify-content: center; + margin-bottom: 40px; +} + +.progress-steps { + display: flex; + align-items: flex-start; + gap: 50px; +} + +// Step Dots (between steps) +.step-dots { + display: flex; + gap: 6px; + + span { + width: 6px; + height: 6px; + border-radius: $border-radius-circle; + background-color: #dadada; + } + + @include respond-to('md') { + display: none; + } +} + +// Circular Progress Steps (Step 1 Design) +.progress-step-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + + .step-icon-wrapper { + padding: 10px; + } + + .step-icon { + width: 62px; + height: 62px; + border-radius: $border-radius-circle; + background-color: #e6e6e6; + display: flex; + align-items: center; + justify-content: center; + color: #999; + } + + &.active .step-icon { + background-color: #0049b4; + color: $white; + } + + .step-label { + font-size: 14px; + font-weight: $font-weight-regular; + color: #dadada; + text-align: center; + white-space: nowrap; + } + + &.active .step-label { + font-weight: $font-weight-bold; + color: #0049b4; + } +} + +// Form Container (Step 1) - extends common +.register-form-container { + @extend .common-section-box; + padding: 50px 45px; + + @include respond-to('md') { + padding: 30px 20px; + } + + // With Sidebar variant (Step 2) + &.with-sidebar { + display: flex; + gap: 0; + padding: 28px; + min-height: 600px; + + @include respond-to('sm') { + flex-direction: column; + } + } +} + +// Form Row, Label, Field styles moved to components/_forms.scss + +// Form Input - Step 1 Style +.register-form-container { + .form-input { + width: 100%; + height: 60px; + padding: 0 20px; + border: 1px solid #dadada; + border-radius: $border-radius-lg; + background-color: $white; + font-size: 20px; + color: $text-dark; + outline: none; + transition: border-color 0.2s ease; + + &::placeholder { + color: #dadada; + } + + &:focus { + border-color: #0049b4; + } + + @include respond-to('md') { + height: 50px; + font-size: 16px; + } + } + + .form-textarea { + width: 100%; + min-height: 190px; + padding: 18px 20px; + border: 1px solid #dadada; + border-radius: $border-radius-lg; + background-color: $white; + font-size: 20px; + color: $text-dark; + outline: none; + resize: vertical; + transition: border-color 0.2s ease; + + &::placeholder { + color: #dadada; + } + + &:focus { + border-color: #0049b4; + } + + @include respond-to('md') { + min-height: 140px; + font-size: 16px; + } + } +} + +// .char-counter-wrapper moved to components/_forms.scss + +// Icon Upload Box - Step 1 Style +.icon-upload-box { + background-color: $white; + border: 1px solid #dadada; + border-radius: $border-radius-lg; + padding: 50px 40px; + display: flex; + flex-direction: column; + align-items: center; + gap: 26px; + + @include respond-to('md') { + padding: 30px 20px; + } +} + +.icon-preview-area { + width: 100px; + height: 100px; + position: relative; + + img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: $border-radius-md; + } +} + +.icon-placeholder { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + border-radius: $border-radius-md; + color: #999; +} + +.icon-upload-box .btn-remove-icon { + position: absolute; + top: -8px; + right: -8px; + width: 24px; + height: 24px; + border-radius: $border-radius-circle; + background-color: #dc3545; + color: $white; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s ease; + + &:hover { + background-color: #c82333; + } +} + +.icon-upload-info { + text-align: center; + + .upload-title { + font-size: 16px; + font-weight: $font-weight-bold; + color: #515961; + margin: 0 0 11px; + } + + .upload-hint { + font-size: 14px; + font-weight: $font-weight-regular; + color: #515961; + margin: 0; + + strong { + font-weight: $font-weight-bold; + } + } +} + +// .btn-upload moved to components/_buttons.scss + +// IP Input Row - Step 1 Style +.ip-input-row { + display: flex; + gap: 21px; + + .ip-input { + flex: 1; + } + + @include respond-to('md') { + flex-direction: column; + gap: 12px; + } +} + +.btn-add-ip { + width: 158px; + height: 60px; + background-color: #3ba4ed; + color: $white; + border: none; + border-radius: $border-radius-lg; + font-size: 20px; + font-weight: $font-weight-bold; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; + + &:hover { + background-color: #2b94dd; + } + + @include respond-to('md') { + width: 100%; + font-size: 16px; + height: 50px; + } +} + +// IP List - Step 1 Style +.register-form-container .ip-list { + margin-top: 20px; + border: none; + background: transparent; + + .ip-items { + display: flex; + flex-direction: column; + gap: 10px; + max-height: none; + } + + .ip-item { + display: flex; + gap: 21px; + padding: 0; + border-bottom: none; + + &:hover { + background: transparent; + } + + @include respond-to('md') { + flex-direction: column; + gap: 12px; + } + + .ip-display { + flex: 1; + height: 60px; + padding: 0 20px; + border: 1px solid #dadada; + border-radius: $border-radius-md; + background-color: $white; + display: flex; + align-items: center; + font-size: 20px; + color: $text-dark; + } + + .btn-remove-ip { + width: 158px !important; + height: 60px !important; + background-color: #e5e7eb !important; + color: #5f666c !important; + border: none !important; + border-radius: $border-radius-lg !important; + font-size: 20px !important; + font-weight: $font-weight-bold; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; + display: flex !important; + align-items: center; + justify-content: center; + + @include respond-to('md') { + width: 100% !important; + font-size: 16px !important; + height: 50px !important; + } + } + } +} + +// Submit Button - Step 1 Style - extends common +.btn-submit { + @extend .apikey-action-btn; +} + +// ============================================================================= +// STEP 2 & STEP 3: Original Styles +// ============================================================================= + +// Container with sidebar layout (Step 2) - extends common +.apikey-register-container { + @extend .common-container; + padding: $spacing-2xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg $spacing-md; + } + + // Step 2: Sidebar + Grid Layout + &.with-sidebar { + display: flex; + min-height: calc(100vh - 200px); + position: relative; + padding: 0; + } +} + +// Progress Indicator +.register-progress { + margin-bottom: $spacing-3xl; + padding: 0 $spacing-lg; + + .progress-steps { + display: flex; + align-items: center; + justify-content: center; + position: relative; + } + + .progress-step { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + z-index: 2; + + .step-number { + width: 40px; + height: 40px; + border-radius: $border-radius-circle; + background: $white; + border: 2px solid $border-gray; + display: flex; + align-items: center; + justify-content: center; + font-weight: $font-weight-semibold; + color: $text-gray; + transition: $transition-base; + margin-bottom: $spacing-sm; + } + + .step-label { + font-size: $font-size-sm; + color: $text-gray; + white-space: nowrap; + } + + &.active { + .step-number { + background: $primary-blue; + border-color: $primary-blue; + color: $white; + box-shadow: 0 0 0 4px rgba($primary-blue, 0.1); + } + + .step-label { + color: $primary-blue; + font-weight: $font-weight-medium; + } + } + + &.completed { + .step-number { + background: $accent-green; + border-color: $accent-green; + color: $white; + } + + .step-label { + color: $text-dark; + } + } + } + + .progress-line { + flex: 1; + height: 2px; + background: $border-gray; + margin: 0 $spacing-md; + margin-bottom: 28px; + position: relative; + + &.filled { + background: $accent-green; + } + } +} + +// Register Header +.register-header { + text-align: center; + margin-bottom: $spacing-3xl; + padding: 0 $spacing-lg; + + h1 { + font-size: $font-size-2xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-sm; + } + + h2 { + font-size: $font-size-xl; + font-weight: $font-weight-semibold; + color: $primary-blue; + margin-bottom: $spacing-md; + } + + .header-description { + font-size: $font-size-base; + color: $text-gray; + max-width: 600px; + margin: 0 auto; + } +} + +// Step 2: Sidebar Navigation +.apikey-register-sidebar { + width: 254px; + background-color: #eceff4; + border-radius: $border-radius-lg; + padding: 23px 12px; + position: sticky; + top: 0; + height: fit-content; + max-height: calc(100vh - 100px); + overflow-y: auto; + flex-shrink: 0; + + @media (max-width: $breakpoint-md) { + width: 240px; + } + + @media (max-width: $breakpoint-sm) { + position: fixed; + left: 0; + top: 60px; + transform: translateX(-100%); + transition: transform 0.3s ease; + box-shadow: $shadow-lg; + z-index: $z-index-modal; + height: calc(100vh - 60px); + max-height: none; + margin: 0; + border-radius: 0; + + &.mobile-open { + transform: translateX(0); + } + } +} + +.apikey-sidebar-nav { + // Sidebar Title + .sidebar-title { + font-size: 20px; + font-weight: $font-weight-bold; + color: #212529; + text-align: center; + padding: 20px 14px 45px; + } + + .menu-section { + margin-bottom: 0; + border-bottom: 1px solid #dadada; + + &:last-child { + border-bottom: none; + } + } + + .menu-title { + padding: 22px 14px; + font-size: 20px; + font-weight: $font-weight-regular; + color: #212529; + cursor: pointer; + transition: $transition-base; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + + &:hover { + background-color: rgba(0, 0, 0, 0.02); + } + + &.active { + font-weight: $font-weight-bold; + color: #212529; + } + + // Menu icon (left side) + .menu-icon { + width: 20px; + height: 20px; + flex-shrink: 0; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } + } + + // Menu text + .menu-text { + flex: 1; + } + + // Right indicator (dot) + .api-count { + width: 8px; + height: 8px; + padding: 0; + min-width: auto; + background-color: #dadada; + border-radius: 50%; + font-size: 0; + flex-shrink: 0; + } + + &.active .api-count { + // Blue dot for active state + background-color: #3ba4ed; + } + } +} + +// Step 2: Main Content Area +.apikey-register-content { + flex: 1; + padding: 23px 30px; + min-height: auto; + display: flex; + flex-direction: column; + + // Result Count + .api-result-count { + font-size: $font-size-base; + color: $text-gray; + margin-bottom: $spacing-xl; + + strong { + color: $primary-blue; + font-weight: $font-weight-semibold; + } + } + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg $spacing-md; + } +} + +// Mobile Menu Toggle +.apikey-mobile-toggle { + display: none; + position: fixed; + bottom: $spacing-lg; + right: $spacing-lg; + width: 56px; + height: 56px; + + border-radius: $border-radius-circle; + border: none; + color: $white; + font-size: 24px; + cursor: pointer; + box-shadow: $shadow-lg; + z-index: $z-index-modal + 1; + transition: $transition-base; + + &:hover { + transform: scale(1.05); + box-shadow: $shadow-xl; + } + + &:active { + transform: scale(0.95); + } + + @media (max-width: $breakpoint-sm) { + display: flex; + align-items: center; + justify-content: center; + } +} + +// Mobile Overlay +.apikey-mobile-overlay { + display: none; + position: fixed; + top: 60px; + left: 0; + right: 0; + bottom: 0; + background-color: rgba($black, 0.5); + z-index: $z-index-modal - 1; + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; + + @media (max-width: $breakpoint-sm) { + display: block; + } + + &.active { + opacity: 1; + pointer-events: auto; + } +} + +// Search and Filter Section (Step 2) +.api-filter-header { + display: flex; + justify-content: flex-end; + align-items: center; + margin-bottom: $spacing-xl; + gap: $spacing-md; + + @media (max-width: $breakpoint-sm) { + justify-content: stretch; + } +} + +.api-search-box { + position: relative; + width: 228px; + height: 44px; + flex-shrink: 0; + margin-left: auto; // Always align to right on PC + + @media (max-width: $breakpoint-sm) { + width: 100%; + margin-left: 0; + } + + .search-input { + width: 100%; + height: 100%; + padding: 0 44px 0 17px; + border: 1px solid #dadada; + border-radius: 12px; + background-color: $white; + font-size: 14px; + font-family: inherit; + outline: none; + transition: $transition-base; + + &:focus { + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &::placeholder { + color: #8c959f; + } + } + + // Search icon (SVG) + svg { + position: absolute; + right: 17px; + top: 50%; + transform: translateY(-50%); + pointer-events: none; + } +} + +.selection-counter { + font-size: $font-size-base; + color: $text-gray; + white-space: nowrap; + + .counter-value { + font-weight: $font-weight-semibold; + color: $primary-blue; + } +} + +// API Filter Header with Select All +.api-filter-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: $spacing-lg; + margin-bottom: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + gap: $spacing-md; + } + + .select-all-wrapper { + display: flex; + align-items: center; + flex: 1; + + @media (max-width: $breakpoint-sm) { + order: 2; + } + } + + .select-all-label { + display: flex; + align-items: center; + gap: $spacing-sm; + cursor: pointer; + font-size: $font-size-base; + color: $text-dark; + user-select: none; + + &:hover { + color: $primary-blue; + } + } + + .select-all-checkbox { + width: 18px; + height: 18px; + cursor: pointer; + accent-color: $primary-blue; + + &:indeterminate { + opacity: 0.6; + } + } + + .api-search-box { + @media (max-width: $breakpoint-sm) { + order: 1; + } + } +} + + + +// API Card Grid (Step 2) +.api-selection-card-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: $spacing-lg; + margin-bottom: $spacing-xl; + + // Tablet: 2 columns + @media (max-width: $breakpoint-md) { + grid-template-columns: repeat(2, 1fr); + gap: $spacing-md; + } + + // Mobile: 1 column + @media (max-width: $breakpoint-sm) { + grid-template-columns: 1fr; + gap: $spacing-md; + } +} + +// Custom Checkbox SVG Styles +// .visually-hidden moved to base/_utilities.scss + +.custom-checkbox { + display: inline-block; + width: 22px; + height: 22px; + flex-shrink: 0; + cursor: pointer; + background-image: url('/img/checkbox-unchecked.svg'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + border-radius: 50%; +} + +// Checkbox checked state - controlled by sibling input +input[type="checkbox"]:checked + .custom-checkbox { + background-color: #0049B4; + background-image: url('/img/checkbox-checked.svg'); +} + +// Select All checkbox styling +.select-all-label { + .custom-checkbox { + margin-right: 8px; + } +} + +// Individual API Card with Checkbox (Step 2) - Figma Design +.api-selection-card { + background: $white; + border: 1px solid #dadada; + border-radius: 12px; + transition: $transition-base; + cursor: pointer; + position: relative; + + &:hover { + border-color: $primary-blue; + box-shadow: $shadow-md; + } + + &.selected { + border-color: #0049b4; + background-color: rgba(#0049b4, 0.02); + } + + .api-card-content { + display: flex; + flex-direction: column; + gap: 14px; + padding: 26px 28px; + cursor: pointer; + + // Header: Category + Checkbox + .api-card-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 13px; + + .api-card-category { + font-size: 14px; + font-weight: $font-weight-regular; + color: #6e7780; + flex: 1; + } + + .checkbox-wrapper { + flex-shrink: 0; + + .api-checkbox { + width: 22px; + height: 22px; + cursor: pointer; + accent-color: #0049b4; + } + } + } + + // API Name + .api-name { + font-size: 18px; + font-weight: $font-weight-bold; + color: #212529; + margin: 0; + line-height: 1; + } + + // API Description + .api-description { + font-size: 15px; + font-weight: $font-weight-regular; + color: #515961; + margin: 0; + line-height: 1.2; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + + // API Icon (Right aligned) + .api-card-icon { + display: flex; + justify-content: flex-end; + margin-top: auto; + + img { + width: 50px; + height: 50px; + object-fit: contain; + } + + i { + width: 50px; + height: 50px; + display: flex; + align-items: center; + justify-content: center; + font-size: 32px; + color: #999; + } + } + } +} + +// Selected Summary +.selected-summary { + background: $light-bg; + border-radius: $border-radius-lg; + padding: $spacing-lg; + margin-bottom: $spacing-xl; + + h3 { + font-size: $font-size-md; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-md; + } + + .selected-list { + display: flex; + flex-wrap: wrap; + gap: $spacing-sm; + + .selected-chip { + display: inline-flex; + align-items: center; + gap: $spacing-xs; + padding: 6px 12px; + background: $white; + border: 1px solid $primary-blue; + border-radius: $border-radius-full; + font-size: $font-size-sm; + color: $primary-blue; + + .remove-chip { + background: none; + border: none; + color: $primary-blue; + font-size: 18px; + cursor: pointer; + padding: 0; + margin-left: 4px; + + &:hover { + color: $accent-orange; + } + } + } + } +} + +// Empty state for API selection - extends common +.empty-api-state { + @extend .apikey-empty-state; + padding: $spacing-3xl; +} + +// Loading state for API selection +.loading-state { + padding: $spacing-3xl; + text-align: center; + color: $text-gray; + + .loading-spinner { + width: 48px; + height: 48px; + margin: 0 auto $spacing-lg; + border: 4px solid $border-gray; + border-top-color: $primary-blue; + border-radius: $border-radius-circle; + animation: spin 1s linear infinite; + } + + p { + font-size: $font-size-base; + color: $text-gray; + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +// Register Form (Step 1) +.register-form { + width: 100%; + max-width: 1021px; + margin: 0 auto; + + .form-card { + background: $white; + border-radius: $border-radius-lg; + padding: $spacing-2xl; + box-shadow: $shadow-sm; + margin-bottom: $spacing-xl; + } + + .form-group { + margin-bottom: $spacing-xl; + + &:last-child { + margin-bottom: 0; + } + } + + .form-label { + display: block; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-sm; + + &.required .required-mark { + color: $accent-orange; + margin-left: 4px; + } + } + + .form-input, + .form-select, + .form-textarea { + width: 100%; + padding: 12px $spacing-md; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-base; + transition: $transition-base; + background: $white; + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &::placeholder { + color: $text-light; + } + + &:disabled { + background-color: #E2E8F0; + } + } + + .form-textarea { + resize: vertical; + min-height: 100px; + font-family: inherit; + } + + .form-hint { + display: block; + font-size: $font-size-xs; + color: $text-gray; + margin-top: $spacing-xs; + + .char-counter { + float: right; + color: $text-light; + } + } + + .radio-group { + display: flex; + gap: $spacing-lg; + flex-wrap: wrap; + + .radio-label { + display: flex; + align-items: center; + cursor: pointer; + + input[type="radio"] { + margin-right: $spacing-sm; + } + + .radio-text { + font-size: $font-size-base; + color: $text-dark; + } + } + } + + // Icon Upload Styles + .icon-upload-wrapper { + display: flex; + align-items: center; + gap: $spacing-lg; + + .icon-preview { + width: 120px; + height: 120px; + border: 2px dashed $border-gray; + border-radius: $border-radius-lg; + display: flex; + align-items: center; + justify-content: center; + background: $gray-bg; + overflow: hidden; + position: relative; + transition: $transition-base; + + &:hover { + border-color: $primary-blue; + background: rgba($primary-blue, 0.05); + } + + .icon-placeholder { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: $spacing-sm; + color: $text-gray; + text-align: center; + padding: $spacing-md; + + svg { + opacity: 0.5; + } + + span { + font-size: $font-size-xs; + font-weight: $font-weight-medium; + } + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + .btn-remove-icon { + position: absolute; + top: 8px; + right: 8px; + width: 28px; + height: 28px; + padding: 0; + background: rgba($white, 0.95); + border: 1px solid $border-gray; + border-radius: $border-radius-circle; + color: $text-gray; + cursor: pointer; + transition: $transition-base; + display: none; + align-items: center; + justify-content: center; + box-shadow: $shadow-sm; + z-index: 10; + + svg { + width: 14px; + height: 14px; + } + + &:hover { + background: $accent-orange; + border-color: $accent-orange; + color: $white; + transform: scale(1.1); + box-shadow: $shadow-md; + } + + &:active { + transform: scale(0.95); + } + } + } + + .icon-input { + display: none; + } + + .btn-icon-select { + padding: 10px 20px; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + color: $text-dark; + cursor: pointer; + transition: $transition-base; + + &:hover { + background: $primary-blue; + border-color: $primary-blue; + color: $white; + } + + &:active { + transform: scale(0.98); + } + } + } + + // IP Whitelist Styles + .ip-input-group { + display: flex; + gap: $spacing-sm; + margin-bottom: $spacing-md; + + .form-input { + flex: 1; + } + + .btn-add-ip { + display: inline-flex; + align-items: center; + gap: $spacing-xs; + padding: 10px 16px; + background: $primary-blue; + border: none; + border-radius: $border-radius-md; + color: $white; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + cursor: pointer; + transition: $transition-base; + white-space: nowrap; + + svg { + flex-shrink: 0; + } + + &:hover { + background: $secondary-blue; + transform: translateY(-1px); + box-shadow: $shadow-md; + } + + &:active { + transform: translateY(0); + } + } + } + + .ip-list { + margin-top: $spacing-md; + overflow: hidden; + + .ip-list-header { + padding: $spacing-md; + background: $gray-bg; + border-bottom: 1px solid $border-gray; + + .ip-count { + font-size: $font-size-sm; + color: $text-gray; + + strong { + color: $primary-blue; + font-weight: $font-weight-semibold; + } + } + } + + .ip-items { + max-height: 240px; + overflow-y: auto; + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: $gray-bg; + } + + &::-webkit-scrollbar-thumb { + background: $border-gray; + border-radius: 3px; + + &:hover { + background: $text-light; + } + } + } + + .ip-item { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid $border-gray; + transition: $transition-base; + + &:last-child { + border-bottom: none; + } + + &:hover { + background: $gray-bg; + } + + .ip-address { + font-family: $font-family-mono; + font-size: $font-size-sm; + color: $text-dark; + font-weight: $font-weight-medium; + } + + .btn-remove-ip { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + padding: 0; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-sm; + color: $text-gray; + cursor: pointer; + transition: $transition-base; + + svg { + width: 14px; + height: 14px; + } + + &:active { + transform: scale(0.95); + } + } + } + } +} + +// Form Actions - Page specific overrides +// Base .form-actions is in components/_forms.scss +.register-form-container .form-actions { + justify-content: space-between; + padding: 0 $spacing-lg $spacing-lg; + margin-top: $spacing-2xl; + border-top: none; + padding-top: 0; + + @media (max-width: $breakpoint-sm) { + padding: 0 $spacing-md $spacing-md; + } +} + +// Result Page (Step 3) - extends common section box +.register-result { + @extend .common-section-box; + text-align: center; + margin: 0 auto; + height: 1045px; + padding-top: 262px; + + &.success { + .result-icon { + + img { + width: 250px; + height: 250px; + } + } + } + + &.error { + .result-icon { + background: rgba($accent-orange, 0.1); + color: $accent-orange; + } + } + + .result-icon-wrapper { + margin-bottom: $spacing-xl; + + .result-icon { + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; + font-size: 40px; + } + } + + .result-header { + margin-bottom: $spacing-2xl; + + h1 { + font-size: $font-size-xl; + font-weight: $font-weight-bold; + color: $primary-blue; + margin-bottom: $spacing-md; + } + + .result-description { + font-size: $font-size-base; + color: $text-gray; + margin: 0 auto; + } + } +} + +// .alert moved to components/_alerts.scss + +.key-info-card { + background: $white; + border-radius: $border-radius-lg; + padding: $spacing-xl; + box-shadow: $shadow-md; + margin-bottom: $spacing-xl; + text-align: left; + + .info-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: $spacing-md 0; + border-bottom: 1px solid $border-gray; + + &:last-child { + border-bottom: none; + } + + .info-label { + font-size: $font-size-sm; + color: $text-gray; + font-weight: $font-weight-medium; + min-width: 120px; + } + + .info-value { + font-size: $font-size-base; + color: $text-dark; + font-weight: $font-weight-medium; + } + + .key-display { + display: flex; + align-items: center; + gap: $spacing-sm; + flex: 1; + justify-content: flex-end; + + .key-value { + font-family: $font-family-mono; + font-size: $font-size-sm; + background: $gray-bg; + padding: 8px 12px; + border-radius: $border-radius-sm; + color: $secondary-blue; + margin-right: $spacing-sm; + } + + .btn-copy, + .btn-toggle-visibility { + padding: 6px 10px; + background: $white; + border: 1px solid $border-gray; + border-radius: $border-radius-sm; + cursor: pointer; + transition: $transition-base; + + &:hover { + background: $primary-blue; + border-color: $primary-blue; + color: $white; + } + } + } + + .status-badge { + &.active { + padding: 4px 12px; + background: rgba($accent-green, 0.15); + color: #4FA065; + border-radius: $border-radius-full; + font-size: $font-size-xs; + font-weight: $font-weight-semibold; + } + } + } +} + +.selected-apis-summary { + background: $gray-bg; + border-radius: $border-radius-lg; + padding: $spacing-lg; + margin-bottom: $spacing-xl; + text-align: left; + + h3 { + font-size: $font-size-md; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-md; + } + + .api-chips { + display: flex; + flex-wrap: wrap; + gap: $spacing-sm; + margin-bottom: $spacing-md; + + .api-chip { + padding: 6px 12px; + background: $white; + border: 1px solid $primary-blue; + border-radius: $border-radius-full; + font-size: $font-size-sm; + color: $primary-blue; + } + } + + .api-note { + font-size: $font-size-xs; + color: $text-gray; + font-style: italic; + } +} + +.next-steps-card { + background: $light-bg; + border-radius: $border-radius-lg; + padding: $spacing-xl; + margin-bottom: $spacing-xl; + text-align: left; + + h3 { + font-size: $font-size-md; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-md; + } + + .steps-list { + margin-left: $spacing-lg; + color: $text-gray; + font-size: $font-size-sm; + line-height: $line-height-loose; + + li { + margin-bottom: $spacing-sm; + } + } +} + +.result-actions { + display: flex; + justify-content: center; + gap: $spacing-md; + flex-wrap: wrap; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + gap: $spacing-sm; + padding: 0 $spacing-md; + } + + .btn-primary, + .btn-secondary { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + padding: 12px 24px; + border-radius: $border-radius-md; + font-size: $font-size-base; + font-weight: $font-weight-medium; + transition: $transition-base; + text-decoration: none; + cursor: pointer; + border: none; + + .icon { + font-size: 18px; + } + + @media (max-width: $breakpoint-sm) { + width: 100%; + min-height: 48px; + padding: 14px $spacing-lg; + justify-content: center; + } + } + + .btn-primary { + color: $white; + box-shadow: $shadow-md; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-lg; + } + } + + .btn-secondary { + background: $white; + color: $text-dark; + border: 1px solid $border-gray; + + &:hover { + background: $gray-bg; + border-color: $primary-blue; + color: $primary-blue; + } + } +} + +// ----------------------------------------------------------------------------- +// Floating Cart Button - Figma Design (node 976:767) +// Background: #3ba4ed, Height: 66px, Width: 180px, Border-radius: 60px +// ----------------------------------------------------------------------------- +.floating-cart-btn { + position: fixed; + bottom: 80px; + right: 40px; + width: 180px; + height: 66px; + padding: 10px 16px 10px 36px; + border-radius: 60px; + background-color: #3ba4ed; + border: none; + color: $white; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + box-shadow: $shadow-xl; + transition: all 0.3s ease; + z-index: $z-index-fixed; + + // "선택된 API" label + .cart-label { + font-size: 14px; + font-weight: $font-weight-bold; + color: $white; + white-space: nowrap; + } + + // Badge circle with count + .cart-badge { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + background: $white; + width: 57px; + height: 57px; + border-radius: 120px; + flex-shrink: 0; + margin-right: -8px; + + .cart-count { + font-size: 24px; + font-weight: $font-weight-bold; + color: #212529; + line-height: 1; + } + + .cart-unit { + font-size: 14px; + font-weight: $font-weight-bold; + color: #212529; + line-height: 1; + margin-top: 2px; + } + } + + &:hover { + transform: translateY(-4px); + box-shadow: 0 12px 32px rgba(59, 164, 237, 0.4); + } + + &:active { + transform: translateY(-2px); + } + + @media (max-width: $breakpoint-sm) { + // Position above mobile toggle button (56px height + 24px bottom + 16px gap) + bottom: 100px; + right: 24px; + width: 160px; + height: 56px; + padding: 8px 12px 8px 28px; + + .cart-label { + font-size: 12px; + } + + .cart-badge { + width: 48px; + height: 48px; + margin-right: -6px; + + .cart-count { + font-size: 20px; + } + + .cart-unit { + font-size: 12px; + } + } + } +} + +// ----------------------------------------------------------------------------- +// Selected APIs Modal +// Uses base modal component structure with API-specific customizations +// Inherits from: components/_modals.scss (.modal, .modal-dialog, .modal-header, etc.) +// ----------------------------------------------------------------------------- +.modal-dialog { + + // API-specific body content - Pill Style (Figma Design node 958:2130) + .selected-apis-list { + display: flex; + flex-wrap: wrap; + gap: $spacing-sm; + align-items: flex-start; + } + + .api-pill { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 16px; + background: #f2f2f2; + border: none; + border-radius: 50px; + transition: all 0.2s ease; + max-width: 100%; + height: 47px; + + &:hover { + background: #e8e8e8; + } + + .api-pill-name { + font-size: 16px; + font-weight: $font-weight-regular; + color: #000000; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 280px; + text-align: center; + } + + .api-pill-remove { + flex-shrink: 0; + width: 20px; + height: 20px; + padding: 0; + background: transparent; + border: none; + border-radius: $border-radius-circle; + color: #212529; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + overflow: hidden; + + svg { + width: 12px; + height: 12px; + } + + &:hover { + background: rgba(0, 0, 0, 0.1); + transform: scale(1.1); + } + + &:active { + transform: scale(0.95); + } + } + + @media (max-width: $breakpoint-sm) { + padding: 8px 14px; + height: 42px; + + .api-pill-name { + font-size: 14px; + max-width: 200px; + } + + .api-pill-remove { + width: 18px; + height: 18px; + + svg { + width: 10px; + height: 10px; + } + } + } + } +} + +// .compound-input and .section-divider moved to components/_forms.scss + + diff --git a/src/main/resources/static/sass/pages/_commission.scss b/src/main/resources/static/sass/pages/_commission.scss new file mode 100644 index 0000000..e2c31df --- /dev/null +++ b/src/main/resources/static/sass/pages/_commission.scss @@ -0,0 +1,374 @@ +// Commission Pages Styles +// 수수료 관리 및 청구서 출력 페이지 스타일 + +@import '../abstracts/variables'; +@import '../abstracts/mixins'; + +// ==================== Commission Management Page ==================== + +// Commission Container +.commission-container { + max-width: 1400px; + margin: 0 auto; +} + +.wrap { + max-width: 1400px; + margin: 0 auto; + background: $white; + padding: $spacing-lg; + border-radius: $border-radius-md; + box-shadow: $shadow-md; +} + +.searchInfo { + display: inline-block; + margin-right: $spacing-sm; + margin-bottom: $spacing-md; +} + +// Search Box +.searchBox { + background: #f8f9fa; + padding: 20px; + border-radius: $border-radius-md; + margin-top: 20px; + margin-bottom: 20px; + + &.row-two { + display: flex; + align-items: center; + gap: 20px; + flex-wrap: wrap; + } + + label { + font-weight: $font-weight-medium; + color: $text-dark; + min-width: 80px; + } + + .form-control { + padding: 6px 12px; + border: 1px solid $border-gray; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + min-width: 100px; + } +} + +.form-inline { + display: flex; + align-items: center; + gap: 10px; +} + +.btnBox { + margin-left: auto; + + .btn + .btn { + margin-left: 5px; + } +} + +// Print Button (initially hidden) +#printBtn { + display: none; +} + +// Notice Text +.commission-notice { + color: #dc3545; + margin-top: 30px; + line-height: 1.6; +} + +.voffset3 { + margin-top: 30px; +} + +// Color Utilities +.color_red { + color: $accent-orange; +} + +.color_blue { + color: #007bff; +} + +.color_darkRed { + color: #8b0000; +} + +// Table Styles +.table-responsive { + overflow-x: auto; + margin-top: 30px; +} + +.table { + width: 100%; + border-collapse: collapse; + font-size: $font-size-sm; + + th { + background: $gray-bg; + font-weight: $font-weight-medium; + color: $text-dark; + padding: $spacing-md; + text-align: center; + border: 1px solid $border-gray; + } + + td { + padding: $spacing-md; + text-align: center; + border: 1px solid $border-gray; + } +} + +.table-bordered { + border: 1px solid $border-gray; + + th, + td { + border: 1px solid $border-gray; + } +} + +.border-type { + border: 2px solid #dee2e6; +} + +// Commission Tables +.commission-table-wrapper { + margin-top: 30px; + + .table { + border: 2px solid #dee2e6; + } +} + +// Summary Row +.summary-row { + background-color: #fff3cd !important; + + td { + font-weight: $font-weight-semibold; + } + + .summary-amount { + font-size: 16px; + color: #007bff; + } +} + +// Text Alignment Utilities +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-left { + text-align: left; +} + +// Background Utilities +.bg-warning { + background-color: #fff3cd !important; +} + +// Icon +.glyphicon-search::before { + content: "🔍"; +} + +// ==================== Commission Print Page ==================== + +.info-table { + border-top: 10px solid $text-gray; + width: 100%; + border-bottom: 2px solid $text-dark; + margin-bottom: $spacing-2xl; + + th { + text-align: left; + padding: $spacing-md $spacing-lg; + font-weight: $font-weight-semibold; + background: none; + border: none; + } + + td { + padding: $spacing-md $spacing-lg; + border: none; + } +} + +.commission-table { + width: 100%; + margin-top: $spacing-2xl; + + th, + td { + border: 1px solid #999 !important; + padding: $spacing-md $spacing-lg; + } + + td { + text-align: right; + } +} + +.bg_ygreen { + background-color: aquamarine; + text-align: center; +} + +.bg_skyBlue { + background-color: skyblue; + text-align: center; +} + +.bg_yellow { + background-color: yellow; + text-align: center; +} + +// Print-specific styles +@media print { + body { + padding: 0; + background: $white; + } + + .searchBox, + .searchInfo, + #printButton, + #backButton, + #printBtn { + display: none !important; + } + + @page { + size: auto; + margin: 0 -0cm; + } + + html { + margin: 0 0cm; + } +} + +// Responsive Design +@media screen and (max-width: $breakpoint-md) { + .wrap { + padding: $spacing-md; + } + + .searchBox { + padding: $spacing-md; + + &.row-two { + flex-direction: column; + align-items: flex-start; + gap: $spacing-md; + } + } + + .form-inline { + width: 100%; + flex-direction: column; + align-items: flex-start; + + label { + min-width: auto; + } + + .form-control { + width: 100%; + } + } + + .btnBox { + margin-left: 0; + width: 100%; + + .btn { + width: 100%; + } + } + + .table-responsive { + overflow-x: scroll; + -webkit-overflow-scrolling: touch; + } +} + +// Commission Print Page Specific +// Note: commissionPrint.html uses body class for scoping +body.commission-print-page { + font-size: 12px; + width: 600px; + margin: 90px; + font-family: 'Noto Sans KR', -apple-system, sans-serif; + + div { + position: relative; + } + + table { + border-collapse: collapse; + + th, + td { + padding: 5px 10px; + } + + tr { + font-size: 12px; + } + } + + h1 { + text-align: center; + + img { + width: 300px; + } + } + + h2 { + margin-top: $spacing-2xl; + float: left; + } + + p { + line-height: 1.6; + + &[style*="float: right"] { + margin-top: 25px; + } + } + + // Print buttons + .btn { + padding: 8px 16px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + } + + .btn-primary { + background: #667eea; + color: white; + + &:hover { + background: #5a67d8; + } + } +} diff --git a/src/main/resources/static/sass/pages/_index.scss b/src/main/resources/static/sass/pages/_index.scss index 7f1ee7f..c794b6b 100644 --- a/src/main/resources/static/sass/pages/_index.scss +++ b/src/main/resources/static/sass/pages/_index.scss @@ -1,438 +1,812 @@ // ----------------------------------------------------------------------------- -// Hero section styles - Modern vibrant design +// Hero Carousel Section - Figma Design // ----------------------------------------------------------------------------- -.hero-section { +.hero-carousel-section { position: relative; - padding: 160px 0 100px; - background: linear-gradient(180deg, $light-bg 0%, $white 100%); + width: 100%; + overflow: hidden; +} + +.hero-carousel-container { + position: relative; + width: 100%; + height: 720px; overflow: hidden; + @include respond-to('md') { + height: 800px; + } + @include respond-to('sm') { - padding: 120px 0 60px; + height: 600px; } } -// Background patterns -.hero-patterns { +.hero-carousel-track { + position: relative; + width: 100%; + height: 100%; +} + +// Individual slide +.hero-slide { position: absolute; top: 0; left: 0; - right: 0; - bottom: 0; - pointer-events: none; + width: 100%; + height: 780px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + visibility: hidden; + transition: opacity 0.6s ease-in-out, visibility 0.6s ease-in-out; - .pattern-circle { - position: absolute; - border-radius: 50%; - opacity: 0.1; - - &.pattern-1 { - @include pattern-circle(400px, $accent-cyan); - top: -200px; - right: -100px; - @include animate-float; - } - - &.pattern-2 { - @include pattern-circle(300px, $accent-yellow); - bottom: -150px; - left: -50px; - animation: float 15s ease-in-out infinite reverse; - } + &.active { + opacity: 1; + visibility: visible; } - .pattern-dots { - position: absolute; - top: 50%; - left: 10%; - width: 100px; - height: 100px; - background-image: radial-gradient(circle, $accent-purple 2px, transparent 2px); - background-size: 20px 20px; - opacity: 0.3; + // Slide backgrounds + &[data-slide="0"] { + background: #E5F8FF; + } + + &[data-slide="1"] { + background: #E5F8FF; + } + + &[data-slide="2"] { + background: #E5F8FF; } } -// Hero content -.hero-content { - text-align: center; +.hero-slide-content { + width: 100%; + max-width: 1280px; + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 80px; // 기본 패딩 줄임 position: relative; - z-index: 1; - max-width: $container-max-width; - margin: 0 auto; - padding: 0 $spacing-lg; + margin: 0 auto; // 가운데 정렬 보장 + + @include respond-to('xl') { + padding: 0 320px; // 1440px 이상에서만 큰 패딩 + } + + @include respond-to('lg') { + padding: 0 160px; // 1280px 이상에서 중간 패딩 + } + + @include respond-to('md') { + flex-direction: column; + padding: 80px 40px; + justify-content: center; + gap: 40px; + } + + @include respond-to('sm') { + padding: 60px 20px; + gap: 30px; + } } -// Hero badge -.hero-badge { +.hero-text-content { + flex: 0 0 auto; + display: flex; + flex-direction: column; + gap: 46px; + z-index: 2; + + @include respond-to('md') { + align-items: center; + text-align: center; + } +} + +.hero-text { + .hero-subtitle { + font-family: 'Noto Sans KR', sans-serif; + font-size: 36px; + font-weight: 400; + line-height: 1; + color: #212529; + margin: 0 0 12px 0; + + @include respond-to('md') { + font-size: 28px; + } + + @include respond-to('sm') { + font-size: 24px; + } + } + + .hero-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 50px; + font-weight: 700; + line-height: 1.2; + color: #000000; + margin: 0; + + @include respond-to('md') { + font-size: 40px; + } + + @include respond-to('sm') { + font-size: 32px; + } + } +} + +.btn-hero-signup { display: inline-flex; align-items: center; - gap: $spacing-sm; - padding: $spacing-sm $spacing-lg; - background: $white; - border: 2px solid $accent-yellow; - border-radius: $border-radius-full; - margin-bottom: $spacing-lg; - font-size: $font-size-sm; - font-weight: $font-weight-semibold; - color: $text-dark; - @include animate-slide-in-down; - - .badge-icon { - font-size: $font-size-lg; - @include animate-bounce; - } -} - -// Main headline -.main-headline { - font-size: $font-size-5xl; - font-weight: $font-weight-extrabold; - line-height: $line-height-tight; - margin-bottom: $spacing-lg; - color: $text-dark; - @include animate-slide-in-up; - - @include respond-to('sm') { - font-size: $font-size-3xl; - } - - @include respond-to('xs') { - font-size: $font-size-2xl; - } - - .headline-highlight { - @include gradient-text($gradient-accent); - } -} - -// Sub headline -.sub-headline { - font-size: $font-size-lg; - font-weight: $font-weight-regular; - line-height: $line-height-normal; - margin-bottom: $spacing-2xl; - color: $text-gray; - animation: slideInUp 0.9s ease-out; - - @include respond-to('sm') { - font-size: $font-size-base; - } -} - -// Hero buttons -.hero-buttons { - display: flex; - gap: $spacing-md; justify-content: center; - margin-bottom: $spacing-4xl; - animation: slideInUp 1s ease-out; + width: 178px; + height: 60px; + padding: 10px; + background: #0049B4; + color: #FFFFFF; + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 700; + border-radius: 10px; + text-decoration: none; + transition: all 0.3s ease; - @include respond-to('sm') { - flex-direction: column; - align-items: center; + &:hover { + background: darken(#0049B4, 10%); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 73, 180, 0.3); } - .btn { - @include button-base; + &:active { + transform: translateY(0); + } - &.btn-primary { - background: $gradient-primary; - color: $white; - box-shadow: $shadow-md; - - &:hover { - box-shadow: $shadow-xl; - } - } - - &.btn-secondary { - background: $white; - color: $primary-blue; - border: 2px solid $primary-blue; - - &:hover { - background: $light-bg; - } - } - - @include respond-to('xs') { - width: 100%; - justify-content: center; - } + @include respond-to('md') { + width: 200px; } } -// Hero stats -.hero-stats { +.hero-image-content { + flex: 0 0 auto; + width: 556px; + height: 455px; display: flex; + align-items: center; justify-content: center; - gap: $spacing-4xl; - @include animate-fade-in; + z-index: 1; + + @include respond-to('lg') { + width: 450px; + height: 370px; + } + + @include respond-to('md') { + width: 400px; + height: 330px; + } @include respond-to('sm') { - flex-direction: column; - gap: $spacing-lg; - } - - .stat-item { - display: flex; - flex-direction: column; - align-items: center; - - .stat-number { - font-size: $font-size-3xl; - font-weight: $font-weight-extrabold; - @include gradient-text($gradient-primary); - } - - .stat-label { - font-size: $font-size-sm; - color: $text-gray; - font-weight: $font-weight-medium; - } - } -} - -// Hero image/illustration -.hero-image { - position: relative; - margin-top: $spacing-4xl; - text-align: center; - - img { - max-width: 100%; + width: 100%; + max-width: 350px; height: auto; - border-radius: $border-radius-xl; - box-shadow: $shadow-xl; } - .hero-decoration { - position: absolute; + .hero-image { width: 100%; height: 100%; - top: 0; - left: 0; - pointer-events: none; + object-fit: contain; + } +} - &::before, - &::after { - content: ''; - position: absolute; - border-radius: 50%; - } +// Navigation buttons +.hero-nav-btn { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 60px; + height: 60px; + background: rgba(255, 255, 255, 0.5); + border: none; + border-radius: 50px; + cursor: pointer; + display: none; // 기본값: 숨김 + align-items: center; + justify-content: center; + z-index: 10; + transition: all 0.3s ease; - &::before { - width: 60px; - height: 60px; - background: $gradient-warm; - top: -30px; - right: 10%; - @include animate-bounce; - } + &:hover { + background: rgba(255, 255, 255, 0.8); + transform: translateY(-50%) scale(1.1); + } - &::after { - width: 40px; - height: 40px; - background: $gradient-accent; - bottom: -20px; - left: 15%; - animation: bounce 2s infinite 0.5s; + &:active { + transform: translateY(-50%) scale(0.95); + } + + svg { + width: 22px; + height: 22px; + } + + // 1280px 이상에서만 표시 + @include respond-to('lg') { + display: flex; + } +} + +.hero-nav-prev { + left: 210px; + + svg { + transform: rotate(180deg); + } + + @include respond-to('lg') { + left: 100px; + } + + @include respond-to('md') { + left: 40px; + } + + @include respond-to('sm') { + left: 20px; + } +} + +.hero-nav-next { + right: 210px; + + @include respond-to('lg') { + right: 100px; + } + + @include respond-to('md') { + right: 40px; + } + + @include respond-to('sm') { + right: 20px; + } +} + +// Carousel indicators +.hero-carousel-indicators { + position: absolute; + bottom: 160px; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 12px; + z-index: 10; + + @include respond-to('sm') { + bottom: 30px; + gap: 8px; + } +} + +.hero-indicator { + width: 14px; + height: 14px; + border-radius: 50%; + background: #F1F1F1; + border: none; + cursor: pointer; + padding: 0; + transition: all 0.3s ease; + + &.active { + background: #0049B4; + } + + &:hover:not(.active) { + background: rgba(0, 0, 0, 0.5); + + } + + @include respond-to('sm') { + width: 10px; + height: 10px; + + &.active { + width: 28px; + border-radius: 5px; } } } +// Auto play toggle button +.hero-autoplay-toggle { + display: flex; + align-items: center; + justify-content: center; + margin-left: 8px; + cursor: pointer; + padding: 0; + transition: all 0.3s ease; + position: relative; + svg { + position: absolute; + opacity: 0; + transition: opacity 0.3s ease; + + &.active { + opacity: 1; + } + } + + &:hover { + background: rgba(255, 255, 255, 1); + border-color: #0049B4; + box-shadow: 0 2px 8px rgba(0, 73, 180, 0.2); + } + + @include respond-to('sm') { + margin-left: 6px; + + svg { + width: 10px; + height: 12px; + } + } +} // ----------------------------------------------------------------------------- // API Search section styles - 검색 섹션 // ----------------------------------------------------------------------------- .api-search-section { - padding: $spacing-4xl 0; - background: linear-gradient(180deg, $white 0%, $light-bg 100%); position: relative; + padding: 0; + //margin-top: -80px; + overflow: hidden; + background: #e9f9ff; - &::before { - content: ''; + .search-background { position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 600px; - height: 600px; - background: radial-gradient(circle, rgba($primary-blue, 0.03) 0%, transparent 70%); + inset: 0; + background-image: url('/img/bg_main_intersect.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; pointer-events: none; } - .search-container { - max-width: 800px; - margin: 0 auto; - text-align: center; + .search-content-wrapper { position: relative; + display: flex; + align-items: center; + justify-content: center; + gap: 40px; z-index: 1; + + @include respond-to('md') { + flex-direction: column; + gap: 24px; + padding-top: 40px; + } + } + + .search-character { + width: 154px; + height: 148px; + flex-shrink: 0; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } + + @include respond-to('md') { + width: 120px; + height: 115px; + } + } + + .search-text-content { + text-align: left; + + @include respond-to('md') { + text-align: center; + } + } + + .search-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 36px; + font-weight: 700; + line-height: 1.3; + color: #000000; + margin: 0; + + @include respond-to('md') { + font-size: 28px; + } + + @include respond-to('sm') { + font-size: 24px; + } + } + + .search-input-wrapper { + position: relative; + display: flex; + justify-content: center; + padding: 0px 0 30px; + z-index: 1; + + @include respond-to('md') { + padding: 30px 20px 20px; + } } .search-form { - margin-bottom: $spacing-xl; - @include animate-slide-in-up; + width: 100%; + max-width: 816px; } - .search-wrapper { + .search-box { + position: relative; + width: 100%; + height: 80px; + background: #FFFFFF; + border: 6px solid #0049B4; + border-radius: 50px; display: flex; - gap: $spacing-md; - padding: 0 $spacing-lg; + align-items: center; + padding: 0 24px; - @include respond-to('sm') { - flex-direction: column; - gap: $spacing-sm; + @include respond-to('md') { + height: 60px; + border: 4px solid #0049B4; + padding: 0 16px; } } .search-input { flex: 1; - padding: $spacing-md $spacing-xl; - font-size: $font-size-base; - border: 2px solid $border-gray; - border-radius: $border-radius-full; - background: $white; - transition: all 0.3s ease; + width: 100%; + height: 100%; + border: none; outline: none; + background: transparent; + font-family: 'Noto Sans KR', sans-serif; + font-size: 17px; + font-weight: 500; + color: #000000; + padding: 0 20px; &::placeholder { - color: $text-light; + color: #B3B3B3; + font-weight: 400; } - &:focus { - border-color: $primary-blue; - box-shadow: 0 0 0 4px rgba($primary-blue, 0.1); - } - - @include respond-to('sm') { - width: 100%; - padding: $spacing-md $spacing-lg; + @include respond-to('md') { + font-size: 15px; + padding: 0 12px; } } - .search-button { - padding: $spacing-md $spacing-2xl; - background: $gradient-primary; - color: $white; + .search-icon-button { + background: none; border: none; - border-radius: $border-radius-full; - font-size: $font-size-base; - font-weight: $font-weight-semibold; cursor: pointer; - transition: all 0.3s ease; - display: flex; - align-items: center; - gap: $spacing-sm; - box-shadow: $shadow-md; - white-space: nowrap; - - i { - font-size: $font-size-lg; - } - - &:hover { - transform: translateY(-2px); - box-shadow: $shadow-xl; - background: linear-gradient(135deg, darken($primary-blue, 5%) 0%, darken($secondary-blue, 5%) 100%); - } - - &:active { - transform: translateY(0); - box-shadow: $shadow-sm; - } - - @include respond-to('sm') { - width: 100%; - justify-content: center; - padding: $spacing-md $spacing-xl; - } - } - - .hashtag-suggestions { + padding: 0; display: flex; align-items: center; justify-content: center; - gap: $spacing-md; - flex-wrap: wrap; - padding: 0 $spacing-lg; - animation: fadeIn 0.8s ease-out 0.2s both; + width: 40px; + height: 40px; + flex-shrink: 0; + transition: transform 0.3s ease; - @include respond-to('sm') { - gap: $spacing-sm; - justify-content: flex-start; + &:hover { + transform: scale(1.1); + } + + &:active { + transform: scale(0.95); + } + + svg { + width: 33px; + height: 34px; + + @include respond-to('md') { + width: 28px; + height: 29px; + } + } + } + + .hashtag-section { + position: relative; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + padding: 0 20px 0px; + z-index: 1; + + @include respond-to('md') { + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 20px 30px; } } .hashtag-label { - font-size: $font-size-sm; - color: $text-gray; - font-weight: $font-weight-medium; + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 700; + color: #000000; + white-space: nowrap; + } - @include respond-to('sm') { - width: 100%; - margin-bottom: $spacing-xs; + .hashtag-list { + display: flex; + align-items: center; + gap: 14px; + flex-wrap: wrap; + + @include respond-to('md') { + justify-content: center; + gap: 10px; } } - .hashtag { - display: inline-flex; - align-items: center; - padding: $spacing-xs $spacing-lg; - background: $white; - border: 1px solid $border-gray; - border-radius: $border-radius-full; - font-size: $font-size-sm; - color: $text-dark; + .hashtag-link { + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; text-decoration: none; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - - &::before { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: $gradient-primary; - transition: left 0.3s ease; - z-index: 0; - } + white-space: nowrap; + transition: color 0.3s ease; &:hover { - border-color: $primary-blue; - transform: translateY(-2px); - box-shadow: $shadow-sm; - color: $white; - position: relative; - z-index: 1; - - &::before { - left: 0; - } + color: #0049B4; + text-decoration: underline; } - @include respond-to('sm') { - padding: $spacing-xs $spacing-md; - font-size: $font-size-xs; + @include respond-to('md') { + font-size: 14px; + } + } + + .hashtag-separator { + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + color: #000000; + user-select: none; + + @include respond-to('md') { + font-size: 14px; } } } // ----------------------------------------------------------------------------- -// API Showcase section styles +// API Showcase section styles - 추천 API (Figma Design) // ----------------------------------------------------------------------------- .api-showcase { - padding: $spacing-6xl 0; + position: relative; + display: flex; + align-items: center; // 수직 중앙 정렬 + padding: 175px 0 100px; background: $white; + overflow: hidden; + + .showcase-background { + position: absolute; + inset: 0; + background-image: url('/img/bg_main_recommend_apis.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + pointer-events: none; + } + + .showcase-wrapper { + max-width: 1228px; + margin: 0 auto; + padding: 0 20px; + position: relative; + width: 100%; + z-index: 1; + } + + .section-header { + text-align: center; + margin-bottom: 24px; + position: relative; + padding-right: 150px; // 버튼 공간 확보 + + @include respond-to('md') { + padding-right: 0; + } + } + + .section-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 44px; + font-weight: 700; + line-height: 1.3; + color: #000000; + margin: 0; + + @include respond-to('md') { + font-size: 36px; + } + + @include respond-to('sm') { + font-size: 28px; + } + } + + .section-subtitle { + font-family: 'Noto Sans KR', sans-serif; + font-size: 26px; + font-weight: 400; + line-height: 1.5; + color: #1E1E1E; + margin-bottom: 30px; + + @include respond-to('md') { + font-size: 20px; + } + + + @include respond-to('sm') { + font-size: 18px; + } + } + + .btn-all-apis { + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 21px; + padding: 12px 24px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 15px; + font-weight: 500; + color: #FFFFFF; + background: #008ae2; + text-decoration: none; + border-radius: 10px; + transition: all 0.3s ease; + height: 40px; + width: 135px; + + @include respond-to('md') { + position: static; + transform: none; + margin: 24px auto 0; + } + + svg { + width: 11px; + height: 17px; + transition: transform 0.3s ease; + + path { + stroke: #FFFFFF; + } + } + + &:hover { + background: darken(#008ae2, 10%); + + svg { + transform: translateX(4px); + } + } + } + + .api-cards-container { + display: flex; + gap: 32px; + justify-content: center; + + @include respond-to('lg') { + gap: 24px; + } + + @include respond-to('md') { + flex-wrap: wrap; + gap: 20px; + justify-content: center; + } + } + + .api-card { + width: 283px; + height: 320px; + background: #FFFFFF; + border: 1px solid #DDDDDD; + border-radius: 20px; + padding: 36px 38px; + display: flex; + flex-direction: column; + align-items: flex-start; + position: relative; + transition: all 0.3s ease; + gap: 0px; + cursor: pointer; + + &:hover { + transform: translateY(-4px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + border-color: #008ae2; + } + + @include respond-to('md') { + width: calc(50% - 10px); + min-width: 250px; + } + + @include respond-to('sm') { + width: 100%; + max-width: 350px; + } + } + + .card-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 24px; + font-weight: 700; + line-height: 1.67; + color: #2A2A2A; + margin: 0 0 20px 0; + } + + .card-description { + font-family: 'Noto Sans KR', sans-serif; + font-size: 15px; + font-weight: 400; + line-height: 1.43; + color: #515151; + margin: 0; + flex: 1; + text-align: left; + } + + .card-illustration { + width: 90px; + height: 90px; + display: flex; + align-items: center; + justify-content: center; + margin-top: auto; + align-self: flex-end; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } + } } @@ -440,243 +814,179 @@ // Info Section - 정보 섹션 스타일 // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Info Section - 광주은행 API 소개 (Figma Design) +// ----------------------------------------------------------------------------- .info-section { - padding: $spacing-6xl 0; - background: $white; position: relative; + padding: $spacing-6xl 0; + background: #FFFFFF; + overflow: hidden; + min-height: 980px; + display: flex; + align-items: center; - &::before { - content: ''; + .info-background { position: absolute; - top: 0; - left: 0; - right: 0; - height: 1px; - background: linear-gradient(90deg, - transparent 0%, - $border-gray 20%, - $border-gray 80%, - transparent 100% - ); + inset: 0; + background-image: url('/img/bg_api_intro.svg'); + background-size: cover; + background-position: center; + pointer-events: none; + } + + //.info-point-image { + // position: absolute; + // inset: 0; + // background-image: url('/img/bg_api_intro_point.png'); + // background-size: cover; + // background-position: center; + // pointer-events: none; + //} + + .container { + position: relative; + z-index: 1; } .info-wrapper { display: flex; - flex-direction: column; align-items: center; - gap: $spacing-3xl; - } + justify-content: space-between; + gap: $spacing-5xl; - .image-container { - width: 100%; - max-width: 600px; - margin: 0 auto; - } - - .image-placeholder { - position: relative; - width: 100%; - height: 300px; - background: linear-gradient(135deg, $light-bg 0%, rgba($primary-blue, 0.1) 100%); - border-radius: $border-radius-2xl; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: $spacing-md; - box-shadow: $shadow-md; - overflow: hidden; - - &::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: radial-gradient( - circle at center, - rgba($accent-cyan, 0.1) 0%, - transparent 50% - ); - animation: rotate 20s linear infinite; - } - - &::after { - content: ''; - position: absolute; - bottom: -20px; - right: -20px; - width: 100px; - height: 100px; - background: $gradient-accent; - border-radius: 50%; - opacity: 0.3; - filter: blur(40px); - } - - i { - font-size: 64px; - color: $primary-blue; - z-index: 1; - } - - span { - font-size: $font-size-xl; - font-weight: $font-weight-semibold; - color: $text-dark; - z-index: 1; - } - - @include respond-to('sm') { - height: 200px; - - i { - font-size: 48px; - } - - span { - font-size: $font-size-lg; - } + @include respond-to('md') { + flex-direction: column; + gap: $spacing-4xl; } } .info-content { - text-align: center; - max-width: 800px; - margin: 0 auto; - } - - .highlight-text { - font-size: $font-size-xl; - line-height: $line-height-loose; - color: $text-dark; - margin-bottom: $spacing-3xl; - font-weight: $font-weight-medium; - - .text-accent { - color: $primary-blue; - font-weight: $font-weight-semibold; - } + flex: 1; + max-width: 600px; @include respond-to('md') { - font-size: $font-size-lg; + text-align: center; + max-width: 100%; + } + } + + .info-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 28px; + font-weight: 400; + line-height: 1.4; + color: #000000; + margin: 0 0 $spacing-lg 0; + + @include respond-to('md') { + font-size: 36px; } @include respond-to('sm') { - font-size: $font-size-base; - padding: 0 $spacing-lg; - margin-bottom: $spacing-2xl; + font-size: 28px; + } + + .title-highlight { + font-weight: 700; + color: #0049B4; + font-size: 36px; + } + } + + .info-description { + font-family: 'Noto Sans KR', sans-serif; + font-size: 18px; + font-weight: 400; + line-height: 1.6; + color: #000000; + margin: 0 0 $spacing-3xl 0; + + @include respond-to('md') { + font-size: 16px; } } .action-buttons { display: flex; gap: $spacing-lg; - justify-content: center; - flex-wrap: wrap; + + @include respond-to('md') { + justify-content: center; + } @include respond-to('sm') { flex-direction: column; - align-items: center; - padding: 0 $spacing-lg; + align-items: stretch; } } .action-btn { - display: flex; + display: inline-flex; align-items: center; - gap: $spacing-md; - padding: $spacing-md $spacing-xl; - background: $white; - border: 2px solid $border-gray; - border-radius: $border-radius-full; + justify-content: center; + padding: 18px 52px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 24px; + font-weight: 700; + line-height: 56px; + border-radius: 20px; text-decoration: none; + white-space: nowrap; transition: all 0.3s ease; - min-width: 280px; - position: relative; - overflow: hidden; + min-width: 310px; + height: 128px; - &::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 0; - height: 100%; - background: $gradient-primary; - transition: width 0.3s ease; - z-index: 0; + @include respond-to('sm') { + font-size: 20px; + padding: 12px 32px; + min-width: 100%; } &:hover { - border-color: $primary-blue; transform: translateY(-3px); - box-shadow: $shadow-lg; - - &::before { - width: 100%; - } - - .btn-number { - background: $white; - color: $primary-blue; - } - - .btn-text, - i { - color: $white; - } + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); } - .btn-number { - position: relative; - z-index: 1; - width: 32px; - height: 32px; - display: flex; - align-items: center; - justify-content: center; - background: $gradient-primary; - color: $white; - border-radius: 50%; - font-weight: $font-weight-bold; - font-size: $font-size-base; - flex-shrink: 0; - transition: all 0.3s ease; - } - - .btn-text { - position: relative; - z-index: 1; - font-size: $font-size-base; - font-weight: $font-weight-medium; - color: $text-dark; - transition: color 0.3s ease; - } - - i { - position: relative; - z-index: 1; - font-size: $font-size-sm; - color: $text-light; - margin-left: auto; - transition: all 0.3s ease; - } - - @include respond-to('sm') { - min-width: 100%; - justify-content: flex-start; + &:active { + transform: translateY(0); } } -} -@keyframes rotate { - from { - transform: rotate(0deg); + .action-btn-primary { + background: #0049B4; + color: #FFFFFF; + + &:hover { + background: darken(#0049B4, 10%); + } } - to { - transform: rotate(360deg); + + .action-btn-secondary { + background: #00ACDD; + color: #FFFFFF; + + &:hover { + background: darken(#00ACDD, 10%); + } + } + + .info-image { + flex: 1; + max-width: 560px; + display: flex; + align-items: center; + justify-content: center; + + img { + width: 100%; + height: auto; + object-fit: contain; + } + + @include respond-to('md') { + max-width: 100%; + } } } @@ -685,165 +995,273 @@ // Support Center section styles // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Support Center Section - 비지니스의 시작 (Figma Design) +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// Support Center Section - 비지니스의 시작 (Figma Design) +// ----------------------------------------------------------------------------- .support-center { - padding: $spacing-6xl 0; - background: $gray-bg; + position: relative; + padding: 150px 0; + background: #eef7fd; + overflow: hidden; + min-height: 980px; + + .support-background { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + height: 100%; + max-width: 1920px; + pointer-events: none; + + &::before { + content: ''; + position: absolute; + top: 17px; // Figma: top-[3234px] relative to page, section starts at ~3217px + left: 46%; // Approximate positioning + width: 693px; + height: 597px; + background-image: url('/img/bg_support_center.png'); // Assuming this image exists or use placeholder + background-size: cover; + background-repeat: no-repeat; + opacity: 0.5; // Adjust based on visual + } + } + + .container { + position: relative; + z-index: 1; + max-width: 1280px; + margin: 0 auto; + padding: 0 40px; + } .section-header { + margin-bottom: 80px; text-align: center; - margin-bottom: $spacing-4xl; .section-title { - font-size: $font-size-4xl; - font-weight: $font-weight-bold; - color: $text-dark; - margin-bottom: $spacing-md; + font-family: 'Noto Sans KR', sans-serif; + font-size: 44px; + line-height: 1.6; + color: #000000; + margin: 0; + text-align: left; - @include respond-to('sm') { - font-size: $font-size-3xl; + @include respond-to('md') { + font-size: 36px; + line-height: 1.4; } - .title-highlight { - @include gradient-text($gradient-primary); - } - } - - .section-subtitle { - font-size: $font-size-lg; - color: $text-gray; - line-height: $line-height-loose; - @include respond-to('sm') { - font-size: $font-size-base; + font-size: 28px; + } + + .title-regular { + font-weight: 400; + } + + .title-bold { + font-weight: 700; } } } .support-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: $spacing-xl; - max-width: 1000px; + display: flex; + gap: 32px; + justify-content: center; + align-items: stretch; + max-width: 1228px; // 598 + 283 + 283 + (32 * 2) = 1228px margin: 0 auto; @include respond-to('md') { - grid-template-columns: 1fr; - gap: $spacing-lg; - max-width: 500px; - } - - @include respond-to('sm') { - gap: $spacing-md; - padding: 0 $spacing-md; + flex-direction: column; + align-items: center; + gap: 20px; } } + // 통합 Support Card .support-card { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - padding: $spacing-2xl $spacing-xl; - background: $white; - border-radius: $border-radius-xl; - box-shadow: $shadow-sm; + background: #FFFFFF; + border-radius: 20px; text-decoration: none; transition: all 0.3s ease; + display: flex; + box-sizing: border-box; + position: relative; overflow: hidden; + height: 377px; // 모든 카드 동일 높이 - &::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 4px; - background: $gradient-primary; - transform: scaleX(0); - transition: transform 0.3s ease; + @include respond-to('md') { + width: 100%; + max-width: 598px; + height: auto; + min-height: 260px; } &:hover { - transform: translateY(-8px); - box-shadow: $shadow-xl; - - &::before { - transform: scaleX(1); - } - - .card-icon { - transform: scale(1.1) rotate(5deg); - background: $gradient-primary; - color: $white; - } - - .card-arrow { - transform: translateX(5px); - color: $primary-blue; - } + transform: translateY(-5px); + box-shadow: 0 10px 30px rgba(0, 73, 180, 0.15); } .card-icon { - width: 80px; - height: 80px; display: flex; align-items: center; justify-content: center; - background: $light-bg; - border-radius: $border-radius-full; - margin-bottom: $spacing-lg; - transition: all 0.3s ease; - i { - font-size: 36px; - color: $primary-blue; + img { + width: 100%; + height: 100%; + object-fit: contain; } } - h3 { - font-size: $font-size-xl; - font-weight: $font-weight-semibold; - color: $text-dark; - margin-bottom: $spacing-sm; - text-align: center; - } + .card-content { + display: flex; + flex-direction: column; + justify-content: center; - p { - font-size: $font-size-base; - color: $text-gray; - text-align: center; - line-height: $line-height-loose; - margin-bottom: $spacing-lg; - } + h3 { + font-family: 'Noto Sans KR', sans-serif; + font-size: 32px; + font-weight: 700; + color: #212529; + margin: 0 0 10px 0; + line-height: 1.3; - .card-arrow { - margin-top: auto; - color: $text-light; - transition: all 0.3s ease; - - i { - font-size: $font-size-lg; - } - } - - @include respond-to('sm') { - padding: $spacing-xl $spacing-lg; - - .card-icon { - width: 70px; - height: 70px; - - i { - font-size: 30px; + @include respond-to('md') { + font-size: 28px; } } - h3 { - font-size: $font-size-lg; + p { + font-family: 'Noto Sans KR', sans-serif; + font-size: 18px; + font-weight: 400; + color: #515961; + margin: 0; + line-height: 1.4; + + @include respond-to('md') { + font-size: 16px; + } + } + } + + // 공지사항 카드 (598px width) + &--notice { + width: 598px; + flex-shrink: 0; + flex-direction: column; + align-items: center; + padding: 60px 40px; + background: #0049B4; + + @include respond-to('md') { + width: 100%; + max-width: 598px; + padding: 50px 40px; } - p { - font-size: $font-size-sm; + .card-icon { + width: 174px; + height: 120px; + margin-bottom: 36px; + } + + .card-content { + align-items: center; + text-align: center; + + h3 { + color: #FFFFFF; + font-size: 36px; + + @include respond-to('md') { + font-size: 32px; + } + } + + p { + color: rgba(255, 255, 255, 0.9); + font-size: 20px; + + @include respond-to('md') { + font-size: 18px; + } + } + } + + &:hover { + background: darken(#0049B4, 5%); + } + } + + // FAQ & Q&A Cards (283px width each) + &--faq, &--qna { + width: 283px; + flex-shrink: 0; + flex-direction: column; + align-items: center; + padding: 60px 40px; + + @include respond-to('md') { + width: 100%; + max-width: 598px; + padding: 40px; + } + + .card-icon { + width: 120px; + height: 120px; + margin-bottom: 36px; + + } + + .card-content { + align-items: center; + text-align: center; + flex: none; + + h3 { + font-size: 36px; + + @include respond-to('md') { + font-size: 32px; + } + } + + p { + font-size: 20px; + + @include respond-to('md') { + font-size: 18px; + } + } + } + } + + // FAQ Card Specifics + &--faq { + background: #DAF0FF; + + .card-content h3 { + color: #212529; + } + } + + // Q&A Card Specifics + &--qna { + background: #D9F6F8; + + .card-content h3 { + color: #212529; } } } @@ -851,247 +1269,215 @@ // ----------------------------------------------------------------------------- -// API Stats Section - API 활용 현황 +// API Stats Section - API 활용 현황 (Figma Design) // ----------------------------------------------------------------------------- .api-stats-section { - padding: $spacing-6xl 0; - background: linear-gradient(180deg, $white 0%, $light-bg 100%); position: relative; + min-height: 720px; + padding: $spacing-6xl 0; overflow: hidden; + display: flex; + align-items: center; + justify-content: center; - // Background decoration - &::before { - content: ''; - position: absolute; - top: 50%; - left: -100px; - width: 200px; - height: 200px; - background: radial-gradient(circle, $accent-cyan 0%, transparent 70%); - opacity: 0.1; - border-radius: 50%; - transform: translateY(-50%); + @include respond-to('md') { + min-height: 600px; + padding: $spacing-4xl 0; } - &::after { - content: ''; - position: absolute; - top: 50%; - right: -100px; - width: 300px; - height: 300px; - background: radial-gradient(circle, $primary-blue 0%, transparent 70%); - opacity: 0.08; - border-radius: 50%; - transform: translateY(-50%); + @include respond-to('sm') { + min-height: 500px; + padding: $spacing-3xl 0; + } +} + +// Background with image +.stats-background { + position: absolute; + inset: 0; + background-image: url('/img/bg_main_api_usage.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + overflow: hidden; +} + +.api-stats-section { + .container { + position: relative; + z-index: 1; } .section-header { text-align: center; - margin-bottom: $spacing-5xl; - position: relative; - z-index: 1; + margin-bottom: 80px; - .section-title { - font-size: $font-size-3xl; - font-weight: $font-weight-bold; - color: $text-dark; - line-height: $line-height-loose; - margin-bottom: $spacing-2xl; - - @include respond-to('md') { - font-size: $font-size-2xl; - } - - @include respond-to('sm') { - font-size: $font-size-xl; - padding: 0 $spacing-lg; - } - - .title-highlight { - @include gradient-text($gradient-primary); - font-weight: $font-weight-extrabold; - } + @include respond-to('sm') { + margin-bottom: 60px; } } - .stats-cards { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: $spacing-2xl; - max-width: 1100px; - margin: 0 auto; - position: relative; - z-index: 1; + .section-title { + font-family: 'Noto Sans KR', sans-serif; + line-height: 1.5; + margin: 0; + + .title-top { + display: block; + font-size: 32px; + font-weight: 400; + color: #E8E8E8; + margin-bottom: 8px; + + @include respond-to('md') { + font-size: 28px; + } + + @include respond-to('sm') { + font-size: 24px; + } + } + + .title-highlight { + font-size: 44px; + font-weight: 700; + color: #81D5FF; + + @include respond-to('md') { + font-size: 36px; + } + + @include respond-to('sm') { + font-size: 28px; + } + } + + // Rest of the title text + font-size: 44px; + font-weight: 400; + color: #E8E8E8; @include respond-to('md') { - grid-template-columns: 1fr; - gap: $spacing-xl; - max-width: 400px; + font-size: 36px; } @include respond-to('sm') { + font-size: 28px; + } + } + + // Stats cards container + .stats-cards { + display: flex; + align-items: center; + justify-content: center; + gap: 0; + max-width: 1200px; + margin: 0 auto; + + @include respond-to('md') { + flex-direction: column; + gap: 40px; + } + + @include respond-to('sm') { + gap: 32px; padding: 0 $spacing-lg; } } + // Individual stat card .stat-card { - background: $white; - border-radius: $border-radius-xl; - padding: $spacing-2xl; - box-shadow: $shadow-md; - border: 1px solid rgba($primary-blue, 0.1); - position: relative; - overflow: hidden; - transition: all 0.4s ease; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + width: 145px; - &::before { - content: ''; - position: absolute; - top: -2px; - left: -2px; - right: -2px; - bottom: -2px; - background: $gradient-primary; - border-radius: $border-radius-xl; - opacity: 0; - z-index: -1; - transition: opacity 0.4s ease; + @include respond-to('md') { + width: auto; } - &:hover { - transform: translateY(-10px) scale(1.02); - box-shadow: $shadow-xl; + .stat-label { + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 500; + color: #FFFFFF; + line-height: 40px; + margin: 0; + white-space: nowrap; - &::before { - opacity: 1; - } - - .stat-icon { - transform: rotate(360deg) scale(1.1); - background: $gradient-primary; - - i { - color: $white; - } - } - - .stat-number { - @include gradient-text($gradient-accent); + @include respond-to('sm') { + font-size: 18px; } } .stat-icon { - width: 70px; - height: 70px; + width: 100px; + height: 100px; display: flex; align-items: center; justify-content: center; - background: $light-bg; - border-radius: $border-radius-full; - margin-bottom: $spacing-lg; - transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.3s ease; - i { - font-size: 32px; - color: $primary-blue; - transition: color 0.3s ease; + svg { + width: 100%; + height: 100%; + filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2)); + } + + @include respond-to('sm') { + width: 80px; + height: 80px; } } - .stat-content { - .stat-number { - font-size: $font-size-4xl; - font-weight: $font-weight-extrabold; - color: $text-dark; - margin-bottom: $spacing-sm; - transition: all 0.3s ease; - display: block; + .stat-number { + font-family: 'Noto Sans KR', sans-serif; + font-size: 44px; + font-weight: 700; + color: #EFDCB2; + line-height: 61px; + margin: 0; + text-align: center; + white-space: nowrap; - @include respond-to('sm') { - font-size: $font-size-3xl; - } - - // Add thousand separator with CSS - &[data-formatted]::after { - content: attr(data-formatted); - } + @include respond-to('md') { + font-size: 40px; } - .stat-label { - font-size: $font-size-lg; - font-weight: $font-weight-semibold; - color: $text-dark; - margin-bottom: $spacing-xs; - } - - .stat-description { - font-size: $font-size-sm; - color: $text-gray; - line-height: $line-height-normal; + @include respond-to('sm') { + font-size: 36px; } } - // Different colors for each card - &:nth-child(1) { + // Hover effect + &:hover { .stat-icon { - background: rgba($accent-cyan, 0.1); - - i { - color: $accent-cyan; - } - } - - &:hover .stat-icon { - background: linear-gradient(135deg, $accent-cyan 0%, $primary-blue 100%); + transform: scale(1.1); } } + } - &:nth-child(2) { - .stat-icon { - background: rgba($accent-green, 0.1); + // Vertical divider between cards + .stats-divider { + width: 1px; + height: 240px; + margin: 0 60px; + flex-shrink: 0; - i { - color: $accent-green; - } - } - - &:hover .stat-icon { - background: linear-gradient(135deg, $accent-green 0%, darken($accent-green, 10%) 100%); - } - } - - &:nth-child(3) { - .stat-icon { - background: rgba($accent-purple, 0.1); - - i { - color: $accent-purple; - } - } - - &:hover .stat-icon { - background: linear-gradient(135deg, $accent-purple 0%, darken($accent-purple, 10%) 100%); - } - } - - @include respond-to('sm') { - padding: $spacing-xl; - - .stat-icon { - width: 60px; - height: 60px; - - i { - font-size: 28px; - } - } + @include respond-to('md') { + display: none; } } } -// Number animation keyframes +// Number count-up animation (keep existing JavaScript animation) +.stat-number { + animation: countUp 0.6s ease-out forwards; +} + @keyframes countUp { from { opacity: 0; @@ -1103,7 +1489,96 @@ } } -.stat-number { - animation: countUp 0.6s ease-out forwards; +// ----------------------------------------------------------------------------- +// 지금 바로 회원가입 CTA Section - Figma Design +// ----------------------------------------------------------------------------- +.signup-cta-section { + position: relative; + min-height: 329px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + + .cta-background { + position: absolute; + inset: 0; + background-image: url('/img/bg_main_join.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + overflow: hidden; + } + + .container { + position: relative; + z-index: 1; + } + + .cta-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + text-align: center; + } + + .cta-title { + font-family: 'Noto Sans KR', sans-serif; + font-size: 40px; + font-weight: 700; + color: #000000; + line-height: normal; + margin: 0; + + @include respond-to('md') { + font-size: 32px; + } + + @include respond-to('sm') { + font-size: 24px; + } + } + + .btn-signup-cta { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 10px; + min-height: 60px; + width: 178px; + background: #008ae2; + color: #FFFFFF; + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 700; + border-radius: 10px; + text-decoration: none; + transition: all 0.3s ease; + + &:hover { + background: darken(#008ae2, 10%); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 138, 226, 0.3); + } + + &:active { + transform: translateY(0); + } + + @include respond-to('sm') { + width: 100%; + max-width: 300px; + } + } + + .cta-divider { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background: #DDDDDD; + } } diff --git a/src/main/resources/static/sass/pages/_inquiry.scss b/src/main/resources/static/sass/pages/_inquiry.scss new file mode 100644 index 0000000..9d77b6b --- /dev/null +++ b/src/main/resources/static/sass/pages/_inquiry.scss @@ -0,0 +1,689 @@ +// ----------------------------------------------------------------------------- +// Inquiry (Q&A) Pages - List, Detail, and Form Views +// ----------------------------------------------------------------------------- + +// Inquiry list page container +.inquiry-page { + min-height: calc(100vh - 140px); + background: $gray-bg; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-md; + } +} + +.inquiry-container { + max-width: $container-max-width; + margin: 0 auto; +} + +// Page header +.inquiry-header { + margin-bottom: $spacing-3xl; + + @media (max-width: $breakpoint-sm) { + margin-bottom: $spacing-2xl; + } + + .page-title { + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-md; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-2xl; + } + } + + .page-description { + font-size: $font-size-base; + color: $text-gray; + line-height: $line-height-normal; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } +} + +// Inquiry table wrapper +.inquiry-list-wrapper { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + overflow: hidden; + margin-bottom: $spacing-xl; +} + +// Inquiry table (extends notice-table structure) +.inquiry-table { + width: 100%; + background: $white; + border-radius: $border-radius-lg; + overflow: hidden; + + // Table header + .table-header { + display: grid; + grid-template-columns: 80px 1fr 100px 100px 120px; + gap: $spacing-md; + padding: $spacing-md $spacing-lg; + background: $light-bg; + border-bottom: 2px solid $border-gray; + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-dark; + + @media (max-width: $breakpoint-md) { + grid-template-columns: 60px 1fr 80px 100px; + padding: $spacing-sm $spacing-md; + font-size: $font-size-xs; + + .col-name { + display: none; + } + } + + @media (max-width: $breakpoint-sm) { + display: none; + } + + .col-num { + text-align: center; + } + + .col-title { + text-align: left; + } + + .col-name { + text-align: center; + } + + .col-status { + text-align: center; + } + + .col-date { + text-align: center; + } + } + + // Table rows + .table-row { + display: grid; + grid-template-columns: 80px 1fr 100px 100px 120px; + gap: $spacing-md; + padding: $spacing-lg; + border-bottom: 1px solid $border-gray; + transition: $transition-base; + cursor: pointer; + + @media (max-width: $breakpoint-md) { + grid-template-columns: 60px 1fr 80px 100px; + padding: $spacing-md; + + .col-name { + display: none; + } + } + + @media (max-width: $breakpoint-sm) { + grid-template-columns: 1fr; + gap: $spacing-sm; + padding: $spacing-md; + } + + &:last-child { + border-bottom: none; + } + + &:hover { + background-color: rgba($primary-blue, 0.02); + } + + .col-num { + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-sm; + color: $text-gray; + font-weight: $font-weight-medium; + + @media (max-width: $breakpoint-sm) { + display: none; + } + } + + .col-title { + display: flex; + align-items: center; + font-size: $font-size-base; + color: $text-dark; + font-weight: $font-weight-medium; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + + a { + color: inherit; + text-decoration: none; + display: flex; + align-items: center; + gap: $spacing-sm; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + } + + .file-icon { + display: inline-flex; + align-items: center; + margin-left: $spacing-sm; + opacity: 0.6; + + img { + width: 16px; + height: 16px; + } + } + } + + .col-name { + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-sm; + color: $text-gray; + + @media (max-width: $breakpoint-md) { + display: none; + } + } + + .col-status { + display: flex; + align-items: center; + justify-content: center; + + @media (max-width: $breakpoint-sm) { + justify-content: flex-start; + } + + // Status badge styles now in components/_badges.scss + } + + .col-date { + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-sm; + color: $text-light; + + @media (max-width: $breakpoint-sm) { + justify-content: flex-start; + font-size: $font-size-xs; + padding-top: $spacing-xs; + } + } + } + + // Mobile label for date + @media (max-width: $breakpoint-sm) { + .table-row .col-date::before { + content: '등록일: '; + color: $text-gray; + margin-right: $spacing-xs; + } + } +} + +// =========================== +// Button Container Layouts +// Note: Button styles now in components/_buttons.scss +// =========================== + +// Inquiry actions (list page + detail page) +.inquiry-actions { + display: flex; + justify-content: center; + align-items: center; + gap: $spacing-md; + margin-top: $spacing-xl; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + } + + // Layout for detail page split actions + .actions-left, + .actions-right { + display: flex; + align-items: center; + gap: $spacing-md; + + @media (max-width: $breakpoint-sm) { + width: 100%; + justify-content: center; + } + } + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + gap: $spacing-md; + + .actions-left, + .actions-right { + flex-direction: column; + } + } +} + +// =========================== +// Inquiry Detail Page +// =========================== +.inquiry-detail-page { + min-height: calc(100vh - 140px); + background: $gray-bg; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-md; + } +} + +.inquiry-detail-container { + margin: 0 auto; +} + +// Inquiry detail card +.inquiry-detail-card { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + overflow: hidden; + margin-bottom: $spacing-xl; + + // Header section + .detail-header { + padding: $spacing-3xl $spacing-2xl $spacing-xl; + border-bottom: 2px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-lg $spacing-md; + } + + // Status badge header styles now in components/_badges.scss + + .inquiry-title { + font-size: $font-size-2xl; + font-weight: $font-weight-bold; + color: $text-dark; + line-height: $line-height-tight; + margin-bottom: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xl; + } + } + + .inquiry-meta { + display: flex; + align-items: center; + gap: $spacing-lg; + flex-wrap: wrap; + font-size: $font-size-sm; + color: $text-gray; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + gap: $spacing-md; + } + + .meta-item { + display: flex; + align-items: center; + gap: $spacing-xs; + + i { + color: $primary-blue; + } + + strong { + color: $text-dark; + font-weight: $font-weight-medium; + } + } + } + } + + // Attachment section + .detail-attachments { + padding: $spacing-lg $spacing-2xl; + background: $gray-bg; + border-bottom: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + } + + .attachment-list { + display: flex; + flex-direction: column; + gap: $spacing-sm; + + .attachment-item { + display: flex; + align-items: center; + gap: $spacing-sm; + + a { + color: $text-dark; + text-decoration: none; + font-size: $font-size-sm; + transition: $transition-base; + display: flex; + align-items: center; + gap: $spacing-xs; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + } + + &:hover { + color: $primary-blue; + + i { + transform: translateY(-2px); + } + } + + i { + color: $primary-blue; + transition: $transition-base; + } + } + } + } + } + + // Content section + .detail-content { + padding: $spacing-3xl $spacing-2xl; + min-height: 200px; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-lg; + } + + .content-body { + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + white-space: pre-line; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } + } +} + +// Response section (answer from admin) +.inquiry-response-card { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + overflow: hidden; + margin-bottom: $spacing-xl; + border-left: 4px solid $accent-green; + + .response-header { + padding: $spacing-xl $spacing-2xl; + background: rgba($accent-green, 0.03); + border-bottom: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg; + } + + .response-title { + display: flex; + align-items: center; + gap: $spacing-sm; + font-size: $font-size-lg; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-sm; + + i { + color: $accent-green; + } + } + + .response-meta { + font-size: $font-size-sm; + color: $text-gray; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + } + } + } + + .response-content { + padding: $spacing-2xl; + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + white-space: pre-line; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg; + font-size: $font-size-sm; + } + } +} + +// Inquiry actions (detail page buttons) +.inquiry-detail-actions { + display: flex; + justify-content: center; + gap: $spacing-md; + margin-bottom: $spacing-3xl; + flex-wrap: wrap; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + } + + .action-btn { + padding: $spacing-md $spacing-2xl; + border-radius: $border-radius-md; + font-size: $font-size-base; + font-weight: $font-weight-medium; + text-decoration: none; + transition: $transition-base; + display: inline-flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + cursor: pointer; + border: none; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + font-size: $font-size-sm; + } + + &.btn-list { + background: $white; + color: $text-dark; + border: 1px solid $border-gray; + + &:hover { + background: $gray-bg; + border-color: $primary-blue; + } + } + + &.btn-edit { + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + } + + &.btn-delete { + background: $accent-orange; + color: $white; + + &:hover { + transform: translateY(-2px); + box-shadow: $shadow-md; + } + } + + i { + font-size: 16px; + } + } +} + +// =========================== +// Inquiry Form Page +// =========================== +.inquiry-form-page { + min-height: calc(100vh - 140px); + background: $gray-bg; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-md; + } +} + +.inquiry-form-container { + margin: 0 auto; +} + +.inquiry-form-card { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + padding: $spacing-3xl; + margin-bottom: $spacing-xl; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-lg; + } + + .form-group { + margin-bottom: $spacing-2xl; + + &:last-child { + margin-bottom: 0; + } + + .form-label { + display: block; + font-size: $font-size-base; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-md; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + + &.required::after { + content: '*'; + color: $accent-orange; + margin-left: $spacing-xs; + } + } + + .form-input { + width: 100%; + padding: $spacing-md; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-base; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + padding: $spacing-sm $spacing-md; + } + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &::placeholder { + color: $text-light; + } + } + + .form-textarea { + width: 100%; + min-height: 200px; + padding: $spacing-md; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-base; + font-family: $font-family-primary; + resize: vertical; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + padding: $spacing-sm $spacing-md; + min-height: 150px; + } + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &::placeholder { + color: $text-light; + } + } + + // File upload styles now in components/_forms.scss + } +} + +// Inquiry form actions +.inquiry-form-actions { + display: flex; + justify-content: center; + gap: $spacing-md; + margin-top: $spacing-xl; + + @media (max-width: $breakpoint-sm) { + flex-direction: column-reverse; + align-items: stretch; + } + + // Uses the same action button styles from .inquiry-actions above + // Supports: action-btn-primary, action-btn-secondary +} diff --git a/src/main/resources/static/sass/pages/_login.scss b/src/main/resources/static/sass/pages/_login.scss index 378fb24..da49387 100644 --- a/src/main/resources/static/sass/pages/_login.scss +++ b/src/main/resources/static/sass/pages/_login.scss @@ -1,198 +1,177 @@ // ----------------------------------------------------------------------------- -// Login Page Styles - Modern Design +// Login Page Styles - Figma Design Implementation // ----------------------------------------------------------------------------- .login-page { - min-height: calc(100vh - 140px); // Account for header and footer display: flex; align-items: center; justify-content: center; - background: linear-gradient(135deg, var(--light-bg) 0%, var(--gray-bg) 100%); + background: #EDF9FE; // Light blue background from Figma padding: 40px 20px; position: relative; - overflow: hidden; - - // Decorative background elements - &::before { - content: ''; - position: absolute; - top: -50%; - right: -20%; - width: 600px; - height: 600px; - background: radial-gradient(circle, var(--accent-cyan) 0%, transparent 70%); - opacity: 0.1; - border-radius: 50%; - } - - &::after { - content: ''; - position: absolute; - bottom: -30%; - left: -10%; - width: 400px; - height: 400px; - background: radial-gradient(circle, var(--primary-blue) 0%, transparent 70%); - opacity: 0.1; - border-radius: 50%; - } + border-radius: 12px; + margin-top: 60px; + margin-bottom: 60px; } .login-container { width: 100%; - max-width: 480px; + max-width: 504px; // Match Figma width margin: 0 auto; position: relative; - z-index: 1; } .login-card { - background: var(--white); - border-radius: 24px; - box-shadow: var(--shadow-xl); - padding: 48px 40px; - backdrop-filter: blur(10px); - border: 1px solid rgba(255, 255, 255, 0.8); + background: transparent; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; - @media (max-width: 480px) { - padding: 32px 24px; - border-radius: 16px; + @media (max-width: 576px) { + padding: 0 20px; } } -.login-header { +.login-logo { + width: 90px; + height: 90px; + margin-bottom: 30px; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } +} + +.login-message { + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 400; + color: #000000; text-align: center; margin-bottom: 40px; - - .login-logo { - display: inline-flex; - align-items: center; - gap: 12px; - margin-bottom: 24px; - - img { - height: 48px; - width: auto; - } - - .logo-text { - font-size: 20px; - font-weight: 700; - color: var(--primary-blue); - padding: 6px 16px; - background: var(--light-bg); - border-radius: 24px; - } - } - - .login-title { - font-size: 28px; - font-weight: 700; - color: var(--text-dark); - margin-bottom: 8px; - } - - .login-subtitle { - font-size: 15px; - color: var(--text-gray); - } + line-height: 1; } .login-form { - margin-bottom: 24px; + width: 100%; + margin-bottom: 0; .form-group { - margin-bottom: 20px; + margin-bottom: 24px; - &:last-child { + &:last-of-type { margin-bottom: 0; } } - .form-label { - display: block; - font-size: 14px; - font-weight: 600; - color: var(--text-dark); - margin-bottom: 8px; - } - .form-input { width: 100%; - padding: 14px 16px; - font-size: 15px; - border: 2px solid var(--border-gray); + height: 70px; + padding: 0 32px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #5F666C; + background: #FFFFFF; + border: 1px solid #DDDDDD; border-radius: 12px; - background: var(--white); - transition: all 0.3s ease; outline: none; + transition: all 0.3s ease; &::placeholder { - color: var(--text-light); + color: #5F666C; } &:focus { - border-color: var(--primary-blue); - box-shadow: 0 0 0 4px rgba(75, 155, 255, 0.1); + border-color: #0049B4; } &.error { - border-color: var(--accent-orange); - - &:focus { - box-shadow: 0 0 0 4px rgba(255, 107, 107, 0.1); - } + border-color: #FF6B6B; } } .form-checkbox { display: flex; align-items: center; - gap: 8px; - margin-top: 16px; + justify-content: flex-end; + gap: 7px; + margin-top: 24px; + margin-bottom: 22px; + margin-right: 10px; input[type="checkbox"] { - width: 18px; - height: 18px; - accent-color: var(--primary-blue); + width: 20px; + height: 20px; + border: 1.5px solid #000000; + border-radius: 4px; cursor: pointer; + appearance: none; + background: #FFFFFF; + position: relative; + flex-shrink: 0; + + &:checked { + background: #FFFFFF; + border-color: #2C2C2C; + + &::after { + content: ''; + position: absolute; + left: 50%; + top: 45%; + transform: translate(-50%, -50%) rotate(45deg); + width: 6px; + height: 12px; + border: solid #2C2C2C; + border-width: 0 2px 2px 0; + } + } } label { - font-size: 14px; - color: var(--text-gray); + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; cursor: pointer; user-select: none; + line-height: 24px; + white-space: nowrap; } } } .login-button { width: 100%; - padding: 16px 24px; - font-size: 16px; - font-weight: 600; - color: var(--white); - background: var(--gradient-primary); + height: 80px; + padding: 10px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + background: #0049B4; border: none; border-radius: 12px; cursor: pointer; transition: all 0.3s ease; - box-shadow: var(--shadow-md); + margin-bottom: 40px; + line-height: 1; &:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-lg); + background: darken(#0049B4, 5%); } &:active { - transform: translateY(0); + background: darken(#0049B4, 10%); } &:disabled { opacity: 0.6; cursor: not-allowed; - transform: none; } } @@ -200,45 +179,34 @@ display: flex; justify-content: center; align-items: center; - gap: 16px; - margin-top: 32px; - padding-top: 32px; - border-top: 1px solid var(--border-gray); + gap: 26px; flex-wrap: wrap; - @media (max-width: 480px) { - gap: 12px; - margin-top: 24px; - padding-top: 24px; - } - a { - font-size: 14px; - color: var(--text-gray); + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; text-decoration: none; transition: color 0.3s ease; - display: flex; - align-items: center; - gap: 6px; + line-height: 1; &:hover { - color: var(--primary-blue); - } - - i { - font-size: 16px; + color: #0049B4; + text-decoration: underline; } } .link-separator { - color: var(--border-gray); - font-size: 14px; + color: #000000; + font-size: 16px; } } // Alert messages .login-alert { - margin-bottom: 20px; + width: 100%; + margin-bottom: 24px; padding: 12px 16px; border-radius: 8px; font-size: 14px; @@ -248,20 +216,20 @@ &.alert-error { background: rgba(255, 107, 107, 0.1); - color: var(--accent-orange); + color: #FF6B6B; border: 1px solid rgba(255, 107, 107, 0.2); } &.alert-success { background: rgba(107, 207, 127, 0.1); - color: var(--accent-green); + color: #6BCF7F; border: 1px solid rgba(107, 207, 127, 0.2); } &.alert-info { - background: rgba(75, 155, 255, 0.1); - color: var(--primary-blue); - border: 1px solid rgba(75, 155, 255, 0.2); + background: rgba(0, 73, 180, 0.1); + color: #0049B4; + border: 1px solid rgba(0, 73, 180, 0.2); } i { @@ -271,16 +239,15 @@ // Loading state .login-loading { - position: absolute; + position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: rgba(255, 255, 255, 0.9); + background: rgba(237, 249, 254, 0.9); display: flex; align-items: center; justify-content: center; - border-radius: 24px; z-index: 10; opacity: 0; pointer-events: none; @@ -294,8 +261,8 @@ .spinner { width: 40px; height: 40px; - border: 3px solid var(--border-gray); - border-top-color: var(--primary-blue); + border: 3px solid #DDDDDD; + border-top-color: #0049B4; border-radius: 50%; animation: spin 1s linear infinite; } @@ -305,4 +272,56 @@ to { transform: rotate(360deg); } -} \ No newline at end of file +} + +// Responsive adjustments +@media (max-width: 576px) { + .login-container { + max-width: 100%; + padding: 0 20px; + } + + .login-logo { + width: 70px; + height: 70px; + margin-bottom: 24px; + } + + .login-message { + font-size: 18px; + margin-bottom: 32px; + } + + .login-form { + .form-input { + height: 60px; + padding: 0 20px; + font-size: 15px; + } + + .form-checkbox { + input[type="checkbox"] { + width: 24px; + height: 24px; + } + + label { + font-size: 14px; + } + } + } + + .login-button { + height: 70px; + font-size: 18px; + margin-bottom: 32px; + } + + .login-links { + gap: 20px; + + a, .link-separator { + font-size: 14px; + } + } +} diff --git a/src/main/resources/static/sass/pages/_mypage.scss b/src/main/resources/static/sass/pages/_mypage.scss new file mode 100644 index 0000000..68bc113 --- /dev/null +++ b/src/main/resources/static/sass/pages/_mypage.scss @@ -0,0 +1,20 @@ +// ----------------------------------------------------------------------------- +// MyPage Styles +// Used in: mypage profile pages (updateCorporateManager, updatePersonalUser, etc.) +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// Corporate Transfer Section - Personal to corporate membership transition +// ----------------------------------------------------------------------------- +.corporate-transfer-section { + margin-top: $spacing-2xl; + padding-top: $spacing-lg; + + .btn-block { + width: 100%; + } +} + +// ----------------------------------------------------------------------------- +// Withdrawal Link styles moved to components/_forms.scss (.form-actions--with-withdrawal) +// ----------------------------------------------------------------------------- diff --git a/src/main/resources/static/sass/pages/_notice.scss b/src/main/resources/static/sass/pages/_notice.scss new file mode 100644 index 0000000..613f82f --- /dev/null +++ b/src/main/resources/static/sass/pages/_notice.scss @@ -0,0 +1,1038 @@ +// ----------------------------------------------------------------------------- +// Notice Pages - List and Detail Views +// ----------------------------------------------------------------------------- + +// Notice list page container +.notice-page { + min-height: calc(100vh - 140px); + background: $gray-bg; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-md; + } +} + +.notice-container { + max-width: $container-max-width; + margin: 0 auto; +} + +// Page header +.notice-header { + margin-bottom: $spacing-3xl; + + @media (max-width: $breakpoint-sm) { + margin-bottom: $spacing-2xl; + } + + .page-title { + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-md; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-2xl; + } + } + + .page-description { + font-size: $font-size-base; + color: $text-gray; + line-height: $line-height-normal; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } +} + +// Notice list wrapper +.notice-list-wrapper { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + overflow: hidden; + margin-bottom: $spacing-xl; +} + +// ----------------------------------------------------------------------------- +// Notice Detail Page - Figma Design (node 1041:2585) +// ----------------------------------------------------------------------------- +.notice-detail-container { + max-width: 1228px; + margin: 0 auto; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-md) { + padding: $spacing-2xl $spacing-md; + } +} + +// Notice Detail Header - Title and Date in one row +.notice-detail-header { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: $spacing-md; + border-bottom: 1px solid #212529; + margin-bottom: $spacing-xl; + + @media (max-width: $breakpoint-md) { + flex-direction: column; + align-items: flex-start; + gap: $spacing-sm; + } +} + +.notice-detail-title { + font-size: 24px; + font-weight: $font-weight-bold; + color: #212529; + line-height: 1; + margin: 0; + + @media (max-width: $breakpoint-md) { + font-size: 20px; + } +} + +.notice-detail-date { + font-size: 24px; + font-weight: $font-weight-regular; + color: #515151; + + @media (max-width: $breakpoint-md) { + font-size: 16px; + } +} + +// Notice Attachment Section +.notice-detail-attachment { + margin-bottom: $spacing-lg; + + .attachment-list { + display: flex; + flex-direction: column; + gap: $spacing-sm; + } + + .attachment-item { + display: flex; + align-items: center; + } +} + +.notice-attachment-link { + display: inline-flex; + align-items: center; + gap: $spacing-xs; + color: #515151; + font-size: 18px; + text-decoration: none; + transition: $transition-base; + + @media (max-width: $breakpoint-md) { + font-size: 14px; + } + + &:hover { + color: $primary-blue; + } + + svg { + flex-shrink: 0; + color: #515151; + } + + &:hover svg { + color: $primary-blue; + } + + .attachment-label { + margin-right: $spacing-md; + } + + .attachment-filename { + color: #515151; + } +} + +// Notice Content Section +.notice-detail-content { + margin-bottom: $spacing-3xl; +} + +.notice-content-body { + background: #F6F9FB; + border-radius: 20px; + padding: $spacing-2xl; + min-height: 280px; + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + + @media (max-width: $breakpoint-md) { + padding: $spacing-lg; + min-height: 200px; + border-radius: 12px; + } + + // Rich text content styling + p { + margin-bottom: $spacing-md; + + &:last-child { + margin-bottom: 0; + } + } + + img { + max-width: 100%; + height: auto; + border-radius: $border-radius-md; + margin: $spacing-lg 0; + } + + a { + color: $primary-blue; + text-decoration: underline; + + &:hover { + color: $secondary-blue; + } + } + + ul, ol { + margin: $spacing-md 0; + padding-left: $spacing-xl; + } + + li { + margin-bottom: $spacing-sm; + } +} + +// Notice Detail Actions +.notice-detail-actions { + display: flex; + justify-content: center; +} + +// List Button - Figma Design +.btn-notice-list { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 60px; + background: #E5E7EB; + border: none; + border-radius: 12px; + font-family: $font-family-primary; + font-size: 18px; + font-weight: $font-weight-bold; + color: #5F666C; + cursor: pointer; + transition: $transition-base; + + @media (max-width: $breakpoint-md) { + width: 160px; + height: 50px; + font-size: 16px; + } + + &:hover { + background: darken(#E5E7EB, 5%); + } + + &:active { + transform: scale(0.98); + } +} + +// Notice detail card +.notice-detail-card { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + overflow: hidden; + margin-bottom: $spacing-xl; + + // Header section + .detail-header { + padding: $spacing-3xl $spacing-2xl $spacing-xl; + border-bottom: 2px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-lg $spacing-md; + } + + .notice-title { + font-size: $font-size-2xl; + font-weight: $font-weight-bold; + color: $text-dark; + line-height: $line-height-tight; + margin-bottom: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xl; + } + } + + .notice-meta { + display: flex; + align-items: center; + gap: $spacing-lg; + flex-wrap: wrap; + font-size: $font-size-sm; + color: $text-gray; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + gap: $spacing-md; + } + + .meta-item { + display: flex; + align-items: center; + gap: $spacing-xs; + + i { + color: $primary-blue; + } + + strong { + color: $text-dark; + font-weight: $font-weight-medium; + } + } + } + } + + // Attachment section + .detail-attachments { + padding: $spacing-lg $spacing-2xl; + background: $gray-bg; + border-bottom: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + } + + .attachment-list { + display: flex; + flex-direction: column; + gap: $spacing-sm; + + .attachment-item { + display: flex; + align-items: center; + gap: $spacing-sm; + + a { + color: $text-dark; + text-decoration: none; + font-size: $font-size-sm; + transition: $transition-base; + display: flex; + align-items: center; + gap: $spacing-xs; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + } + + &:hover { + color: $primary-blue; + + i { + transform: translateY(-2px); + } + } + + i { + color: $primary-blue; + transition: $transition-base; + } + } + } + } + } + + // Content section + .detail-content { + padding: $spacing-3xl $spacing-2xl; + min-height: 300px; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-lg; + } + + .content-body { + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + + // Content formatting + p { + margin-bottom: $spacing-md; + + &:last-child { + margin-bottom: 0; + } + } + + h1, h2, h3, h4, h5, h6 { + margin-top: $spacing-xl; + margin-bottom: $spacing-md; + font-weight: $font-weight-semibold; + color: $text-dark; + } + + img { + max-width: 100%; + height: auto; + border-radius: $border-radius-md; + margin: $spacing-lg 0; + } + + a { + color: $primary-blue; + text-decoration: underline; + + &:hover { + color: $secondary-blue; + } + } + + ul, ol { + margin: $spacing-md 0; + padding-left: $spacing-xl; + } + + li { + margin-bottom: $spacing-sm; + } + + blockquote { + border-left: 4px solid $primary-blue; + padding-left: $spacing-lg; + margin: $spacing-lg 0; + color: $text-gray; + font-style: italic; + } + + code { + background: $gray-bg; + padding: 2px 6px; + border-radius: $border-radius-sm; + font-family: $font-family-mono; + font-size: 0.9em; + color: $primary-blue; + } + + pre { + background: $gray-bg; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + padding: $spacing-md; + overflow-x: auto; + margin: $spacing-lg 0; + + code { + background: transparent; + padding: 0; + color: $text-dark; + } + } + + table { + width: 100%; + border-collapse: collapse; + margin: $spacing-lg 0; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + overflow: hidden; + + th { + background: $light-bg; + padding: $spacing-sm $spacing-md; + text-align: left; + font-weight: $font-weight-semibold; + border-bottom: 2px solid $border-gray; + } + + td { + padding: $spacing-sm $spacing-md; + border-bottom: 1px solid $border-gray; + } + + tr:last-child td { + border-bottom: none; + } + } + } + } +} + +// Action buttons +.notice-actions { + display: flex; + justify-content: center; + gap: $spacing-md; + margin-bottom: $spacing-3xl; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: stretch; + } + + // Action button styles now in components/_buttons.scss +} + +// Navigation (prev/next) +.notice-navigation { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-sm; + overflow: hidden; + + .nav-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: $spacing-lg $spacing-2xl; + border-bottom: 1px solid $border-gray; + transition: $transition-base; + cursor: pointer; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: flex-start; + padding: $spacing-md $spacing-lg; + gap: $spacing-sm; + } + + &:last-child { + border-bottom: none; + } + + &:hover { + background: $gray-bg; + + .nav-title { + color: $primary-blue; + } + } + + .nav-label { + display: flex; + align-items: center; + gap: $spacing-sm; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + color: $text-gray; + min-width: 80px; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + } + + i { + color: $primary-blue; + } + } + + .nav-title { + flex: 1; + font-size: $font-size-base; + color: $text-dark; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } + + .nav-date { + font-size: $font-size-sm; + color: $text-light; + min-width: 100px; + text-align: right; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + text-align: left; + } + } + } +} + +// ----------------------------------------------------------------------------- +// Inquiry Detail Page - Based on Notice Detail Design +// ----------------------------------------------------------------------------- +.inquiry-detail-container { + max-width: 1228px; + margin: 0 auto; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-md) { + padding: $spacing-2xl $spacing-md; + } +} + +// Inquiry Detail Header +.inquiry-detail-header { + padding-bottom: $spacing-md; + border-bottom: 1px solid #212529; + margin-bottom: $spacing-xl; +} + +.inquiry-header-top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: $spacing-md; + + @media (max-width: $breakpoint-md) { + flex-direction: column; + align-items: flex-start; + gap: $spacing-sm; + } +} + +.inquiry-detail-title { + font-size: 24px; + font-weight: $font-weight-bold; + color: #212529; + line-height: 1.4; + margin: 0; + + @media (max-width: $breakpoint-md) { + font-size: 20px; + } +} + +.inquiry-detail-date { + font-size: 18px; + font-weight: $font-weight-regular; + color: #515151; + + @media (max-width: $breakpoint-md) { + font-size: 16px; + } +} + +// Inquiry Attachment Section +.inquiry-detail-attachment { + margin-bottom: $spacing-lg; + + .attachment-list { + display: flex; + flex-direction: column; + gap: $spacing-sm; + } + + .attachment-item { + display: flex; + align-items: center; + } +} + +.inquiry-attachment-link { + display: inline-flex; + align-items: center; + gap: $spacing-xs; + color: #515151; + font-size: 18px; + text-decoration: none; + transition: $transition-base; + + @media (max-width: $breakpoint-md) { + font-size: 14px; + } + + &:hover { + color: $primary-blue; + } + + svg { + flex-shrink: 0; + color: #515151; + } + + &:hover svg { + color: $primary-blue; + } + + .attachment-label { + margin-right: $spacing-md; + } + + .attachment-filename { + color: #515151; + } +} + +// Inquiry Content Section +.inquiry-detail-content { + margin-bottom: $spacing-2xl; +} + +.inquiry-content-body { + background: #F6F9FB; + border-radius: 20px; + padding: $spacing-2xl; + min-height: 200px; + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + white-space: pre-line; + + @media (max-width: $breakpoint-md) { + padding: $spacing-lg; + min-height: 150px; + border-radius: 12px; + } + + p { + margin-bottom: $spacing-md; + + &:last-child { + margin-bottom: 0; + } + } + + img { + max-width: 100%; + height: auto; + border-radius: $border-radius-md; + margin: $spacing-lg 0; + } + + a { + color: $primary-blue; + text-decoration: underline; + + &:hover { + color: $secondary-blue; + } + } +} + +// Admin Response Section +.inquiry-response-section { + margin-bottom: $spacing-2xl; +} + +.inquiry-response-header { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: $spacing-md; + border-bottom: 1px solid #DADADA; + margin-bottom: $spacing-lg; + + @media (max-width: $breakpoint-md) { + flex-direction: column; + align-items: flex-start; + gap: $spacing-sm; + } +} + +.response-label { + font-size: 20px; + font-weight: $font-weight-bold; + color: #0049b4; + + @media (max-width: $breakpoint-md) { + font-size: 18px; + } +} + +.response-date { + font-size: 18px; + font-weight: $font-weight-regular; + color: #515151; + + @media (max-width: $breakpoint-md) { + font-size: 16px; + } +} + +.inquiry-response-body { + background: #ffffff; + border: 1px solid #E5E7EB; + border-radius: 20px; + padding: $spacing-2xl; + min-height: 150px; + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + white-space: pre-line; + + @media (max-width: $breakpoint-md) { + padding: $spacing-lg; + min-height: 100px; + border-radius: 12px; + } +} + +// Inquiry Detail Actions +.inquiry-detail-actions { + display: flex; + justify-content: space-between; + align-items: center; + gap: $spacing-md; + + @media (max-width: $breakpoint-md) { + flex-direction: column-reverse; + gap: $spacing-lg; + } + + .actions-left { + display: flex; + gap: $spacing-md; + } + + .actions-right { + display: flex; + gap: $spacing-md; + } +} + +// Inquiry Action Buttons +.btn-inquiry-list { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 60px; + background: #E5E7EB; + border: none; + border-radius: 12px; + font-family: $font-family-primary; + font-size: 18px; + font-weight: $font-weight-bold; + color: #5F666C; + cursor: pointer; + transition: $transition-base; + + @media (max-width: $breakpoint-md) { + width: 160px; + height: 50px; + font-size: 16px; + } + + &:hover { + background: darken(#E5E7EB, 5%); + } + + &:active { + transform: scale(0.98); + } +} + +.btn-inquiry-edit { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 60px; + background: #0049b4; + border: none; + border-radius: 12px; + font-family: $font-family-primary; + font-size: 18px; + font-weight: $font-weight-bold; + color: $white; + cursor: pointer; + transition: $transition-base; + + @media (max-width: $breakpoint-md) { + width: 100px; + height: 50px; + font-size: 16px; + } + + &:hover { + background: darken(#0049b4, 5%); + } + + &:active { + transform: scale(0.98); + } +} + +.btn-inquiry-delete { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 60px; + background: #DC3545; + border: none; + border-radius: 12px; + font-family: $font-family-primary; + font-size: 18px; + font-weight: $font-weight-bold; + color: $white; + cursor: pointer; + transition: $transition-base; + + @media (max-width: $breakpoint-md) { + width: 100px; + height: 50px; + font-size: 16px; + } + + &:hover { + background: darken(#DC3545, 5%); + } + + &:active { + transform: scale(0.98); + } +} + +// ----------------------------------------------------------------------------- +// Inquiry Form Page - Based on apiKeyRegisterStep1 and mypage designs +// ----------------------------------------------------------------------------- +.inquiry-form-container { + max-width: 1228px; + margin: 0 auto; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-md) { + padding: $spacing-2xl $spacing-md; + } +} + +// File Upload Inline - Figma Design (node 1029-1507) +// Layout: [텍스트필드] [파일첨부 버튼] +.file-upload-inline { + display: flex; + align-items: center; + gap: 20px; + + @media (max-width: $breakpoint-md) { + flex-direction: column; + align-items: stretch; + gap: $spacing-md; + } + + // 텍스트필드 영역 - 파일명 표시 + .file-input-display { + flex: 1; + display: flex; + align-items: center; + justify-content: space-between; + height: 60px; + padding: 0 20px; + background: $white; + border: 1px solid #DADADA; + border-radius: 12px; + min-width: 0; + + &.has-file { + border-color: #3ba4ed; + } + } + + .file-display-text { + flex: 1; + font-family: $font-family-primary; + font-size: $font-size-base; + color: #94A3B8; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &.has-file { + color: $text-dark; + } + } + + // 파일 삭제 버튼 (인라인) + .btn-remove-file-inline { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + background: #DC3545; + border: none; + border-radius: 50%; + color: $white; + cursor: pointer; + transition: $transition-base; + flex-shrink: 0; + margin-left: $spacing-sm; + + &:hover { + background: darken(#DC3545, 10%); + } + + svg { + width: 12px; + height: 12px; + } + } + + // 파일첨부 버튼 - Figma 디자인 (#3ba4ed) + .btn-file-attach { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 10px; + width: 172px; + height: 60px; + padding: 10px; + background: #3ba4ed; + border: none; + border-radius: 12px; + font-family: $font-family-primary; + font-size: 18px; + font-weight: $font-weight-bold; + color: $white; + cursor: pointer; + transition: $transition-base; + white-space: nowrap; + flex-shrink: 0; + + @media (max-width: $breakpoint-md) { + width: 100%; + } + + &:hover { + background: darken(#3ba4ed, 8%); + } + + svg { + width: 22px; + height: 22px; + flex-shrink: 0; + } + } +} + +// 파일 업로드 힌트 텍스트 +.file-upload-hint { + margin-top: $spacing-sm; + font-size: $font-size-sm; + color: #94A3B8; + line-height: $line-height-normal; + + strong { + color: $text-dark; + } +} diff --git a/src/main/resources/static/sass/pages/_org-register.scss b/src/main/resources/static/sass/pages/_org-register.scss new file mode 100644 index 0000000..9f5be4a --- /dev/null +++ b/src/main/resources/static/sass/pages/_org-register.scss @@ -0,0 +1,873 @@ +// Organization Registration Page Styles +// Modern design for corporate registration flow + +@import '../abstracts/variables'; +@import '../abstracts/mixins'; + +// Main Registration Container +.org-register-page { + min-height: 100vh; + padding: 0; + + @include respond-to('sm') { + padding: 0; + } +} + +.org-register-container { + @extend .common-container; + + padding: $spacing-2xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg $spacing-md; + } +} + +// Header +.org-register-title { + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + text-align: center; + margin-bottom: $spacing-3xl; + + @include respond-to('sm') { + font-size: $font-size-2xl; + margin-bottom: $spacing-xl; + } +} + +// Section Headers +.org-section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: $spacing-lg $spacing-xl; + background: #EDF9FE; + border-radius: $border-radius-md; + margin-bottom: $spacing-xl; + + h3 { + font-size: $font-size-lg; + font-weight: $font-weight-regular; + color: #515961; + margin: 0; + } + + .required-badge { + background: rgba(255, 255, 255, 0.2); + color: $white; + padding: $spacing-xs $spacing-md; + border-radius: $border-radius-full; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + display: inline-flex; + align-items: center; + gap: $spacing-xs; + + &::before { + content: '*'; + color: $accent-yellow; + font-weight: $font-weight-bold; + } + } + + // Agreement variant - Simple text with underline (Figma design) + &--agreement { + background: none; + padding: 0 0 $spacing-md 0; + border-radius: 0; + border-bottom: 2px solid #212529; + margin-bottom: $spacing-xl; + + h3 { + font-size: 22px; + font-weight: $font-weight-bold; + color: #212529; + margin: 0; + } + + .required-badge { + display: none; + } + } + + @include respond-to('sm') { + padding: $spacing-md $spacing-lg; + + h3 { + font-size: $font-size-md; + } + + &--agreement { + padding: 0 0 $spacing-sm 0; + + h3 { + font-size: $font-size-md; + } + } + } +} + +// Info Notice +.org-info-notice { + border-radius: $border-radius-md; + margin-bottom: $spacing-md; + + ul { + list-style: none; + padding: 0; + margin: 0; + + li { + position: relative; + padding-left: $spacing-lg; + color: $text-gray; + font-size: $font-size-sm; + line-height: 1.6; + + &::before { + content: '•'; + position: absolute; + left: 0; + color: $primary-blue; + font-weight: $font-weight-bold; + } + + & + li { + margin-top: $spacing-sm; + } + } + } +} + +// Form Groups +.org-form-group { + margin-bottom: $spacing-sm; + display: flex; + align-items: flex-start; + gap: $spacing-lg; + + &:last-child { + margin-bottom: 0; + } + + @include respond-to('sm') { + flex-direction: column; + gap: $spacing-md; + } +} + +.org-form-label { + display: flex; + align-items: center; + gap: $spacing-sm; + font-size: $font-size-base; + font-weight: $font-weight-semibold; + color: $text-dark; + min-width: 180px; + padding-top: $spacing-md; + + .required-badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 2px 8px; + background: #3BA4ED; + color: $white; + font-size: 12px; + font-weight: $font-weight-medium; + border-radius: 4px; + line-height: 1.2; + } + + @include respond-to('sm') { + min-width: auto; + padding-top: 0; + } +} + +.org-form-input-wrapper { + flex: 1; + display: flex; + flex-direction: column; + gap: $spacing-sm; + + @include respond-to('sm') { + width: 100%; + } +} + +// Inline layout for input + button on same row +.org-input-row { + display: flex; + align-items: center; + gap: $spacing-md; + + .org-form-input, + .org-compound-input, + .org-auth-input-group { + flex: 1; + min-width: 0; + } + + .org-btn-check { + flex-shrink: 0; + } + + @include respond-to('sm') { + flex-direction: column; + align-items: stretch; + gap: $spacing-sm; + + .org-form-input, + .org-compound-input, + .org-auth-input-group { + width: 100%; + } + + .org-btn-check { + width: 100%; + } + } +} + +// Input Fields +.org-form-input { + width: 100%; + padding: $spacing-md $spacing-lg; + border: 2px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-base; + color: $text-dark; + transition: $transition-base; + background: $white; + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba(75, 155, 255, 0.1); + } + + &:disabled { + background: $gray-bg; + color: $text-light; + cursor: not-allowed; + } + + &.is-invalid { + border-color: $accent-orange; + } + + &.is-valid { + border-color: $accent-green; + } + + &::placeholder { + color: $text-light; + } +} + +// Compound Inputs (e.g., phone number, email) +.org-compound-input { + display: flex; + align-items: center; + gap: $spacing-sm; + width: 100%; + + .org-form-input, + .org-form-select { + flex: 1; + min-width: 0; + } + + // Equal width for phone number inputs + .phone-number { + flex: 1; + width: 100%; + } + + .separator { + color: $text-gray; + font-weight: $font-weight-semibold; + user-select: none; + flex-shrink: 0; + } + + @include respond-to('sm') { + width: 100%; + + .org-form-input, + .org-form-select { + flex: 1; + min-width: 0; + } + } +} + +// Select Dropdown +.org-form-select { + width: 100%; + padding: $spacing-md $spacing-lg; + border: 2px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-base; + color: $text-dark; + background: $white; + cursor: pointer; + transition: $transition-base; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748B' d='M6 9L1 4h10z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right $spacing-lg center; + padding-right: $spacing-3xl; + + &:focus { + outline: none; + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba(75, 155, 255, 0.1); + } + + &:disabled { + background-color: $gray-bg; + color: $text-light; + cursor: not-allowed; + } +} + +// Button with Input +.org-input-button-group { + display: flex; + gap: $spacing-md; + + .org-form-input { + flex: 1; + } + + @include respond-to('sm') { + flex-direction: column; + + .org-form-input { + flex: none; + } + } +} + +// Auth Input Group (for authentication number with timer) +.org-auth-input-group { + position: relative; + display: flex; + align-items: center; + + .org-form-input { + padding-right: 100px; // Make space for timer + } +} + +.org-timer { + position: absolute; + right: $spacing-lg; + top: 50%; + transform: translateY(-50%); + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $accent-orange; + pointer-events: none; + user-select: none; +} + +// Buttons +.org-btn { + padding: $spacing-md $spacing-2xl; + border-radius: $border-radius-md; + font-size: $font-size-base; + font-weight: $font-weight-semibold; + cursor: pointer; + transition: $transition-base; + border: none; + display: inline-flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + white-space: nowrap; + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + &:not(:disabled):hover { + transform: translateY(-1px); + box-shadow: $shadow-md; + } + + &:not(:disabled):active { + transform: translateY(0); + } +} + +.org-btn-primary { + color: $white; + +} + +.org-btn-secondary { + background: $white; + color: $text-gray; + border: 2px solid $border-gray; + + &:not(:disabled):hover { + border-color: $primary-blue; + color: $primary-blue; + } +} + +.org-btn-check { + padding: $spacing-md $spacing-lg; + width: 172px; + background: #A4D6EA; + color: $white; + border: 2px solid #A4D6EA; + text-align: center; + justify-content: center; + + &:not(:disabled):hover { + color: $white; + } + + @include respond-to('sm') { + width: 100%; + } +} + +// File Upload +.org-file-upload { + display: flex; + align-items: center; + gap: $spacing-md; + + @include respond-to('sm') { + flex-direction: column; + align-items: stretch; + } +} + +.org-file-display { + flex: 1; + padding: $spacing-md $spacing-lg; + border: 2px dashed $border-gray; + border-radius: $border-radius-md; + background: $gray-bg; + color: $text-light; + cursor: default; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &.has-file { + border-style: solid; + border-color: $accent-green; + background: rgba(107, 207, 127, 0.05); + color: $text-dark; + } +} + +.org-file-label { + @extend .org-btn-check; + cursor: pointer; + background: #3BA4ED; + border-radius: 12px; + border: 2px solid #3BA4ED; + + input[type="file"] { + display: none; + } +} + +.org-file-remove { + padding: $spacing-md; + background: $accent-orange; + color: $white; + border: none; + border-radius: $border-radius-md; + cursor: pointer; + transition: $transition-base; + + &:hover { + background: darken($accent-orange, 10%); + } +} + +// File Upload Notice +.org-file-notice { + margin-top: $spacing-md; + padding: $spacing-md; + border-radius: $border-radius-sm; + + p { + margin: 0; + font-size: $font-size-sm; + color: $text-gray; + line-height: 1.5; + + & + p { + margin-top: $spacing-xs; + } + + &::before { + content: '• '; + color: $accent-yellow; + font-weight: $font-weight-bold; + } + } +} + +// Action Buttons +.org-action-buttons { + display: flex; + gap: $spacing-lg; + justify-content: center; + margin-top: $spacing-4xl; + padding-top: $spacing-3xl; + border-top: 1px solid $border-gray; + + .btn { + width: 220px; + text-align: center; + justify-content: center; + } + + @include respond-to('sm') { + flex-direction: column; + margin-top: $spacing-2xl; + padding-top: $spacing-xl; + } +} + +// Validation Messages +.org-validation-message { + margin-top: $spacing-sm; + padding: $spacing-sm $spacing-md; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + + &.success { + background: rgba(107, 207, 127, 0.1); + color: $accent-green; + } + + &.error { + background: rgba(255, 107, 107, 0.1); + color: $accent-orange; + } +} + +// Loading Overlay +.org-loading-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(26, 26, 46, 0.7); + display: none; + align-items: center; + justify-content: center; + z-index: 9999; + + &.active { + display: flex; + } + + .spinner { + width: 50px; + height: 50px; + border: 4px solid rgba(255, 255, 255, 0.2); + border-top-color: $white; + border-radius: 50%; + animation: spin 1s linear infinite; + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +// Responsive Adjustments +@include respond-to('sm') { + .org-form-input { + width: 100%; + } + + .org-compound-input { + width: 100%; + + .org-form-select, + .org-form-input { + flex: 1; + min-width: 0; + width: auto; + font-size: $font-size-sm; + padding: $spacing-sm $spacing-md; + } + } + + .org-auth-input-group { + width: 100%; + + .org-form-input { + width: 100%; + } + } +} + +// Agreement Form - Figma Design +.agreement-form { + background: $white; + border: 1px solid #DDDDDD; + border-radius: 12px; + padding: 30px 20px; + display: flex; + flex-direction: column; + gap: 20px; + margin-bottom: 90px; +} + +// Agree All Section +.agreement-all-section { + display: flex; + align-items: center; + padding: 10px 0; +} + +// Divider +.agreement-divider { + height: 1px; + background: #DDDDDD; + width: 100%; +} + +// Agreement Items List +.agreement-items-list { + display: flex; + flex-direction: column; + gap: 20px; +} + +// Agreement Item Row +.agreement-item-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 4px; + height: 28px; +} + +// Checkbox Label +.agreement-checkbox-label { + display: flex; + align-items: center; + gap: 4px; + cursor: pointer; + flex: 1; + user-select: none; +} + +// Checkbox Input (hidden) +.agreement-checkbox-input { + position: absolute; + opacity: 0; + pointer-events: none; + + &:checked + .agreement-checkbox-custom { + background-image: url('/img/checkbox-checked.png'); + } + + &:focus + .agreement-checkbox-custom { + box-shadow: 0 0 0 3px rgba(140, 149, 159, 0.1); + } +} + +// Checkbox Custom Style (Circle Design) +.agreement-checkbox-custom { + position: relative; + width: 26px; + height: 26px; + min-width: 26px; + border: none; + border-radius: 50%; + background-image: url('/img/checkbox-unchecked.png'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + transition: $transition-base; + padding: 0; +} + +// Checkbox Text +.agreement-checkbox-text { + font-size: 16px; + font-weight: 400; + color: #515961; + line-height: 100.02%; + display: flex; + align-items: center; + gap: 4px; + + &.agreement-all-text { + font-size: 18px; + font-weight: 700; + color: #212529; + } +} + +// Agreement Required Badge +.agreement-required { + color: #0049B4; + font-weight: 700; +} + +// Agreement Title +.agreement-title { + color: #515961; +} + +// Toggle Icon +.agreement-toggle-icon { + display: flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + min-width: 22px; + border: none; + background: transparent; + color: $text-gray; + cursor: pointer; + transition: $transition-base; + padding: 8px 4px 10px 7px; + + i { + font-size: 12px; + transition: transform 0.3s ease; + } + + &:hover { + color: $primary-blue; + } + + &.active { + color: $primary-blue; + + i { + transform: rotate(180deg); + } + } +} + +// Agreement Content +.agreement-content { + margin-top: $spacing-md; + background: $main-bg; +} + +.agreement-scroll { + max-height: 300px; + overflow-y: auto; + padding: $spacing-lg; + + &::-webkit-scrollbar { + width: 8px; + } + + &::-webkit-scrollbar-track { + background: $border-gray; + border-radius: $border-radius-sm; + } + + &::-webkit-scrollbar-thumb { + background: $text-light; + border-radius: $border-radius-sm; + + &:hover { + background: $text-gray; + } + } + + // Style agreement content + div { + font-size: $font-size-sm; + line-height: 1.8; + color: $text-gray; + + h1, h2, h3, h4, h5, h6 { + color: $text-dark; + margin-top: $spacing-lg; + margin-bottom: $spacing-md; + font-weight: $font-weight-semibold; + } + + p { + margin-bottom: $spacing-md; + } + + ul, ol { + margin-left: $spacing-lg; + margin-bottom: $spacing-md; + } + + table { + width: 100%; + border-collapse: collapse; + margin-bottom: $spacing-md; + + th, td { + border: 1px solid $border-gray; + padding: $spacing-sm; + text-align: left; + } + + th { + background: $light-bg; + font-weight: $font-weight-semibold; + } + } + } +} + +// Responsive +@include respond-to('sm') { + .agreement-form { + padding: 20px 16px; + gap: 16px; + } + + .agreement-all-section { + padding: 8px 0; + } + + .agreement-items-list { + gap: 16px; + } + + .agreement-item-row { + height: auto; + min-height: 28px; + } + + .agreement-checkbox-text { + font-size: $font-size-sm; + + &.agreement-all-text { + font-size: $font-size-base; + } + } + + .agreement-scroll { + max-height: 250px; + padding: $spacing-md; + } +} diff --git a/src/main/resources/static/sass/pages/_partnership.scss b/src/main/resources/static/sass/pages/_partnership.scss new file mode 100644 index 0000000..3748c49 --- /dev/null +++ b/src/main/resources/static/sass/pages/_partnership.scss @@ -0,0 +1,255 @@ +// ----------------------------------------------------------------------------- +// Partnership Form Page - Modern Design +// ----------------------------------------------------------------------------- + +// Page Header +.page-header { + margin-bottom: $spacing-4xl; + text-align: center; + + @include respond-to('sm') { + margin-bottom: $spacing-3xl; + } + + .page-header-content { + max-width: 800px; + margin: 0 auto; + } + + .page-title { + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-md; + display: flex; + align-items: center; + justify-content: center; + gap: $spacing-md; + + @include respond-to('sm') { + font-size: $font-size-2xl; + flex-direction: column; + gap: $spacing-sm; + } + + i { + color: $primary-blue; + font-size: $font-size-3xl; + + @include respond-to('sm') { + font-size: $font-size-2xl; + } + } + } + + .page-description { + font-size: $font-size-lg; + color: $text-gray; + line-height: $line-height-normal; + + @include respond-to('sm') { + font-size: $font-size-base; + } + + .highlight { + color: $primary-blue; + font-weight: $font-weight-semibold; + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: -2px; + left: 0; + right: 0; + height: 2px; + border-radius: 2px; + } + } + } +} + +// Partnership Form Container +.partnership-form-container { + max-width: 800px; + margin: 0 auto; + + @include respond-to('sm') { + padding: 0 $spacing-md; + } +} + +// Partnership Card +.partnership-card { + padding: $spacing-4xl; + background: $white; + border-radius: $border-radius-xl; + box-shadow: $shadow-lg; + border: 1px solid $border-gray; + + @include respond-to('sm') { + padding: $spacing-2xl $spacing-lg; + border-radius: $border-radius-md; + } + + // Form group styles + .form-group { + margin-bottom: $spacing-2xl; + + @include respond-to('sm') { + margin-bottom: $spacing-xl; + } + + label { + display: flex; + align-items: center; + gap: $spacing-sm; + font-size: $font-size-base; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-md; + + i { + color: $primary-blue; + font-size: $font-size-md; + } + + .required { + color: $accent-orange; + margin-left: 2px; + } + } + + // Textarea specific height + textarea.form-control { + min-height: 200px; + resize: vertical; + line-height: 1.6; + + @include respond-to('sm') { + min-height: 150px; + } + } + } + + // Form hint with icon + .form-hint { + display: flex; + align-items: flex-start; + gap: $spacing-xs; + margin-top: $spacing-sm; + font-size: $font-size-sm; + color: $text-gray; + line-height: $line-height-normal; + + i { + color: $primary-blue; + margin-top: 2px; + flex-shrink: 0; + } + } + + // Form error with icon + .form-error { + display: flex; + align-items: flex-start; + gap: $spacing-xs; + margin-top: $spacing-sm; + font-size: $font-size-sm; + color: $accent-orange; + line-height: $line-height-normal; + + i { + margin-top: 2px; + flex-shrink: 0; + } + } + + // Form help text + .form-help-text { + margin-top: $spacing-md; + + p { + display: flex; + align-items: flex-start; + gap: $spacing-xs; + margin: $spacing-xs 0; + font-size: $font-size-xs; + color: $text-light; + line-height: $line-height-normal; + + i { + color: $accent-green; + margin-top: 2px; + flex-shrink: 0; + } + } + } +} + +// .form-actions moved to components/_forms.scss + +// File Upload Wrapper Override for Partnership Page +.partnership-card .file-upload-wrapper { + .file-name-display { + &.has-file { + color: $text-dark; + background: rgba($primary-blue, 0.05); + border-color: $primary-blue; + font-weight: $font-weight-medium; + } + } + + @media (max-width: $breakpoint-sm) { + .file-upload-btn { + order: 1; + } + + .file-name-display { + order: 2; + } + + .file-remove-btn { + order: 3; + } + } +} + + +// Focus states for better accessibility +.partnership-card { + .form-control:focus { + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + outline: none; + } + + // Enhanced focus for textarea + textarea.form-control:focus { + box-shadow: 0 0 0 4px rgba($primary-blue, 0.15); + } +} + +// Print styles +@media print { + .page-header { + margin-bottom: $spacing-xl; + } + + .partnership-card { + box-shadow: none; + border: 1px solid $border-gray; + padding: $spacing-xl; + } + + .form-actions { + display: none; + } + + .file-upload-wrapper { + .file-upload-btn, + .file-remove-btn { + display: none; + } + } +} diff --git a/src/main/resources/static/sass/pages/_signup-selection.scss b/src/main/resources/static/sass/pages/_signup-selection.scss new file mode 100644 index 0000000..2d329f9 --- /dev/null +++ b/src/main/resources/static/sass/pages/_signup-selection.scss @@ -0,0 +1,191 @@ +// ----------------------------------------------------------------------------- +// Signup Selection Page Styles - Figma Design Implementation +// ----------------------------------------------------------------------------- + +.signup-selection-page { + min-height: calc(100vh - 140px); // Account for header and footer + display: flex; + align-items: center; + justify-content: center; + background: #EDF9FE; // Light blue background from Figma (same as login) + padding: 60px 20px; + position: relative; + border-radius: 12px; + margin-top: 60px; + margin-bottom: 60px; +} + +.signup-selection-container { + width: 100%; + max-width: 1018px; // Match Figma container width + margin: 0 auto; + position: relative; +} + +.signup-selection-card { + background: transparent; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; + + @media (max-width: 576px) { + padding: 0 20px; + } +} + +.signup-logo { + width: 90px; + height: 90px; + margin-bottom: 30px; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } +} + +.signup-message { + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 400; + color: #000000; + text-align: center; + margin-bottom: 40px; + line-height: 1; +} + +.signup-buttons { + width: 100%; + max-width: 504px; + display: flex; + flex-direction: column; + gap: 40px; + margin-bottom: 60px; +} + +.signup-btn { + width: 100%; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + padding: 10px; + font-family: 'Noto Sans KR', sans-serif; + font-size: 20px; + font-weight: 700; + color: #FFFFFF; + text-decoration: none; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + line-height: 1; + position: relative; + + &:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + } + + &:active { + transform: translateY(0); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); + } + + .signup-btn-icon { + width: 26px; + height: 30px; + flex-shrink: 0; + } + + span { + white-space: nowrap; + } +} + +.signup-btn-individual { + background: #0049B4; +} + +.signup-btn-organization { + background: #00A1D7; +} + +.signup-navigation { + display: flex; + justify-content: center; + align-items: center; + gap: 26px; + flex-wrap: wrap; + + .signup-nav-link { + font-family: 'Noto Sans KR', sans-serif; + font-size: 16px; + font-weight: 400; + color: #000000; + text-decoration: none; + transition: color 0.3s ease; + line-height: 1; + + &:hover { + color: #0049B4; + text-decoration: underline; + } + } + + .signup-nav-separator { + color: #000000; + font-size: 16px; + line-height: 1; + } +} + +// Responsive adjustments +@media (max-width: 576px) { + .signup-selection-page { + padding: 40px 20px; + } + + .signup-selection-container { + max-width: 100%; + padding: 0 20px; + } + + .signup-logo { + width: 70px; + height: 70px; + margin-bottom: 24px; + } + + .signup-message { + font-size: 18px; + margin-bottom: 32px; + } + + .signup-buttons { + max-width: 100%; + gap: 24px; + margin-bottom: 48px; + } + + .signup-btn { + height: 70px; + font-size: 18px; + + .signup-btn-icon { + width: 22px; + height: 26px; + } + } + + .signup-navigation { + gap: 20px; + + .signup-nav-link, + .signup-nav-separator { + font-size: 14px; + } + } +} diff --git a/src/main/resources/static/sass/pages/_terms-agreements.scss b/src/main/resources/static/sass/pages/_terms-agreements.scss new file mode 100644 index 0000000..ec24c1c --- /dev/null +++ b/src/main/resources/static/sass/pages/_terms-agreements.scss @@ -0,0 +1,496 @@ +// ----------------------------------------------------------------------------- +// Terms and Agreements Page - Modern Design +// 이용약관 및 개인정보처리방침 페이지 +// ----------------------------------------------------------------------------- + +// Page Container +.terms-page { + min-height: calc(100vh - 140px); + background: $gray-bg; + padding: $spacing-3xl $spacing-lg; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-md; + } +} + +.terms-container { + max-width: $container-max-width; + margin: 0 auto; +} + +// Page Header +.terms-header { + margin-bottom: $spacing-3xl; + + @media (max-width: $breakpoint-sm) { + margin-bottom: $spacing-2xl; + } + + .page-title { + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + color: $text-dark; + margin-bottom: $spacing-md; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-2xl; + } + } + + .page-description { + font-size: $font-size-base; + color: $text-gray; + line-height: $line-height-normal; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + } +} + +// Terms Content Card +.terms-content-card { + background: $white; + border-radius: $border-radius-lg; + box-shadow: $shadow-md; + overflow: hidden; +} + +// Tab Navigation +.terms-tabs { + display: flex; + gap: 0; + background: $gray-bg; + padding: $spacing-xs; + border-bottom: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-xs; + } + + .tab-link { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + gap: $spacing-sm; + padding: $spacing-md $spacing-lg; + font-size: $font-size-base; + font-weight: $font-weight-semibold; + color: $text-gray; + text-decoration: none; + background: transparent; + border-radius: $border-radius-md; + transition: $transition-base; + text-align: center; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-sm $spacing-md; + font-size: $font-size-sm; + gap: $spacing-xs; + } + + i { + font-size: $font-size-md; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-base; + } + } + + &:hover { + color: $primary-blue; + background: rgba($primary-blue, 0.05); + + i { + transform: scale(1.1); + } + } + + &.active { + color: $white; + background: $primary-blue; + box-shadow: $shadow-sm; + + i { + color: $white; + } + } + } +} + +// Version Selector +.terms-selector { + padding: $spacing-lg $spacing-2xl; + background: $light-bg; + border-bottom: 1px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-md $spacing-lg; + } + + form { + max-width: 400px; + } + + .custom-select { + position: relative; + cursor: pointer; + + .select-selected { + display: flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-md $spacing-lg; + background: $white; + border: 2px solid $border-gray; + border-radius: $border-radius-md; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + color: $text-dark; + transition: $transition-base; + cursor: pointer; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-sm $spacing-md; + font-size: $font-size-xs; + } + + i { + &:first-child { + color: $primary-blue; + } + + &:last-child { + margin-left: auto; + font-size: $font-size-xs; + color: $text-gray; + transition: $transition-base; + } + } + + span { + font-weight: $font-weight-semibold; + color: $primary-blue; + } + + &:hover { + border-color: $primary-blue; + box-shadow: 0 0 0 3px rgba($primary-blue, 0.1); + } + + &.select-arrow-active { + border-color: $primary-blue; + + i:last-child { + transform: rotate(180deg); + } + } + } + + .select-items { + position: absolute; + top: calc(100% + $spacing-xs); + left: 0; + right: 0; + background: $white; + border: 2px solid $primary-blue; + border-radius: $border-radius-md; + box-shadow: $shadow-lg; + max-height: 240px; + overflow-y: auto; + z-index: $z-index-dropdown; + list-style: none; + padding: $spacing-xs; + margin: 0; + + &.select-hide { + display: none; + } + + li { + padding: $spacing-sm $spacing-md; + font-size: $font-size-sm; + color: $text-dark; + border-radius: $border-radius-sm; + cursor: pointer; + transition: $transition-base; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-xs $spacing-sm; + font-size: $font-size-xs; + } + + &:hover { + background: $light-bg; + color: $primary-blue; + } + + &.selected { + background: $primary-blue; + color: $white; + font-weight: $font-weight-semibold; + } + } + } + } +} + +// Terms Content +.terms-content { + padding: $spacing-3xl $spacing-2xl; + min-height: 400px; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-2xl $spacing-lg; + min-height: 300px; + } + + .content-body { + font-size: $font-size-base; + color: $text-dark; + line-height: $line-height-loose; + white-space: pre-wrap; + word-wrap: break-word; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-sm; + } + + // Content formatting + p { + margin-bottom: $spacing-md; + + &:last-child { + margin-bottom: 0; + } + } + + h1, h2, h3, h4, h5, h6 { + margin-top: $spacing-xl; + margin-bottom: $spacing-md; + font-weight: $font-weight-semibold; + color: $text-dark; + line-height: $line-height-tight; + + &:first-child { + margin-top: 0; + } + } + + h1 { + font-size: $font-size-2xl; + font-weight: $font-weight-bold; + padding-bottom: $spacing-md; + border-bottom: 2px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xl; + } + } + + h2 { + font-size: $font-size-xl; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-lg; + } + } + + h3 { + font-size: $font-size-lg; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-base; + } + } + + strong { + font-weight: $font-weight-bold; + color: $text-dark; + } + + em { + font-style: italic; + color: $text-gray; + } + + a { + color: $primary-blue; + text-decoration: underline; + transition: $transition-base; + + &:hover { + color: $secondary-blue; + } + } + + ul, ol { + margin: $spacing-md 0; + padding-left: $spacing-2xl; + + @media (max-width: $breakpoint-sm) { + padding-left: $spacing-lg; + } + } + + ul { + list-style-type: disc; + } + + ol { + list-style-type: decimal; + } + + li { + margin-bottom: $spacing-sm; + line-height: $line-height-normal; + + &:last-child { + margin-bottom: 0; + } + } + + blockquote { + border-left: 4px solid $primary-blue; + padding-left: $spacing-lg; + margin: $spacing-lg 0; + color: $text-gray; + font-style: italic; + background: $gray-bg; + padding: $spacing-md $spacing-lg; + border-radius: 0 $border-radius-md $border-radius-md 0; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-sm $spacing-md; + } + } + + code { + background: $gray-bg; + padding: 2px 6px; + border-radius: $border-radius-sm; + font-family: $font-family-mono; + font-size: 0.9em; + color: $primary-blue; + } + + pre { + background: $gray-bg; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + padding: $spacing-md; + overflow-x: auto; + margin: $spacing-lg 0; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-sm; + } + + code { + background: transparent; + padding: 0; + color: $text-dark; + } + } + + table { + width: 100%; + border-collapse: collapse; + margin: $spacing-lg 0; + border: 1px solid $border-gray; + border-radius: $border-radius-md; + overflow: hidden; + font-size: $font-size-sm; + + @media (max-width: $breakpoint-sm) { + font-size: $font-size-xs; + } + + th { + background: $light-bg; + padding: $spacing-sm $spacing-md; + text-align: left; + font-weight: $font-weight-semibold; + color: $text-dark; + border-bottom: 2px solid $border-gray; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-xs $spacing-sm; + } + } + + td { + padding: $spacing-sm $spacing-md; + border-bottom: 1px solid $border-gray; + color: $text-dark; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-xs $spacing-sm; + } + } + + tr { + &:last-child td { + border-bottom: none; + } + + &:hover { + background: $gray-bg; + } + } + } + + hr { + border: none; + border-top: 1px solid $border-gray; + margin: $spacing-2xl 0; + } + + // Article/Section numbering + .article { + margin-top: $spacing-2xl; + padding-top: $spacing-lg; + border-top: 1px solid $border-gray; + + &:first-child { + margin-top: 0; + padding-top: 0; + border-top: none; + } + } + + .section-number { + display: inline-block; + min-width: 30px; + color: $primary-blue; + font-weight: $font-weight-bold; + } + } +} + +// Scrollbar styling for select dropdown +.terms-selector .select-items { + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: $gray-bg; + border-radius: $border-radius-sm; + } + + &::-webkit-scrollbar-thumb { + background: $primary-blue; + border-radius: $border-radius-sm; + + &:hover { + background: $secondary-blue; + } + } +} diff --git a/src/main/resources/static/sass/pages/_user-management.scss b/src/main/resources/static/sass/pages/_user-management.scss new file mode 100644 index 0000000..7d159c1 --- /dev/null +++ b/src/main/resources/static/sass/pages/_user-management.scss @@ -0,0 +1,379 @@ +// ----------------------------------------------------------------------------- +// User Management Pages - Modern Card-Based Layout +// Styles for user list and user detail pages +// ----------------------------------------------------------------------------- + +// User Management Container (List Page) +.user-management-container { + max-width: 1400px; + margin: 0 auto; + padding: $spacing-3xl $spacing-2xl; + margin-bottom: $spacing-2xl; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg $spacing-md; + } +} + +// Header Section +.user-management-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: $spacing-2xl; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + align-items: flex-start; + gap: $spacing-lg; + } +} + +.user-management-title { + h1 { + font-size: $font-size-sm; + color: $text-gray; + font-weight: $font-weight-regular; + margin-bottom: $spacing-xs; + } + + h2 { + font-size: $font-size-2xl; + font-weight: $font-weight-bold; + color: $text-dark; + } +} + +.user-management-actions { + display: flex; + gap: $spacing-md; +} + +.btn-create-user-large { + padding: $spacing-md $spacing-2xl; + font-size: $font-size-md; + margin-top: $spacing-lg; +} + +// Table Controls - Uses common styles from components/_tables.scss +// Page-specific overrides only + +// ----------------------------------------------------------------------------- +// User List Table Customizations +// Extends .list-table from components/_tables.scss +// ----------------------------------------------------------------------------- +.user-management-container { + .list-table { + margin-bottom: $spacing-2xl; + + // Link styles in table cells + .row-cell a { + color: $text-dark; + text-decoration: none; + transition: $transition-base; + + &:hover { + color: $primary-blue; + } + } + } + + .table-controls { + @extend .common-title-bar; + + .search-box { + .btn { + height: 44px; + } + } + } +} + +// Current user badge (used in actions column) +.user-current-badge { + display: inline-flex; + height: 40px; + align-items: center; + gap: 6px; + padding: 6px 12px; + background-color: rgba($accent-purple, 0.1); + color: $accent-purple; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + font-weight: $font-weight-medium; +} + +// Empty State +.user-empty-state { + text-align: center; + padding: $spacing-5xl $spacing-lg; + color: $text-gray; + + .empty-icon { + font-size: 80px; + margin-bottom: $spacing-lg; + opacity: 0.5; + } + + h3 { + font-size: $font-size-xl; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-md; + } + + p { + font-size: $font-size-base; + color: $text-gray; + } +} + +// ----------------------------------------------------------------------------- +// User Detail Page +// ----------------------------------------------------------------------------- + +.user-detail-container { + max-width: 900px; + margin: 0 auto; + padding: $spacing-2xl; + + @media (max-width: $breakpoint-sm) { + padding: $spacing-lg $spacing-md; + } +} + +// Profile Card +.user-profile-card { + color: $white; + margin-bottom: $spacing-xl; + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: -50%; + right: -20%; + width: 400px; + height: 400px; + background: rgba($white, 0.05); + border-radius: $border-radius-circle; + } + + .detail-grid { + border: none; + } +} + +.user-profile-header { + display: flex; + align-items: center; + gap: $spacing-xl; + position: relative; + z-index: 1; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + text-align: center; + } +} + +.user-profile-avatar { + flex-shrink: 0; +} + +.avatar-circle-large { + width: 100px; + height: 100px; + border-radius: $border-radius-circle; + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-3xl; + font-weight: $font-weight-bold; + background: rgba($white, 0.2); + color: $white; + border: 4px solid rgba($white, 0.3); + box-shadow: $shadow-lg; +} + +.user-profile-info { + flex: 1; + + h2 { + font-size: $font-size-2xl; + font-weight: $font-weight-bold; + margin-bottom: $spacing-sm; + } + + .user-profile-email { + font-size: $font-size-base; + opacity: 0.9; + margin-bottom: $spacing-md; + } +} + +.user-profile-badges { + display: flex; + gap: $spacing-sm; + flex-wrap: wrap; + + @media (max-width: $breakpoint-sm) { + justify-content: center; + } + + .user-status-badge, + .user-role-badge { + background: rgba($white, 0.2); + color: $white; + backdrop-filter: blur(10px); + border: 1px solid rgba($white, 0.3); + } +} + +// Detail Section (Reuse from API Key Detail) +.detail-section { + background: $white; + border-radius: $border-radius-lg; + padding: $spacing-xl; + box-shadow: $shadow-sm; + margin-bottom: $spacing-lg; + + h2 { + font-size: $font-size-lg; + font-weight: $font-weight-semibold; + color: $text-dark; + margin-bottom: $spacing-lg; + padding-bottom: $spacing-sm; + border-bottom: 2px solid $light-bg; + } +} + +.detail-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + grid-template-columns: 1fr; + } +} + +.detail-item { + display: flex; + flex-direction: column; + gap: $spacing-xs; + + &.full-width { + grid-column: 1 / -1; + } +} + +.detail-label { + font-size: $font-size-sm; + font-weight: $font-weight-semibold; + color: $text-gray; + display: flex; + align-items: center; + gap: $spacing-xs; + + i { + color: $primary-blue; + font-size: $font-size-sm; + } +} + +.detail-value { + font-size: $font-size-base; + color: $text-dark; + padding: $spacing-sm 0; +} + +.status-indicator { + display: inline-flex; + align-items: center; + gap: $spacing-xs; + padding: 6px 12px; + border-radius: $border-radius-sm; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + + &.status-active { + background-color: rgba($accent-green, 0.1); + color: darken($accent-green, 10%); + + .status-dot { + background-color: $accent-green; + } + } + + &.status-inactive { + background-color: rgba($text-gray, 0.1); + color: $text-gray; + + .status-dot { + background-color: $text-gray; + } + } +} + +.status-dot { + width: 8px; + height: 8px; + border-radius: $border-radius-circle; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +// Detail Actions +.detail-actions { + display: flex; + gap: $spacing-md; + justify-content: center; + padding-top: $spacing-lg; + + @media (max-width: $breakpoint-sm) { + flex-direction: column; + } +} + +// ----------------------------------------------------------------------------- +// Inquiry Status Badge - Figma Design (node 998-2056, 998-2006) +// ----------------------------------------------------------------------------- +.inquiry-status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + height: 30px; + padding: 0 14px; + border-radius: 50px; + font-size: 15px; + font-weight: $font-weight-bold; + color: $white; + white-space: nowrap; + + // 답변완료 - 파란색 배경 + &--completed { + background-color: #0049b4; + } + + // 답변대기 - 회색 배경 + &--pending { + background-color: #8c959f; + } +} + +// Inquiry Actions +.inquiry-actions { + display: flex; + justify-content: center; + margin-top: $spacing-2xl; +} diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U10.html b/src/main/resources/templates/views/apps/apis/KAPAP004U10.html index 98b54bc..b671516 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U10.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U10.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U3.html b/src/main/resources/templates/views/apps/apis/KAPAP004U3.html index 563e28c..da23afb 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U3.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U3.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U4.html b/src/main/resources/templates/views/apps/apis/KAPAP004U4.html index 46b770f..f330ed0 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U4.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U4.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U5.html b/src/main/resources/templates/views/apps/apis/KAPAP004U5.html index c901331..0f78102 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U5.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U5.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U6.html b/src/main/resources/templates/views/apps/apis/KAPAP004U6.html index 87f30b6..08c85ec 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U6.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U6.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U7.html b/src/main/resources/templates/views/apps/apis/KAPAP004U7.html index 9009707..c2f89f7 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U7.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U7.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U8.html b/src/main/resources/templates/views/apps/apis/KAPAP004U8.html index 44e63c2..c415b0a 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U8.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U8.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/KAPAP004U9.html b/src/main/resources/templates/views/apps/apis/KAPAP004U9.html index 0ae0c80..1237b14 100644 --- a/src/main/resources/templates/views/apps/apis/KAPAP004U9.html +++ b/src/main/resources/templates/views/apps/apis/KAPAP004U9.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}"> diff --git a/src/main/resources/templates/views/apps/apis/mainApiCommon.html b/src/main/resources/templates/views/apps/apis/mainApiCommon.html index 62076eb..f9085a0 100644 --- a/src/main/resources/templates/views/apps/apis/mainApiCommon.html +++ b/src/main/resources/templates/views/apps/apis/mainApiCommon.html @@ -1,6 +1,6 @@ diff --git a/src/main/resources/templates/views/apps/apis/mainApiDetail.html b/src/main/resources/templates/views/apps/apis/mainApiDetail.html index 67a069f..4ebaeba 100644 --- a/src/main/resources/templates/views/apps/apis/mainApiDetail.html +++ b/src/main/resources/templates/views/apps/apis/mainApiDetail.html @@ -2,39 +2,53 @@ + layout:decorate="~{layout/kjbank_title_layout}"> + +

+

API 마켓

+
+
+ +
+
+
+
+

+ 우리곁의 수많은 서비스들이 + 광주은행 오픈 API와 함께하고 있습니다. +

+
+
+
+

서비스 이용 수

+
+ + + + + + + + + +
+

9,999

+
+ +
+ +
+

API 이용 건수

+
+ + + + + + + + + +
+

9,999

+
+ +
+ +
+

API 활용 기업

+
+ + + + + + + + + +
+

9,999

+
+
+
+
+ + + +
+ + + diff --git a/src/main/resources/templates/views/apps/main/userAgreement.html b/src/main/resources/templates/views/apps/main/userAgreement.html index f8f3236..dbd2877 100644 --- a/src/main/resources/templates/views/apps/main/userAgreement.html +++ b/src/main/resources/templates/views/apps/main/userAgreement.html @@ -1,6 +1,6 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_base_layout}">
diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyDetail.html b/src/main/resources/templates/views/apps/mypage/apiKeyDetail.html deleted file mode 100644 index 3bedb85..0000000 --- a/src/main/resources/templates/views/apps/mypage/apiKeyDetail.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - API 키 상세 - - -
-
-
-

인증키 정보

-
- -
- -
- -
-

- 인증키 이름 -

-
-
- -
-
-
-
-

- Client Id -

-
-
- -
-
-
- -
-

- Client Secret -

-
-
-
-

- client_key -

-
-
-
-
- -
-

-
-
-
- -
-
-
-
- -
-

- 변경일 -

-
-
- -
-
-
- -
-

- 인증키 상태 -

-
-
- -
-
-
- -
- -
-

API 정보

-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
No서비스API명비고
14공통회원여부조회 -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
No서비스API명비고
14공통회원여부조회 -
-
-
- - -
-

운영 전환 신청 내역

-
-
-
- - - - - - - - - - - - - - - - - - - - -
상태일시상세내용
요청2024.06.01 - 12:12:12 - 운영 전환 요청
-
- -
- - - - - - - - - - - - - - - - - - - - -
상태일시상세내용
요청2024.06.01 - 12:12:12 - 운영 전환 요청
-
-
-
- - -
-
- 목록 -
- -
-
-
- -
- - - - -
- - - - - - diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyList.html b/src/main/resources/templates/views/apps/mypage/apiKeyList.html index aae847c..de274c1 100644 --- a/src/main/resources/templates/views/apps/mypage/apiKeyList.html +++ b/src/main/resources/templates/views/apps/mypage/apiKeyList.html @@ -1,92 +1,156 @@ + xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/kjbank_title_layout}"> -
-
-
-

인증키 목록

-
-
-
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No이름인증키인증키상태사용 API 수마지막수정일
1 - 수신 - - - 활성화1
-
-
-
- -
- -
- -
-
-
-
-
+
+
+ +

앱관리

-
- - -
- - diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep1.html b/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep1.html new file mode 100644 index 0000000..101d914 --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep1.html @@ -0,0 +1,477 @@ + + + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

앱 수정

+ 서비스 중인 앱 정보를 수정합니다. +
+ + +
+
+ +
+
+
+ 앱 정보수정 +
+
+
앱 정보수정
+
+ + +
+ +
+ + +
+
+
+ API 선택 +
+
+
API 선택
+
+ + +
+ +
+ + +
+
+
+ 완료 +
+
+
완료
+
+
+
+ + +
+ + + + + + +
+ + +
+
+ + + + + +
+
+ 앱 아이콘 + 필수 +
+
+
+
+
+ + + + + +
+ + Icon Preview + + Icon Preview + + + + +
+
+

앱 아이콘 이미지 파일을 업로드하세요

+

권장사이즈는 128X128픽셀이며 JPG, PNG, GIF파일만 등록할 수 있습니다.

+
+ + +
+
+
+ + +
+
+ 앱 이름 + 필수 +
+
+ +
+
+ + +
+
+ 앱 설명 + 필수 +
+
+ + + 0 / 500 + +
+
+ + +
+
+ Call Back URL +
+
+ +
+
+ + +
+
+ 화이트리스트 +
+
+
+ + +
+ + + + + + +
+
+ +
+
+ + +
+ + 취소 + + +
+ +
+
+ + + + + + + diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep2.html b/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep2.html new file mode 100644 index 0000000..a1b0a0a --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep2.html @@ -0,0 +1,739 @@ + + + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

앱 수정

+ API를 이용하여 서비스할 앱 정보를 수정해주세요. +
+ + +
+
+ +
+
+
+ 앱 정보입력 +
+
+
앱 정보입력
+
+ + +
+ +
+ + +
+
+
+ API 선택 +
+
+
API 선택
+
+ + +
+ +
+ + +
+
+
+ 앱 수정 완료 +
+
+
앱 수정 완료
+
+
+
+ + +
+ + + + + + +
+ + +
+ + + + + + + + +
+ + +
+
+ + + + + +
+ + +
+ + +
+ +
+
+

API 목록을 불러오는 중...

+
+ + + + + + +
+ +
+
+ +
+ + +
+ + +
+ +
+ + + + + +
+ + + + + + diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep3.html b/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep3.html new file mode 100644 index 0000000..f2bcd59 --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/apiKeyModifyStep3.html @@ -0,0 +1,124 @@ + + + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

앱 수정

+ API를 이용하여 서비스할 앱 정보를 수정해주세요. +
+ +
+
+ +
+
+
+ 앱 정보입력 +
+
+
앱 정보입력
+
+ + +
+ +
+ + +
+
+
+ API 선택 +
+
+
API 선택
+
+ + +
+ +
+ + +
+
+
+ 앱 수정 완료 +
+
+
앱 수정 완료
+
+
+
+ + +
+ +
+
+ +
+
+ + +
+

앱 수정 요청이 완료되었습니다.

+

+ 담당자 승인 후 변경 사항이 적용됩니다. [앱 정보]화면에서 수정 내역을 확인할 수 있습니다. +

+
+ + + +
+ + + + +
+
+ + + + + diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyProdDetail.html b/src/main/resources/templates/views/apps/mypage/apiKeyProdDetail.html deleted file mode 100644 index fc38639..0000000 --- a/src/main/resources/templates/views/apps/mypage/apiKeyProdDetail.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - API 키 상세 - - -
-
-
-

인증키 정보

-
- -
- -
- -
-

- 인증키 이름 -

-
-
- - -
-
-
- -
-

- 변경일 -

-
-
- -
-
-
- -
-

- 인증키 상태 -

-
-
- -
-
-
- -
- -
-

API 정보

-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
No서비스API명비고
14공통회원여부조회 -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
No서비스API명비고
14공통회원여부조회 -
-
-
-
- -
-
- 목록 -
- -
-
-
- -
- - - - -
- - - - - - diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyProdList.html b/src/main/resources/templates/views/apps/mypage/apiKeyProdList.html deleted file mode 100644 index 8eabc6b..0000000 --- a/src/main/resources/templates/views/apps/mypage/apiKeyProdList.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - -
-
-
-

인증키 목록

-
-
-
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
No이름인증키상태사용 API 수마지막수정일
1 - 수신 - 활성화1
-
-
-
- -
- -
- -
-
-
-
- -
-
-
-
- - -
- - - - - diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep1.html b/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep1.html new file mode 100644 index 0000000..3c84064 --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep1.html @@ -0,0 +1,513 @@ + + + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

앱 생성

+ API를 이용하여 서비스할 앱 정보를 등록해주세요. +
+ + +
+
+ +
+
+
+ 앱 정보입력 +
+
+
앱 정보입력
+
+ + +
+ +
+ + +
+
+
+ API 선택 +
+
+
API 선택
+
+ + +
+ +
+ + +
+
+
+ 앱 생성 완료 +
+
+
앱 생성 완료
+
+
+
+ + +
+ + + + + + +
+ + +
+
+ + +
+
+ 앱 아이콘 + 필수 +
+
+
+
+
+ + + + + + + + + +
+ + +
+
+

앱 아이콘 이미지 파일을 업로드하세요

+

권장사이즈는 128X128픽셀이며 JPG, PNG, GIF파일만 등록할 수 있습니다.

+
+ + +
+
+
+ + +
+
+ 앱 이름 + 필수 +
+
+ +
+
+ + +
+
+ 앱 설명 + 필수 +
+
+ + + 0 / 500 + +
+
+ + +
+
+ Call Back URL +
+
+ +
+
+ + +
+
+ 화이트리스트 +
+
+
+ + +
+ + + + + + +
+
+ +
+
+ + +
+ +
+ +
+
+ + + + + + diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep2.html b/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep2.html new file mode 100644 index 0000000..eddbc67 --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep2.html @@ -0,0 +1,688 @@ + + + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

앱 생성

+ API를 이용하여 서비스할 앱 정보를 등록해주세요. +
+ + +
+
+ +
+
+
+ 앱 정보입력 +
+
+
앱 정보입력
+
+ + +
+ +
+ + +
+
+
+ API 선택 +
+
+
API 선택
+
+ + +
+ +
+ + +
+
+
+ 앱 생성 완료 +
+
+
앱 생성 완료
+
+
+
+ + +
+ + + + + + + + +
+ + +
+
+ + +
+ + +
+ + +
+ +
+
+

API 목록을 불러오는 중...

+
+ + + + + + +
+ +
+
+ +
+ + +
+ + +
+ +
+ + + + + +
+ + + + + + diff --git a/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep3.html b/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep3.html new file mode 100644 index 0000000..f50ba4c --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/apiKeyRegisterStep3.html @@ -0,0 +1,137 @@ + + + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

앱 생성

+ API를 이용하여 서비스할 앱 정보를 등록해주세요. +
+ +
+
+ +
+
+
+ 앱 정보입력 +
+
+
앱 정보입력
+
+ + +
+ +
+ + +
+
+
+ API 선택 +
+
+
API 선택
+
+ + +
+ +
+ + +
+
+
+ 앱 생성 완료 +
+
+
앱 생성 완료
+
+
+
+ + +
+ +
+
+ +
+
+ + +
+

앱 생성 요청이 완료되었습니다.

+

+ 담당자 앱 승인 후 [앱 정보]화면에서 Client ID와 Client Secret을 확인 할 수 있습니다. +

+
+ + + +
+ + + + +
+
+ + + + + + diff --git a/src/main/resources/templates/views/apps/mypage/apiRequestProdDetail.html b/src/main/resources/templates/views/apps/mypage/apiRequestProdDetail.html deleted file mode 100644 index d3555c5..0000000 --- a/src/main/resources/templates/views/apps/mypage/apiRequestProdDetail.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - API 요청 상세 - - -
-
-
-

운영 인증키 요청 정보

-
- -
-
-
-

- 이름 -

-
-
- -
-
-
-
-

- 유형 -

-
-
- -
-
-
-
-

- 상태 -

-
-
- -
-
-
-
-

- 사유 -

-
-
- -
-
-
-
-

- 요청일시 -

-
-
- -
-
-
-
-
-

API 정보

-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No서비스API명
삭제
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No서비스API명
삭제
-
-
- -
-
- - -
-
-
- 목록 -
-
-
- - -
- - - - diff --git a/src/main/resources/templates/views/apps/mypage/apiRequestProdHistory.html b/src/main/resources/templates/views/apps/mypage/apiRequestProdHistory.html deleted file mode 100644 index 47860d7..0000000 --- a/src/main/resources/templates/views/apps/mypage/apiRequestProdHistory.html +++ /dev/null @@ -1,114 +0,0 @@ - - - -
-
-
-

인증키 신청 목록

-
-
-
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No신청명신청상태신청일처리일자신청사유사용 API 수
110
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No신청명신청상태신청일신청사유사용 API 수
1110
-
-
-
- -
- -
-
-
-
- -
-
-
- - - - - - diff --git a/src/main/resources/templates/views/apps/mypage/appRequestDetail.html b/src/main/resources/templates/views/apps/mypage/appRequestDetail.html new file mode 100644 index 0000000..6f69c53 --- /dev/null +++ b/src/main/resources/templates/views/apps/mypage/appRequestDetail.html @@ -0,0 +1,239 @@ + + + + API 키 신청 상세 + + +
+
+ +

앱관리

+
+
+ +
+ + +
+

API Key 신청 상세

+ 신청하신 API Key의 상세 정보를 확인할 수 있습니다. +
+ + +
+ +
+ 앱 아이콘 +
+ + + + + +
+
+ +
+ + + 대기중 + + +

앱 이름

+ +

+ 여기에 입력한 앱 설명이 표시됩니다. +

+
+
+ + +
+ + +
+ +
+
K00000001
+ +
+
+ + +
+ +
+
+ http://www.abcd.co.kr +
+
+
+ + +
+ +
+
+ 10.0.0.1, 10.0.0.2, 192.168.123.1 +
+
+
+ + +
+ +
+
+
+ 추가된 API 1 + 승인대기 +
+ + +
+

선택된 API가 없습니다.

+
+
+
+
+ + +
+ +
+
+ 2025.11.22 12:00 +
+
+
+ + +
+ +
+
+ 2025.11.22 12:00 +
+
+
+ + +
+ +
+
+ Approval reason +
+
+
+ +
+ + +
+ + + 목록 + +
+ +
+ +
+ + + + + + + diff --git a/src/main/resources/templates/views/apps/mypage/components/commonUserInfo.html b/src/main/resources/templates/views/apps/mypage/components/commonUserInfo.html index 751dcd4..92471d1 100644 --- a/src/main/resources/templates/views/apps/mypage/components/commonUserInfo.html +++ b/src/main/resources/templates/views/apps/mypage/components/commonUserInfo.html @@ -2,133 +2,98 @@ -
-

- 이메일 아이디 -

-
-
- - -
+
+
+ 이메일 아이디 +
+
+ +
-
-

- 성명 -

-
-
- -
+
+
+ 성명 필수 +
+
+
-
-

- 휴대폰 번호 -

-
-
- +
+
+ 휴대폰 번호 필수 +
+
+
- - - - + - - - - - + - - -
-
- 변경
+
-