commit 3632629a76a0a5e89afe0508715436641736f1fe Author: bd091 Date: Sat Oct 18 10:53:16 2025 +0900 최초 세팅 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..132b469 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/SoftwareRequirement/20250423/2025년 03월 재고현황_최종_ver0.3.xlsx b/SoftwareRequirement/20250423/2025년 03월 재고현황_최종_ver0.3.xlsx new file mode 100644 index 0000000..befbc2a Binary files /dev/null and b/SoftwareRequirement/20250423/2025년 03월 재고현황_최종_ver0.3.xlsx differ diff --git a/SoftwareRequirement/20250423/메이드유 뎁스별 가격정리_250418ver0.3.xlsx b/SoftwareRequirement/20250423/메이드유 뎁스별 가격정리_250418ver0.3.xlsx new file mode 100644 index 0000000..da81d75 Binary files /dev/null and b/SoftwareRequirement/20250423/메이드유 뎁스별 가격정리_250418ver0.3.xlsx differ diff --git a/SoftwareRequirement/2025년 03월 재고현황.xlsx b/SoftwareRequirement/2025년 03월 재고현황.xlsx new file mode 100644 index 0000000..6bfa3ed Binary files /dev/null and b/SoftwareRequirement/2025년 03월 재고현황.xlsx differ diff --git a/SoftwareRequirement/2025년 03월 재고현황_최종_ver0.2.xlsx b/SoftwareRequirement/2025년 03월 재고현황_최종_ver0.2.xlsx new file mode 100644 index 0000000..d75fd73 Binary files /dev/null and b/SoftwareRequirement/2025년 03월 재고현황_최종_ver0.2.xlsx differ diff --git a/SoftwareRequirement/MADEU.damx b/SoftwareRequirement/MADEU.damx new file mode 100644 index 0000000..feb052a Binary files /dev/null and b/SoftwareRequirement/MADEU.damx differ diff --git a/SoftwareRequirement/메이드유 뎁스별 가격정리_250418ver0.2.xlsx b/SoftwareRequirement/메이드유 뎁스별 가격정리_250418ver0.2.xlsx new file mode 100644 index 0000000..d0bb1ce Binary files /dev/null and b/SoftwareRequirement/메이드유 뎁스별 가격정리_250418ver0.2.xlsx differ diff --git a/SoftwareRequirement/테이블 명세서.xlsx b/SoftwareRequirement/테이블 명세서.xlsx new file mode 100644 index 0000000..1718202 Binary files /dev/null and b/SoftwareRequirement/테이블 명세서.xlsx differ diff --git a/SoftwareRequirement/홈페이지 리뉴얼 _2025.xlsx b/SoftwareRequirement/홈페이지 리뉴얼 _2025.xlsx new file mode 100644 index 0000000..013f21d Binary files /dev/null and b/SoftwareRequirement/홈페이지 리뉴얼 _2025.xlsx differ diff --git a/SoftwareRequirement/홈페이지_화면설계.pptx b/SoftwareRequirement/홈페이지_화면설계.pptx new file mode 100644 index 0000000..78f0cf6 Binary files /dev/null and b/SoftwareRequirement/홈페이지_화면설계.pptx differ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..243f7c1 --- /dev/null +++ b/build.gradle @@ -0,0 +1,106 @@ +plugins { + id 'java' + id 'war' + id 'org.springframework.boot' version '3.2.1' + id 'io.spring.dependency-management' version '1.1.4' +} + +group = 'com' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '21' +} + +war { + archiveBaseName = 'madeu_diet_home' + archiveVersion = '' + archiveClassifier = '' +} + + + +configurations { + compileOnly { + extendsFrom annotationProcessor + } + all { + // 로그 관련 (logging 모듈에 대한 의존성을 제거) + exclude group: "org.springframework.boot", module : "spring-boot-starter-logging" +// exclude group: 'ch.qos.logback', module: 'logback-classic' +// exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-web' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-webflux' + testImplementation 'io.projectreactor:reactor-test' + + // tomcat + providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' + implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' + + // thymeleaf + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.3.0' + + // lombok + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + //mybatis + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' +// implementation 'com.microsoft.sqlserver:mssql-jdbc:11.2.3.jre17' +// runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc' + //runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' + implementation 'org.mariadb.jdbc:mariadb-java-client:3.3.2' + + // AES + implementation 'com.adobe.xmp:xmpcore:6.1.11' + + // 로그 + implementation 'org.springframework.boot:spring-boot-starter-log4j2' + + // HttpUtil + implementation 'com.google.code.gson:gson:2.10.1' + + // api 통신 + implementation 'org.apache.httpcomponents.client5:httpclient5:5.3' + + //JSON + implementation 'org.json:json:20231013' + implementation 'com.googlecode.json-simple:json-simple:1.1.1' + implementation 'org.apache.commons:commons-lang3:3.14.0' + + // push 관련 + implementation 'com.google.api-client:google-api-client:2.7.0' + + // POI + implementation 'org.apache.poi:poi:5.2.5' + implementation 'org.apache.poi:poi-ooxml:5.2.5' + + // popbill + implementation 'kr.co.linkhub:popbill-spring-boot-starter:1.14.3' + + implementation 'com.squareup.okhttp3:okhttp:5.1.0' +} + +tasks.named('test') { + useJUnitPlatform() +} + +tasks.register('madeu_diet_home') { + group = 'com' + description = 'Task description' + doLast { + // 실행할 코드 + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..6cd8368 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..191c4ee --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..7101f8e --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..57bf15a --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'madeu_diet_home' diff --git a/src/main/java/com/madeuhome/MadeuHomeApplication.java b/src/main/java/com/madeuhome/MadeuHomeApplication.java new file mode 100644 index 0000000..33dae2e --- /dev/null +++ b/src/main/java/com/madeuhome/MadeuHomeApplication.java @@ -0,0 +1,13 @@ +package com.madeuhome; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MadeuHomeApplication { + + public static void main(String[] args) { + SpringApplication.run(MadeuHomeApplication.class, args); + } + +} diff --git a/src/main/java/com/madeuhome/ServletInitializer.java b/src/main/java/com/madeuhome/ServletInitializer.java new file mode 100644 index 0000000..0c34aea --- /dev/null +++ b/src/main/java/com/madeuhome/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.madeuhome; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(MadeuHomeApplication.class); + } + +} diff --git a/src/main/java/com/madeuhome/common/ctrl/MenuController.java b/src/main/java/com/madeuhome/common/ctrl/MenuController.java new file mode 100644 index 0000000..78c2da8 --- /dev/null +++ b/src/main/java/com/madeuhome/common/ctrl/MenuController.java @@ -0,0 +1,35 @@ +package com.madeuhome.common.ctrl; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ModelAttribute; + +import com.madeuhome.common.dto.MenuDto; +import com.madeuhome.common.svc.MenuService; + +import jakarta.servlet.http.HttpServletRequest; + +@ControllerAdvice +public class MenuController { + + @Autowired + private MenuService menuService; + + // 메인 페이지에서 메뉴 데이터를 모델에 추가 + @ModelAttribute("menuList") + public List getMenu(HttpServletRequest request) { + String requestURI = request.getRequestURI(); + + // 특정 URL 패턴에만 메뉴 추가 + if (requestURI.endsWith("Intro.do") || requestURI.startsWith("/index") ) { + return menuService.getMenuHierarchy("MAIN"); + } + + + return new ArrayList<>(); + } + +} diff --git a/src/main/java/com/madeuhome/common/dto/MenuDto.java b/src/main/java/com/madeuhome/common/dto/MenuDto.java new file mode 100644 index 0000000..ccf9fab --- /dev/null +++ b/src/main/java/com/madeuhome/common/dto/MenuDto.java @@ -0,0 +1,47 @@ +package com.madeuhome.common.dto; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MenuDto { + + private Integer menuId; + private String siteCd; + private Integer upperMenuId; + private String menuName; + private String menuUrl; + private Integer menuOrder; + private Integer menuDepth; + private String useYn; + private String regUser; + private LocalDateTime regDate; + private String modUser; + private LocalDateTime modDate; + + // 계층구조를 위한 추가 필드 + @Builder.Default + private List children = new ArrayList<>(); + + // 편의 메서드 추가 + public boolean hasChildren() { + return children != null && !children.isEmpty(); + } + + public boolean isRootMenu() { + return upperMenuId == null || upperMenuId == 0; + } + + public boolean isActive() { + return "Y".equals(useYn); + } +} diff --git a/src/main/java/com/madeuhome/common/mapper/MenuMapper.java b/src/main/java/com/madeuhome/common/mapper/MenuMapper.java new file mode 100644 index 0000000..30a2c30 --- /dev/null +++ b/src/main/java/com/madeuhome/common/mapper/MenuMapper.java @@ -0,0 +1,13 @@ +package com.madeuhome.common.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import com.madeuhome.common.dto.MenuDto; + +@Mapper +public interface MenuMapper { + List selectAllMenus(@Param("siteCode") String siteCode); +} diff --git a/src/main/java/com/madeuhome/common/svc/MenuService.java b/src/main/java/com/madeuhome/common/svc/MenuService.java new file mode 100644 index 0000000..ce7f773 --- /dev/null +++ b/src/main/java/com/madeuhome/common/svc/MenuService.java @@ -0,0 +1,9 @@ +package com.madeuhome.common.svc; + +import java.util.List; + +import com.madeuhome.common.dto.MenuDto; + +public interface MenuService { + public List getMenuHierarchy(String siteCode); +} diff --git a/src/main/java/com/madeuhome/common/svc/impl/MenuServiceImpl.java b/src/main/java/com/madeuhome/common/svc/impl/MenuServiceImpl.java new file mode 100644 index 0000000..d02398f --- /dev/null +++ b/src/main/java/com/madeuhome/common/svc/impl/MenuServiceImpl.java @@ -0,0 +1,64 @@ +package com.madeuhome.common.svc.impl; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.madeuhome.common.dto.MenuDto; +import com.madeuhome.common.mapper.MenuMapper; +import com.madeuhome.common.svc.MenuService; + +@Service +public class MenuServiceImpl implements MenuService { + + @Autowired + private MenuMapper menuMapper; + + public List getMenuHierarchy(String siteCode) { + // DB에서 모든 메뉴 조회 + List allMenus = menuMapper.selectAllMenus(siteCode); + + // 계층구조로 변환 + return buildMenuTree(allMenus); + } + + private List buildMenuTree(List allMenus) { + Map menuMap = new HashMap<>(); + List rootMenus = new ArrayList<>(); + + // 1단계: 모든 메뉴를 맵에 저장하고 children 리스트 초기화 + for (MenuDto menu : allMenus) { + menu.setChildren(new ArrayList<>()); + menuMap.put(menu.getMenuId(), menu); + } + + // 2단계: 부모-자식 관계 설정 + for (MenuDto menu : allMenus) { + if (menu.getUpperMenuId() == null || menu.getUpperMenuId() == 0) { + // 최상위 메뉴 + rootMenus.add(menu); + } else { + // 하위 메뉴 + MenuDto parent = menuMap.get(menu.getUpperMenuId()); + if (parent != null) { + parent.getChildren().add(menu); + } + } + } + + // 메뉴 순서대로 정렬 + rootMenus.sort(Comparator.comparing(MenuDto::getMenuOrder)); + rootMenus.forEach(menu -> { + if (menu.getChildren() != null) { + menu.getChildren().sort(Comparator.comparing(MenuDto::getMenuOrder)); + } + }); + + return rootMenus; + } +} diff --git a/src/main/java/com/madeuhome/config/DatabaseConfig.java b/src/main/java/com/madeuhome/config/DatabaseConfig.java new file mode 100644 index 0000000..6463850 --- /dev/null +++ b/src/main/java/com/madeuhome/config/DatabaseConfig.java @@ -0,0 +1,47 @@ +package com.madeuhome.config; + +import com.zaxxer.hikari.HikariDataSource; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; + +@Configuration +public class DatabaseConfig { + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.hikari") + public DataSource dataSource(){ + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource, ApplicationContext applicationContext) throws Exception{ + + SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); + factoryBean.setDataSource(dataSource); + factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**/*.xml")); + + return factoryBean.getObject(); + } + + @Bean + public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory){ + return new SqlSessionTemplate(sqlSessionFactory); + } + + @Bean + public DataSourceTransactionManager transactionManager(DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + +} diff --git a/src/main/java/com/madeuhome/config/SchedulerConfig.java b/src/main/java/com/madeuhome/config/SchedulerConfig.java new file mode 100644 index 0000000..1339956 --- /dev/null +++ b/src/main/java/com/madeuhome/config/SchedulerConfig.java @@ -0,0 +1,22 @@ +package com.madeuhome.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +@Configuration +public class SchedulerConfig implements SchedulingConfigurer { + private final int POOL_SIZE = 10; + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + + threadPoolTaskScheduler.setPoolSize(POOL_SIZE); + threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-"); + threadPoolTaskScheduler.initialize(); + + scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); + } +} \ No newline at end of file diff --git a/src/main/java/com/madeuhome/config/ThymeleafLayoutConfig.java b/src/main/java/com/madeuhome/config/ThymeleafLayoutConfig.java new file mode 100644 index 0000000..12f129f --- /dev/null +++ b/src/main/java/com/madeuhome/config/ThymeleafLayoutConfig.java @@ -0,0 +1,14 @@ +package com.madeuhome.config; + +import nz.net.ultraq.thymeleaf.layoutdialect.LayoutDialect; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ThymeleafLayoutConfig { + + @Bean + public LayoutDialect layoutDialect() { + return new LayoutDialect(); + } +} diff --git a/src/main/java/com/madeuhome/constants/Constants.java b/src/main/java/com/madeuhome/constants/Constants.java new file mode 100644 index 0000000..6eba6bb --- /dev/null +++ b/src/main/java/com/madeuhome/constants/Constants.java @@ -0,0 +1,42 @@ +package com.madeuhome.constants; + +public interface Constants { + + static final public String OK = "0"; + static final public String OK_ONE = "1"; + static final public String FAIL = "-1"; + static final public String FAIL_ACCOUNT_NULL = "-2"; + + + + //배송관련 + static final public String SEARCH_OK = "20000"; //완료 + static final public String SEARCH_NONE = "20001"; //검색 결과 없음 + + + static final public String SEARCH_COMPANY_CODE = "30000"; //회사 코드 값 + static final public String SEARCH_COMPANY = "30001"; //회사 + static final public String SEARCH_COMPANY_IP = "30002"; //회사 IP 허용이 아님 + + static final public String SEARCH_COUNT_MAX = "40000"; //최대 검색 수량 + static final public String SEARCH_DATA = "40001"; //필수 데이터 누락 + static final public String SEARCH_DATA_MAX = "40002"; //데이터 자리수 초과 + static final public String INSERT_MAX = "40003"; //최대 등록 건수 초과 + static final public String INSERT_SAME = "40004"; //중복 데이터 + + static final public String PARAM_DATA = "40005"; //파라미터 데이터 누락 + + // EBS API 관련 + static final public String API_KEY_NONE = "401"; // API KEY 정보가 없습니다. + static final public String API_KEY_UNEQUAL = "402"; // API KEY 정보가 일치하지 않습니다. + static final public String EBS_ID_NONE = "403"; // 초등온 회원의 암호화키 정보가 없습니다. + static final public String SEARCH_MONTH_NONE = "404"; // 검색 월 정보가 없습니다. + static final public String CONTENT_TYPE_NONE = "405"; // 과목 정보가 없습니다. + static final public String USER_TYPE_NONE = "406"; // 사용자 타입 정보가 없습니다. + static final public String START_DATE_NONE = "407"; // 서비스 시작일 정보가 없습니다. + static final public String END_DATE_NONE = "408"; // 서비스 종료일 정보가 없습니다. + static final public String USER_SAME = "409"; // 이미 등록되어 있는 사용자입니다. + static final public String EBS_ID_UNEQUAL = "410"; // 사용자 정보가 없습니다. +} + + diff --git a/src/main/java/com/madeuhome/controller/web/webaccept/WebAcceptController.java b/src/main/java/com/madeuhome/controller/web/webaccept/WebAcceptController.java new file mode 100644 index 0000000..cde2fe1 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webaccept/WebAcceptController.java @@ -0,0 +1,49 @@ +package com.madeuhome.controller.web.webaccept; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.madeuhome.init.ManagerDraftAction; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Controller +public class WebAcceptController extends ManagerDraftAction{ + + /** + * 개인정보처리방침 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webaccept/acceptPrivacy.do") + public String selectWebAcceptPrivacy(HttpSession session,HttpServletRequest request) { + + log.debug("WebAcceptController selectWebAcceptPrivacy START"); + + log.debug("WebAcceptController selectWebAcceptPrivacy END"); + return "/web/accept/acceptPrivacy"; + } + + /** + * 사이트 이용약관 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webaccept/acceptSite.do") + public String selectWebAcceptSite(HttpSession session,HttpServletRequest request) { + + log.debug("WebAcceptController selectWebAcceptSite START"); + + log.debug("WebAcceptController selectWebAcceptSite END"); + return "/web/accept/acceptSite"; + } + +} diff --git a/src/main/java/com/madeuhome/controller/web/webdiet/WebDietController.java b/src/main/java/com/madeuhome/controller/web/webdiet/WebDietController.java new file mode 100644 index 0000000..b924e7f --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webdiet/WebDietController.java @@ -0,0 +1,62 @@ +package com.madeuhome.controller.web.webdiet; + +import com.madeuhome.init.ManagerDraftAction; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Slf4j +@Controller +public class WebDietController extends ManagerDraftAction{ + + /** + * 다이어트 주사 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webdiet/selectDietInjectionIntro.do") + public String selectDietInjectionIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebDietController selectDietInjectionIntro START"); + + log.debug("WebDietController selectDietInjectionIntro END"); + return "/web/service/serviceInfo"; + } + + /** + * 다이어트 레이저 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webdiet/selectDietLaserIntro.do") + public String selectDietLaserIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebDietController selectDietLaserIntro START"); + + log.debug("WebDietController selectDietLaserIntro END"); + return "/web/diet/dietLaserSelect"; + } + + /** + * 다이어트 수액 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webdiet/selectDietSapIntro.do") + public String selectDietSapIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebDietController selectDietSapIntro START"); + + log.debug("WebDietController selectDietSapIntro END"); + return "/web/diet/dietSapSelect"; + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java b/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java new file mode 100644 index 0000000..4518ea3 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java @@ -0,0 +1,495 @@ +package com.madeuhome.controller.web.webevent; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webevent.WebEventService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; + + +@Slf4j +@Controller +public class WebEventController extends ManagerDraftAction{ + + @Autowired + private WebEventService webEventService; + + @Autowired + private LogHistoryService logHistoryService; + + /** + * 이벤트 리스트 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectListWebEventIntro.do") + public String selectListWebEventIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebEventController selectListWebEventIntro START"); + + log.debug("WebEventController selectListWebEventIntro END"); + return "/web/webevent/webEventSelectList"; + } + + /** + * 이벤트 카테고리 목록 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectListWebEvent.do") + public ModelAndView selectListWebEvent(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebEventController selectListWebEvent START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webEventService.selectListWebEvent(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webevent/selectListWebEvent.do"); + insertMap.put("func", "selectListCategory"); + insertMap.put("funcName", "이벤트 리스트 조회"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "이벤트"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebEventController selectListWebEvent END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 이벤트 별 항목 목록 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectListEvent.do") + public ModelAndView selectListEvent(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebEventController selectListEvent START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webEventService.selectListEvent(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webevent/selectListEvent.do"); + insertMap.put("func", "selectListEvent"); + insertMap.put("funcName", "이벤트 리스트 조회"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "이벤트"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebEventController selectListEvent END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 이벤트 안내 상세로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectEventDetailIntro.do") + public String selectEventDetailIntro(HttpSession session, HttpServletRequest request, Model model) { + + log.debug("WebEventController selectEventDetailIntro START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); + model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); + model.addAttribute("POST_NO", paramMap.get("POST_NO")); + log.debug("WebEventController selectEventDetailIntro END"); + + return "/web/webevent/webEventSelect"; + } + + /** + * 이벤트 안내 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectEventDetail.do") + public ModelAndView selectEventDetail(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebEventController selectEventDetail START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webEventService.selectEventDetail(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webevent/selectEventDetail.do"); + insertMap.put("func", "selectEventDetail"); + insertMap.put("funcName", "이벤트 상세 조회"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "이벤트 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebEventController selectEventDetail END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + @RequestMapping(value="/webevent/selectMakeReservation.do") + public String selectMakeReservation(HttpSession session, HttpServletRequest request, Model model) { + + log.debug("WebServiceController selectMakeReservation START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); + model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); + model.addAttribute("POST_NO", paramMap.get("POST_NO")); + model.addAttribute("PROCEDURE_ID", paramMap.get("PROCEDURE_ID")); + + log.debug("WebServiceController selectMakeReservation END"); + + return "/web/webevent/makeReservation"; + } + + /** + * 시술 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectReservation.do") + public ModelAndView selectReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController selectReservation START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webEventService.selectReservation(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webevent/selectReservation.do"); + insertMap.put("func", "selectListService"); + insertMap.put("funcName", "예약 조회"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "예약 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController selectReservation END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 시술 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/selectReservationCnt.do") + public ModelAndView selectReservationCnt(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController selectReservationCnt START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webEventService.selectReservationCnt(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webevent/selectReservationCnt.do"); + insertMap.put("func", "selectReservationCnt"); + insertMap.put("funcName", "예약 조회"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "예약 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController selectReservationCnt END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 예약 저장 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webevent/insertReservation.do") + public ModelAndView insertReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController insertReservation START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webEventService.insertReservation(paramMap); + log.debug(map + "TEST"); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webevent/insertReservation.do"); + insertMap.put("func", "selectReservationCnt"); + insertMap.put("funcName", "예약 저장"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "예약 저장"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController insertReservation END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webhome/WebHomeController.java b/src/main/java/com/madeuhome/controller/web/webhome/WebHomeController.java new file mode 100644 index 0000000..02afc1f --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webhome/WebHomeController.java @@ -0,0 +1,39 @@ +package com.madeuhome.controller.web.webhome; + +import com.madeuhome.init.ManagerDraftAction; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Slf4j +@Controller +public class WebHomeController extends ManagerDraftAction{ + + /** + * 홈 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/") + public String homeIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebHomeController homeIntro START"); + + log.debug("WebHomeController homeIntro END"); + return "/intro"; + } + + @RequestMapping(value="/index") + public String homeIndex(HttpSession session,HttpServletRequest request) { + + log.debug("WebHomeController homeIndex START"); + + log.debug("WebHomeController homeIndex END"); + return "/index"; + } +} \ No newline at end of file diff --git a/src/main/java/com/madeuhome/controller/web/webinstagram/WebInstagramController.java b/src/main/java/com/madeuhome/controller/web/webinstagram/WebInstagramController.java new file mode 100644 index 0000000..9d4b939 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webinstagram/WebInstagramController.java @@ -0,0 +1,95 @@ +package com.madeuhome.controller.web.webinstagram; + +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webinstagram.WebInstagramService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Controller +public class WebInstagramController extends ManagerDraftAction{ + @Autowired + private WebInstagramService webInstagramService; + + @Autowired + private LogHistoryService logHistoryService; + + /** + * 인스타 정보 리스트 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webinstagram/selectListWebInstagram.do") + public ModelAndView selectListWebInstagram(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebInstagramController selectListWebInstagram START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + try{ + map = webInstagramService.selectListWebInstagram(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webyoutube/selectListWebInstagram.do"); + insertMap.put("func", "selectListWebInstagram"); + insertMap.put("funcName", "인스타그램 리스트 조회"); + insertMap.put("service", "webInstagramService"); + insertMap.put("serviceName", "인스타그램"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", ""); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + + logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebInstagramController selectListWebInstagram END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webintroduction/WebIntroductionController.java b/src/main/java/com/madeuhome/controller/web/webintroduction/WebIntroductionController.java new file mode 100644 index 0000000..c35cb72 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webintroduction/WebIntroductionController.java @@ -0,0 +1,88 @@ +package com.madeuhome.controller.web.webintroduction; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webmainbanner.WebMainBannerService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; + + +@Slf4j +@Controller +public class WebIntroductionController extends ManagerDraftAction{ + + /** + * 병원 소개 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webintroduction/selectIntroductionHospitalIntro.do") + public String selectIntroductionHospitalIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebIntroductionController selectIntroductionHospitalIntro START"); + + log.debug("WebIntroductionController selectIntroductionHospitalIntro END"); + return "/web/introduction/introductionHospitalSelect"; + } + + /** + * 의료진 소개 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webintroduction/selectIntroductionStaffIntro.do") + public String selectIntroductionStaffIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebIntroductionController selectIntroductionStaffIntro START"); + + log.debug("WebIntroductionController selectIntroductionStaffIntro END"); + return "/web/introduction/introductionStaffSelect"; + } + + /** + * 비급여 안내 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webintroduction/selectIntroductionPriceIntro.do") + public String selectIntroductionPriceIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebIntroductionController selectIntroductionPriceIntro START"); + + log.debug("WebIntroductionController selectIntroductionPriceIntro END"); + return "/web/introduction/introductionPriceSelect"; + } + + /** + * 찾아오시는길 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webintroduction/selectIntroductionWayIntro.do") + public String selectIntroductionWayIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebIntroductionController selectIntroductionWayIntro START"); + + log.debug("WebIntroductionController selectIntroductionWayIntro END"); + return "/web/introduction/introductionWaySelect"; + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webmainbanner/WebMainBannerController.java b/src/main/java/com/madeuhome/controller/web/webmainbanner/WebMainBannerController.java new file mode 100644 index 0000000..a226bfe --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webmainbanner/WebMainBannerController.java @@ -0,0 +1,160 @@ +package com.madeuhome.controller.web.webmainbanner; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webmainbanner.WebMainBannerService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; + + +@Slf4j +@Controller +public class WebMainBannerController extends ManagerDraftAction{ + + @Autowired + private WebMainBannerService webPopupService; + + @Autowired + private LogHistoryService logHistoryService; + + /** + * 메인 배너 정보 리스트 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webmainbanner/selectListWebMainBanner.do") + public ModelAndView selectListWebMainBanner(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebMainBannerController selectListWebMainBanner START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPopupService.selectListWebMainBanner(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webmainbanner/selectListWebMainBanner.do"); + insertMap.put("func", "selectListWebMainBanner"); + insertMap.put("funcName", "메인 배너 리스트 조회"); + insertMap.put("service", "webPopupService"); + insertMap.put("serviceName", "메인 배너"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + + logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebMainBannerController selectListWebMainBanner END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 메인 배너 정보 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webmainbanner/selectWebMainBanner.do") + public ModelAndView selectWebMainBanner(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebMainBannerController selectWebMainBanner START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPopupService.selectWebMainBanner(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webmainbanner/selectWebMainBanner.do"); + insertMap.put("func", "selectWebMainBanner"); + insertMap.put("funcName", "메인 배너 상세 조회"); + insertMap.put("service", "webPopupService"); + insertMap.put("serviceName", "메인 배너"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + + logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebMainBannerController selectWebMainBanner END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + +} diff --git a/src/main/java/com/madeuhome/controller/web/webpetit/WebPetitController.java b/src/main/java/com/madeuhome/controller/web/webpetit/WebPetitController.java new file mode 100644 index 0000000..b388f24 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webpetit/WebPetitController.java @@ -0,0 +1,65 @@ +package com.madeuhome.controller.web.webpetit; + +import com.madeuhome.init.ManagerDraftAction; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Slf4j +@Controller +public class WebPetitController extends ManagerDraftAction{ + + /** + * 레이저 리프팅 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webpetit/selectPetitLaserIntro.do") + public String selectPetitLaserIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebPetitController selectPetitLaserIntro START"); + + log.debug("WebPetitController selectPetitLaserIntro END"); + return "/web/petit/petitLaserSelect"; + } + + /** + * 콜라겐 필러 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webpetit/selectPetitFillerIntro.do") + public String selectPetitFillerIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebPetitController selectPetitFillerIntro START"); + + log.debug("WebPetitController selectPetitFillerIntro END"); + return "/web/petit/petitFillerSelect"; + } + + /** + * 안티에이징 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webpetit/selectPetitAntiagingIntro.do") + public String selectPetitAntiagingIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebPetitController selectPetitAntiagingIntro START"); + + log.debug("WebPetitController selectPetitAntiagingIntro END"); + return "/web/petit/petitAntiagingSelect"; + } + + + +} diff --git a/src/main/java/com/madeuhome/controller/web/webphoto/WebPhotoController.java b/src/main/java/com/madeuhome/controller/web/webphoto/WebPhotoController.java new file mode 100644 index 0000000..0b14432 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webphoto/WebPhotoController.java @@ -0,0 +1,275 @@ +package com.madeuhome.controller.web.webphoto; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webphoto.WebPhotoService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; + + +@Slf4j +@Controller +public class WebPhotoController extends ManagerDraftAction{ + + @Autowired + private WebPhotoService webPhotoService; + + @Autowired + private LogHistoryService logHistoryService; + + /** + * 전후사진 리스트 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webphoto/selectListWebPhotoIntro.do") + public String selectListWebPhotoIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebPhotoController selectListWebPhotoIntro START"); + + log.debug("WebPhotoController selectListWebPhotoIntro END"); + return "/web/webphoto/webPhotoSelectList"; + } + + /** + * 전후사진 카테고리 목록 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webphoto/selectListWebPhoto.do") + public ModelAndView selectListWebPhoto(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebPhotoController selectListWebPhoto START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPhotoService.selectListWebPhoto(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webphoto/selectListWebPhoto.do"); + insertMap.put("func", "selectListCategory"); + insertMap.put("funcName", "전후사진 리스트 조회"); + insertMap.put("service", "webPhotoService"); + insertMap.put("serviceName", "전후사진"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebPhotoController selectListWebPhoto END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 전후사진 별 항목 목록 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webphoto/selectListPhoto.do") + public ModelAndView selectListPhoto(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebPhotoController selectListPhoto START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPhotoService.selectListPhoto(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webservice/selectListPhoto.do"); + insertMap.put("func", "selectListPhoto"); + insertMap.put("funcName", "전후사진 리스트 조회"); + insertMap.put("service", "webPhotoService"); + insertMap.put("serviceName", "전후사진"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebPhotoController selectListPhoto END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 전후사진 안내 상세로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webphoto/selectPhotoDetailIntro.do") + public String selectPhotoDetailIntro(HttpSession session, HttpServletRequest request, Model model) { + + log.debug("WebPhotoController selectPhotoDetailIntro START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); + model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); + model.addAttribute("POST_NO", paramMap.get("POST_NO")); + log.debug("WebPhotoController selectPhotoDetailIntro END"); + + return "/web/webphoto/webPhotoSelect"; + } + + /** + * 전후사진 안내 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webphoto/selectPhotoDetail.do") + public ModelAndView selectPhotoDetail(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebPhotoController selectPhotoDetail START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPhotoService.selectPhotoDetail(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webphoto/selectPhotoDetail.do"); + insertMap.put("func", "selectPhotoDetail"); + insertMap.put("funcName", "전후사진 상세 조회"); + insertMap.put("service", "webPhotoService"); + insertMap.put("serviceName", "전후사진 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebPhotoController selectPhotoDetail END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webpopup/WebPopupController.java b/src/main/java/com/madeuhome/controller/web/webpopup/WebPopupController.java new file mode 100644 index 0000000..1c17a77 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webpopup/WebPopupController.java @@ -0,0 +1,160 @@ +package com.madeuhome.controller.web.webpopup; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webpopup.WebPopupService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; + + +@Slf4j +@Controller +public class WebPopupController extends ManagerDraftAction{ + + @Autowired + private WebPopupService webPopupService; + + @Autowired + private LogHistoryService logHistoryService; + + /** + * 이벤트 정보 리스트 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webpopup/selectListWebPopup.do") + public ModelAndView selectListWebPopup(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebPopupController selectListWebPopup START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPopupService.selectListWebPopup(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webpopup/selectListWebPopup.do"); + insertMap.put("func", "selectListWebPopup"); + insertMap.put("funcName", "팝업 리스트 조회"); + insertMap.put("service", "webPopupService"); + insertMap.put("serviceName", "팝업"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + + logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebPopupController selectListWebPopup END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 이벤트 정보 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webpopup/selectWebPopup.do") + public ModelAndView selectWebPopup(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebPopupController selectWebPopup START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webPopupService.selectWebPopup(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webpopup/selectWebPopup.do"); + insertMap.put("func", "selectWebPopup"); + insertMap.put("funcName", "팝업 상세 조회"); + insertMap.put("service", "webPopupService"); + insertMap.put("serviceName", "팝업"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + + logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebPopupController selectWebPopup END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + +} diff --git a/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java b/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java new file mode 100644 index 0000000..9db6d82 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java @@ -0,0 +1,458 @@ +package com.madeuhome.controller.web.webservice; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PostMapping; +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.servlet.ModelAndView; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.web.webservice.WebServiceService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Controller +public class WebServiceController extends ManagerDraftAction{ + @Autowired + private WebServiceService webServiceService; + + /** + * 시술관리 목록으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/selectServiceIntro.do") + public String selectListServiceIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebServiceController selectListServiceIntro START"); + + log.debug("WebServiceController selectListServiceIntro END"); + + return "/web/service/serviceInfo"; + } + + /** + * 시술관리 카테고리 목록 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/selectListCategory.do") + public ModelAndView selectListCategory(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController selectListCategory START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webServiceService.selectListWebCategory(paramMap); + log.debug(map + ""); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webservice/selectListCategory.do"); + insertMap.put("func", "selectListCategory"); + insertMap.put("funcName", "카테고리 리스트 조회"); + insertMap.put("service", "webEventService"); + insertMap.put("serviceName", "카테고리"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController selectListCategory END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 카테고리 별 시술 목록 조회 + * + * @param request + * @param response + * @return + */ + @PostMapping(value="/webservice/selectListService.do") + @ResponseBody + public ResponseEntity> selectListService(@RequestParam("categoryNo") String categoryNo) { + + Map response = new HashMap<>(); + + try { + HashMap paramMap = new HashMap<>(); + paramMap.put("categoryNo", categoryNo); + + Map result = webServiceService.selectListWebService(paramMap); + return ResponseEntity.ok(result); + + } catch (Exception e) { + log.error("서비스 조회 실패", e); + response.put("msgCode", Constants.FAIL); + response.put("msgDesc", e.getMessage()); + response.put("rows", new ArrayList<>()); + return ResponseEntity.ok(response); + } + } + + /** + * 시술관리 상세로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/selectServiceDetailIntro.do") + public String selectServiceDetailIntro(HttpSession session, HttpServletRequest request, Model model) { + + log.debug("WebServiceController selectServiceDetailIntro START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + model.addAttribute("CATEGORY_DIV_CD", paramMap.get("categoryDivCd")); + model.addAttribute("CATEGORY_NO", paramMap.get("categoryNo")); + model.addAttribute("POST_NO", paramMap.get("postNo")); + log.debug("WebServiceController selectServiceDetailIntro END"); + + return "/web/service/webServiceDetail"; + } + + /** + * 시술 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/selectServiceDetail.do") + public ModelAndView selectServiceDetail(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController selectServiceDetail START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webServiceService.selectServiceDetail(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webservice/selectListService.do"); + insertMap.put("func", "selectListService"); + insertMap.put("funcName", "시술 상세 조회"); + insertMap.put("service", "webServiceService"); + insertMap.put("serviceName", "시술 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController selectServiceDetail END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + @RequestMapping(value="/webservice/selectMakeReservation.do") + public String selectMakeReservation(HttpSession session, HttpServletRequest request, Model model) { + + log.debug("WebServiceController selectMakeReservation START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); + model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); + model.addAttribute("POST_NO", paramMap.get("POST_NO")); + model.addAttribute("PROCEDURE_ID", paramMap.get("PROCEDURE_ID")); + + log.debug("WebServiceController selectMakeReservation END"); + + return "/web/service/makeReservation"; + } + + /** + * 시술 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/selectReservation.do") + public ModelAndView selectReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController selectReservation START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webServiceService.selectReservation(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webservice/selectReservation.do"); + insertMap.put("func", "selectListService"); + insertMap.put("funcName", "예약 조회"); + insertMap.put("service", "webServiceService"); + insertMap.put("serviceName", "예약 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController selectReservation END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 시술 목록 상세 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/selectReservationCnt.do") + public ModelAndView selectReservationCnt(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController selectReservationCnt START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webServiceService.selectReservationCnt(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webservice/selectReservationCnt.do"); + insertMap.put("func", "selectReservationCnt"); + insertMap.put("funcName", "예약 조회"); + insertMap.put("service", "webServiceService"); + insertMap.put("serviceName", "예약 상세"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController selectReservationCnt END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 예약 저장 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webservice/insertReservation.do") + public ModelAndView insertReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebServiceController insertReservation START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webServiceService.insertReservation(paramMap); + log.debug(map + "TEST"); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webservice/insertReservation.do"); + insertMap.put("func", "selectReservationCnt"); + insertMap.put("funcName", "예약 저장"); + insertMap.put("service", "webServiceService"); + insertMap.put("serviceName", "예약 저장"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + + log.debug("WebServiceController insertReservation END"); + + + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webskin/WebSkinController.java b/src/main/java/com/madeuhome/controller/web/webskin/WebSkinController.java new file mode 100644 index 0000000..4250c15 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webskin/WebSkinController.java @@ -0,0 +1,83 @@ +package com.madeuhome.controller.web.webskin; + +import com.madeuhome.init.ManagerDraftAction; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + + +@Slf4j +@Controller +public class WebSkinController extends ManagerDraftAction{ + + /** + * 색소 및 미백 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webskin/selectSkinPigmentIntro.do") + public String selectSkinPigmentIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebSkinController selectSkinPigmentIntro START"); + + log.debug("WebSkinController selectSkinPigmentIntro END"); + return "/web/skin/skinPigmentSelect"; + } + + + /** + * 여드름 및 피부트러블 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webskin/selectSkinProblemIntro.do") + public String selectSkinProblemIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebSkinController selectSkinProblemIntro START"); + + log.debug("WebSkinController selectSkinProblemIntro END"); + return "/web/skin/skinProblemSelect"; + } + + + /** + * 모공축소 및 피부결 개선 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webskin/selectSkinTextureIntro.do") + public String selectSkinTextureIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebSkinController selectSkinTextureIntro START"); + + log.debug("WebSkinController selectSkinTextureIntro END"); + return "/web/skin/skinTextureSelect"; + } + + + + /** + * 제모 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webskin/selectSkinWaxingIntro.do") + public String selectSkinWaxingIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebSkinController selectSkinWaxingIntro START"); + + log.debug("WebSkinController selectSkinWaxingIntro END"); + return "/web/skin/skinWaxingSelect"; + } + +} diff --git a/src/main/java/com/madeuhome/controller/web/webvoc/WebVOCController.java b/src/main/java/com/madeuhome/controller/web/webvoc/WebVOCController.java new file mode 100644 index 0000000..c1a669a --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webvoc/WebVOCController.java @@ -0,0 +1,240 @@ +package com.madeuhome.controller.web.webvoc; + +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.web.webvoc.WebVOCService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Controller +public class WebVOCController extends ManagerDraftAction{ + @Autowired + private WebVOCService webVocService; + + /** + * 칭찬불만접수 화면으로 이동. + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webvoc/selectWebVOCIntro.do") + public String selectWebVOCIntro(HttpSession session,HttpServletRequest request) { + + log.debug("WebVOCController selectWebVOCIntro START"); + + log.debug("WebVOCController selectWebVOCIntro END"); + return "/web/voc/vocSelect"; + } + + /** + * 휴대폰 인증 확인 + * request: + * response : msgCode, msgDesc + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webvoc/selectPhoneAuthCheck.do") + public ModelAndView selectPhoneAuthCheck(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + log.debug("WebVOCController selectPhoneAuthCheck START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + StringBuffer errorMsg = new StringBuffer(); + + try{ + paramMap.put("loginUserId", String.valueOf(session.getAttribute("loginUserId"))); + paramMap.put("muUserId", String.valueOf(session.getAttribute("loginUserId"))); + map = webVocService.selectPhoneAuthCheck(paramMap); + }catch(Exception e){ + e.printStackTrace(); + errorMsg.append(e); + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. (E0042)"); + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webvoc/selectPhoneAuthCheck.do"); + insertMap.put("func", "selectPhoneAuthCheck"); + insertMap.put("funcName", "휴대폰 인증 확인"); + insertMap.put("service", "webPhoneAuthService"); + insertMap.put("serviceName", "휴대폰 인증"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + insertMap.put("tId", map.get("tId")); + if((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) || String.valueOf(errorMsg).length() == 0){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muUserId", paramMap.get("muUserId")); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + log.debug("WebVOCController selectPhoneAuthCheck END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + + /** + * 인증번호 등록 + * request: + * response : msgCode, msgDesc + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webvoc/insertPhoneAuth.do") + public ModelAndView insertPhoneAuth(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + log.debug("WebVOCController insertPhoneAuth START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + StringBuffer errorMsg = new StringBuffer(); + + try{ + paramMap.put("regId", String.valueOf(session.getAttribute("loginUserId"))); + paramMap.put("modId", String.valueOf(session.getAttribute("loginUserId"))); + map = webVocService.insertPhoneAuth(paramMap); + }catch(Exception e){ + e.printStackTrace(); + errorMsg.append(e); + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. (E0043)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webvoc/insertPhoneAuth.do"); + insertMap.put("func", "insertPhoneAuth"); + insertMap.put("funcName", "인증번호 등록"); + insertMap.put("service", "webPhoneAuthService"); + insertMap.put("serviceName", "인증번호"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + insertMap.put("tId", map.get("tId")); + if(("false").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "ERROR"); + }else{ + insertMap.put("resultCode", "SUCCESS"); + } + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("sbUserId", paramMap.get("sbUserId")); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebVOCController insertPhoneAuth END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 인증번호 등록 + * request: + * response : msgCode, msgDesc + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webvoc/insertVOC.do") + public ModelAndView insertVOC(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + log.debug("WebVOCController insertVOC START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + StringBuffer errorMsg = new StringBuffer(); + + log.debug(paramMap+ ""); + log.debug(map + ""); + + try{ + map = webVocService.insertVOC(paramMap); + }catch(Exception e){ + e.printStackTrace(); + errorMsg.append(e); + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. (E0043)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webvoc/insertPhoneAuth.do"); + insertMap.put("func", "insertPhoneAuth"); + insertMap.put("funcName", "인증번호 등록"); + insertMap.put("service", "webPhoneAuthService"); + insertMap.put("serviceName", "인증번호"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + insertMap.put("tId", map.get("tId")); + if(("false").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "ERROR"); + }else{ + insertMap.put("resultCode", "SUCCESS"); + } + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("sbUserId", paramMap.get("sbUserId")); + +// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebVOCController insertVOC END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webyoutube/WebYoutubeController.java b/src/main/java/com/madeuhome/controller/web/webyoutube/WebYoutubeController.java new file mode 100644 index 0000000..96c3b3f --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/webyoutube/WebYoutubeController.java @@ -0,0 +1,96 @@ +package com.madeuhome.controller.web.webyoutube; + +import com.madeuhome.constants.Constants; +import com.madeuhome.init.ManagerDraftAction; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import com.madeuhome.service.web.webyoutube.WebYoutubeService; +import com.madeuhome.util.HttpUtil; +import com.madeuhome.util.RequestLogUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import java.util.HashMap; + + +@Slf4j +@Controller +public class WebYoutubeController extends ManagerDraftAction{ + + @Autowired + private WebYoutubeService webYoutubeService; + + @Autowired + private LogHistoryService logHistoryService; + + /** + * 유튜브 정보 리스트 조회 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value="/webyoutube/selectListWebYoutube.do") + public ModelAndView selectListWebYoutube(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + + log.debug("WebYoutubeController selectListWebYoutube START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + StringBuffer errorMsg = new StringBuffer(); + + try{ + map = webYoutubeService.selectListWebYoutube(paramMap); + }catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + }finally { + if(Constants.OK == map.get("msgCode")) { + + }else{ + if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + + map.put("success", false); + if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/webyoutube/selectListWebYoutube.do"); + insertMap.put("func", "selectListWebYoutube"); + insertMap.put("funcName", "유튜브 리스트 조회"); + insertMap.put("service", "webYoutubeService"); + insertMap.put("serviceName", "유튜브"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + ; + if(("true").equals(String.valueOf(map.get("success")))){ + insertMap.put("resultCode", "SUCCESS"); + }else{ + insertMap.put("resultCode", "ERROR"); + } + + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("muMemberId")); + + logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("WebYoutubeController selectListWebYoutube END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/dao/common/loghistory/LogHistorySqlMapDAO.java b/src/main/java/com/madeuhome/dao/common/loghistory/LogHistorySqlMapDAO.java new file mode 100644 index 0000000..947c375 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/common/loghistory/LogHistorySqlMapDAO.java @@ -0,0 +1,38 @@ +package com.madeuhome.dao.common.loghistory; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; + +@Repository +public class LogHistorySqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 오류 로그 정보 등록 + * + * @param Map + * @return + * @throws DataAccessException + */ + public int insertLogHistory(HashMap paramMap) + throws DataAccessException { + logger.debug("LogHistorySqlMapDAO insertLogHistory START"); + String sqlId = "LogHistory.insertLogHistory"; + logger.debug("LogHistorySqlMapDAO insertLogHistory END"); + return getSqlSession().insert(sqlId, paramMap); + } + +} diff --git a/src/main/java/com/madeuhome/dao/common/visitlog/VisitLogSqlMapDAO.java b/src/main/java/com/madeuhome/dao/common/visitlog/VisitLogSqlMapDAO.java new file mode 100644 index 0000000..fefa325 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/common/visitlog/VisitLogSqlMapDAO.java @@ -0,0 +1,37 @@ +package com.madeuhome.dao.common.visitlog; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; + +@Repository +public class VisitLogSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 접속 로그 등록 + * + * @param Map + * @return + * @throws DataAccessException + */ + public int insertVisitLog(HashMap paramMap) + throws DataAccessException { + logger.debug("VisitLogSqlMapDAO insertVisitLog START"); + String sqlId = "VisitLog.insertVisitLog"; + logger.debug("VisitLogSqlMapDAO insertVisitLog END"); + return getSqlSession().insert(sqlId, paramMap); + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webevent/WebEventSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webevent/WebEventSqlMapDAO.java new file mode 100644 index 0000000..1c9328a --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webevent/WebEventSqlMapDAO.java @@ -0,0 +1,140 @@ +package com.madeuhome.dao.web.webevent; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class WebEventSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 이벤트 카테고리 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebEvent(HashMap paramMap) + throws DataAccessException { + logger.debug("WebEventSqlMapDAO selectListWebEvent START"); + String sqlId = "WebEvent.selectListWebEvent"; + logger.debug("WebEventSqlMapDAO selectListWebEvent END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 이벤트 정보 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListEvent(HashMap paramMap) + throws DataAccessException { + logger.debug("WebEventSqlMapDAO selectListEvent START"); + String sqlId = "WebEvent.selectListEvent"; + logger.debug("WebEventSqlMapDAO selectListEvent END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 이벤트안내 정보 이벤트 상세 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectEventDetail(HashMap paramMap) throws DataAccessException { + logger.debug("WebEventSqlMapDAO selectEventDetail START"); + + String sqlId = "WebEvent.selectEventDetail"; + + logger.debug("WebEventSqlMapDAO selectEventDetail END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + + /** + * 이벤트안내 정보 이벤트 목록 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListEventSub(HashMap paramMap) throws DataAccessException { + logger.debug("WebEventSqlMapDAO selectListEventSub START"); + + String sqlId = "WebEvent.selectListEventSub"; + + logger.debug("WebEventSqlMapDAO selectListEventSub END"); + + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 예약 상세 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectReservationCnt(HashMap paramMap) throws DataAccessException { + logger.debug("WebEventSqlMapDAO selectReservationCnt START"); + + String sqlId = "WebEvent.selectReservationCnt"; + + logger.debug("WebEventSqlMapDAO selectReservationCnt END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + + /** + * 예약 시술 정보 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectReservationService(HashMap paramMap) throws DataAccessException { + logger.debug("WebEventSqlMapDAO selectReservationService START"); + + String sqlId = "WebEvent.selectReservationService"; + + logger.debug("WebEventSqlMapDAO selectReservationService END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + /** + * 예약 정보 저장 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map insertReservation(HashMap paramMap) throws DataAccessException { + logger.debug("WebEventSqlMapDAO insertReservation START"); + + String sqlId = "WebEvent.insertReservation"; + + logger.debug("WebEventSqlMapDAO insertReservation END"); + + getSqlSession().insert(sqlId, paramMap); + + return null; + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webmainbanner/WebMainBannerSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webmainbanner/WebMainBannerSqlMapDAO.java new file mode 100644 index 0000000..e585df2 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webmainbanner/WebMainBannerSqlMapDAO.java @@ -0,0 +1,69 @@ +package com.madeuhome.dao.web.webmainbanner; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class WebMainBannerSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 메인 배너 정보 총 갯수 조회 (total count) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectTotalWebMainBannerCount(HashMap paramMap) + throws DataAccessException { + logger.debug("WebMainBannerSqlMapDAO selectTotalWebMainBannerCount START"); + String sqlId = "WebMainBanner.selectTotalWebMainBannerCount"; + logger.debug("WebMainBannerSqlMapDAO selectTotalWebMainBannerCount END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 메인 배너 정보 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebMainBanner(HashMap paramMap) + throws DataAccessException { + logger.debug("WebMainBannerSqlMapDAO selectListWebMainBanner START"); + String sqlId = "WebMainBanner.selectListWebMainBanner"; + logger.debug("WebMainBannerSqlMapDAO selectListWebMainBanner END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 메인 배너 정보 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectWebMainBanner(HashMap paramMap) + throws DataAccessException { + logger.debug("WebMainBannerSqlMapDAO selectWebMainBanner START"); + String sqlId = "WebMainBanner.selectWebMainBanner"; + logger.debug("WebMainBannerSqlMapDAO selectWebMainBanner END"); + return getSqlSession().selectList(sqlId, paramMap); + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webphoto/WebPhotoSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webphoto/WebPhotoSqlMapDAO.java new file mode 100644 index 0000000..c73050a --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webphoto/WebPhotoSqlMapDAO.java @@ -0,0 +1,88 @@ +package com.madeuhome.dao.web.webphoto; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class WebPhotoSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 전후사진 카테고리 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebPhoto(HashMap paramMap) + throws DataAccessException { + logger.debug("WebPhotoSqlMapDAO selectListWebPhoto START"); + String sqlId = "WebPhoto.selectListWebPhoto"; + logger.debug("WebPhotoSqlMapDAO selectListWebPhoto END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 전후사진 정보 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListPhoto(HashMap paramMap) + throws DataAccessException { + logger.debug("WebPhotoSqlMapDAO selectListPhoto START"); + String sqlId = "WebPhoto.selectListPhoto"; + logger.debug("WebPhotoSqlMapDAO selectListPhoto END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 전후사진안내 정보 전후사진 상세 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectPhotoDetail(HashMap paramMap) throws DataAccessException { + logger.debug("WebPhotoSqlMapDAO selectPhotoDetail START"); + + String sqlId = "WebPhoto.selectPhotoDetail"; + + logger.debug("WebPhotoSqlMapDAO selectPhotoDetail END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + + /** + * 전후사진안내 정보 전후사진 목록 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListPhotoSub(HashMap paramMap) throws DataAccessException { + logger.debug("WebPhotoSqlMapDAO selectListPhotoSub START"); + + String sqlId = "WebPhoto.selectListPhotoSub"; + + logger.debug("WebPhotoSqlMapDAO selectListPhotoSub END"); + + return getSqlSession().selectList(sqlId, paramMap); + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webpopup/WebPopupSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webpopup/WebPopupSqlMapDAO.java new file mode 100644 index 0000000..e757d42 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webpopup/WebPopupSqlMapDAO.java @@ -0,0 +1,69 @@ +package com.madeuhome.dao.web.webpopup; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class WebPopupSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 이벤트 정보 총 갯수 조회 (total count) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectTotalWebPopupCount(HashMap paramMap) + throws DataAccessException { + logger.debug("WebPopupSqlMapDAO selectTotalWebPopupCount START"); + String sqlId = "WebPopup.selectTotalWebPopupCount"; + logger.debug("WebPopupSqlMapDAO selectTotalWebPopupCount END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 이벤트 정보 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebPopup(HashMap paramMap) + throws DataAccessException { + logger.debug("WebPopupSqlMapDAO selectListWebPopup START"); + String sqlId = "WebPopup.selectListWebPopup"; + logger.debug("WebPopupSqlMapDAO selectListWebPopup END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 이벤트 정보 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectWebPopup(HashMap paramMap) + throws DataAccessException { + logger.debug("WebPopupSqlMapDAO selectWebPopup START"); + String sqlId = "WebPopup.selectWebPopup"; + logger.debug("WebPopupSqlMapDAO selectWebPopup END"); + return getSqlSession().selectList(sqlId, paramMap); + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java new file mode 100644 index 0000000..4aae690 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java @@ -0,0 +1,145 @@ +package com.madeuhome.dao.web.webservice; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import jakarta.annotation.PostConstruct; + +@Repository +public class WebServiceSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 시술관리 정보 카테고리 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebCategory(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO selectListWebCategory START"); + + String sqlId = "WebService.selectListWebCategory"; + + logger.debug("WebServiceSqlMapDAO selectListWebCategory END"); + + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 시술관리 정보 시술 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebService(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO selectListWebService START"); + + String sqlId = "WebService.selectListWebService"; + + logger.debug("WebServiceSqlMapDAO selectListWebService END"); + + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 시술관리 정보 시술 상세 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectServiceDetail(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO selectServiceDetail START"); + + String sqlId = "WebService.selectServiceDetail"; + + logger.debug("WebServiceSqlMapDAO selectServiceDetail END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + + /** + * 시술관리 정보 시술 목록 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListService(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO selectListService START"); + + String sqlId = "WebService.selectListService"; + + logger.debug("WebServiceSqlMapDAO selectListService END"); + + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 예약 상세 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectReservationCnt(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO selectReservationCnt START"); + + String sqlId = "WebService.selectReservationCnt"; + + logger.debug("WebServiceSqlMapDAO selectReservationCnt END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + + /** + * 예약 시술 정보 조회 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map selectReservationService(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO selectReservationService START"); + + String sqlId = "WebService.selectReservationService"; + + logger.debug("WebServiceSqlMapDAO selectReservationService END"); + + return getSqlSession().selectOne(sqlId, paramMap); + } + /** + * 예약 정보 저장 + * + * @param Map + * @return + * @throws DataAccessException + */ + public Map insertReservation(HashMap paramMap) throws DataAccessException { + logger.debug("WebServiceSqlMapDAO insertReservation START"); + + String sqlId = "WebService.insertReservation"; + + logger.debug("WebServiceSqlMapDAO insertReservation END"); + + getSqlSession().insert(sqlId, paramMap); + + return null; + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webvoc/WebVOCSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webvoc/WebVOCSqlMapDAO.java new file mode 100644 index 0000000..ca21b76 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webvoc/WebVOCSqlMapDAO.java @@ -0,0 +1,129 @@ +package com.madeuhome.dao.web.webvoc; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import jakarta.annotation.PostConstruct; + +@Repository +public class WebVOCSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 문자 전송 이력 등록 + * + * + * @param map + * @return + * @throws DataAccessException + */ + public int insertSms(HashMap paramMap) throws DataAccessException { + logger.debug("WebVOCSqlMapDAO insertSms START"); + String sqlId = "WebVOC.insertSms"; + logger.debug("WebVOCSqlMapDAO insertSms END"); + return getSqlSession().update(sqlId, paramMap); + } + + /** + * 문자 전송 상태 변경 + * + * + * @param map + * @return + * @throws DataAccessException + */ + public int updateSmsState(HashMap paramMap) throws DataAccessException { + logger.debug("WebVOCSqlMapDAO updateSmsState START"); + String sqlId = "WebVOC.updateSmsState"; + logger.debug("WebVOCSqlMapDAO updateSmsState END"); + return getSqlSession().update(sqlId, paramMap); + } + /** + * 문자 전송 팝빌 상태 변경 + * + * + * @param map + * @return + * @throws DataAccessException + */ + public int updateSmsPopbillState(HashMap paramMap) throws DataAccessException { + logger.debug("WebVOCSqlMapDAO updateSmsPopbillState START"); + String sqlId = "WebVOC.updateSmsPopbillState"; + logger.debug("WebVOCSqlMapDAO updateSmsPopbillState END"); + return getSqlSession().update(sqlId, paramMap); + } + + /** + * 휴대폰 인증 수 조회(당일) + * + * @param map + * @return + * @throws DataAccessException + */ + public List> selectListPhoneAuthCountToday(HashMap map) + throws DataAccessException { + logger.debug("WebVOCSqlMapDAO selectListPhoneAuthCountToday START"); + String sqlId = "WebVOC.selectListPhoneAuthCountToday"; + logger.debug("WebVOCSqlMapDAO selectListPhoneAuthCountToday END"); + return getSqlSession().selectList(sqlId, map); + } + + /** + * 휴대폰 인증 확인 + * + * @param map + * @return + * @throws DataAccessException + */ + public List> selectPhoneAuthCheck(HashMap map) + throws DataAccessException { + logger.debug("WebVOCSqlMapDAO selectPhoneAuthCheck START"); + String sqlId = "WebVOC.selectPhoneAuthCheck"; + logger.debug("WebVOCSqlMapDAO selectPhoneAuthCheck END"); + return getSqlSession().selectList(sqlId, map); + } + + /** + * 인증번호 등록 + * + * @param map + * @return + * @throws DataAccessException + */ + public int insertPhoneAuth(HashMap map) + throws DataAccessException { + logger.debug("WebVOCSqlMapDAO insertPhoneAuth START"); + String sqlId = "WebVOC.insertPhoneAuth"; + logger.debug("WebVOCSqlMapDAO insertPhoneAuth END"); + return getSqlSession().insert(sqlId, map); + } + + /** + * 접수 등록 + * + * @param map + * @return + * @throws DataAccessException + */ + public int insertVOC(HashMap map) + throws DataAccessException { + logger.debug("WebVOCSqlMapDAO insertVOC START"); + String sqlId = "WebVOC.insertVOC"; + logger.debug("WebVOCSqlMapDAO insertVOC END"); + return getSqlSession().insert(sqlId, map); + } +} diff --git a/src/main/java/com/madeuhome/dao/web/webyoutube/WebYoutubeSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webyoutube/WebYoutubeSqlMapDAO.java new file mode 100644 index 0000000..f9d7394 --- /dev/null +++ b/src/main/java/com/madeuhome/dao/web/webyoutube/WebYoutubeSqlMapDAO.java @@ -0,0 +1,54 @@ +package com.madeuhome.dao.web.webyoutube; + +import jakarta.annotation.PostConstruct; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.support.SqlSessionDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class WebYoutubeSqlMapDAO extends SqlSessionDaoSupport{ + + @Autowired + private SqlSessionTemplate sqlSessionTemplate; + + @PostConstruct + void init() { + setSqlSessionTemplate(sqlSessionTemplate); + } + + /** + * 유튜브 정보 총 갯수 조회 (total count) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectTotalWebYoutubeCount(HashMap paramMap) + throws DataAccessException { + logger.debug("WebYoutubeSqlMapDAO selectTotalWebYoutubeCount START"); + String sqlId = "WebYoutube.selectTotalWebYoutubeCount"; + logger.debug("WebYoutubeSqlMapDAO selectTotalWebYoutubeCount END"); + return getSqlSession().selectList(sqlId, paramMap); + } + + /** + * 유튜브 정보 리스트 조회 (List) + * + * @param Map + * @return + * @throws DataAccessException + */ + public List> selectListWebYoutube(HashMap paramMap) + throws DataAccessException { + logger.debug("WebYoutubeSqlMapDAO selectListWebYoutube START"); + String sqlId = "WebYoutube.selectListWebYoutube"; + logger.debug("WebYoutubeSqlMapDAO selectListWebYoutube END"); + return getSqlSession().selectList(sqlId, paramMap); + } +} diff --git a/src/main/java/com/madeuhome/init/ManagerDraftAction.java b/src/main/java/com/madeuhome/init/ManagerDraftAction.java new file mode 100644 index 0000000..14997ca --- /dev/null +++ b/src/main/java/com/madeuhome/init/ManagerDraftAction.java @@ -0,0 +1,78 @@ +package com.madeuhome.init; + +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ManagerDraftAction { + + public boolean adminCheckLogin(HttpSession session) throws Exception { + if (session == null) { + return false; + } + String ntsoftId = (String) session.getAttribute("ntsoftId"); + String ntsoftUserId = (String) session.getAttribute("ntsoftUserId"); + String ntsoftUserName = (String) session.getAttribute("ntsoftUserName"); + log.debug("======================== MANAGER CHECKLOGIN START ========================="); + log.debug("ntsoftId : "+ ntsoftId); + log.debug("ntsoftUserId : "+ ntsoftUserId); + log.debug("ntsoftUserName : "+ ntsoftUserName); + log.debug("========================= MANAGER CHECKLOGIN END =========================="); + if ((ntsoftId == null) || ("".equals(ntsoftId)) || (ntsoftUserId == null) || ("".equals(ntsoftUserId))) { + return false; + } + + return true; + } + + public boolean adminCheckLogin(HttpSession session,String t) throws Exception { + if (session == null) { + return false; + } + String ntsoftId = (String) session.getAttribute("ntsoftId"); + String ntsoftUserId = (String) session.getAttribute("ntsoftUserId"); + String ntsoftUserName = (String) session.getAttribute("ntsoftUserName"); + String userType = (String) session.getAttribute("userType"); + String tyCompanyId = (String) session.getAttribute("tyCompanyId"); + log.debug("======================== MANAGER CHECKLOGIN START ========================="); + log.debug("ntsoftId : "+ ntsoftId); + log.debug("ntsoftUserId : "+ ntsoftUserId); + log.debug("ntsoftUserName : "+ ntsoftUserName); + log.debug("userType : "+ userType); + log.debug("tyCompanyId : "+ tyCompanyId); + log.debug("========================= MANAGER CHECKLOGIN END =========================="); + if ((ntsoftId == null) || ("".equals(ntsoftId)) || (ntsoftUserId == null) || ("".equals(ntsoftUserId))) { + return false; + } + + if (!userType.equals(t)) { + return false; + } + return true; + } + + public boolean webCheckLogin(HttpSession session)throws Exception{ + + if(session == null){ + return false; + }else{ + String muMemberId = (String)session.getAttribute("muMemberId"); + String loginId = (String)session.getAttribute("loginId"); + String userName = (String)session.getAttribute("userName"); + log.debug("======================== USER CHECKLOGIN START ========================="); + log.debug(" muMemberId : "+ muMemberId); + log.debug(" loginId : "+ loginId); + log.debug(" userName : "+ userName); + log.debug("======================== USER CHECKLOGIN END ==========================="); + + log.debug("======================================= session ID Start2 ======================================="); + log.debug("=============== Session ID :"+session.getId()); + log.debug("======================================= session ID End2 ======================================="); + if(null==muMemberId||("").equals(muMemberId)){ + return false; + }else{ + return true; + } + } + } +} diff --git a/src/main/java/com/madeuhome/init/ServiceInitializeServlet.java b/src/main/java/com/madeuhome/init/ServiceInitializeServlet.java new file mode 100644 index 0000000..ef6ad5c --- /dev/null +++ b/src/main/java/com/madeuhome/init/ServiceInitializeServlet.java @@ -0,0 +1,52 @@ +package com.madeuhome.init; + +import jakarta.servlet.http.HttpServlet; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ServiceInitializeServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static String default_file_store_path = ""; + private static String default_file_store_folder = ""; + private static String webService_url= ""; + private static String appService_url =""; + + + public void init(){ + log.debug("ServiceInitializeServlet - init start"); + default_file_store_path = getInitParameter("DEFAULT_FILE_STORE_PATH"); + default_file_store_folder = getInitParameter("DEFAULT_FILE_STORE_FOLDER"); + webService_url = getInitParameter("WEBSERVICE_URL"); + appService_url = getInitParameter("APPSERVICE_URL"); + + //NoticeThreadJob.getInstance(); + //BirthDayThreadJob.getInstance(); + log.debug("ServiceInitializeServlet - init end"); + } + + public static String getDefaultFileStorePath(){ + return default_file_store_path; + } + + public static String getDefaultFileStoreFolder() { + return default_file_store_folder; + } + + public static String getAppServiceUrl(){ + return appService_url; + } + + public static String getWebServiceUrl(){ + return webService_url; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public static void main(String[] args) { + System.out.println(default_file_store_path); + } +} diff --git a/src/main/java/com/madeuhome/service/common/loghistory/LogHistoryService.java b/src/main/java/com/madeuhome/service/common/loghistory/LogHistoryService.java new file mode 100644 index 0000000..9e45455 --- /dev/null +++ b/src/main/java/com/madeuhome/service/common/loghistory/LogHistoryService.java @@ -0,0 +1,10 @@ +package com.madeuhome.service.common.loghistory; + +import java.util.HashMap; + + +public interface LogHistoryService { + + public HashMap insertLogHistory(HashMap paramMap, HashMap visitLogParamMap) throws Exception; + +} diff --git a/src/main/java/com/madeuhome/service/common/loghistory/impl/LogHistoryServiceImpl.java b/src/main/java/com/madeuhome/service/common/loghistory/impl/LogHistoryServiceImpl.java new file mode 100644 index 0000000..6d11b8d --- /dev/null +++ b/src/main/java/com/madeuhome/service/common/loghistory/impl/LogHistoryServiceImpl.java @@ -0,0 +1,92 @@ +package com.madeuhome.service.common.loghistory.impl; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.common.loghistory.LogHistorySqlMapDAO; +import com.madeuhome.service.common.loghistory.LogHistoryService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; + + +@Slf4j +@Service("LogHistoryService") +public class LogHistoryServiceImpl implements LogHistoryService { + + @Autowired + private LogHistorySqlMapDAO logHistorySqlMapDAO; + + + /** + * 오류 로그 정보 등록 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + @Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW) + public HashMap insertLogHistory( + HashMap paramMap, HashMap visitLogParamMap) throws Exception{ + log.debug("WebLogHistoryServiceImpl insertLogHistory START"); + + HashMap map = new HashMap(); + + log.debug("muMemberId : "+paramMap.get("muMemberId")); + + log.debug("url : "+paramMap.get("url")); + log.debug("func : "+paramMap.get("func")); + log.debug("service : "+paramMap.get("service")); + log.debug("requestValue : "+paramMap.get("requestValue")); + log.debug("responseValue : "+paramMap.get("responseValue")); + log.debug("tId : "+paramMap.get("tId")); + log.debug("resultCode : "+paramMap.get("resultCode")); + log.debug("resultMsg : "+paramMap.get("resultMsg")); + + try{ + boolean check = true; + + String tId = String.valueOf(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar c1 = Calendar.getInstance(); + String tDate = sdf.format(c1.getTime()); + + HashMap logHistoryMap = new HashMap(); + + paramMap.put("visitIp", visitLogParamMap.get("visitIp")); + paramMap.put("visitOriginAgent", visitLogParamMap.get("visitOriginAgent")); + paramMap.put("visitAgent", visitLogParamMap.get("visitAgent")); + paramMap.put("visitOs", visitLogParamMap.get("visitOs")); + paramMap.put("regId", "SYSTEM"); + paramMap.put("modId", "SYSTEM"); + + if(true == check){ + paramMap.put("tDate", tDate); + paramMap.put("tId", tId); + + String muLogHistoryId = ("H").concat(String.valueOf(System.currentTimeMillis())); + paramMap.put("muLogHistoryId",muLogHistoryId); + paramMap.put("muMemberId", paramMap.get("muMemberId")); + logHistorySqlMapDAO.insertLogHistory(paramMap); + log.debug("muLogHistoryId :"+paramMap.get("id")); + paramMap.put("muLogHistoryId", paramMap.get("id")); + map.put("muLogHistoryId", paramMap.get("muLogHistoryId")); + + map.put("msgCode", Constants.OK); + map.put("msgDesc", "등록되었습니다."); + } + } + catch (Exception e) { + e.printStackTrace(); + throw e; + } + log.debug("WebLogHistoryServiceImpl insertLogHistory END"); + return map; + } + +} diff --git a/src/main/java/com/madeuhome/service/common/visitlog/VisitLogService.java b/src/main/java/com/madeuhome/service/common/visitlog/VisitLogService.java new file mode 100644 index 0000000..56a0606 --- /dev/null +++ b/src/main/java/com/madeuhome/service/common/visitlog/VisitLogService.java @@ -0,0 +1,10 @@ +package com.madeuhome.service.common.visitlog; + +import java.util.HashMap; + + +public interface VisitLogService { + + public HashMap insertVisitLog(HashMap paramMap) throws Exception; + +} diff --git a/src/main/java/com/madeuhome/service/common/visitlog/impl/VisitLogServiceImpl.java b/src/main/java/com/madeuhome/service/common/visitlog/impl/VisitLogServiceImpl.java new file mode 100644 index 0000000..632e074 --- /dev/null +++ b/src/main/java/com/madeuhome/service/common/visitlog/impl/VisitLogServiceImpl.java @@ -0,0 +1,78 @@ +package com.madeuhome.service.common.visitlog.impl; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.common.visitlog.VisitLogSqlMapDAO; +import com.madeuhome.service.common.visitlog.VisitLogService; +import com.madeuhome.util.ValidationCheckUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + + +@Slf4j +@Service("VisitLogService") +public class VisitLogServiceImpl implements VisitLogService{ + + @Autowired + private VisitLogSqlMapDAO visitLogSqlMapDAO; + + /** + * 접속 로그 등록 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + @Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW) + public HashMap insertVisitLog( + HashMap paramMap) throws Exception{ + log.debug("VisitLogServiceImpl insertVisitLog START"); + + HashMap map = new HashMap(); + + log.debug("muMemberId : "+paramMap.get("muMemberId")); + log.debug("regId : "+paramMap.get("regId")); + log.debug("modId : "+paramMap.get("modId")); + + log.debug("workType : "+paramMap.get("workType")); + + try{ + boolean check = true; + + String workType = String.valueOf(paramMap.get("workType")); + + if(true != ValidationCheckUtil.emptyCheck(workType)){ + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc","구분 정보가 없습니다."); + } + + if(true == check){ + + paramMap.put("muMemberId", paramMap.get("muMemberId")); + paramMap.put("regId", paramMap.get("regId")); + paramMap.put("modId", paramMap.get("modId")); + paramMap.put("tyVisitLogId", ("VL").concat(String.valueOf(System.currentTimeMillis()))); + + paramMap.put("type", "W"); + + visitLogSqlMapDAO.insertVisitLog(paramMap); + + map.put("msgCode", Constants.OK); + map.put("msgDesc", "등록되었습니다."); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("VisitLogServiceImpl insertVisitLog END"); + return map; + } + +} diff --git a/src/main/java/com/madeuhome/service/web/webevent/WebEventService.java b/src/main/java/com/madeuhome/service/web/webevent/WebEventService.java new file mode 100644 index 0000000..0195190 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webevent/WebEventService.java @@ -0,0 +1,14 @@ +package com.madeuhome.service.web.webevent; + +import java.util.HashMap; + + +public interface WebEventService { + + public HashMap selectListWebEvent(HashMap paramMap) throws Exception; + public HashMap selectListEvent(HashMap paramMap) throws Exception; + public HashMap selectEventDetail(HashMap paramMap) throws Exception; + public HashMap selectReservation(HashMap paramMap) throws Exception; + public HashMap selectReservationCnt(HashMap paramMap) throws Exception; + public HashMap insertReservation(HashMap paramMap) throws Exception; +} diff --git a/src/main/java/com/madeuhome/service/web/webevent/impl/WebEventServiceImpl.java b/src/main/java/com/madeuhome/service/web/webevent/impl/WebEventServiceImpl.java new file mode 100644 index 0000000..af535aa --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webevent/impl/WebEventServiceImpl.java @@ -0,0 +1,237 @@ +package com.madeuhome.service.web.webevent.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webevent.WebEventSqlMapDAO; +import com.madeuhome.service.web.webevent.WebEventService; + +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Service("WebEventService") +public class WebEventServiceImpl implements WebEventService { + + @Autowired + private WebEventSqlMapDAO webEventSqlMapDAO; + + /** + * 이벤트 카테고리 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebEvent(HashMap paramMap) throws Exception { + log.debug("WebEventServiceImpl selectListEvent START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webEventSqlMapDAO.selectListWebEvent(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebEventServiceImpl selectListEvent END"); + return map; + } + + /** + * 이벤트 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListEvent( + HashMap paramMap) throws Exception { + log.debug("WebEventServiceImpl selectListEvent START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webEventSqlMapDAO.selectListEvent(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebEventServiceImpl selectListEvent END"); + return map; + } + + /** + * 이벤트 정보 상세 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectEventDetail(HashMap paramMap) throws Exception { + log.debug("WebEventServiceImpl selectEventDetail START"); + + HashMap map = new HashMap(); + + try{ + //상세 내용 + Map listMap = webEventSqlMapDAO.selectEventDetail(paramMap); + map.put("rows",listMap); + //이벤트 목록 + List> listEventMap = webEventSqlMapDAO.selectListEventSub(paramMap); + map.put("price",listEventMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebEventServiceImpl selectEventDetail END"); + return map; + } + + /** + * 예약 정보 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectReservation(HashMap paramMap) throws Exception { + log.debug("WebEventServiceImpl selectReservation START"); + + HashMap map = new HashMap(); + + try{ + //예약 목록 + List> listMap2 = new ArrayList>(); + + if(paramMap.get("PROCEDURE_ID").toString().indexOf("#") != -1) { + String[] PROCEDURE_ID = paramMap.get("PROCEDURE_ID").toString().split("#"); + + for(int i = 0; i < PROCEDURE_ID.length; i++) { + HashMap map2 = new HashMap(); + map2.put("PROCEDURE_ID", PROCEDURE_ID[i]); + listMap2.add(webEventSqlMapDAO.selectReservationService(map2)); + } + }else { + listMap2.add(webEventSqlMapDAO.selectReservationService(paramMap)); + } + map.put("reservation",listMap2); + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebEventServiceImpl selectReservation END"); + return map; + } + + /** + * 예약 정보 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectReservationCnt(HashMap paramMap) throws Exception { + log.debug("WebEventServiceImpl selectReservationCnt START"); + + HashMap map = new HashMap(); + + try{ + //상세 내용 + Map listMap = webEventSqlMapDAO.selectReservationCnt(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebEventServiceImpl selectReservationCnt END"); + return map; + } + + /** + * 예약 정보 저장 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap insertReservation(HashMap paramMap) throws Exception { + log.debug("WebEventServiceImpl insertReservation START"); + HashMap map = new HashMap(); + try{ + String muReserveId = ("R").concat(String.valueOf(System.currentTimeMillis())); + paramMap.put("muReserveId",muReserveId); + + // TREATMENT_INFOS 파라미터가 있으면 파싱하여 P_변수명으로 세팅 후 insertReservation 호출 + if(paramMap.get("TREATMENT_INFOS") != null) { + ObjectMapper objectMapper = new ObjectMapper(); + List> treatmentList = objectMapper.readValue(paramMap.get("TREATMENT_INFOS").toString(), new TypeReference>>(){}); + for(Map t : treatmentList) { + paramMap.put("P_TREATMENT_ID", t.get("MU_TREATMENT_ID")); + paramMap.put("P_TREATMENT_NM", t.get("TREATMENT_NAME")); + paramMap.put("P_PROCEDURE_ID", t.get("MU_TREATMENT_PROCEDURE_ID")); + paramMap.put("P_PROCEDURE_NM", t.get("TREATMENT_PROCEDURE_NAME")); + webEventSqlMapDAO.insertReservation(paramMap); + } + } else { + // 기존 방식대로 단일 시술 정보로 처리 + paramMap.put("P_TREATMENT_ID", paramMap.get("MU_TREATMENT_ID")); + paramMap.put("P_TREATMENT_NM", paramMap.get("TREATMENT_NAME")); + paramMap.put("P_PROCEDURE_ID", paramMap.get("MU_TREATMENT_PROCEDURE_ID")); + paramMap.put("P_PROCEDURE_NM", paramMap.get("TREATMENT_PROCEDURE_NAME")); + webEventSqlMapDAO.insertReservation(paramMap); + } + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + System.out.println("[insertReservation] paramMap: " + paramMap); + log.debug("WebEventServiceImpl insertReservation END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/service/web/webinstagram/WebInstagramService.java b/src/main/java/com/madeuhome/service/web/webinstagram/WebInstagramService.java new file mode 100644 index 0000000..fee3f57 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webinstagram/WebInstagramService.java @@ -0,0 +1,9 @@ +package com.madeuhome.service.web.webinstagram; + +import java.util.HashMap; + + +public interface WebInstagramService { + + public HashMap selectListWebInstagram(HashMap paramMap) throws Exception; +} diff --git a/src/main/java/com/madeuhome/service/web/webinstagram/impl/WebInstagramServiceImpl.java b/src/main/java/com/madeuhome/service/web/webinstagram/impl/WebInstagramServiceImpl.java new file mode 100644 index 0000000..79f4d85 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webinstagram/impl/WebInstagramServiceImpl.java @@ -0,0 +1,54 @@ +package com.madeuhome.service.web.webinstagram.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.madeuhome.constants.Constants; +import com.madeuhome.service.web.webinstagram.WebInstagramService; + +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Service("WebInstagramService") +public class WebInstagramServiceImpl implements WebInstagramService { + + @Value("${instagram.client-id}") + String clientId; + + @Value("${instagram.accesstoken}") + String accessToken; + + /** + * 인스타그램 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebInstagram( + HashMap paramMap) throws Exception { + log.debug("WebInstagramServiceImpl selectListWebInstagram START"); + HashMap map = new HashMap(); + String apiUrl = "https://graph.instagram.com/" + clientId + "/media?fields=id,caption,media_url,permalink,media_type,thumbnail_url&access_token=" + accessToken; + try{ + RestTemplate restTemplate = new RestTemplate(); + Map response = restTemplate.getForObject(apiUrl, Map.class); + List> data = (List>) response.get("data"); + map.put("msgCode", Constants.OK); + map.put("success","true"); + map.put("rows", data); + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + log.debug("WebInstagramServiceImpl selectListWebInstagram END"); + return map; + } +} \ No newline at end of file diff --git a/src/main/java/com/madeuhome/service/web/webmainbanner/WebMainBannerService.java b/src/main/java/com/madeuhome/service/web/webmainbanner/WebMainBannerService.java new file mode 100644 index 0000000..a2655b4 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webmainbanner/WebMainBannerService.java @@ -0,0 +1,11 @@ +package com.madeuhome.service.web.webmainbanner; + +import java.util.HashMap; + + +public interface WebMainBannerService { + + public HashMap selectListWebMainBanner(HashMap paramMap) throws Exception; + public HashMap selectWebMainBanner(HashMap paramMap) throws Exception; + +} diff --git a/src/main/java/com/madeuhome/service/web/webmainbanner/impl/WebMainBannerServiceImpl.java b/src/main/java/com/madeuhome/service/web/webmainbanner/impl/WebMainBannerServiceImpl.java new file mode 100644 index 0000000..8c19d1e --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webmainbanner/impl/WebMainBannerServiceImpl.java @@ -0,0 +1,97 @@ +package com.madeuhome.service.web.webmainbanner.impl; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webmainbanner.WebMainBannerSqlMapDAO; +import com.madeuhome.service.web.webmainbanner.WebMainBannerService; +import com.madeuhome.util.ValidationCheckUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Slf4j +@Service("WebMainBannerService") +public class WebMainBannerServiceImpl implements WebMainBannerService { + + @Autowired + private WebMainBannerSqlMapDAO webMainBannerSqlMapDAO; + + /** + * 메인 배너 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebMainBanner( + HashMap paramMap) throws Exception { + log.debug("WebMainBannerServiceImpl selectListWebMainBanner START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webMainBannerSqlMapDAO.selectListWebMainBanner(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebMainBannerServiceImpl selectListWebMainBanner END"); + return map; + } + + /** + * 메인 배너 정보 상세 조회 (one) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectWebMainBanner( + HashMap paramMap) throws Exception { + log.debug("WebMainBannerServiceImpl selectWebMainBanner START"); + + HashMap map = new HashMap(); + + log.debug("muWebMainBannerId : "+paramMap.get("muWebMainBannerId")); + + try{ + boolean check = true; + + String muWebMainBannerId = String.valueOf(paramMap.get("muWebMainBannerId")); + + if(true != ValidationCheckUtil.emptyCheck(muWebMainBannerId)){ + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc","메인 배너 식별자 정보가 없습니다."); + } + + if(true == check){ + List> listMap = webMainBannerSqlMapDAO.selectWebMainBanner(paramMap); + int listMapSize = listMap.size(); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + map.put("rows",listMap); + + } + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebMainBannerServiceImpl selectWebMainBanner END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/service/web/webphoto/WebPhotoService.java b/src/main/java/com/madeuhome/service/web/webphoto/WebPhotoService.java new file mode 100644 index 0000000..6b8d68c --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webphoto/WebPhotoService.java @@ -0,0 +1,11 @@ +package com.madeuhome.service.web.webphoto; + +import java.util.HashMap; + + +public interface WebPhotoService { + + public HashMap selectListWebPhoto(HashMap paramMap) throws Exception; + public HashMap selectListPhoto(HashMap paramMap) throws Exception; + public HashMap selectPhotoDetail(HashMap paramMap) throws Exception; +} diff --git a/src/main/java/com/madeuhome/service/web/webphoto/impl/WebPhotoServiceImpl.java b/src/main/java/com/madeuhome/service/web/webphoto/impl/WebPhotoServiceImpl.java new file mode 100644 index 0000000..c0cebe7 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webphoto/impl/WebPhotoServiceImpl.java @@ -0,0 +1,115 @@ +package com.madeuhome.service.web.webphoto.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webphoto.WebPhotoSqlMapDAO; +import com.madeuhome.service.web.webphoto.WebPhotoService; + +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Service("WebPhotoService") +public class WebPhotoServiceImpl implements WebPhotoService { + + @Autowired + private WebPhotoSqlMapDAO webPhotoSqlMapDAO; + + /** + * 전후사진 카테고리 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebPhoto(HashMap paramMap) throws Exception { + log.debug("WebPhotoServiceImpl selectListPhoto START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webPhotoSqlMapDAO.selectListWebPhoto(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebPhotoServiceImpl selectListPhoto END"); + return map; + } + + /** + * 전후사진 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListPhoto( + HashMap paramMap) throws Exception { + log.debug("WebPhotoServiceImpl selectListPhoto START"); + System.out.println(paramMap); + HashMap map = new HashMap(); + + try{ + List> listMap = webPhotoSqlMapDAO.selectListPhoto(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebPhotoServiceImpl selectListPhoto END"); + return map; + } + + /** + * 전후사진 정보 상세 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectPhotoDetail(HashMap paramMap) throws Exception { + log.debug("WebPhotoServiceImpl selectPhotoDetail START"); + + HashMap map = new HashMap(); + + try{ + //상세 내용 + Map listMap = webPhotoSqlMapDAO.selectPhotoDetail(paramMap); + map.put("rows",listMap); + //전후사진 목록 + List> listPhotoMap = webPhotoSqlMapDAO.selectListPhotoSub(paramMap); + map.put("price",listPhotoMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebPhotoServiceImpl selectPhotoDetail END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/service/web/webpopup/WebPopupService.java b/src/main/java/com/madeuhome/service/web/webpopup/WebPopupService.java new file mode 100644 index 0000000..9763f06 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webpopup/WebPopupService.java @@ -0,0 +1,11 @@ +package com.madeuhome.service.web.webpopup; + +import java.util.HashMap; + + +public interface WebPopupService { + + public HashMap selectListWebPopup(HashMap paramMap) throws Exception; + public HashMap selectWebPopup(HashMap paramMap) throws Exception; + +} diff --git a/src/main/java/com/madeuhome/service/web/webpopup/impl/WebPopupServiceImpl.java b/src/main/java/com/madeuhome/service/web/webpopup/impl/WebPopupServiceImpl.java new file mode 100644 index 0000000..a6a196e --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webpopup/impl/WebPopupServiceImpl.java @@ -0,0 +1,97 @@ +package com.madeuhome.service.web.webpopup.impl; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webpopup.WebPopupSqlMapDAO; +import com.madeuhome.service.web.webpopup.WebPopupService; +import com.madeuhome.util.ValidationCheckUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Slf4j +@Service("WebPopupService") +public class WebPopupServiceImpl implements WebPopupService { + + @Autowired + private WebPopupSqlMapDAO webPopupSqlMapDAO; + + /** + * 이벤트 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebPopup( + HashMap paramMap) throws Exception { + log.debug("WebPopupServiceImpl selectListWebPopup START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webPopupSqlMapDAO.selectListWebPopup(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebPopupServiceImpl selectListWebPopup END"); + return map; + } + + /** + * 이벤트 정보 상세 조회 (one) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectWebPopup( + HashMap paramMap) throws Exception { + log.debug("WebPopupServiceImpl selectWebPopup START"); + + HashMap map = new HashMap(); + + log.debug("muWebPopupId : "+paramMap.get("muWebPopupId")); + + try{ + boolean check = true; + + String muWebPopupId = String.valueOf(paramMap.get("muWebPopupId")); + + if(true != ValidationCheckUtil.emptyCheck(muWebPopupId)){ + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc","이벤트 식별자 정보가 없습니다."); + } + + if(true == check){ + List> listMap = webPopupSqlMapDAO.selectWebPopup(paramMap); + int listMapSize = listMap.size(); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + map.put("rows",listMap); + + } + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebPopupServiceImpl selectWebPopup END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java b/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java new file mode 100644 index 0000000..6253fc3 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java @@ -0,0 +1,12 @@ +package com.madeuhome.service.web.webservice; + +import java.util.HashMap; + +public interface WebServiceService { + public HashMap selectListWebCategory(HashMap paramMap) throws Exception; + public HashMap selectListWebService(HashMap paramMap) throws Exception; + public HashMap selectServiceDetail(HashMap paramMap) throws Exception; + public HashMap selectReservation(HashMap paramMap) throws Exception; + public HashMap selectReservationCnt(HashMap paramMap) throws Exception; + public HashMap insertReservation(HashMap paramMap) throws Exception; +} diff --git a/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java b/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java new file mode 100644 index 0000000..0a6f84c --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java @@ -0,0 +1,295 @@ +package com.madeuhome.service.web.webservice.impl; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webservice.WebServiceSqlMapDAO; +import com.madeuhome.service.web.webservice.WebServiceService; +import com.madeuhome.util.OkHttpService; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service("WebServiceService") +public class WebServiceServiceImpl implements WebServiceService{ + + @Autowired + private WebServiceSqlMapDAO webServiceSqlMapDAO; + + @Value("${url.old-crm-php}") + private String ocp; + + /** + * 시술 정보 카테고리 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebCategory(HashMap paramMap) throws Exception { + log.debug("WebServiceServiceImpl selectListWebCategory START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webServiceSqlMapDAO.selectListWebCategory(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebServiceServiceImpl selectListWebCategory END"); + return map; + } + + /** + * 시술 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebService(HashMap paramMap) throws Exception { + log.debug("WebServiceServiceImpl selectListWebService START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webServiceSqlMapDAO.selectListWebService(paramMap); + + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebServiceServiceImpl selectListWebService END"); + return map; + } + + /** + * 시술 정보 상세 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectServiceDetail(HashMap paramMap) throws Exception { + log.debug("WebServiceServiceImpl selectServiceDetail START"); + + HashMap map = new HashMap(); + + try{ + //상세 내용 + Map listMap = webServiceSqlMapDAO.selectServiceDetail(paramMap); + map.put("rows",listMap); + //시술 목록 + List> listServiceMap = webServiceSqlMapDAO.selectListService(paramMap); + map.put("price",listServiceMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebServiceServiceImpl selectServiceDetail END"); + return map; + } + + /** + * 예약 정보 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectReservation(HashMap paramMap) throws Exception { + log.debug("WebServiceServiceImpl selectReservation START"); + HashMap map = new HashMap(); + + try{ + //예약 목록 + List> listMap2 = new ArrayList>(); + + if(paramMap.get("PROCEDURE_ID").toString().indexOf(",") != -1) { + String[] PROCEDURE_ID = paramMap.get("PROCEDURE_ID").toString().split(","); + + for(int i = 0; i < PROCEDURE_ID.length; i++) { + HashMap map2 = new HashMap(); + map2.put("PROCEDURE_ID", PROCEDURE_ID[i]); + listMap2.add(webServiceSqlMapDAO.selectReservationService(map2)); + } + }else { + listMap2.add(webServiceSqlMapDAO.selectReservationService(paramMap)); + } + map.put("reservation",listMap2); + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebServiceServiceImpl selectReservation END"); + return map; + } + + /** + * 예약 정보 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectReservationCnt(HashMap paramMap) throws Exception { + log.debug("WebServiceServiceImpl selectReservationCnt START"); + + HashMap map = new HashMap(); + + try{ + //상세 내용 + Map listMap = webServiceSqlMapDAO.selectReservationCnt(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebServiceServiceImpl selectReservationCnt END"); + return map; + } + + /** + * 예약 정보 저장 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap insertReservation(HashMap paramMap) throws Exception { + log.debug("WebServiceServiceImpl insertReservation START"); + HashMap map = new HashMap(); + try{ + String muReserveId = ("R").concat(String.valueOf(System.currentTimeMillis())); + paramMap.put("muReserveId",muReserveId); + ArrayList userRequest = new ArrayList(); + // TREATMENT_INFOS 파라미터가 있으면 파싱하여 P_변수명으로 세팅 후 insertReservation 호출 + if(paramMap.get("TREATMENT_INFOS") != null) { + ObjectMapper objectMapper = new ObjectMapper(); + List> treatmentList = objectMapper.readValue(paramMap.get("TREATMENT_INFOS").toString(), new TypeReference>>(){}); + for(Map t : treatmentList) { + paramMap.put("P_TREATMENT_ID", t.get("MU_TREATMENT_ID")); + paramMap.put("P_TREATMENT_NM", t.get("TREATMENT_NAME")); + paramMap.put("P_PROCEDURE_ID", t.get("MU_TREATMENT_PROCEDURE_ID")); + paramMap.put("P_PROCEDURE_NM", t.get("TREATMENT_PROCEDURE_NAME")); + userRequest.add((String) t.get("TREATMENT_PROCEDURE_NAME")); + webServiceSqlMapDAO.insertReservation(paramMap); + } + } else { + // 기존 방식대로 단일 시술 정보로 처리 + paramMap.put("P_TREATMENT_ID", paramMap.get("MU_TREATMENT_ID")); + paramMap.put("P_TREATMENT_NM", paramMap.get("TREATMENT_NAME")); + paramMap.put("P_PROCEDURE_ID", paramMap.get("MU_TREATMENT_PROCEDURE_ID")); + paramMap.put("P_PROCEDURE_NM", paramMap.get("TREATMENT_PROCEDURE_NAME")); + userRequest.add((String) paramMap.get("TREATMENT_PROCEDURE_NAME")); + webServiceSqlMapDAO.insertReservation(paramMap); + } + + Map formData = new HashMap<>(); + formData.put("visitorName", (String) paramMap.get("NAME")); + formData.put("visitorPhone", (String) paramMap.get("PHONE_NUMBER")); + + String strUserRequest = "[선택시술]:" + userRequest.stream().collect(Collectors.joining(", ")); + String birthDate = "[생년월일]:" + paramMap.get("BIRTH_DATE"); + String reqTxt = "[요청사항]:" + (String) paramMap.get("ETC"); + formData.put("userRequest", strUserRequest + "\n" + birthDate + "\n" + reqTxt); + String time = (String) paramMap.get("TIME"); + String date = (String) paramMap.get("SELECTED_DATE"); + String dateTime = date + " " + time; + formData.put("datetime", dateTime); + + Map detailMap = webServiceSqlMapDAO.selectServiceDetail(paramMap); + + formData.put("itemName", "[홈페이지] 다이어트센터"); + // 구CRM 연동ID가 없을 경우 모두 (재방문) 다이어트 센터 + String oldCrmItemId = (String) detailMap.get("oldCrmItemId") == null ? "NBI-2WlrXQdl-esws-5aA5-al7z-d7HwxL9tX0YF" : (String) detailMap.get("oldCrmItemId"); + formData.put("itemID", oldCrmItemId); + + formData.put("etcText", "[진료]:" + (String) detailMap.get("CATEGORY_NM")); + + + // OLD CRM으로 예약정보 POST + /** + * //시술정보(상품명 , 상품ID) + 상품명 : 메쉬다주사(지방분해주사) + 상품 ID : NBI-1M0JEq5C-b8LM-4W0V-9YxZ-Z5r9XWJpIVEZ + + 피부 & 쁘띠센터 + NBI-4aJSJ67P-f0ID-4xds-aReQ-MnhfErLts0HP + + 프리미엄 레이저 리프팅 + NBI-1iPCWjih-2TDk-4NG3-ci56-tK7dgxxAT6dU + + (첫방문) 다이어트 센터 + NBI-1Q8doiCm-qzTh-4imi-9lsK-6YDslUzIK2OO + + (재방문) 다이어트 센터 + NBI-2WlrXQdl-esws-5aA5-al7z-d7HwxL9tX0YF + + 탈모약 + NBI-Nz00si0r-DkGc-5hdd-bs27-SLn0KHlHflS8 + + 비만치료제 위고비 + NBI-2nJnTFVm-ieDy-4TNQ-czDK-Ll9FyixFr7zn + **/ + OkHttpService.postFormData(ocp, formData); + + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + System.out.println("[insertReservation] paramMap: " + paramMap); + log.debug("WebServiceServiceImpl insertReservation END"); + return map; + } + +} \ No newline at end of file diff --git a/src/main/java/com/madeuhome/service/web/webvoc/WebVOCService.java b/src/main/java/com/madeuhome/service/web/webvoc/WebVOCService.java new file mode 100644 index 0000000..04045db --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webvoc/WebVOCService.java @@ -0,0 +1,9 @@ +package com.madeuhome.service.web.webvoc; + +import java.util.HashMap; + +public interface WebVOCService { + public HashMap selectPhoneAuthCheck(HashMap paramMap) throws Exception; + public HashMap insertPhoneAuth(HashMap paramMap) throws Exception; + public HashMap insertVOC(HashMap paramMap) throws Exception; +} diff --git a/src/main/java/com/madeuhome/service/web/webvoc/impl/WebVOCServiceImpl.java b/src/main/java/com/madeuhome/service/web/webvoc/impl/WebVOCServiceImpl.java new file mode 100644 index 0000000..867b5e6 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webvoc/impl/WebVOCServiceImpl.java @@ -0,0 +1,284 @@ +package com.madeuhome.service.web.webvoc.impl; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webvoc.WebVOCSqlMapDAO; +import com.madeuhome.service.web.webvoc.WebVOCService; +import com.madeuhome.util.ValidationCheckUtil; +import com.popbill.api.MessageService; +import com.popbill.api.PopbillException; +import com.popbill.api.message.Message; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service("WebVOCService") +public class WebVOCServiceImpl implements WebVOCService{ + + @Autowired + private WebVOCSqlMapDAO webVOCSqlMapDAO; + /*Popbill*/ + @Autowired + private MessageService messageService; + + @Value("${corpNum}") + String corpNum; + + @Value("${userId}") + String userId; + + @Value("${senderName}") + String senderName; + + @Value("${senderPhoneNumber}") + String senderPhoneNumber; + + + /** + * 휴대폰 인증 확인 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectPhoneAuthCheck(HashMap paramMap) throws Exception { + log.debug("MobilePhoneAuthServiceImpl selectPhoneAuthCheck START"); + + HashMap map = new HashMap(); + + log.debug("phoneNumber : " + paramMap.get("phoneNumber")); + log.debug("authNumber : " + paramMap.get("authNumber")); + + try { + boolean check = true; + + String phoneNumber = String.valueOf(paramMap.get("phoneNumber")); + String authNumber = String.valueOf(paramMap.get("authNumber")); + + if (true != ValidationCheckUtil.emptyCheck(phoneNumber)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "핸드폰 번호 정보가 없습니다."); + } + + if (true != ValidationCheckUtil.emptyCheck(authNumber)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "인증번호정보가 없습니다."); + } + + if (check == true) { + + List> listMap = webVOCSqlMapDAO.selectPhoneAuthCheck(paramMap); + int cnt = Integer.parseInt(String.valueOf(listMap.get(0).get("successCount"))); + + if(cnt>0) { + map.put("msgCode", Constants.OK); + map.put("msgDesc", "인증되었습니다."); + }else { + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "인증번호가 다릅니다. 다시 입력해주세요."); + } + } + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("MobilePhoneAuthServiceImpl selectPhoneAuthCheck END"); + return map; + } + + /** + * 인증번호 등록(SMS 발송) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) + public HashMap insertPhoneAuth(HashMap paramMap) throws Exception { + + log.debug("MobilePhoneAuthServiceImpl insertPhoneAuth START"); + + HashMap map = new HashMap(); + + log.debug("phoneNumber : " + paramMap.get("phoneNumber")); + log.debug("authType : " + paramMap.get("authType")); + + try { + boolean check = true; + + String phoneNumber = String.valueOf(paramMap.get("phoneNumber")); + + if (true != ValidationCheckUtil.emptyCheck(phoneNumber)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "연락처 정보가 없습니다."); + } + + // 최대 5회 발송확인. +// if (check == true) { +// List> selectListPhoneAuthCountToday = mobilePhoneAuthSqlMapDAO.selectListPhoneAuthCountToday(paramMap); +// +// int authSendCount = Integer.parseInt(String.valueOf(selectListPhoneAuthCountToday.get(0).get("totalCount"))); +// +// if (authSendCount >= 5) { +// check = false; +// map.put("msgCode", Constants.FAIL); +// map.put("msgDesc", "일일 인증횟수가 초과되었습니다."); +// } +// } + + if (check == true) { + //SMS 환경설정 정보 호 출 : 팝빌회원 사업자번호, 팝빌회원 아이디, 발신자명, 발신번호, TEST(수신번호), 인증번호 + String receiverNumber = String.valueOf(paramMap.get("phoneNumber")); //테스트 후 paramMap.get("phoneNumber")로 변경; + String tId = String.valueOf(System.currentTimeMillis()); + int authNumber = (int) (Math.random() * (9999 - 1000 + 1)) + 1000; + String message = "[인증번호:"+authNumber+"] 메이드유 인증번호입니다."; + + log.debug("corpNum :"+corpNum); + log.debug("userId :"+userId); + log.debug("senderName :"+senderName); + log.debug("senderPhoneNumber :"+senderPhoneNumber); + log.debug("receiverNumber :"+receiverNumber); + log.debug("authNumber :"+authNumber); + + //SMS 등록 + HashMap insertSmsParamMap = new HashMap(); + insertSmsParamMap.put("id", ("S").concat(String.valueOf(System.currentTimeMillis()))); + insertSmsParamMap.put("senderPhoneNumber",senderPhoneNumber); + insertSmsParamMap.put("receiverNumber",receiverNumber); + insertSmsParamMap.put("content",message); + insertSmsParamMap.put("state","R"); + insertSmsParamMap.put("popbillState","0"); + insertSmsParamMap.put("popbillResult",""); + insertSmsParamMap.put("regId", paramMap.get("regId")); + insertSmsParamMap.put("modId", paramMap.get("modId")); + insertSmsParamMap.put("tId", tId); + webVOCSqlMapDAO.insertSms(insertSmsParamMap); + + //PHONE AUTH 등록 + HashMap insertPhoneAuthParamMap = new HashMap(); + insertPhoneAuthParamMap.put("id", ("PA").concat(String.valueOf(System.currentTimeMillis()))); + insertPhoneAuthParamMap.put("muSmsId", insertSmsParamMap.get("id")); + insertPhoneAuthParamMap.put("phoneNumber", paramMap.get("phoneNumber")); + insertPhoneAuthParamMap.put("authType", paramMap.get("authType")); //JN : 회원가입 ID: 아이디찾기, PW: 비밀번호 찾기, EM: 이메일 변경 + insertPhoneAuthParamMap.put("authNumber", authNumber); + insertSmsParamMap.put("tId", tId); + webVOCSqlMapDAO.insertPhoneAuth(insertPhoneAuthParamMap); + + // sms 상태 수정 + HashMap smsStateParamMap = new HashMap(); + smsStateParamMap.put("muSmsId", insertSmsParamMap.get("id")); + smsStateParamMap.put("state", "G"); + webVOCSqlMapDAO.updateSmsState(smsStateParamMap); + + + Message[] messages = new Message[1]; + + Message msg = new Message(); + msg.setSender(senderPhoneNumber); //발신번호 + msg.setSenderName(senderName); //발신자명 + msg.setReceiver(receiverNumber); //수신번호 + msg.setReceiverName(""); //수신자명 + msg.setContent(message); //메시지내용 + + messages[0] = msg; + + String receiptNum = ""; + + // 예약전송일시, null 처리시 즉시전송 + Date reserveDT = null; + // 광고문자 전송여부 + Boolean adsYN = false; + + // 전송요청번호 + // 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용. + // 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당. + String requestNum = ""; + + try { + receiptNum = messageService.sendSMS(corpNum, senderPhoneNumber, message, messages, reserveDT, adsYN, userId, requestNum); + + log.debug("receiptNum",receiptNum); + + } catch (PopbillException e) { + log.debug("오류 코드 :" + e.getCode()); + log.debug("오류 메시지 :" + e.getMessage()); + } + + // sms 상태 수정 + smsStateParamMap = new HashMap(); + smsStateParamMap.put("muSmsId", insertSmsParamMap.get("id")); + smsStateParamMap.put("state", "Y"); + webVOCSqlMapDAO.updateSmsState(smsStateParamMap); + + map.put("msgCode", Constants.OK); + map.put("msgDesc", "발송되었습니다."); + } + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("MobilePhoneAuthServiceImpl insertPhoneAuth END"); + return map; + } + + /** + * 접수 등록 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) + public HashMap insertVOC(HashMap paramMap) throws Exception { + + log.debug("MobilePhoneAuthServiceImpl insertVOC START"); + + HashMap map = new HashMap(); + + + try { + boolean check = true; + + String phoneNumber = String.valueOf(paramMap.get("phoneNumber")); + + if (true != ValidationCheckUtil.emptyCheck(phoneNumber)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "연락처 정보가 없습니다."); + } + + + if (check == true) { + webVOCSqlMapDAO.insertVOC(paramMap); + + + map.put("msgCode", Constants.OK); + map.put("msgDesc", "접수되었습니다."); + } + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("MobilePhoneAuthServiceImpl insertVOC END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/service/web/webyoutube/WebYoutubeService.java b/src/main/java/com/madeuhome/service/web/webyoutube/WebYoutubeService.java new file mode 100644 index 0000000..7c04308 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webyoutube/WebYoutubeService.java @@ -0,0 +1,9 @@ +package com.madeuhome.service.web.webyoutube; + +import java.util.HashMap; + + +public interface WebYoutubeService { + + public HashMap selectListWebYoutube(HashMap paramMap) throws Exception; +} diff --git a/src/main/java/com/madeuhome/service/web/webyoutube/impl/WebYoutubeServiceImpl.java b/src/main/java/com/madeuhome/service/web/webyoutube/impl/WebYoutubeServiceImpl.java new file mode 100644 index 0000000..8947a1d --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/webyoutube/impl/WebYoutubeServiceImpl.java @@ -0,0 +1,51 @@ +package com.madeuhome.service.web.webyoutube.impl; + +import com.madeuhome.constants.Constants; +import com.madeuhome.dao.web.webyoutube.WebYoutubeSqlMapDAO; +import com.madeuhome.service.web.webyoutube.WebYoutubeService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Slf4j +@Service("WebYoutubeService") +public class WebYoutubeServiceImpl implements WebYoutubeService { + + @Autowired + private WebYoutubeSqlMapDAO webYoutubeSqlMapDAO; + + /** + * 유튜브 정보 리스트 조회 (List) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectListWebYoutube( + HashMap paramMap) throws Exception { + log.debug("WebYoutubeServiceImpl selectListWebYoutube START"); + + HashMap map = new HashMap(); + + try{ + List> listMap = webYoutubeSqlMapDAO.selectListWebYoutube(paramMap); + map.put("rows",listMap); + + map.put("msgCode", Constants.OK); + map.put("success","true"); + + }catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebYoutubeServiceImpl selectListWebYoutube END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/util/HttpUtil.java b/src/main/java/com/madeuhome/util/HttpUtil.java new file mode 100644 index 0000000..cc76868 --- /dev/null +++ b/src/main/java/com/madeuhome/util/HttpUtil.java @@ -0,0 +1,61 @@ +package com.madeuhome.util; + +import com.google.gson.Gson; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.ModelAndView; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.Enumeration; +import java.util.HashMap; + +public class HttpUtil { + public static ModelAndView makeHashToJsonModelAndView( + final HashMap map) { + Gson gson = new Gson(); + ModelAndView mnv = new ModelAndView(); + mnv.setViewName("/notification"); + mnv.addObject("message", gson.toJson(map)); + + return mnv; + } + + public static void sendResponceToJson(HttpServletResponse response, + final HashMap map) { + response.setContentType("application/json; charset=utf-8"); + + Gson gson = new Gson(); + try { + response.getWriter().write(gson.toJson(map)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static HashMap getParameterMap( + HttpServletRequest request) { + HashMap parameterMap = new HashMap(); + Enumeration enums = request.getParameterNames(); + while (enums.hasMoreElements()) { + String paramName = (String) enums.nextElement(); + String[] parameters = request.getParameterValues(paramName); + + // Parameter가 배열일 경우 + if (parameters.length > 1) { + parameterMap.put(paramName, parameters); + // Parameter가 배열이 아닌 경우 + } else { + try { + parameters[0] = parameters[0].replaceAll("%", "%25"); + parameterMap.put(paramName, URLDecoder.decode(parameters[0],"UTF-8")); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + return parameterMap; + } +} diff --git a/src/main/java/com/madeuhome/util/OkHttpService.java b/src/main/java/com/madeuhome/util/OkHttpService.java new file mode 100644 index 0000000..c594fa4 --- /dev/null +++ b/src/main/java/com/madeuhome/util/OkHttpService.java @@ -0,0 +1,52 @@ +package com.madeuhome.util; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.springframework.stereotype.Component; + +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +@Component +public class OkHttpService { + private static final OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .build(); + + /** + * Form-data POST 요청 + * @param url 요청 URL + * @param formData 폼 데이터 + * @return 응답 문자열 + * @throws IOException 요청 실패시 + */ + public static String postFormData(String url, Map formData) throws IOException { + MultipartBody.Builder builder = new MultipartBody.Builder() + .setType(MultipartBody.FORM); + + // 폼 데이터 추가 + for (Map.Entry entry : formData.entrySet()) { + if (entry.getValue() != null) { + builder.addFormDataPart(entry.getKey(), entry.getValue()); + } + } + + Request request = new Request.Builder() + .url(url) + .post(builder.build()) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new IOException("HTTP Error: " + response.code() + " " + response.message()); + } + return response.body().string(); + } + } +} diff --git a/src/main/java/com/madeuhome/util/RequestLogUtil.java b/src/main/java/com/madeuhome/util/RequestLogUtil.java new file mode 100644 index 0000000..7c3d11b --- /dev/null +++ b/src/main/java/com/madeuhome/util/RequestLogUtil.java @@ -0,0 +1,210 @@ +package com.madeuhome.util; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Slf4j +public class RequestLogUtil { + + /** + * 접속 로그 저장 + * @param request + * @param + * @throws Exception + */ + // https://linked2ev.github.io/java/2019/05/22/JAVA-1.-java-get-clientIP/ + public static HashMap getVisitLogParameterMap(HttpServletRequest request) { + + String visitIp = getClientIP(request); + String visitReferDomain = getClientDomainName(request); + String visitRefer = getClientDomain(request); + String visitOriginAgent = getClientAgent(request); + String visitAgent = getClientBrower(request); + String visitOs = getClientOS(request); + + + // pushHistory에 저장. + HashMap visitLogParamMap = new HashMap(); + visitLogParamMap.put("type", "A"); // 관리자에서 로그 등록 + visitLogParamMap.put("visitIp", visitIp); + visitLogParamMap.put("visitReferDomain", visitReferDomain); + visitLogParamMap.put("visitRefer", visitRefer); + visitLogParamMap.put("visitOriginAgent", visitOriginAgent); + visitLogParamMap.put("visitAgent", visitAgent); + visitLogParamMap.put("visitOs", visitOs); + + return visitLogParamMap; + } + + /** + * 접속자 IP + * @param request + * @param + * @throws Exception + */ + // https://linked2ev.github.io/java/2019/05/22/JAVA-1.-java-get-clientIP/ + public static String getClientIP(HttpServletRequest request) { + String ip = request.getHeader("X-Forwarded-For"); + log.debug("> X-FORWARDED-FOR : " + ip); + + if (ip == null) { + ip = request.getHeader("Proxy-Client-IP"); + log.debug("> Proxy-Client-IP : " + ip); + } + if (ip == null) { + ip = request.getHeader("WL-Proxy-Client-IP"); + log.debug("> WL-Proxy-Client-IP : " + ip); + } + if (ip == null) { + ip = request.getHeader("HTTP_CLIENT_IP"); + log.debug("> HTTP_CLIENT_IP : " + ip); + } + if (ip == null) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + log.debug("> HTTP_X_FORWARDED_FOR : " + ip); + } + if (ip == null) { + ip = request.getRemoteAddr(); + log.debug("> getRemoteAddr : "+ip); + } + + log.debug("Result : IP Address : "+ip); + + return ip; + } + + /** + * 접속자 Agent + * @param request + * @param + * @throws Exception + */ + public static String getClientAgent(HttpServletRequest request) { + String agent = request.getHeader("User-Agent"); + + log.debug("Result : agent : "+agent); + + return agent; + } + + /** + * 접속자 브라우저 + * @param request + * @param + * @throws Exception + */ + public static String getClientBrower(HttpServletRequest request) { + String agent = request.getHeader("User-Agent"); + + String brower = null; + + if (agent != null) { + if (agent.indexOf("Trident") > -1) { + brower = "MS IE"; + } else if (agent.indexOf("Edg") > -1) { + brower = "MS Edg"; + }else if (agent.indexOf("KAKAOTALK") > -1) { + brower = "KAKAOTALK"; + } else if (agent.indexOf("Chrome") > -1) { + brower = "Chrome"; + } else if (agent.indexOf("Safari") > -1) { + brower = "Safari"; + } else if (agent.indexOf("Opera") > -1) { + brower = "Opera"; + } + } + + log.debug("Result : brower : "+brower); + + return brower; + } + + /** + * 접속자 OS + * @param request + * @param + * @throws Exception + */ + public static String getClientOS(HttpServletRequest request) { + String agent = request.getHeader("User-Agent"); + + // OS 구분 + String os = null; + + if(agent.indexOf("Android") != -1) { + os = "Android"; + }else if(agent.indexOf("iPhone") != -1) { + os = "iPhone"; + }else if(agent.indexOf("Linux") != -1) { + os = "Linux"; + }else if(agent.indexOf("Mac OS") != -1) { + os = "Mac OS"; + }else if(agent.indexOf("Windows") != -1) { + os = "Windows"; + }else { + os = "etc"; + } + + log.debug("Result : OS : "+os); + + return os; + } + + /** + * 접속자 도메인(REFER) + * @param request + * @param + * @throws Exception + */ + public static String getClientDomain(HttpServletRequest request) { + + String referer = request.getHeader("REFERER"); + + log.debug("Result : Referer : "+referer); + + return referer; + } + + /** + * 접속자 도메인(REFER에서 도메인명만 추출) + * @param request + * @param + * @throws Exception + */ + public static String getClientDomainName(HttpServletRequest request) { + + String referer = request.getHeader("REFERER"); + + log.debug("Referer : "+referer); + + if(referer==null||referer.equals("")) { + return null; + } + + String result=""; + Pattern urlPattern = Pattern.compile("^(https?):\\/\\/([^:\\/\\s]+)(:([^\\/]*))?((\\/[^\\s/\\/]+)*)?\\/([^#\\s\\?]*)(\\?([^#\\s]*))?(#(\\w*))?$"); + Matcher m = urlPattern.matcher(referer); + + if (m.matches()) { + /*for(int i=0; i<=m.groupCount();i++) { + System.out.println(m.group(i)); + }*/ + + if(m.groupCount()>=2){ + result = m.group(2); + } + + if(result.contains("www.")) { + result = result.substring(4, result.length()); + } + } + + log.debug("Result : domainName : "+result); + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/com/madeuhome/util/SecurityUtil.java b/src/main/java/com/madeuhome/util/SecurityUtil.java new file mode 100644 index 0000000..4407398 --- /dev/null +++ b/src/main/java/com/madeuhome/util/SecurityUtil.java @@ -0,0 +1,39 @@ +package com.madeuhome.util; + + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class SecurityUtil { + + public static String encryptSHA256(String str) { + + String sha = ""; + try { + MessageDigest sh = MessageDigest.getInstance("SHA-256"); + sh.update(str.getBytes()); + byte byteData[] = sh.digest(); + StringBuffer sb = new StringBuffer(); + for(int i = 0; i < byteData.length; i++) { + sb.append(Integer.toString((byteData[i]&0xff) + 256, 16).substring(1)); + } + sha = sb.toString(); + } catch (NoSuchAlgorithmException e) { + sha = null; + } + + + return sha; + } + + + public static void main(String[] args){ + try { + + System.out.println("encryptSHA256 : "+ encryptSHA256("1234")); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/madeuhome/util/ValidationCheckUtil.java b/src/main/java/com/madeuhome/util/ValidationCheckUtil.java new file mode 100644 index 0000000..68ec66b --- /dev/null +++ b/src/main/java/com/madeuhome/util/ValidationCheckUtil.java @@ -0,0 +1,101 @@ +package com.madeuhome.util; + +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.regex.Pattern; + +@Slf4j +public class ValidationCheckUtil { + + public static Boolean emptyCheck(String value){ + if(null==value||("").equals(value)||("null").equals(value)||("NULL").equals(value)||("undefined").equals(value)) { + return false; + }else{ + return true; + } + } + + public static Boolean lengthCheck(String value, int maxLength){ + int strLength = value.length(); + log.debug("strLength : "+strLength); + + if(strLength > maxLength) { + return false; + }else{ + return true; + } + } + + public static Boolean dateCheck(String value){ + + try{ + int strLength = value.length(); + log.debug("strLength : "+strLength); + + if(strLength == 10){ + SimpleDateFormat dateFormatParser = new SimpleDateFormat("yyyy-MM-dd"); + dateFormatParser.setLenient(false); + dateFormatParser.parse(value); + + return true; + }else{ + return false; + } + + }catch (Exception e){ + return false; + } + } + + public static Boolean dateTimeCheck(String value){ + + try{ + int strLength = value.length(); + log.debug("strLength : "+strLength); + + if(strLength == 16){ + SimpleDateFormat dateFormatParser = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + dateFormatParser.setLenient(false); + dateFormatParser.parse(value); + + return true; + }else{ + return false; + } + + }catch (Exception e){ + return false; + } + } + + public static boolean phoneCheck(String str) { + return Pattern.matches("^\\d{2,3}\\d{3,4}\\d{4}$", str); + } + + // 이메일 검사기 + public static boolean emailCheck(String str) { + return Pattern.matches("^[a-z0-9A-Z._-]*@[a-z0-9A-Z]*.[a-zA-Z.]*$", str); + } + + public static boolean passwordCheck(String str) { + return Pattern.matches("(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z\\d]{9,16}$", str); + } + public static void main(String[] args){ + + try { + boolean emptyCheck = ValidationCheckUtil.emptyCheck("484651984561"); + boolean lengthCheck = ValidationCheckUtil.lengthCheck("길이체크", 255); + boolean dateCheck = ValidationCheckUtil.dateCheck("2022-03-01"); + boolean dateTimeCheck = ValidationCheckUtil.dateTimeCheck("2022-03-01 12:11"); + + log.debug("emptyCheck : "+emptyCheck); + log.debug("lengthCheck : "+lengthCheck); + log.debug("dateCheck : "+dateCheck); + log.debug("dateTimeCheck : "+dateTimeCheck); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..2df2d4e --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,16 @@ +spring: + datasource: + hikari: + driver-class-name: org.mariadb.jdbc.Driver + jdbc-url: jdbc:mariadb://vara.iptime.org:3306/madeu + username: madeu + password: madeu12#$ + +url: + cdn: http://dcrm.vara.co.kr/cdn/ + old-crm-php: http://crm.madeu.co.kr/add-booking-home.php + +madeu: + logo: + size800x450: http://crm.vara.co.kr/cdn/logo_800x450.png + diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..5d14eee --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,16 @@ +spring: + datasource: + hikari: + driver-class-name: org.mariadb.jdbc.Driver + jdbc-url: jdbc:mariadb://183.98.184.84:3306/madeu + username: madeu + password: apdlemdb12#$ + +url: + cdn: http://crm.vara.co.kr/cdn/ + old-crm-php: http://crm.madeu.co.kr/add-booking-home.php + +madeu: + logo: + size800x450: http://crm.vara.co.kr/cdn/logo_800x450.png + diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..f41083f --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,16 @@ +spring: + datasource: + hikari: + driver-class-name: org.mariadb.jdbc.Driver + jdbc-url: jdbc:mariadb://localhost:3306/madeu + username: madeu + password: apdlemdb12#$ + +url: + cdn: https://crm.vara.co.kr/cdn/ + old-crm-php: http://crm.madeu.co.kr/add-booking-home.php + +madeu: + logo: + size800x450: http://crm.vara.co.kr/cdn/logo_800x450.png + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..da50a9e --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,53 @@ +# 공통 설정 +spring: + profiles: + active: local + thymeleaf: + prefix: classpath:templates/ + suffix: .html + cache: false + check-template-location: true + servlet: + multipart: + maxFileSize: 500MB + maxRequestSize: 500MB + +server: + port: 8081 + compression: + enabled: true + server-header: server + error: + whitelabel: + enabled: false + path: /error/errorIntro.do + servlet: + session: + timeout: -1 + + + +mybatis: + type-aliases-package: com.entree + mapper-locations: mybatis/mappers/*.xml + configuration: + map-underscore-to-camel-case: true + +# Popbill 설정 +popbill: + link-id: NTSOFT + secret-key: Wha5GNilXotCWzsZFj4c1VAvFv3pSlnNog5zpZlxsZc= + is-test: false + is-ip-restrict-on-off: false + use-static-ip: false + use-local-time-yn: true + +corpNum: 4901201321 +userId: chanseul +senderName: madeu +senderPhoneNumber: 025474711 + +# Instagram 설정 +instagram: + client-id: 17841468400622116 + accesstoken: IGAAMzYDUuoLJBZAE04bnBiaHFicnBybGJrTVVYQmVBa0p0WV9XNVRXLUpiV0taTFJFelBBQTZAoeXhxckpLelcwMVAyQ1VMdGhpUUhydWZAnYWpJSXFGeXozcGNMOFFmWGEtTXRxWHFDMUpJRkcycGoxT2o5MlppY09mRWhNVUVxOAZDZD \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..1fb399a --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,63 @@ + + + + + /usr/local/apache-tomcat-10.1.11/logs/madeuhome + [%date{yyyy-MM-dd HH:mm:ss}] %level %log{36}(%file:%line) - %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/LogHistorySqlMap.xml b/src/main/resources/mappers/LogHistorySqlMap.xml new file mode 100644 index 0000000..f2ef9a0 --- /dev/null +++ b/src/main/resources/mappers/LogHistorySqlMap.xml @@ -0,0 +1,63 @@ + + + + + + SELECT CONCAT(#{muLogHistoryId},LPAD((SELECT NEXTVAL(MU_LOG_HISTORY_SEQ)), 11, 0)) + + INSERT INTO MU_LOG_HISTORY( + MU_LOG_HISTORY_ID + ,MU_MEMBER_ID + ,VISIT_IP + ,VISIT_ORIGIN_AGENT + ,VISIT_AGENT + ,VISIT_OS + ,URL + ,FUNC + ,SERVICE + ,FUNC_NAME + ,SERVICE_NAME + ,REQUEST_VALUE + ,RESPONSE_VALUE + ,RESULT_CODE + ,RESULT_MSG + ,WRITE_DATE + ,WRITE_TIME + ,CUD_FLAG + ,USE_YN + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + ,T_ID + ,T_DATE + )VALUES( + #{id} + ,#{muMemberId} + ,#{visitIp,jdbcType=VARCHAR} + ,#{visitOriginAgent,jdbcType=VARCHAR} + ,#{visitAgent,jdbcType=VARCHAR} + ,#{visitOs,jdbcType=VARCHAR} + ,#{url,jdbcType=VARCHAR} + ,#{func,jdbcType=VARCHAR} + ,#{service,jdbcType=VARCHAR} + ,#{funcName,jdbcType=VARCHAR} + ,#{serviceName,jdbcType=VARCHAR} + ,#{requestValue} + ,#{responseValue} + ,#{resultCode,jdbcType=VARCHAR} + ,#{resultMsg,jdbcType=VARCHAR} + ,CURDATE() + ,CURTIME() + ,'C' + ,'Y' + ,#{regId} + ,NOW() + ,#{modId} + ,NOW() + ,#{tId} + ,#{tDate} + ) + + + \ No newline at end of file diff --git a/src/main/resources/mappers/VisitLogSqlMap.xml b/src/main/resources/mappers/VisitLogSqlMap.xml new file mode 100644 index 0000000..56bbecc --- /dev/null +++ b/src/main/resources/mappers/VisitLogSqlMap.xml @@ -0,0 +1,42 @@ + + + + + + + SELECT CONCAT(#{tyVisitLogId},LPAD((SELECT NEXTVAL('TY_VISIT_LOG_SEQ')), 10, 0)) + + INSERT INTO TY_VISIT_LOG( + TY_VISIT_LOG_ID + ,TY_USER_ID + ,TYPE + ,VISIT_IP + ,VISIT_REFER_DOMAIN + ,VISIT_REFER + ,VISIT_ORIGIN_AGENT + ,VISIT_AGENT + ,VISIT_OS + ,VISIT_DATE + ,WORK_TYPE + ,USE_YN + ,REG_ID + ,REG_DATE + )VALUES( + #{id} + ,#{muMemberId, jdbcType=VARCHAR} + ,#{type, jdbcType=VARCHAR} + ,#{visitIp, jdbcType=VARCHAR} + ,#{visitReferDomain, jdbcType=VARCHAR} + ,#{visitRefer, jdbcType=VARCHAR} + ,#{visitOriginAgent, jdbcType=VARCHAR} + ,#{visitAgent, jdbcType=VARCHAR} + ,#{visitOs, jdbcType=VARCHAR} + ,NOW() + ,#{workType, jdbcType=VARCHAR} + ,'Y' + ,#{regId} + ,NOW() + ) + + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebEventSqlMap.xml b/src/main/resources/mappers/WebEventSqlMap.xml new file mode 100644 index 0000000..5a53375 --- /dev/null +++ b/src/main/resources/mappers/WebEventSqlMap.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT CONCAT(#{muReserveId},LPAD((SELECT NEXTVAL(MU_RESERVE_SEQ)), 11, 0)) + + INSERT INTO MU_RESERVE( + MU_RESERVE_ID + ,USER_NAME + ,PHONE_NUMBER + ,RESERVE_DATE + ,RESERVE_TIME + ,MU_TREATMENT_ID + ,TREATMENT_NAME + ,MU_TREATMENT_PROCEDURE_ID + ,TREATMENT_PROCEDURE_NAME + ,ETC + ,STATUS + ,STATUS2 + ,WRITE_DATE + ,WRITE_TIME + ,CUD_FLAG + ,USE_YN + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + )VALUES( + #{id} + ,#{NAME} + ,#{PHONE_NUMBER} + ,#{SELECTED_DATE} + ,#{TIME} + ,#{P_TREATMENT_ID} + ,#{P_TREATMENT_NM} + ,#{P_PROCEDURE_ID} + ,#{P_PROCEDURE_NM} + ,#{ETC,jdbcType=VARCHAR} + ,'T' + ,'N' + ,CURDATE() + ,CURTIME() + ,'C' + ,'Y' + ,'customer' + ,NOW() + ,'customer' + ,NOW() + ) + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebMainBannerSqlMap.xml b/src/main/resources/mappers/WebMainBannerSqlMap.xml new file mode 100644 index 0000000..ffa73e1 --- /dev/null +++ b/src/main/resources/mappers/WebMainBannerSqlMap.xml @@ -0,0 +1,49 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebPhotoSqlMap.xml b/src/main/resources/mappers/WebPhotoSqlMap.xml new file mode 100644 index 0000000..3875903 --- /dev/null +++ b/src/main/resources/mappers/WebPhotoSqlMap.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebPopupSqlMap.xml b/src/main/resources/mappers/WebPopupSqlMap.xml new file mode 100644 index 0000000..24274d8 --- /dev/null +++ b/src/main/resources/mappers/WebPopupSqlMap.xml @@ -0,0 +1,45 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebServiceSqlMap.xml b/src/main/resources/mappers/WebServiceSqlMap.xml new file mode 100644 index 0000000..2084c6e --- /dev/null +++ b/src/main/resources/mappers/WebServiceSqlMap.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT CONCAT(#{muReserveId},LPAD((SELECT NEXTVAL(MU_RESERVE_SEQ)), 11, 0)) + + INSERT INTO MU_RESERVE( + MU_RESERVE_ID + ,USER_NAME + ,PHONE_NUMBER + ,RESERVE_DATE + ,RESERVE_TIME + ,MU_TREATMENT_ID + ,TREATMENT_NAME + ,MU_TREATMENT_PROCEDURE_ID + ,TREATMENT_PROCEDURE_NAME + ,ETC + ,STATUS + ,STATUS2 + ,WRITE_DATE + ,WRITE_TIME + ,CUD_FLAG + ,USE_YN + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + )VALUES( + #{id} + ,#{NAME} + ,#{PHONE_NUMBER} + ,#{SELECTED_DATE} + ,#{TIME} + ,#{P_TREATMENT_ID} + ,#{P_TREATMENT_NM} + ,#{P_PROCEDURE_ID} + ,#{P_PROCEDURE_NM} + ,#{ETC,jdbcType=VARCHAR} + ,'T' + ,'N' + ,CURDATE() + ,CURTIME() + ,'C' + ,'Y' + ,'customer' + ,NOW() + ,'customer' + ,NOW() + ) + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebVOCSqlMap.xml b/src/main/resources/mappers/WebVOCSqlMap.xml new file mode 100644 index 0000000..94da5c4 --- /dev/null +++ b/src/main/resources/mappers/WebVOCSqlMap.xml @@ -0,0 +1,183 @@ + + + + + + + SELECT CONCAT(#{id},LPAD((SELECT NEXTVAL(MU_SMS_SEQ)), 11, 0)) + + INSERT INTO MU_SMS( + MU_SMS_ID + ,MU_USER_ID + ,USER_NAME + ,RECEIVER + ,TYPE + ,TITLE + ,CONTENT + ,STATE + ,POPBILL_STATE + ,SENDER + ,WRITE_DATE + ,WRITE_TIME + ,CUD_FLAG + ,USE_YN + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + ,T_ID + ,T_DATE + ,SEND_SYS_CD + )VALUES( + #{id} + ,#{muUserId, jdbcType=VARCHAR} + ,#{userName, jdbcType=VARCHAR} + ,#{phoneNumber, jdbcType=VARCHAR} + ,#{smsType, jdbcType=VARCHAR} + ,#{title, jdbcType=VARCHAR} + ,#{content, jdbcType=VARCHAR} + ,#{state, jdbcType=VARCHAR} + ,#{popbillState, jdbcType=VARCHAR} + ,#{sender, jdbcType=VARCHAR} + ,NOW() + ,NOW() + ,'C' + ,'Y' + ,#{regId} + ,NOW() + ,#{modId} + ,NOW() + ,#{tId} + ,NOW() + ,'02' + ) + + + + UPDATE MU_SMS + SET USE_YN = 'Y' + ,MOD_ID = #{modId} + ,MOD_DATE = NOW() + ,CUD_FLAG = 'U' + ,STATE = #{chgState, jdbcType=VARCHAR} + + + ,SEND_DATE = NOW() + + + ,SEND_DATE = #{reserveDate} + + + + + + ,RECEIPT_NUMBER = #{receiptNum, jdbcType=VARCHAR} + + WHERE USE_YN = 'Y' + AND MU_SMS_ID = #{muSmsId} + AND STATE = #{oldState} + + + + UPDATE MU_SMS + SET MOD_ID = #{modId} + ,MOD_DATE = NOW() + ,CUD_FLAG = 'U' + ,POPBILL_STATE = #{state, jdbcType=VARCHAR} + ,POPBILL_RESULT = #{result, jdbcType=VARCHAR} + WHERE USE_YN = 'Y' + AND POPBILL_STATE = #{popbillState} + AND RECEIPT_NUMBER = #{receiptNumber} + AND REPLACE(RECEIVER, '-', '') = #{receiveNumber} + AND USER_NAME = #{receiveName} + + + + + + + + + + + SELECT CONCAT(#{id},LPAD((SELECT NEXTVAL(MU_PHONE_AUTH_SEQ)), 10, 0)) + + INSERT INTO MU_PHONE_AUTH ( + MU_PHONE_AUTH_ID + ,MU_SMS_ID + ,AUTH_TYPE + ,MU_USER_ID + ,PHONE_NUMBER + ,AUTH_NUMBER + ,SEND_DATE + ,WRITE_DATE + ,CUD_FLAG + ,USE_YN + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + ,T_ID + ,T_DATE + )VALUES( + #{id} + ,#{sbSmsId, jdbcType=VARCHAR} + ,#{authType, jdbcType=VARCHAR} + ,#{sbUserId, jdbcType=VARCHAR} + ,#{phoneNumber, jdbcType=VARCHAR} + ,#{authNumber, jdbcType=VARCHAR} + ,NOW() + ,NOW() + ,'C' + ,'Y' + ,'SYSTEM' + ,NOW() + ,'SYSTEM' + ,NOW() + ,#{tId} + ,NOW() + ) + + + + + + SELECT NEXTVAL(HP_CMP_CPL_BBS_SEQ) + + INSERT INTO HP_CMP_CPL_BBS ( + POST_NO + ,BRANCH_OFFICE_CD + ,MB_NAME + ,MB_HP + ,OPINION_CLASSIFICATION_CD + ,CONTENT + ,REG_DATE + )VALUES( + #{id} + ,#{gubun, jdbcType=VARCHAR} + ,#{name, jdbcType=VARCHAR} + ,#{phoneNumber, jdbcType=VARCHAR} + ,#{opinion, jdbcType=VARCHAR} + ,#{content, jdbcType=VARCHAR} + ,NOW() + ) + + \ No newline at end of file diff --git a/src/main/resources/mappers/WebYoutubeSqlMap.xml b/src/main/resources/mappers/WebYoutubeSqlMap.xml new file mode 100644 index 0000000..4620d5d --- /dev/null +++ b/src/main/resources/mappers/WebYoutubeSqlMap.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mappers/common/MenuMapper.xml b/src/main/resources/mappers/common/MenuMapper.xml new file mode 100644 index 0000000..86935da --- /dev/null +++ b/src/main/resources/mappers/common/MenuMapper.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/src/main/resources/static/css/admin/common.css b/src/main/resources/static/css/admin/common.css new file mode 100644 index 0000000..e1cc97f --- /dev/null +++ b/src/main/resources/static/css/admin/common.css @@ -0,0 +1,901 @@ +/* +Ntsoft v1.0.2 +Copyright 2021.11 NTSOFT, Inc. +*/ + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; text-shadow:none; + /*color:rgba(49, 58, 70, .8);*/ +} +svg , path {color:unset;} + +/* .box-sizing(@box-model) { + -webkit-box-sizing: @box-model; //사파리 <= 5 + -moz-box-sizing: @box-model; //파이어폭스 <= 19 + box-sizing: @box-model; +} */ + + +body {font-family: 'Pretendard', sans-serif; padding:0; margin:0; font-size:13px;} + +/*상단네비*/ +/* .navbar.navbar-default {border-radius:0; margin-bottom:0; z-index:2; position:fixed; width:100%; background-color:#2196F3; border-color:#2196F3; border:none; height:50px; min-width:590px;} +.navbar.navbar-default .container-fluid {padding-left:0; padding-right:0;} +.navbar.navbar-default .container-fluid .navbar-header {float:left; width:270px;} +.navbar.navbar-default .container-fluid .navbar-header svg {display:none;} +.navbar.navbar-default .container-fluid .navbar-header svg path {color:#fff;} +.navbar.navbar-default .container-fluid .navbar-collapse{display:block; width:calc(100% - 270px); float:right; border:none; padding:0 10px;} +.navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand {font-size:18px; font-weight:bold; line-height:50px; padding:0; width:200px; color:#fff; margin:0; padding-left:20px;} +.nav.navbar-nav {float:right; padding:9px 0; margin:0;} +.nav>li {float:left;} +.navbar .nav > li > a {font-size:13px; color:#fff; width:120px; line-height:20px; text-align:center; padding:6px 0; background:#0E3F66; margin-left:10px; font-weight:700; border-radius:.267rem;} +.navbar .nav > li > a.redBtn {background:#fc5083;} +.navbar .nav > li > a.redBtn:hover {background:#eb4375;} +.navbar .nav > li > a:hover {position:relative; z-index:1; display:inline-block; overflow:hidden; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; -webkit-transition:.3s ease-out; transition:.3s ease-out; vertical-align:middle; background-color:#0a375a; color:#fff;} +.navbar .nav > li > a:focus {background:#082e1c; color:#fff;} +.navbar .nav > li > a.service {padding-left:24px;} +.navbar .nav > li > a.member {padding-left:24px;} +.navbar .nav > li > a.logout {padding-left:16px;} +.navbar .nav > li > a.service svg {position:absolute; top:3px; left:22px; width:18px;} +.navbar .nav > li > a.member svg {position:absolute; top:8px; left:22px; width:18px;} +.navbar .nav > li > a.logout svg {position:absolute; top:7px; left:22px; width:18px; height:18px;} +.far.fa-sun {margin-right:5px;} +.nav-tabs > li {width:100%;} +.nav.nav-tabs.left {width:200px; height:100vh; border:none; float:left; position:absolute; top:0; z-index:1; padding-top:52px;} +.left .caret {display:none;} +.fas.fa-school {margin-right:5px; width:20px; text-align:center;} +.fas.fa-plus {float:right; padding:9px 0; font-size:11px;} +.fas.fa-minus {float:right; padding:9px 0; font-size:11px;} +.nav-tabs .dropdown-menu {width:100%; box-shadow:none; border-radius:0; border:none; padding:0; position:relative;} +.left .dropdown-menu > li > a {padding-left:40px; height:40px; line-height:34px; font-size:13px;} +.left .dropdown-menu > li > a.active {} +.left li {width:100%; display:inline-block; visibility:visible; position:relative;} +.fas.fa-book-reader {margin-right:5px; width:20px; text-align: center;} +.fas.fa-chalkboard-teacher {margin-right:5px; width:20px; text-align:center;} +.fas.fa-baby {margin-right:5px; width:20px; text-align:center;} +.fas.fa-user-tie {margin-right:5px; width:20px; text-align:center;} +.fas.fa-clipboard-list {margin-right:5px; width:20px; text-align:center;} +.nav-tabs > li > a {height:50px; line-height:30px; font-size:14px; box-sizing:border-box; margin:0; border-radius:0; border-bottom:solid 1px #DFE3E7; font-weight:bold;} +.far.fa-user {margin-right:10px;} +.navbar-nav .open .dropdown-menu {width:250px; padding:0; border-radius:0; border:none; left:-150px;} +.name p {padding-left:30px; font-size:14px;} +.far.fa-star {margin-right:10px; color:#fff;} +.navbar-default .navbar-nav .open .dropdown-menu > li.name > a {width:250px; padding:15px 15px;} +.margin0 {margin:0;} +.left-btn {width:50%; background:#f7f7f9; position:relative; bottom:0; left:0; text-align:center; border:1px solid #eee;} +.right-btn {width:50%; background:#f7f7f9; position:absolute; bottom:0; right:0; text-align:center; border:1px solid #eee;} +.dropdown-menu > li.left-btn > a {font-size:13px; line-height:32px;} +.navbar-default .navbar-nav .open .dropdown-menu > li.name > a:hover {background:none; color:#333;} +.dropdown-menu > li.right-btn > a {font-size:13px; line-height:32px;} +.left .open > a, .left .open > a:hover, .left .open > a:focus {border:none; border-bottom:solid 2px; box-sizing:border-box;} +.breadcrumb > li {font-size:13px;} +.breadcrumb {padding-left:0; margin:0;} +.right .col-md-12 {padding:0;} +.right .col-md-12.box {background:#fff; border:solid 1px #DFE3E7; margin:20px 0 30px; padding:20px; border-radius:4px; clear:both; background:#fff;} + + +@media only screen and (max-width:1200px) { + .navbar.navbar-default .container-fluid .navbar-header svg#btn_mobileMenu {display:block; width:50px; height:50px; color:#fff; padding:11px; float:left;} + .navbar.navbar-default .container-fluid .navbar-header svg#btn_mobileMenu2 {display:block; width:50px; height:50px; color:#fff; padding:7px; float:left;} + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand {padding:0;} + .container-fluid>.navbar-collapse, .container-fluid>.navbar-header, .container>.navbar-collapse, .container>.navbar-header {margin-right:0;margin-left:0;} +} */ + + + + + + + + + + + +/* 왼쪽메뉴 */ +.left-menu {overflow:auto; background:#151515; z-index:9; top:0px; left:0; width:200px; height:100%; box-sizing:border-box; vertical-align:top; position:fixed; padding-bottom:50px;} +.left-menu::-webkit-scrollbar {width:6px; height:6px;} +.left-menu::-webkit-scrollbar-thumb {border-radius:8px; background-color:#377ec1;} +.left-menu::-webkit-scrollbar-corner {background:#151515;} + +.left-menu .navbar-brand {line-height:50px; padding:0; display:table; width:100%; padding-left:15px;} +/* +.left-menu .navbar-brand .logo {width:30px; height:30px; position:relative; float:left; top:10px; margin-right:10px;} +.left-menu .navbar-brand .logo img {width:100%; position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0);} +.left-menu .navbar-brand .logoSpan {color:#fff; font-weight:bold;} +*/ +.left-menu .navbar-brand .imgBox {height:50px;} +.left-menu .navbar-brand .imgBox img {width:130px;} + +.left-menu #sidebar ul.components {background:#151515;} +.left-menu .left-icon {width:20px; float:left; font-size:14px; position:relative; top:3px; margin-right:8px;} +.left-menu #sidebar .components li a .right-icon {font-size:22px; position:absolute; right:10px; top:50%; transform:translateY(-50%);} +.left-menu a, .left-menu a:hover, .left-menu a:focus {text-decoration:none;} +.left-menu a[data-toggle="collapse"] {position:relative;} + +.left-menu #sidebar .components li {display:table; width:100%;} +.left-menu #sidebar .components li a {display:inline-block; padding:5px 10px; width:100%;} +.left-menu #sidebar .components li a svg {fill:rgba(255, 255, 255, .6); float:left; /*background:rgb(131 212 217 / 50%);*/ padding:2px; border-radius:4px;} +.left-menu #sidebar .components li a .tempSpan {color:rgba(255, 255, 255, .6); line-height:30px; font-size:14px; word-break:keep-all;} +.left-menu #sidebar .components li.active a {background:#29292c;} +.left-menu #sidebar .components li.active a svg {fill:#fff;} +.left-menu #sidebar .components li.active a .tempSpan {color:#fff;} +.left-menu #sidebar .components li:hover a svg {fill:#fff;} +.left-menu #sidebar .components li:hover a .tempSpan {color:#fff;} + +.left-menu #sidebar .collapse.in {display:block; color:#fff; background:#055b80;} +.left-menu #sidebar .collapse.in li {background:#43485e;} +.left-menu #sidebar .components li .list-unstyled > li a {background:#29292c; border-bottom:none; font-size:13px; font-weight:normal; padding:8px 20px 8px; padding-left:40px; color:rgba(255, 255, 255, .6);} +.left-menu #sidebar .components li .list-unstyled > li a:hover {color:#fff;} +.left-menu #sidebar .components li .list-unstyled > li.active a {color:#fff; background:#377ec1;} +.left-menu #sidebar .categoryLeftMenu {background:#377ec1; padding:2px 0; padding-left:20px; color:#fff;} +.left-menu .imgNon{display:none;} +.dropdown-toggle::after {display:none;} + + + + +/*왼쪽메뉴 간략화(아이콘)*/ +.left-menu.summary {width:60px;} +.tapNav.summary {left:60px; width:calc(100% - 60px);} +.rightBoxNT.summary {left:60px; width:calc(100% - 60px);} + +.left-menu.summary #sidebar .components li {position:relative; height:40px;} +.left-menu.summary a[data-toggle="collapse"] {position:absolute;} +.left-menu.summary #sidebar .components li a {width:60px;} +.left-menu.summary #sidebar .components li a .right-icon, .left-menu.summary #sidebar .components li .list-unstyled {display:none;} +.left-menu.summary #sidebar .components li a svg {display:block; float:unset; margin:0 auto;} + +.left-menu.summary #sidebar .components li:hover a .tempSpan {display:inline-block !important; width:150px; height:40px; background:#151515; float:right; position:absolute; top:0; left:60px; line-height:40px; padding-left:10px;} +.left-menu.summary #sidebar .components li.active:hover a .tempSpan {display:inline-block !important; width:150px; height:40px; background:#377ec1; float:right; position:absolute; top:0; left:60px; line-height:40px; padding-left:10px;} +.left-menu.summary #sidebar .components li:hover .list-unstyled {display:inline-block !important; width:150px; height:40px; background:#151515; float:right; position:absolute; top:40px; left:60px; line-height:40px;} +.left-menu.summary #sidebar .components li:hover .list-unstyled li a {display:inline-block !important; width:150px; padding:0; padding-left:10px;} + + + + + + + +.tapNav {margin:0; padding:0; background:#151515; position:fixed; top:0; left:200px; z-index:9; min-width:1000px; width:calc(100% - 200px); word-spacing:-1px;} +/* .tapNav #btn_mobileMenu {display:none;} */ +.tapNav svg#btn_mobileMenu {display:block; float:left; margin:10px 5px 0; fill:#fff;} +.tapNav svg#btn_mobileMenu2 {display:block; float:left; margin:10px 5px 0;} +/* 경로 */ +.tapNav .breadcrumb {background:none; padding:0; line-height:50px; float:left; margin:0;} +.tapNav .breadcrumb>li.active {color:#377ec1;} +.rightBtnWrap {float:right; padding:10px 0; margin:0 10px 0 0; list-style:none;} +.rightBtnWrap li {float:left;} +.rightBtnWrap li > p {margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:14px; display:block; text-align:center; color:#fff;} +.rightBtnWrap li > a {background:#1e2362; width:100px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px; display:block; text-align:center; color:#fff; text-decoration:none;} +.rightBtnWrap li > a:hover {position:relative; z-index:1; display:inline-block; overflow:hidden; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; -webkit-transition:.3s ease-out; transition:.3s ease-out; vertical-align:middle; background-color:#191e58; color:#fff;} + +.rightBtnWrap li > a.logout {background:#c50000; color:#fff;} +.rightBtnWrap li > a.logout:hover {background:#bf0000;} + +/*탭네비*/ +.tapNav .tabWrap {background:#333; /*overflow:hidden;*/ width:100%; position:relative; height:40px; top: 50px;} +.tapNav .tabWrap .tabList {margin:0; border-bottom:none; outline:none; transition:padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); position:absolute; height:40px; width:calc(100% - 40px);} +.tapNav .tabWrap .tabList .tabContainer {position:relative; box-sizing:border-box; margin-bottom:-1px; /*overflow:hidden;*/ font-size:14px; line-height:1.5715; white-space:nowrap; transition:padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); zoom:1; padding:0 40px; height:auto;} +.tapNav .tabWrap .tabList .tabContainer::before, .tapNav .tabWrap .tabList .tabContainer::after {display:table; content:'';} +.tapNav .tabWrap .tabList .tabContainer .tabPrev {left:0;} +.tapNav .tabWrap .tabList .tabContainer .tabNext {right:2px;} +.tapNav .tabWrap .tabList .tabContainer .tabPrev, .tapNav .tabWrap .tabList .tabContainer .tabNext {position:absolute; z-index:2; width:40px; height:100%; text-align:center; background-color:transparent; border:0; cursor:pointer; opacity:.7; transition:color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); user-select:none; pointer-events:auto; line-height:1; color:#fff;} +.tapNav .tabWrap .tabList .tabContainer .tabPrev:hover , .tapNav .tabWrap .tabList .tabContainer .tabNext:hover {opacity:1;} +.tapNav .tabWrap .tabList .tabContainer .disabled {cursor:not-allowed;} +.tapNav .tabWrap .tabList .tabContainer .disabled, .tapNav .tabWrap .tabList .tabContainer .disabled:hover {opacity:.4;} + +.tapNav .tabWrap .tabList .tabContainer .tabPrev .tabPrevTarget, .tabWrap .tabList .tabContainer .tabNext .tabNextTarget {font-size:14px; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); color:#fff;} + +.tapNav .tabWrap .allClose {height:40px; position:absolute; right:0;} +.tapNav .tabWrap .allClose svg {padding:8px; fill:rgba(255, 255, 255, .8);} +.tapNav .tabWrap .allClose:hover svg {fill:#fff;} + +.tapNav .tabWrap .tabList .tabContainer .scrollWrap {overflow-x:scroll; white-space:nowrap;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap::-webkit-scrollbar {display:none;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox {position:relative; display:inline-block; box-sizing:border-box; margin:0; padding-left:0; list-style:none; transition:transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox::before, .tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox::after {display:table; content:' ';} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab {padding:0; background:none; height:40px; line-height:40px; transition:background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); border-radius:0; border:none; margin:0; position:relative; display:inline-block; box-sizing:border-box; text-decoration:none; cursor:pointer; font-size:13px;} +/* .tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab .unclosable {color:#fff;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab .tabPadding {color:#fff;} */ +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab.active {background:#fff;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab.dashboard {padding:0 16px;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab.dashboard .unclosable { color:rgba(255, 255, 255, .8);} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab.active .tabPadding {color:rgba(49, 58, 70, .8);} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab .tabPadding {padding:0 28px 0 16px; color:rgba(255, 255, 255, .8);} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab .tabPadding .closeIcon {display:inline-block; color:inherit; line-height:0; text-align:center; text-transform:none; vertical-align:-0.125em; text-rendering:optimizeLegibility; -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale; width:auto; height:auto; margin:-6px 0 0 0; position:absolute; right:10px; top:15px; font-size:12px;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab .tabPadding .closeIcon[tabindex] {cursor:pointer;} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab .tabPadding .closeIcon svg {fill:rgba(255, 255, 255, .8);} +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tab.active .tabPadding .closeIcon svg {fill:rgba(49, 58, 70, .8);} + +.tapNav .tabWrap .tabList .tabContainer .scrollWrap .scrollBox .tabBar {position:absolute; bottom:1px; left:0; z-index:1; box-sizing:border-box; width:0; height:2px; background-color:#1890ff; transform-origin:0 0; visibility:hidden; display:none !important;} + + + + + + + + + +/* 전체외각 */ +.rightBoxNT {margin:0; padding:10px; padding-top:0; background:#fff; position:relative; top:50px; left:200px; /*z-index:1;*/ min-width:1000px; width:calc(100% - 200px); min-height:calc(100vh - 89px); word-spacing:-1px;} +/* 상단라인 */ +.rightBoxNT .formLine {border-top:1px solid #dee2e6;} +.rightBoxNT .form-horizontal {margin:0 0 20px; display:table; width:100%; background:#fff; position:relative;} +.rightBoxNT .form-horizontal .form-group {display:table; width:100%; border-bottom:1px solid #dee2e6; border-left:none; border-right:none; margin:0; padding:0; background:#f5f7f7;} +/* 폼그룹2분할_영역제어 */ +.rightBoxNT .form-horizontal .form-group50Wrap {margin-top:0; border-bottom:none; display:table; width:100%;} +/* 폼그룹2분할 */ +.rightBoxNT .form-horizontal .form-group50 {width:50%; float:left; border-bottom:1px solid #dee2e6; background:#f5f7f7;} +/* 폼그룹라벨제목 */ +.rightBoxNT .form-horizontal .control-label {float:left; margin:0; width:170px; text-align:left; line-height:30px; padding:5px 0 5px 15px; font-weight:unset;} +.rightBoxNT .form-horizontal .control-label .requisite {color:#ff4545;} +/* 폼그룹왼쪽정렬*/ +.rightBoxNT .form-horizontal .floatLeft {float:left;} +/* 폼그룹라벨제목 제외한 영역 */ +.rightBoxNT .form-horizontal .rightWidth {width:calc(100% - 170px); background:#fff;} +/*영역필요없는 기간[오늘,3일,7일,1개월], 인풋옆에버튼있을시[ex.파일업로드]*/ +.rightBoxNT .form-horizontal .rightWarp {padding:5px 0 5px 5px;} + + + + +/* 검색조건_인풋 */ +.rightBoxNT .form-horizontal .searchWrapInput {width:200px; padding:5px 0 5px 5px;} +/* 등록,수정페이지_인풋 */ +.rightBoxNT .form-horizontal .pageWrapInput {width:250px; padding:5px 0 5px 5px;} +/* 등록,수정페이지_텍스트에어리어,에디터 */ +.rightBoxNT .form-horizontal .pageWrapTextarea {padding:5px; width:100%;} +/* kevin 추가 */ +.rightBoxNT .form-horizontal .smallPageWrapInput {width:100px; padding:5px 0 5px 5px;} + + +/* 분할영역패딩제거 */ +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {padding:0;} + + + + +/* 경로 */ +.rightBoxNT .breadcrumb {background:none; padding:10px 0; margin:0; float:left; line-height:20px;} +.rightBoxNT .breadcrumb>li.active {color:#377ec1;} +.breadcrumb>li {color:rgba(49, 58, 70, .7);} +/* .breadcrumb>li+li:before {color:rgba(49, 58, 70, .2);} */ + + +/* 버튼기본 */ +.rightBoxNT .btnCommon {width:100px; margin:0 3px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px;} +/* 버튼기본오른쪽정렬 */ +.rightBoxNT .btnRightCommon {width:100px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px;} + +/* 검색화면 및 상세화면 버튼 박스 */ +.rightBoxNT .btnBox {padding:0; margin:24px auto 4px; min-width:10px; display:table; /*float:right;*/} +/* 메인컬러_버튼 */ +.rightBoxNT .btnMain {background:#377ec1; color:#fff;} /*.rightBoxNT .btnMint*/ +.rightBoxNT .btnMain:hover {background:#7caad7;} +/* 회색_버튼 */ +.rightBoxNT .btnGray {background:#8e949d; color:#fff;} +.rightBoxNT .btnGray:hover {background:#878c95;} + + +/*상세조회,아이콘버튼사용시*/ +/* +!* 흰색라인_버튼 *! +.rightBoxNT .btnWhite {background:#fff; color:#377ec1; border:solid 1px #377ec1;} +.rightBoxNT .btnWhite:hover {color:#377ec1; border:solid 1px #377ec1;} +.rightBoxNT .btnWhite svg {fill:#377ec1; height:30px; position:absolute;} +.rightBoxNT .btnWhite:hover svg {fill:#377ec1;} + +!* 버튼아이콘 *! +.rightBoxNT .btnCommon svg {fill:#fff; float:left; padding:3px;} +.rightBoxNT .btn-overlap svg {fill:#fff; float:left; padding:3px;} +*/ + + + +/* 폼 공통 */ +.rightBoxNT .form-horizontal .form-control {border:1px solid #dee2e6; display:block; width:100%; padding:0; padding-left:5px; background-color:#FFF; border-radius:0.267rem; box-shadow:none; height:30px; line-height:30px; font-size:13px; color:rgba(49, 58, 70, .8);} +.rightBoxNT .form-horizontal .form-control[disabled]{background:rgba(238, 242, 247, .6);} +.rightBoxNT select.form-control:not([multiple=multiple]) {background-image:url(/image/web//image/web/arrow-down.png); background-position:95%; background-size:14px 14px,10px 10px; background-repeat:no-repeat; -webkit-appearance:none; -moz-appearance:none; padding-right:1.5rem; height:30px; color:rgba(49, 58, 70, .8);} +.input-group.date .input-group-addon {background:none; border:1px solid #dee2e6; border-left:none; border-left:none;} +.input-group.date .input-group-addon[disabled] {opacity:.5; background:#dee2e6;cursor:no-drop;} +.rightBoxNT .input-group-addon:last-child {padding:5px 10px;} +.glyphicon-calendar:before {color:rgba(49, 58, 70, .8);} +.rightBoxNT .form-horizontal .dateInput {border-right:none;} +.rightBoxNT .form-horizontal .password {font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +.rightBoxNT textarea {font-size:13px; border:1px solid #dee2e6; outline:none; padding:.47rem .8rem; display:block; border-radius:0.267rem;} +.rightBoxNT textarea.height107 {height: 107px;} +.rightBoxNT textarea:focus {border:1px solid #377ec1;} +.rightBoxNT textarea:disabled {background:rgba(238, 242, 247, .6);} +.rightBoxNT input.form-control:focus {border:1px solid #377ec1;} +.rightBoxNT select.form-control:not([multiple=multiple]):focus {border:1px solid #377ec1;} +.rightBoxNT .form-horizontal .sideNumber {line-height:30px; color:#97989b; position:relative; left:5px; bottom:-5px;} + +.rightBoxNT .form-horizontal .form-control.dateInput2 {border-radius:0.267rem 0 0 0.267rem;} + + +/* 기간[오늘,3일,7일,1개월] */ +.rightBoxNT .form-horizontal .btn-choce {background:none; border-color:#dee2e6; color:rgba(49, 58, 70, .8); height:30px; padding:5px 12px; font-size:13px; font-weight:400; line-height:1.42857143; border-radius:4px;} +.rightBoxNT .form-horizontal .btn-choce:hover, .rightBoxNT form .btn-choce:focus {background:#377ec1; color:#fff; outline:none;} + + + + + +/* 상세페이지 회색버튼 [ex.아이디조회,중복확인] */ +.rightBoxNT .form-horizontal .overlap {float:left;} +.rightBoxNT .form-horizontal .overlap .btnGray {width:100px; background:#377ec1; color:#fff; text-shadow:none; border:none; padding:0; border-radius:.267rem; box-shadow:none; line-height:30px; font-size:13px;} +.rightBoxNT .form-horizontal .overlap .btnGray:hover {background:#377ec1;} + + + + + + +/* 리스트 왼쪽,오른쪽,마진제외 버튼 영역 */ +.rightBoxNT .form-horizontal .btnlistBox {padding:5px 0; display:table; width:100%; border-top:1px solid #a2a2a2;} + +/* 리스트버튼기본 */ +.rightBoxNT .form-horizontal .btnlistBox .btnCommon {width:100px; margin:0 3px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px;} +/* 리스트버튼기본왼쪽정렬 */ +.rightBoxNT .form-horizontal .btnlistBox .btnLeftCommon {width:100px; margin:0; margin-right:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px;} +/* 리스트버튼기본오른쪽정렬 */ +.rightBoxNT .form-horizontal .btnlistBox .btnRightCommon {width:100px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px; float:right;} + +/* 메인컬러_버튼 */ +.rightBoxNT .form-horizontal .btnlistBox .btnMain {background:#377ec1; color:#fff;} /*.rightBoxNT .btnMint*/ +.rightBoxNT .form-horizontal .btnlistBox .btnMain:hover {background:#7caad7;} +/* 회색_버튼 */ +.rightBoxNT .form-horizontal .btnlistBox .btnGray {background:#8e949d; color:#fff;} +.rightBoxNT .form-horizontal .btnlistBox .btnGray:hover {background:#878c95;} +/* 빨간색_버튼 */ +.rightBoxNT .form-horizontal .btnlistBox .btnRed {background:#c50049; color:#fff;} +.rightBoxNT .form-horizontal .btnlistBox .btnRed:hover {background:#bb0045;} +/* 엑셀_버튼 */ +.rightBoxNT .form-horizontal .btnlistBox .btnExcel {background:#0f743d; color:#fff;} +.rightBoxNT .form-horizontal .btnlistBox .btnExcel:hover {background:#0e6e3a;} + + +/* 리스트좌측검색갯수 */ +.rightBoxNT .listNav {display:inline-block; width:100%; height:30px; position:relative;} +.rightBoxNT .listNav .numberBox {position: absolute;left: 0;} +.rightBoxNT .listNav .numberBox .number {line-height:30px; margin:0; display:inline-block;} +.rightBoxNT .listNav .numberBox .number .n-color {color:#377ec1; padding-left:3px;} +.rightBoxNT .listNav .numberBox .slush {padding:0 5px; display:inline-block;} +.rightBoxNT .listNav .text {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700; display:block; border-bottom:1px solid #dee2e6;} +/* 리스트우측셀렉트3종 */ +.rightBoxNT .listNav .selectBox {position:absolute; top:0; right:0;} +.rightBoxNT .listNav .selectBox .selectList {margin:0 0 0 7px; float:right; width:150px;} + + +/* 참고문구 */ +.rightBoxNT .form-horizontal .textareaText {line-height:30px; color:#97989b; position:relative; left:5px; bottom:-105px;} +.rightBoxNT .form-horizontal .inputnoneText {font-size:13px; line-height:30px;} +.rightBoxNT .form-horizontal .commentText {margin:0 0 0 5px; font-weight:600; line-height:40px;} +.rightBoxNT .form-horizontal .inputcomment {clear:both; color:#50c3ca; margin:0; font-size:12px; padding-top:0;} +.rightBoxNT .form-horizontal .commentCheck {position:relative; bottom:-5px; font-weight:500; line-height:40px; margin-left:5px;} +.rightBoxNT .form-horizontal .commentSide {line-height:30px; color:#97989b; position:relative; left:5px; bottom:-5px;} + + +/* 체크,라디오 공통 */ +.rightBoxNT .checkbox, .radio {position:relative; display:inline-block;} +.rightBoxNT .checkbox input[type=checkbox], .rightBoxNT .radio input[type=radio] {display:none;} +.rightBoxNT input[type=radio], .rightBoxNT input[type=checkbox] {box-sizing:border-box; padding:0;} +.rightBoxNT .form-horizontal .checkbox, .rightBoxNT .form-horizontal .radio {min-height:29px; padding:0 5px 0 15px;} + + +/* 체크박스 */ +.rightBoxNT .checkbox label {font-size:13px; line-height:30px; margin-left:7px; padding:0;} +.rightBoxNT .checkbox label:after, .checkbox label:before {height:18px; width:18px; top:6px; left:0; position:absolute;} +.rightBoxNT .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.rightBoxNT .checkbox label:before {content:''; border-radius:4px;} +.rightBoxNT .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.rightBoxNT .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:5px; width:9px; border-color:#6A99F8; border-radius:0; border-width:2px; top:12px; left:5px;} + + +/* 라디오박스 */ +.rightBoxNT .radioWrap {padding:5px 0 5px 5px; display:inline;} +.rightBoxNT .radio label {font-size:13px; line-height:29px; margin-left:5px; padding:0;} +.rightBoxNT .radio label::after, .radio label::before {content:'';} +.rightBoxNT .radio label:after, .radio label:before {height:20px; width:20px; top:8px; left:0; position:absolute;} +.rightBoxNT .radio label::before {border:1px solid #dee2e6; border-radius:50%; width:16px; height:16px; margin-right:.5rem;} +.rightBoxNT .radio label::after {position:absolute; display:-webkit-inline-box; display:-webkit-inline-flex; display:-ms-inline-flexbox; display:inline-flex; height:6px; width:6px; background-color:#377ec1; border-radius:50%; top:13px; left:5px; opacity:0; -webkit-transform:scale(3.6); -ms-transform:scale(3.6); transform:scale(3.6); border:none;} +.rightBoxNT .radio input[type=radio]:checked~label::after {opacity:1; -webkit-transform:scale(1); -ms-transform:scale(1); transform:scale(1); -webkit-transition:all .3s cubic-bezier(.35,.9,.4,.9); transition:all .3s cubic-bezier(.35,.9,.4,.9);} + + +/* 주소 */ +.rightBoxNT .form-horizontal .addressBox {width:calc(100% - 170px); float:left; padding:5px;} +.rightBoxNT .form-horizontal .addressBox .numberBox {margin-bottom:6px; width:245px;} +.rightBoxNT .form-horizontal .addressBox .last {margin-bottom:0;} +.rightBoxNT .form-horizontal .addressBox .numberBox .number { margin-right:5px; width:calc(245px - 105px);} +.rightBoxNT .form-horizontal .btn-overlap {background:#377ec1; color:#fff; text-shadow:none; border:none; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px; padding:0; width:100px;} +.rightBoxNT .form-horizontal .btn-overlap:hover {background:#377ec1;} +/* 버튼아이콘 */ +.rightBoxNT .btn-overlap svg {fill:#fff; float:left; width:25px} +.rightBoxNT .form-horizontal .addressBox .address1 {margin-bottom:5px;} + +/* 주소찾기 */ +.rightBoxNT .form-horizontal .address {width:calc(100% - 200px); float:left; padding-left:10px;} +.rightBoxNT .form-horizontal .address .roadBox {margin-bottom:5px;} +.rightBoxNT .form-horizontal .address .roadBox .road {width:29.1%; float:left; margin-right:10px;} +.rightBoxNT .form-horizontal .address .roadBox .btn-overlap {width:100px; background:#dee2e6; color:#333; text-shadow:none; border:none; padding:0; border-radius:.267rem; box-shadow:none; line-height:30px; font-size:13px;} +.rightBoxNT .form-horizontal .address .roadBox .btn-overlap:hover {background:#dedede;} +.rightBoxNT .form-horizontal .address .roadBox .subroad {width:39.6%;} + + + +/* 날짜 선택 체크리스트 */ +.rightBoxNT .choiceDateBox {display:block; overflow-y:scroll; border:1px solid #dee2e6; outline:none; width:100%; height:130px; padding:5px;} + + + +/* 파일업로드 */ +.rightBoxNT .input-file {min-height:37px; padding-right:0; padding-left:15px;} +.rightBoxNT .input-file {display:inline-block;} +.rightBoxNT .input-file [type="file"] {position:absolute; width:1px; height:1px; padding:0; overflow:hidden; clip:rect(0, 0, 0, 0); border:0 none; } +.rightBoxNT .input-file .file-label {background-color:#dee2e6; text-align:center; margin:0 0 0 7px; text-shadow:none; border:none; border-radius:.267rem; box-shadow:none; line-height:30px; font-weight:300; cursor:pointer; padding:0 12px 0 7px;} +.rightBoxNT .input-file .btnFile {width:100px; background:#377ec1; text-shadow:none; color:#fff; border:none; padding:0.47rem 0.8rem; border-radius:0.267rem; box-shadow:none; height:35px; margin:0; text-align:center; font-weight:normal; line-height:25px;} +/* 버튼아이콘 */ +.rightBoxNT .input-file .file-label svg {fill:rgba(49, 58, 70, .8); float:left; width:25px} +.rightBoxNT .input-file .file-name {width:245px; border:1px solid #dee2e6; padding:.47rem .8rem; background-color:#FFF; border-radius:.267rem; box-shadow:none; height:30px; outline:none; float:left;} +.rightBoxNT .input-file [type="file"]:focus {border:1px solid #50c3ca;} +/* 첨부파일_파일문구 */ +.rightBoxNT .download-file {padding-left:15px; height:30px; line-height:24px; color:#dee2e6;} +.rightBoxNT .download-file .fileDownloadTitle {color:#999; text-decoration:underline;} + + +/* 이미지 */ +/* .rightBoxNT .form-horizontal .photoBox {width:calc(100% - 200px); float:left; padding:0 0 0 10px;} */ +.rightBoxNT .form-horizontal .photoSlash {width:300px; float:left; padding:0 0 0 10px;} +.rightBoxNT .form-horizontal .title-name {margin:5px 0;} +.rightBoxNT .form-horizontal .imgnumber {color:#97989b; position:relative; left:10px;} +.rightBoxNT input[type="file"] {position:absolute; opacity:0; cursor:pointer; z-index:1;} +.rightBoxNT .form-horizontal .photoList {display:table; position:relative;} +.rightBoxNT .form-horizontal .videoList {display:table;} +.rightBoxNT .form-horizontal .imgBox {width:100px; height:100px; padding:0; float:left; margin-right:10px;} +.rightBoxNT .form-horizontal .img-100 {border:1px solid #dee2e6; width:100px; height:100px; background:none; color:#3e3f3a;} +.rightBoxNT .form-horizontal .img-100:hover{background:none;border:1px solid #dee2e6;box-shadow:none;} +.rightBoxNT .form-horizontal .photoBorder {width:calc(100% - 200px); border-bottom:1px solid #dee2e6; display:-webkit-box; float:right;} +.rightBoxNT .form-horizontal .photoBorder.last {border:none;} +.rightBoxNT .form-horizontal .sub-name {clear:both; color:#97989b; margin:5px 0 0; font-size:12px; position:relative;} +.rightBoxNT .form-horizontal .sub-name:first-child {margin-top:10px;} +.rightBoxNT .form-horizontal .sub-name .deleteSvg {width:20px; height:20px; fill:rgba(49, 58, 70, .8); position:absolute;} +/* 여러개이미지 */ +.rightBoxNT .form-horizontal .photoSlashAdd {width:calc(100% - 300px); float:left; padding:0 0 0 10px; display:grid;} +.rightBoxNT .form-horizontal .photoListAdd {display:table; position:relative; float:left;} +/*사용안할시 제거*/ +.rightBoxNT .form-horizontal .img-250 {border:1px solid #dee2e6; width:288px; height:288px; background:#f7f7f7;} +.rightBoxNT .form-horizontal .img-250 img {opacity:0; width:auto; height:auto; max-width:100%; max-height:100%;} +.rightBoxNT .form-horizontal .miniphotoBox {width:calc(100% - 200px - 10px); float:left; padding-left:10px;} + + + + + + +/* 해더고정스크롤 */ +.rightBoxNT .basicScroll {overflow:hidden; min-width:100%; margin-bottom:21px;} +.rightBoxNT .basicScroll .grid-layout {margin:0 auto; width:100%; background:#fff; font-size:12px; color:#444; border:solid 1px #dddfe4; border-top:none; position:relative; box-sizing:border-box;} +/*툴팁레이어가 grid-layout 위에 있을 경우 overflow:hidden 제거 필요 */ +/* 스크롤바 스타일 관련 */ +.rightBoxNT .basicScroll .grid-layout {scrollbar-highlight-color:#fff; scrollbar-shadow-color:#fff; scrollbar-arrow-color:#8a8a8a; scrollbar-face-color:#d9d9d9; scrollbar-3dlight-color:#fff; scrollbar-darkshadow-color:#fff; scrollbar-track-color:#fff;} +.rightBoxNT .basicScroll .grid-layout ::-webkit-scrollbar {-webkit-appearance:none; width:17px; height:17px; background-color:#fff;} +.rightBoxNT .basicScroll .grid-layout ::-webkit-scrollbar-thumb {background-color:#d9d9d9; border:5px solid transparent; border-radius:16px; background-clip:content-box;} +.rightBoxNT .basicScroll .grid-layout ::-webkit-scrollbar-thumb:hover {background-color:#c1c1c1;} +.rightBoxNT .basicScroll .grid-layout ::-webkit-scrollbar-corner {background-color:#f2f2f2;} +/* 헤더 영역 */ +.rightBoxNT .basicScroll .grid-layout .header {position:relative; overflow:hidden;} +.rightBoxNT .basicScroll .grid-layout .header .headerBox {overflow:hidden; left:-1px; border-top:1px solid #dee2e6; background:#f6f6f6;} +.rightBoxNT .basicScroll .grid-layout .header .base {overflow-x:scroll; margin-right:-1px;} +.rightBoxNT .basicScroll .grid-layout .header .config-button {display:none;} +.rightBoxNT .basicScroll .grid-layout .header tbody {background-color:#f6f6f6;} +.rightBoxNT .basicScroll .grid-layout .header .left {margin-right:16px;} +/* 바디 영역 */ +.rightBoxNT .basicScroll .grid-layout .body {position:relative; overflow:hidden; margin-bottom:-1px;} +.rightBoxNT .basicScroll .grid-layout .body .height-bar {display:none;} +.rightBoxNT .basicScroll .grid-layout .body .base {margin-right:-1px;} +.rightBoxNT .basicScroll .grid-layout .body .bodyBox {top:-1px; left:-1px; overflow:hidden;} +.rightBoxNT .basicScroll .grid-layout .vertical-scrollbar-line {display:none;} +.rightBoxNT .basicScroll .grid-layout .horizontal-scrollbar-line {display:none; position:absolute; width:100%; height:1px; left:0px; background-color:#dddfe4;} +.rightBoxNT .basicScroll .grid-layout .container {position:relative;} +.rightBoxNT .basicScroll .grid-layout .body .left {display:none; position:absolute; top:0; margin:0;} +.rightBoxNT .basicScroll .grid-layout .right {display:none; position:absolute; top:0; right:-1px;} +.rightBoxNT .basicScroll .grid-layout .clipboard {position:absolute; left:-999px; width:1px; height:1px; bottom:0;} +/* 합계 영역 */ +.rightBoxNT .basicScroll .grid-layout .header .footerBox {overflow:hidden; left:-1px; border-top:1px solid #dee2e6; background:#f6f6f6;} +/* 그리드 전체 비활성화 */ +.rightBoxNT .basicScroll .grid-layout .blocker-layer {display:none; position:absolute; background:rgba(0, 0, 0, 0.05); width:100%; height:100%; top:0;} +.rightBoxNT .basicScroll .grid-layout.disabled, .basicScroll .grid-layout.disabled th, .basicScroll .grid-layout.disabled .content-holder {color:#e0e0e0 !important;} +.rightBoxNT .basicScroll .grid-layout.disabled .blocker-layer {display:block;} +/* 수평 스크롤 가능 영역 */ +.rightBoxNT .basicScroll .grid-layout .horizontal-scrollable {overscroll-behavior-x:none;} +/* 수직 스크롤바를 사용하지 않는 경우 */ +.rightBoxNT .basicScroll .grid-layout .virtual-horizontal-scrollbar {display:none;} +.rightBoxNT .basicScroll .grid-layout .virtual-horizontal-scrollbar .space {display:none;} +/* 수직 스크롤바를 사용하는 경우 */ +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .header .config-button {display:block; position:absolute; border:solid 1px #dddfe4; top:0; right:-1px; width:18px; background-color:#f6f6f6;} +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .body {overflow-y:scroll; margin-right:-1px;} +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .body .height-bar {display:block; position:absolute; width:1px; top:0; left:0; background:transparent;} +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .virtual-horizontal-scrollbar {margin-right:16px;} +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line {display:block; position:absolute; width:1px; height:100%; top:0; right:16px; background-color:#dddfe4;} +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line:after {position:absolute; right:-17px; top:0; width:1px; height:100%; background-color:#dddfe4; content:'';} +/* grid-layout overflow:hidden 제거시 필요 */ +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .header .container {margin-right:16px;} +.rightBoxNT .basicScroll .grid-layout.vertical-scrollbar .horizontal-scrollbar-line {bottom:-1px;} +/* 수평 스크롤바를 사용하는 경우 */ +.rightBoxNT .basicScroll .grid-layout.horizontal-scrollbar .container {overflow:hidden;} +.rightBoxNT .basicScroll .grid-layout.horizontal-scrollbar .body .base {overflow-x:scroll;} +.rightBoxNT .basicScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar {display:block; overflow-y:hidden; overflow-x:scroll; height:17px;} +.rightBoxNT .basicScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar .width-bar {height:1px;} +.rightBoxNT .basicScroll .grid-layout.horizontal-scrollbar .horizontal-scrollbar-line {bottom:16px;} +/* 데이터 테이블 관련 */ +.rightBoxNT .basicScroll .grid-layout table {border:0; table-layout:fixed; border-collapse:collapse; border-spacing:1px; width:100%;} +.rightBoxNT .basicScroll .grid-layout table.titleTable {position:relative; right:2px;} +.rightBoxNT .basicScroll .grid-layout table col {background-color:#fff;} +.rightBoxNT .basicScroll .grid-layout table th {font-weight:normal; font-size:12px; overflow:hidden; white-space:nowrap; text-align:center; position:relative; border:1px solid #dee2e6; border-top:none; border-left:none; height:35px;} +.rightBoxNT .basicScroll .grid-layout table th.last {border-bottom:none;} +.rightBoxNT .basicScroll .grid-layout table tr.hover {background-color:#fff;} +.rightBoxNT .basicScroll .grid-layout table tr.checked {background-color:#fff;} +.rightBoxNT .basicScroll .grid-layout table tr.focused {background-color:#fff;} +.rightBoxNT .basicScroll .grid-layout table tr.disabled, .rightBoxNT .basicScroll .grid-layout table tr.disabled-row {color:#b0b0b0;} +.rightBoxNT .basicScroll .grid-layout table td {overflow:hidden; font-size:12px; border:1px solid #dee2e6; border-top:none; border-left:none; background:#fff; text-align:center; height:35px;} +.rightBoxNT .basicScroll .grid-layout table td div.productNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .basicScroll .grid-layout table td div.productOptionType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .basicScroll .grid-layout table td div.couponNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .basicScroll .grid-layout table td div.contentType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .basicScroll .grid-layout table td div.leftAlign {text-align:left;} +.rightBoxNT .basicScroll .grid-layout table td div.rightAlign {text-align:right;} +.rightBoxNT .basicScroll .grid-layout table td a {color:#5a86dd;} +.rightBoxNT .basicScroll .grid-layout table td img {vertical-align:middle; margin:-1px;} +/* 체크 박스 관련 스타일 */ +.rightBoxNT .basicScroll .grid-layout .checkbox label:after, .rightBoxNT .basicScroll .grid-layout .checkbox label:before {height:18px; width:18px; top:6px; left:8px; position:absolute;} +.rightBoxNT .basicScroll .grid-layout .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.rightBoxNT .basicScroll .grid-layout .checkbox label:before {content:''; border-radius:4px;} +.rightBoxNT .basicScroll .grid-layout .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.rightBoxNT .basicScroll .grid-layout .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:.6rem; width:1rem; border-color:#50c3ca; border-radius:0; border-width:2px; top:11px; left:12px;} + +.rightBoxNT .basicScroll .cui-grid-textbox {display:inline-block; width:100%; box-sizing:border-box;} +/* 데이터 없을 때 */ +.rightBoxNT .basicScroll .grid-layout .empty-layer {display:none; width:100%; height:100%; position:absolute; top:0; background:#fff; width:calc(100% - 17px);} +.rightBoxNT .basicScroll .grid-layout .empty-layer .content {display:table-cell; font-size:14px; height:100%; text-align:center; padding-top:100px; overflow-x:hidden; overscroll-behavior-x:none;} +/* 열고정 라인 그라데이션 스타일 */ +.rightBoxNT .basicScroll .grid-layout .line-gradient:after {position:absolute; top:0; bottom:0; width:6px; height:100%; content:'';} + + + + + + + +/* 왼쪽고정,해더고정 스크롤 */ +.rightBoxNT .fixedScroll {max-width:800px; overflow:hidden; min-width:100%; margin-bottom:21px;} +.rightBoxNT .fixedScroll .grid-layout {margin:0 auto; width:100%; background:#fff; font-size:12px; color:#444; border:solid 1px #dddfe4; border-top:none; position:relative; box-sizing:border-box;} +/*툴팁레이어가 grid-layout 위에 있을 경우 overflow:hidden 제거 필요 */ +/* 스크롤바 스타일 관련 */ +.rightBoxNT .fixedScroll .grid-layout {scrollbar-highlight-color:#fff; scrollbar-shadow-color:#fff; scrollbar-arrow-color:#8a8a8a; scrollbar-face-color:#d9d9d9; scrollbar-3dlight-color:#fff; scrollbar-darkshadow-color:#fff; scrollbar-track-color:#fff;} +.rightBoxNT .fixedScroll .grid-layout ::-webkit-scrollbar {-webkit-appearance:none; width:17px; height:17px; background-color:#fff;} +.rightBoxNT .fixedScroll .grid-layout ::-webkit-scrollbar-thumb {background-color:#d9d9d9; border:5px solid transparent; border-radius:16px; background-clip:content-box;} +.rightBoxNT .fixedScroll .grid-layout ::-webkit-scrollbar-thumb:hover {background-color:#c1c1c1;} +.rightBoxNT .fixedScroll .grid-layout ::-webkit-scrollbar-corner {background-color:#f2f2f2;} +/* 헤더 영역 */ +.rightBoxNT .fixedScroll .grid-layout .header {position:relative; overflow:hidden; border-top:1px solid #dee2e6;} +.rightBoxNT .fixedScroll .grid-layout .header .headerBox {overflow:hidden; left:-1px; overflow-y:scroll; height:35px;} +.rightBoxNT .fixedScroll .grid-layout .header .base {overflow-x:hidden; margin-right:-1px;} +.rightBoxNT .fixedScroll .grid-layout .header .config-button {display:none;} +.rightBoxNT .fixedScroll .grid-layout .header tbody {background-color:#f6f6f6;} +.rightBoxNT .fixedScroll .grid-layout #headerBox::-webkit-scrollbar-thumb {background-color:#f6f6f6;} +.rightBoxNT .fixedScroll .grid-layout #headerBox::-webkit-scrollbar-track {background-color:#f6f6f6; border-bottom:1px solid #dee2e6;} +/* 바디 영역 */ +.rightBoxNT .fixedScroll .grid-layout .body {position:relative; overflow:hidden; margin-bottom:-1px;} +.rightBoxNT .fixedScroll .grid-layout .body .height-bar {display:none;} +.rightBoxNT .fixedScroll .grid-layout .body .bodyBox {top:-1px; left:-1px; overflow:hidden;} +.rightBoxNT .fixedScroll .grid-layout .vertical-scrollbar-line {display:none;} +.rightBoxNT .fixedScroll .grid-layout .horizontal-scrollbar-line {display:none; position:absolute; width:100%; height:1px; left:0px; background-color:#dddfe4;} +.rightBoxNT .fixedScroll .grid-layout .container {position:relative;} +.rightBoxNT .fixedScroll .grid-layout .left {display:none; position:absolute; top:0;} +.rightBoxNT .fixedScroll .grid-layout .right {display:none; position:absolute; top:0; right:-1px;} +.rightBoxNT .fixedScroll .grid-layout .clipboard {position:absolute; left:-999px; width:1px; height:1px; bottom:0;} +/* 합계 영역 */ +.rightBoxNT .fixedScroll .grid-layout .header .footerBox {overflow:hidden; left:-1px; border-top:1px solid #dee2e6; background:#f6f6f6; padding-right:17px;} +.rightBoxNT .fixedScroll .grid-layout .header .footerBox table th {border-top:none; border-bottom:none;} +/* 그리드 전체 비활성화 */ +.rightBoxNT .fixedScroll .grid-layout .blocker-layer {display:none; position:absolute; background:rgba(0, 0, 0, 0.05); width:100%; height:100%; top:0;} +.rightBoxNT .fixedScroll .grid-layout.disabled, .fixedScroll .rightBoxNT .fixedScroll .grid-layout.disabled th, .fixedScroll .grid-layout.disabled .content-holder {color:#e0e0e0 !important;} +.rightBoxNT .fixedScroll .grid-layout.disabled .blocker-layer {display:block;} +/* 수평 스크롤 가능 영역 */ +.rightBoxNT .fixedScroll .grid-layout .horizontal-scrollable {overscroll-behavior-x:none;} +/* 수직 스크롤바를 사용하지 않는 경우 */ +.rightBoxNT .fixedScroll .grid-layout .virtual-horizontal-scrollbar {display:none;} +.rightBoxNT .fixedScroll .grid-layout .virtual-horizontal-scrollbar .space {display:none;} +/* 수직 스크롤바를 사용하는 경우 */ +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .header .config-button {display:block; position:absolute; border:solid 1px #dddfe4; top:0; right:-1px; width:18px; background-color:#f6f6f6;} +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .body {overflow-y:scroll; min-height:255px; max-height:initial; height:601px;} +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .body .height-bar {display:block; position:absolute; width:1px; top:0; left:0; background:transparent;} +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .virtual-horizontal-scrollbar {margin-right:16px;} +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line {display:block; position:absolute; width:1px; height:100%; top:0; right:16px; background-color:#dddfe4;} +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line:after {position:absolute; right:-17px; top:0; width:1px; height:100%; background-color:#dddfe4; content:'';} +/* grid-layout overflow:hidden 제거시 필요 */ +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .header .container {margin-right:16px;} +.rightBoxNT .fixedScroll .grid-layout.vertical-scrollbar .horizontal-scrollbar-line {bottom:-1px;} +/* 수평 스크롤바를 사용하는 경우 */ +.rightBoxNT .fixedScroll .grid-layout.horizontal-scrollbar .container {overflow:hidden;} +.rightBoxNT .fixedScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar {display:block; overflow-y:hidden; overflow-x:scroll; height:17px;} +.rightBoxNT .fixedScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar .width-bar {height:1px;} +.rightBoxNT .fixedScroll .grid-layout.horizontal-scrollbar .horizontal-scrollbar-line {bottom:16px;} +/* 데이터 테이블 관련 */ +.rightBoxNT .fixedScroll .grid-layout table {border:0; table-layout:fixed; border-collapse:collapse; border-spacing:1px; width:100%; height:35px;} +.rightBoxNT .fixedScroll .grid-layout table.titleTable {position:relative; right:0;} +.rightBoxNT .fixedScroll .grid-layout table col {background-color:#fff;} +.rightBoxNT .fixedScroll .grid-layout table th {font-weight:normal; font-size:12px; overflow:hidden; white-space:nowrap; text-align:center; position:relative; border:1px solid #dee2e6; border-left:none; border-top:none;} +.rightBoxNT .fixedScroll .grid-layout table tr {height:30px;} +.rightBoxNT .fixedScroll .grid-layout table tr.hover {background-color:#fff;} +.rightBoxNT .fixedScroll .grid-layout table tr.checked {background-color:#fff;} +.rightBoxNT .fixedScroll .grid-layout table tr.focused {background-color:#fff;} +.rightBoxNT .fixedScroll .grid-layout table tr.disabled, .fixedScroll .grid-layout table tr.disabled-row {color:#b0b0b0;} +.rightBoxNT .fixedScroll .grid-layout table td {overflow:hidden; font-size:12px; border:1px solid #dee2e6; border-top:none; border-left:none; background:#fff; line-height:17px; text-align:center; height:35px;} +.rightBoxNT .fixedScroll .grid-layout table td div.productNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .fixedScroll .grid-layout table td div.productOptionType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .fixedScroll .grid-layout table td div.couponNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .fixedScroll .grid-layout table td div.contentType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.rightBoxNT .fixedScroll .grid-layout table td div.leftAlign {text-align:left;} +.rightBoxNT .fixedScroll .grid-layout table td div.rightAlign {text-align:right;} +.rightBoxNT .fixedScroll .grid-layout table td.focused {border:solid 1px #5a86dd; padding:7px 11px;} +.rightBoxNT .fixedScroll .grid-layout table td a {color:#5a86dd;} +.rightBoxNT .fixedScroll .grid-layout table td img {vertical-align:middle; margin:-1px;} +/* 체크 박스 관련 스타일 */ +.rightBoxNT .fixedScroll .grid-layout .checkbox label:after, .rightBoxNT .fixedScroll .grid-layout .checkbox label:before {height:18px; width:18px; top:5px; left:5px; position:absolute;} +.rightBoxNT .fixedScroll .grid-layout .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.rightBoxNT .fixedScroll .grid-layout .checkbox label:before {content:''; border-radius:4px;} +.rightBoxNT .fixedScroll .grid-layout .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.rightBoxNT .fixedScroll .grid-layout .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:.6rem; width:1rem; border-color:#178754; border-radius:0; border-width:2px; top:10px; left:9px;} + +.rightBoxNT .fixedScroll .cui-grid-textbox {display:inline-block; width:100%; box-sizing:border-box;} +/* 데이터 없을 때 */ +.rightBoxNT .fixedScroll .grid-layout .empty-layer {display:none; width:100%; height:100%; position:absolute; top:0; background:#fff; width:calc(100% - 17px);} +.rightBoxNT .fixedScroll .grid-layout .empty-layer .content {display:table-cell; font-size:14px; height:100%; text-align:center; padding-top:100px; overflow-x:hidden; overscroll-behavior-x:none;} +/* 열고정 라인 그라데이션 스타일 */ +.rightBoxNT .fixedScroll .grid-layout .line-gradient:after {position:absolute; top:0; bottom:0; width:6px; height:100%; content:'';} + + + + + + + + + +/* 리스트 검색결과가 없습니다.*/ +.rightBoxNT .form-horizontal table .searchEmpty>td{cursor: default;} +.rightBoxNT .form-horizontal table .searchEmpty>td .noData {height:200px; vertical-align:middle; display:block; text-align:center; padding:70px 0;} +.rightBoxNT .form-horizontal table .searchEmpty>td .noData .noDataTitle {margin:0; font-size:18px; color:#777;} +.rightBoxNT .form-horizontal table .searchEmpty>td .noData .noDataText {margin:0; line-height:14px; color:#999;} +.rightBoxNT .form-horizontal table .searchEmpty>td .noData .noDataText span {color:#50c3ca;} + + + + +/* 스크롤없는 일반표 */ +.rightBoxNT .basicTable {overflow:hidden; min-width:100%; margin-bottom:10px;} +.rightBoxNT .basicTable table {border:0; table-layout:fixed; border-collapse:collapse; border-spacing:1px; border:1px solid #dee2e6; width:100%;} +.rightBoxNT .basicTable table th {background-color:#f6f6f6; font-weight:normal; font-size:12px; overflow:hidden; white-space:nowrap; text-align:center; position:relative; border:1px solid #dee2e6; border-top:none; border-left:none; height:35px;} +.rightBoxNT .basicTable table td {overflow:hidden; font-size:12px; border-top:none; border-left:none; background:#fff; border:1px solid #dee2e6; text-align:center; height:35px;} + + + + +/* 탭 */ +.rightBoxNT .border {width:40px; height:3px; background:#00723e;} +.rightBoxNT .listConbox {margin-bottom:1px;} +.rightBoxNT .listConbox .tabList {list-style:none; padding:0; margin:1px; margin-bottom:-1px; width:100%; background:#fff;} +.rightBoxNT .listConbox .tabList li {position:relative; display:table-cell; width:calc(100% / 12); border-left:0; text-align:center;} +.rightBoxNT .listConbox .tabList .planActionLi{width:200px;} +.rightBoxNT .listConbox .tabList li:after {content:''; position:absolute; top:0; bottom:0; left:-1px; right:0; border:1px solid #dedede;} +.rightBoxNT .listConbox .tabList li a {position:relative; display:block; font-size:13px; line-height:38px; height:38px; z-index:1; margin:0; padding:0; border:0; background:#f5f7f7; border:1px solid #dee2e6; border-left:none; border-radius:0;} +.rightBoxNT .listConbox .tabList li a:link {color:rgba(49, 58, 70, .8);} +.rightBoxNT .listConbox .tabList li a:hover {background:#f5f7f7; color:rgba(49, 58, 70, .8);} +.rightBoxNT .listConbox .tabList li.active a:after {content:''; position:absolute; top:0; left:0; right:0; bottom:0; border:0; z-index:2;} +.rightBoxNT .listConbox .tabList li.active a:hover{background:none;} +.rightBoxNT .listConbox .nav-tabs>li.active>a, .rightBoxNT .listConbox .nav-tabs>li.active>a:focus, .rightBoxNT .listConbox .nav-tabs>li.active>a:hover {color:#fff; background:#377ec1; border-radius:0; border:none;} /*선택시 배경 여기에 넣을것 */ +.rightBoxNT .formSubstance .tab-pane {display:none;} +.rightBoxNT .formSubstance .tab-pane.active {display:block;} /*bradley 수정*/ +/* 탭내용*/ +.rightBoxNT .form-horizontal .conBox {border:1px solid #dee2e6; padding:10px;} +.rightBoxNT .form-horizontal .conBox .title {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700;} +.rightBoxNT .form-horizontal .conBox .title span {color:#97989b; font-size:13px; margin-left:10px;} +.rightBoxNT .form-horizontal .conBox .marginBox {margin:30px;} + + + + + + +/* 페이지게이션 */ +.pagination{margin:0;} +.pagination>li {width:30px; height:30px; display:inline-block;} + +.pagination>li>a {height:100%; width:100%; padding:0;} +.pagination>li>a svg {width:14px; height:14px; position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0);} +.pagination>li>a.page-link {padding:5px 0;} +.pagination>li>a.next {border-right:1px solid #ddd;} +.pagination>li>a, .pagination>li>span {line-height:1.5; padding:5px 12px; border-right:none;} +.pagination>li:last-child>a, .pagination>li:last-child>span {border-right:solid 1px #e6e6e6;} + + +.pagination>.disabled>a, .pagination>.disabled>a:focus, .pagination>.disabled>a:hover, .pagination>.disabled>span, .pagination>.disabled>span:focus, .pagination>.disabled>span:hover{border-color:#e6e6e6; /* color:#919191; */ width:30px; height:30px;} +.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover {background-color:#377ec1; border-color:#377ec1; color:#fff; width:30px; height:30px; line-height:20px;} +.pagination>li>a:hover, .pagination>li>span:hover, .pagination>li>a:focus, .pagination>li>span:focus {background:#377ec1; color:#fff; border:solid 1px #377ec1;} +.pagination>li>a, .pagination>li>span {color:#333;} +.pagination>.disabled>span svg {width:14px; height:14px; position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0);} +.pagination>.disabled>span.next {border-right:1px solid #ddd;} + + + +/* 상세입력 */ +.rightBoxNT .detailsBox {margin-top:0; border-bottom:none; margin-bottom:20px; display:inline-block; width:100%;} +.rightBoxNT .detailsBox .detailsTitle {color:rgba(49, 58, 70, .8); text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700; display:block;} +.rightBoxNT .detailsBox .left {padding:0;} +.rightBoxNT .detailsBox .right {padding:0;} +.rightBoxNT .detailsBox .group1 {padding-bottom:0;} +.rightBoxNT .detailsBox .detailsPanel {} +.rightBoxNT .detailsBox .detailsPanel .sideText {line-height:30px; color:#97989b; position:relative; left:5px; bottom:-5px;} + +/* 상세입력+,-버튼 */ +.rightBoxNT .form-horizontal .tableBtn {} +.rightBoxNT .form-horizontal .tableBtn .btn-Plus {height:30px; background:#50c3ca; padding:0; width:30px; border-radius:.267rem;} +.rightBoxNT .form-horizontal .tableBtn .btn-Plus:hover {background:#63b3a6;} +.rightBoxNT .form-horizontal .tableBtn .btn-Plus svg {color:#fff; width:25px; height:25px; position:relative; top:2px;} +.rightBoxNT .form-horizontal .tableBtn .btn-Minus {height:30px; background:#fc5083; padding:0; width:30px; border-radius:.267rem;} +.rightBoxNT .form-horizontal .tableBtn .btn-Minus:hover {background:#eb4375;} +.rightBoxNT .form-horizontal .tableBtn .btn-Minus svg {color:#fff; width:25px; height:25px; position:relative; top:2px;} + +.rightBoxNT .form-horizontal .tableBtn1 {width:40px; background:#fff; border:1px solid #dee2e6;} +.rightBoxNT .form-horizontal .tableBtn1 .btn-Minus {height:34px; background:#fc5083; padding:0; width:35px; border-radius:.267rem;} +.rightBoxNT .form-horizontal .tableBtn1 .btn-Minus:hover {background:#eb4375;} +.rightBoxNT .form-horizontal .tableBtn1 .btn-Minus svg {color:#fff; width:25px; height:25px; position:relative; top:3px;} + + + + + +/* 질문관리_질문답변내용 */ +.rightBoxNT .form-horizontal .mainTitle {font-size:15px; line-height:40px; font-weight:700; padding:0 15px; border-bottom:1px solid #dee2e6;} +.rightBoxNT .form-horizontal .openList {margin:0; padding:0; list-style:none; margin-bottom:30px;} +.rightBoxNT .form-horizontal .openList li {padding:5px 0; border-bottom:1px solid #dee2e6;} +.rightBoxNT .form-horizontal .openList li .titleBox {background:#f7f7f7; height:40px; padding:0 15px; border:1px solid #dee2e6;} +.rightBoxNT .form-horizontal .openList li .titleBox .user {font-size:13px; line-height:40px; font-weight:700;} +.rightBoxNT .form-horizontal .openList li .titleBox .site {margin:0 2px 0 3px; padding:1px 6px; border-radius:1px; font-size:12px; color:#fff; background:#4684e9; font-style:normal; position:relative; top:0;} +.rightBoxNT .form-horizontal .openList li .titleBox .site.type {background: #fc5083;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox {float:right;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .time{margin:0; font-size:13px; line-height:40px; color:#999;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .openBtn {width:60px; margin:0 7px; text-shadow:none; border:none; padding:0; border-radius:.267rem; box-shadow:none; line-height:25px; font-size:13px; position:relative; top:-2px;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .open-revise {background:#50c3ca; color:#fff; margin-right:0;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .open-revise:hover {background:#63b3a6;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .open-delete {background:#fc5083; color:#fff; margin-right:0;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .open-delete:hover {background:#eb4375;} +/*질문내용*/ +.rightBoxNT .form-horizontal .openList li .questionTitle{background:rgb(112 192 179 / 20%); height:40px; padding:0 15px; border:1px solid #dee2e6;} +.rightBoxNT .form-horizontal .openList li .answerBox .questionMainTitle {font-size:15px; font-weight:700; border-bottom:1px solid #dee2e6; padding-bottom:10px;} +.rightBoxNT .form-horizontal .openList li .answerBox .questionAnswer {color:#888; letter-spacing:-.03em; padding:10px 0;} +.rightBoxNT .form-horizontal .openList li .numberBox {border-top:1px solid #dee2e6; padding-top:10px;} +/*질문답변*/ +.rightBoxNT .form-horizontal .openList li .answerBox {clear:both; position:relative; top:-2px; padding:10px 15px; border:1px solid #dee2e6; background-color:#fff;} +.rightBoxNT .form-horizontal .openList li .answerBox .answer {color:#888; letter-spacing:-.03em;} +.rightBoxNT .form-horizontal .openList li .answerBox .answer.memoTitle {font-weight:700;} +.rightBoxNT .form-horizontal .openList li .answerBox .detail {margin-bottom:15px;display:inline-block;font-size:12px;color:#999;} + + + +/* 권한 체크리스트 박스 */ +.rightBoxNT .checkListchoiceBox {border:1px solid #dee2e6; display:block; width:100%; padding:0.47rem 0.8rem; border-radius:0.267rem; width:calc(100% - 10px); display:table;} +.rightBoxNT .checkListchoiceBox .checkListWarp {width:calc(100%/5); float:left;} +.rightBoxNT .checkListchoiceBox .checkListWarp .title {line-height:30px; color:#333; font-weight:500; background:#f7f7f7; border:1px solid #dee2e6; border-left:none; text-align:center;} +.rightBoxNT .checkListchoiceBox .checkListWarp .title.first {border-left:1px solid #dee2e6;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox {border-top:none; border-right:none; /*padding:10px 10px 10px 30px;*/ min-height:150px; padding:10px;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox {position:relative; display:block;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox input[type=checkbox] {display:none;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox input[type=checkbox] {box-sizing:border-box; padding:0;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox {min-height:26px; padding:0 18px;} + +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox label {font-size:13px; line-height:26px; margin-left:7px; padding:0;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox label:after, .rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox label:before {height:18px; width:18px; top:4px; left:0; position:absolute;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox label:before {content:''; border-radius:4px;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.rightBoxNT .checkListchoiceBox .checkListWarp .checkListBox .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:5px; width:9px; border-color:#6A99F8; border-radius:0; border-width:2px; top:10px; left:5px;} + + + + + +/* 캘린더 */ +.rightBoxNT .form-horizontal .calendarBox{padding:5px 0;} +/* 토요일 글자(요일,날짜) 색상 */ +.rightBoxNT .form-horizontal .calendarBox .fc-day-sat.fc-day-past div>a {color:#50c3ca;} +.rightBoxNT .form-horizontal .calendarBox .fc-day.fc-day-sat div>a {color:#50c3ca;} +/* 일요일 글자(요일,날짜) 색상 */ +.rightBoxNT .form-horizontal .calendarBox .fc-day-sun.fc-day-past div>a {color:#fc5083;} +.rightBoxNT .form-horizontal .calendarBox .fc-day.fc-day-sun div>a {color:#fc5083;} +/* 평일 글자(요일,날짜) 색상 */ +.rightBoxNT .form-horizontal .calendarBox .fc-daygrid-day-number {color:#333;} +.rightBoxNT .form-horizontal .calendarBox .fc-day div>a{color:#333;} +/* 캘린더 안 등록 버튼 */ +.rightBoxNT .form-horizontal .calendarBox .fc-insertButton-button{background-color:#63b3a6; color:#fff; border:0; line-height:23px;} +/* 캘린더 안 다음달 버튼 */ +.rightBoxNT .form-horizontal .calendarBox .fc-next-button{margin:0;} +/* 캘린더 안 제목(년월) */ +.rightBoxNT .form-horizontal .calendarBox .fc-toolbar-title{display:inline-block; vertical-align:middle; margin:0 30px;} +/* 캘린더 안 이벤트 백그라운드 기본값 */ +.rightBoxNT .form-horizontal .calendarBox .fc-h-event{background:none;border:0;} +/* 일정 커서 */ +.rightBoxNT .form-horizontal .calendarBox .fc-event-main-frame{cursor: pointer;} + + +/* */ +.ag-header-cell-label { + justify-content: center; +} + +.ag-theme-alpine .ag-ltr .ag-cell{ + text-align: center;font-size: 12px;padding:0;line-height: 30px; +} +.ag-theme-balham .ag-ltr .ag-cell{ + text-align: center;font-size: 12px;padding:0;line-height: 30px; +} + +.ag-theme-balham .ag-header-cell{ + padding: 4px 18px; +} + +.ag-selection-checkbox{ + padding: 7px 17px; +} + + + + +/*반응형 View*/ +@media only screen and (max-width: 1577px) { + .rightBoxNT .form-horizontal .pageDateInput{width:42%;} +} +@media only screen and (max-width: 1376px) { + .left-menu {left:-200px;} + .rightBoxNT {left:0; width:calc(1376px - 20px);} + + /* 모바일 햄버거 메뉴 관련 joy추가 */ + html.open {overflow:hidden;} + #leftMenu.open {left:0px;} + .page_cover.open {display:block;} + .page_cover {width:100%; height:100%; position:fixed; top:0px; left:0px; background-color:rgba(0,0,0,0.4); z-index:4; display:none; margin-top:50px;} + + .tapNav {width:calc(1376px - 20px); left:0;} + +} + +@media only screen and (max-width:1200px) { + + .rightBoxNT {left:0; width:calc(1200px - 20px);} + .tapNav {width:calc(1200px - 20px);} +} + +@media only screen and (max-width:1024px) { +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:414px) { +} + +@media only screen and (max-width:375px) { +} + +@media only screen and (max-width:360px) { +} + +@media only screen and (max-width:320px) { +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/common_styles.css b/src/main/resources/static/css/admin/common_styles.css new file mode 100644 index 0000000..4c094de --- /dev/null +++ b/src/main/resources/static/css/admin/common_styles.css @@ -0,0 +1,91 @@ +/* common.css 수정금지 */ +/* 새로 css 추가시 어느 페이지에 어디위치인지 표시할것 */ +/* 기존 css 수정시 여기다가 수정할것 */ + + +/* bradley 추가 시작 */ +.rightBoxNT {top:90px; min-height:calc(100vh - 90px);} +.tapNav .tabWrap .tabList .tabContainer {height:40px;} +/* 등록,수정페이지_인풋 width 125 */ +.rightBoxNT .form-horizontal .pageWrapInput.width125 {width:125px;} + +/* 상세페이지 파일 다운로드 링크 display:none; 추가 */ +.rightBoxNT .download-file {display:none;} + +/* 질문 상세 수정 삭제 버튼 위치 수정 후 margin 변경 */ +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .open-revise {margin: 0 7px 0 0;} +.rightBoxNT .form-horizontal .openList li .titleBox .timeBox .open-delete {margin: 0 7px 0 0;} + + + + + +/*상세검색*/ +.rightBoxNT .form-horizontal .btnWhite.open svg {transform:rotate(180deg);} + +/*접속로그 기준일*/ +.rightBoxNT .listNav .numberBox .number.n-colorRed {color:red;font-size:12px;} +.rightBoxNT .listNav .numberBox .number.n-colorRed span {color:red;} + + +.page_cover {width:100%; height:100%; position:fixed; top:0; left:0; background-color:rgba(0,0,0,0.4); z-index:4; display:none;} +.page_cover.open {display:block;} + +/*첨부파일 확장자*/ +.rightBoxNT .input-file .fileExt {color:red; padding-left:10px;} + +.rightBoxNT .form-horizontal .form-group .width50, .rightBoxNT .form-horizontal .form-group50 .width50 {width:42%; padding:5px;} +.rightBoxNT .form-horizontal .form-group .width100, .rightBoxNT .form-horizontal .form-group50 .width100 {width:100%; padding:5px;} +.rightBoxNT .detailsBox {display:table;} + +/* 탭 상단 사용자 접속 정보 */ +.leftBtnWrap {float: left; padding:10px 0; margin:0 10px 0 0; list-style:none;} +.leftBtnWrap li .tapUser {float: left; margin:0; margin-left:6px; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; display:block;} +.leftBtnWrap li .tapUser p {text-shadow:none; line-height:30px; text-align:center; color:#fff;} +.leftBtnWrap li .tapUser .tapUserName {float: right; font-size:13px; } +.leftBtnWrap li .tapUser .tapSessionTime {width: 50px; float: left; font-size:15px; font-weight: 800;} +.leftBtnWrap .btnSession {width:60px; margin:0 10px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; line-height:30px; font-size:13px;} +/* 메인컬러_버튼 */ +.leftBtnWrap .btnMain {background:#377ec1; color:#fff;} + +/* 검색버튼 */ +.rightBoxNT .form-horizontal .search_box {float:left; padding:5px 0 5px 5px;} +.rightBoxNT .form-horizontal .search_box .search_btn {border-color:#e6e6e6; color:#333; height:30px; padding:0 10px; font-size:13px; font-weight:400; line-height:1.42857143; border-radius:4px; background:#377ec1; border:none;} +.rightBoxNT .form-horizontal .search_box .search_btn:hover, .rightBoxNT .search_box .search_btn:focus {background:#7caad7;} +.rightBoxNT .form-horizontal .search_box .search_btn img {position:relative; top:-1px;} +.rightBoxNT .form-horizontal .search_box .search_delete_btn {border-color:#e6e6e6; color:#333; height:30px; padding:0 10px; font-size:13px; font-weight:400; line-height:1.42857143; border-radius:4px; background:#fc5083; border:none;display: none;} +.rightBoxNT .form-horizontal .search_box .search_delete_btn:hover, .rightBoxNT .search_box .search_btn:focus {background:#fc5083;} +.rightBoxNT .form-horizontal .search_box .search_delete_btn img {position:relative; top:-1px;} + +/* 그래프 스타일 추가 */ +.rightBoxNT .basicScroll table td.graphBar {padding:0 5px;} +.rightBoxNT .basicScroll table td.graphBar div {height:15px; background-color:#377ec1; opacity:0.4; position:relative; cursor:pointer;} +/* bradley 추가 종료 */ + +/* emily 추가 시작 */ +/* 일괄등록 가이드박스 */ +.rightBoxNT .form-list .guideBox {padding:10px 15px; margin-bottom:15px; border:1px solid #e6e6e6;} +.rightBoxNT .form-list .guideBox p {font-size:15px; font-weight:700;} +.rightBoxNT .form-list .guideBox ul {padding:0; margin:0; list-style:none;} +.rightBoxNT .form-list .guideBox ul li {list-style:inside;} +.rightBoxNT .form-list .guideBox .txtBold {font-weight: 800;} +.rightBoxNT .form-list .number {line-height:30px; margin:0; display:inline-block;} + + +.rightBoxNT .listNav .numberBox .number .r-color {color:red; padding-left:3px;} + +/* 로고 등록 이미지 박스 사이즈 조절*/ +.rightBoxNT .form-horizontal .imgBox2 {width:300px; height:60px; padding:0; float:left; margin-right:10px;} +.rightBoxNT .form-horizontal .img-300 {border:1px solid #dee2e6; width:300px; height:60px; background:none; color:#3e3f3a;} +.rightBoxNT .form-horizontal .img-300:hover{background:none;border:1px solid #dee2e6;box-shadow:none;} + +/* 수정 권한 없을 때 summernote대신 */ +.rightBoxNT .form-horizontal .textarea_content {height: 200px; overflow-y: auto; background:rgba(238, 242, 247, .6);} + +/* 빨간색 버튼 */ +.rightBoxNT .btnRed {background:#c50049; color:#fff;} +.rightBoxNT .btnRed:hover {background:#bb0045;} + +/* 등록,수정페이지 글자수 카운트 */ +.rightBoxNT .form-horizontal .sideText {line-height:30px; color:#97989b; position:relative; left:5px; bottom:-5px;} +/* emily 추가 종료 */ \ No newline at end of file diff --git a/src/main/resources/static/css/admin/curriculumCompleteFamilyPrint.css b/src/main/resources/static/css/admin/curriculumCompleteFamilyPrint.css new file mode 100644 index 0000000..b706914 --- /dev/null +++ b/src/main/resources/static/css/admin/curriculumCompleteFamilyPrint.css @@ -0,0 +1,101 @@ +/************* 기본영역 정의 *************/ + +* { margin: 0; font-family: "궁서체"; box-sizing: border-box; color:#333; } + +/************* page *************/ +.page { width:250mm; height:353mm; padding:120px 120px; /*background:url('../../image/admin/print/bg2.png')no-repeat 50% 50%;*/ background-size:100%; } +.page .content_wrap { width:685px; height:100%; text-align:center; position:relative; } +.page .content_wrap p.top { font-size:30px; letter-spacing:-1px; position:absolute; top:70px; left:70px; } +.page .content_wrap .top_box { padding-top:150px; } +.page .content_wrap .top_box h1 { font-size:60px; text-align:center; letter-spacing:35px; } +.page .content_wrap .top_box .info_box { margin-top:30px; padding:0 100px; text-align:left; position:relative; } +.page .content_wrap .top_box .info_box ul { padding:0; margin-top:10px; display:inline-block; } +.page .content_wrap .top_box .info_box ul li { margin-top:20px; display:flex; } +.page .content_wrap .top_box .info_box ul li label { font-size:30px; letter-spacing:10px; } +.page .content_wrap .top_box .info_box ul li p { font-size:30px; letter-spacing:10px; } +.page .content_wrap .top_box .info_box .img_box { width:105px; height:135px; position:absolute; top:0; right:100px; } +.page .content_wrap .top_box .info_box .img_box img { width:100%; } +.page .content_wrap p.article { margin-top:100px; font-size:33px; letter-spacing:1px; line-height:55px; text-align:left; display:inline-block; } +.page .content_wrap p.date { margin-top:70px; font-size:33px; letter-spacing:1px; } +.page .content_wrap .btm_box { margin-top:110px; } +.page .content_wrap .btm_box p { margin-left:170px; font-size:21px; display:inline-block; } +.page .content_wrap .btm_box p span { letter-spacing:10px; } +.page .content_wrap .btm_box p span.narrow { letter-spacing:-5px; } +.page .content_wrap .btm_box p span.siz { font-size:35px; } +.page .content_wrap .btm_box img { width:400px; margin-left:175px; } + +@media print { + @page { + size:250mm 353mm; + margin: 0; + } + + * { + -webkit-print-color-adjust: exact !important; + color-adjust: exact !important; + print-color-adjust: exact !important; + } +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 900; + font-display: swap; + src: local('Pretendard Black'), url(../../font/admin/Pretendard-Black.woff2) format('woff2'), url(../../font/admin/Pretendard-Black.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 800; + font-display: swap; + src: local('Pretendard ExtraBold'), url(../../font/admin/Pretendard-ExtraBold.woff2) format('woff2'), url(../../font/admin/Pretendard-ExtraBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 700; + font-display: swap; + src: local('Pretendard Bold'), url(../../font/admin/Pretendard-Bold.woff2) format('woff2'), url(../../font/admin/Pretendard-Bold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 600; + font-display: swap; + src: local('Pretendard SemiBold'), url(../../font/admin/Pretendard-SemiBold.woff2) format('woff2'), url(../../font/admin/Pretendard-SemiBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 500; + font-display: swap; + src: local('Pretendard Medium'), url(../../font/admin/Pretendard-Medium.woff2) format('woff2'), url(../../font/admin/Pretendard-Medium.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 400; + font-display: swap; + src: local('Pretendard Regular'), url(../../font/admin/Pretendard-Regular.woff2) format('woff2'), url(../../font/admin/Pretendard-Regular.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 300; + font-display: swap; + src: local('Pretendard Light'), url(../../font/admin/Pretendard-Light.woff2) format('woff2'), url(../../font/admin/Pretendard-Light.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 200; + font-display: swap; + src: local('Pretendard ExtraLight'), url(../../font/admin/Pretendard-ExtraLight.woff2) format('woff2'), url(../../font/admin/Pretendard-ExtraLight.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 100; + font-display: swap; + src: local('Pretendard Thin'), url(../../font/admin/Pretendard-Thin.woff2) format('woff2'), url(../../font/admin/Pretendard-Thin.woff) format('woff'); +} diff --git a/src/main/resources/static/css/admin/curriculumCompletePrint.css b/src/main/resources/static/css/admin/curriculumCompletePrint.css new file mode 100644 index 0000000..0bf5307 --- /dev/null +++ b/src/main/resources/static/css/admin/curriculumCompletePrint.css @@ -0,0 +1,104 @@ +/************* 기본영역 정의 *************/ + +* { margin: 0; font-family: "궁서체"; box-sizing: border-box; color:#333; } + +/************* page *************/ +.page { width:210mm; height:297mm; padding: 1.5cm 1.5cm 2cm 1.5cm;} +.page .content_wrap { width:685px; height:100%; text-align:center; position:relative; } +.page .content_wrap p.top { font-size:30px; letter-spacing:-1px; position:absolute; top:70px; left:70px; } +.page .content_wrap .top_box { padding-top:150px; } +.page .content_wrap .top_box h1 { font-size:60px; text-align:center; letter-spacing:35px; } +.page .content_wrap .top_box .info_box { margin-top:30px; padding:0 100px; text-align:left; position:relative; } +.page .content_wrap .top_box .info_box ul { padding:0; margin-top:10px; display:inline-block; } +.page .content_wrap .top_box .info_box ul li { margin-top:20px; display:flex; } +.page .content_wrap .top_box .info_box ul li label { font-size:30px; letter-spacing:10px; } +.page .content_wrap .top_box .info_box ul li p { font-size:30px; letter-spacing:10px; } +.page .content_wrap .top_box .info_box .img_box { width:105px; height:135px; position:absolute; top:0; right:100px; } +.page .content_wrap .top_box .info_box .img_box img { width:100%; } +.page .content_wrap p.article { margin-top:100px; font-size:33px; letter-spacing:1px; line-height:70px; text-align:left; display:inline-block; } +.page .content_wrap p.date { margin-top:135px; font-size:33px; letter-spacing:1px; } +.page .content_wrap .btm_box { margin-top:60px; } +.page .content_wrap .btm_box p { margin-left:170px; font-size:21px; display:inline-block; } +.page .content_wrap .btm_box p span { letter-spacing:10px; } +.page .content_wrap .btm_box p span.narrow { letter-spacing:-5px; } +.page .content_wrap .btm_box p span.siz { font-size:35px; } +.page .content_wrap .btm_box img { width:400px; margin-left:175px; } + +@page { + size: A4; + margin: 0; +} + + +@media print { + * { + -webkit-print-color-adjust: exact !important; + color-adjust: exact !important; + print-color-adjust: exact !important; + } + + html, body { width:210mm; height:297mm; } +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 900; + font-display: swap; + src: local('Pretendard Black'), url(../../font/admin/Pretendard-Black.woff2) format('woff2'), url(../../font/admin/Pretendard-Black.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 800; + font-display: swap; + src: local('Pretendard ExtraBold'), url(../../font/admin/Pretendard-ExtraBold.woff2) format('woff2'), url(../../font/admin/Pretendard-ExtraBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 700; + font-display: swap; + src: local('Pretendard Bold'), url(../../font/admin/Pretendard-Bold.woff2) format('woff2'), url(../../font/admin/Pretendard-Bold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 600; + font-display: swap; + src: local('Pretendard SemiBold'), url(../../font/admin/Pretendard-SemiBold.woff2) format('woff2'), url(../../font/admin/Pretendard-SemiBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 500; + font-display: swap; + src: local('Pretendard Medium'), url(../../font/admin/Pretendard-Medium.woff2) format('woff2'), url(../../font/admin/Pretendard-Medium.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 400; + font-display: swap; + src: local('Pretendard Regular'), url(../../font/admin/Pretendard-Regular.woff2) format('woff2'), url(../../font/admin/Pretendard-Regular.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 300; + font-display: swap; + src: local('Pretendard Light'), url(../../font/admin/Pretendard-Light.woff2) format('woff2'), url(../../font/admin/Pretendard-Light.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 200; + font-display: swap; + src: local('Pretendard ExtraLight'), url(../../font/admin/Pretendard-ExtraLight.woff2) format('woff2'), url(../../font/admin/Pretendard-ExtraLight.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 100; + font-display: swap; + src: local('Pretendard Thin'), url(../../font/admin/Pretendard-Thin.woff2) format('woff2'), url(../../font/admin/Pretendard-Thin.woff) format('woff'); +} diff --git a/src/main/resources/static/css/admin/dashboard.css b/src/main/resources/static/css/admin/dashboard.css new file mode 100644 index 0000000..61823ff --- /dev/null +++ b/src/main/resources/static/css/admin/dashboard.css @@ -0,0 +1,33 @@ + +/* dashboard */ +.rightBoxNT {background:#e6efeb; min-height:calc(100vh - 50px); padding:10px;} +.rightBoxNT .content_box {display:table; width:100%; padding:20px;} +.rightBoxNT .content_box .content_top {list-style:none; padding:0; margin:0; margin-bottom:30px; display:table; width:100%;} +.rightBoxNT .content_box .content_top li {float:left; width:calc((100% / 3) - 20px); border:solid 1px #e6e6e6; border-radius:4px; background:#fff;} +.rightBoxNT .content_box .content_top li:nth-child(2) {margin:0 30px;} +.rightBoxNT .content_box .content_top li .title {font-size:13px; font-weight:700; padding:0 20px; line-height:50px; border-bottom:solid 1px #e6e6e6; margin:0; color:#000; position:relative;} +.rightBoxNT .content_box .content_top li .text_box {padding:0 20px; position:relative; height:100px;} +.rightBoxNT .content_box .content_top li .text_box .user {font-size:28px; font-weight:700; margin:0; line-height: 150px;} +.rightBoxNT .content_box .content_top li .text_box .money_box {position:absolute; top:50%; transform:translateY(-50%); width:calc(100% - 40px);} +.rightBoxNT .content_box .content_top li .text_box .money_box .temp {float:left; width:calc(100% / 3); text-align:center;} +.rightBoxNT .content_box .content_top li .text_box .money_box .money_title {font-size:15px; font-weight:700; margin:0; line-height:25px;} +.rightBoxNT .content_box .content_top li .text_box .money_box .money_content {font-size:15px; font-weight:700; margin:0; line-height:25px; color:#377ec1;} +.rightBoxNT .content_box .content_top li .text_box .money_box .money_content span {color:#377ec1;} + +.rightBoxNT .content_box .content_top li .title svg {width:25px; height:25px; position:absolute; top:50%; right:25px; transform:translateY(-50%); color:#377ec1;} + + + +.rightBoxNT .content_box .content_bottom {list-style:none; padding:0; margin:0; margin-bottom:30px; display:table; width:100%;} +.rightBoxNT .content_box .content_bottom li {float:left; width:calc((100% / 3) - 20px); border:solid 1px #e6e6e6; border-radius:4px; background:#fff;} +.rightBoxNT .content_box .content_bottom li:nth-child(2) {margin:0 30px;} +.rightBoxNT .content_box .content_bottom li .notice_warp {} +.rightBoxNT .content_box .content_bottom li .notice_warp .title {font-size:13px; font-weight:700; padding:0 20px; line-height:50px; border-bottom:solid 1px #e6e6e6; margin:0; color:#000;} +.rightBoxNT .content_box .content_bottom li .notice_warp .title a {float:right; font-size:13px; color:#377ec1;} +.rightBoxNT .content_box .content_bottom li .notice_warp .title a:hover {color:#27885f;} +.rightBoxNT .content_box .content_bottom li .notice_warp .list_box {padding:0 10px;} + + +.rightBoxNT .content_box .content_bottom li .notice_warp .list_box .list {display:table; width:100%; padding:0; margin:0; list-style:none; min-height:394px;} +.rightBoxNT .content_box .content_bottom li .notice_warp .list_box .list li {width:100%; float:unset; border:none; border-top:solid 1px #e6e6e6; border-radius:0; background:unset; margin:0; padding:10px; font-size:13px; cursor:pointer;} +.rightBoxNT .content_box .content_bottom li .notice_warp .list_box .list li:first-child {border-top:none;} diff --git a/src/main/resources/static/css/admin/error.css b/src/main/resources/static/css/admin/error.css new file mode 100644 index 0000000..069cdd0 --- /dev/null +++ b/src/main/resources/static/css/admin/error.css @@ -0,0 +1,83 @@ +/*반응형 View*/ +@media (min-width: 768px){ + .carousel-caption {width:70%;} +} + +@media (min-width: 992px){ + .carousel-caption {width:70%;} +} + +@media (min-width: 1200px){ + .carousel-caption {width:60%;} +} + +/*홈네비*/ +#header #menu a {color:#fff;} +#header #menu a:hover {color:#6487c2;} +.header {background:#00000021;} +.header {background:none;} +.header .logo {color:#333;} + +/*error*/ +.error {/* margin-top:80px; */ height:889px; width:100%;} +.error .normal {position:absolute; top:50%; transform:translatey(-50%); width:100%; left:0; right:0;} +.error .normal .btn{background:#23527c; width:230px; position:relative; left:50%; margin-left:-115px; border-radius:4px; padding:5px; color:#fff; top:30px;} +.error .normal .img {position:relative; left:50%; margin-left:-250px; margin-top:100px; width:500px;} +.error .normal .img img {width:100%;} + + +/*텍스트*/ +.font-title1 {font-size:60px;} +.font-title2 {font-size:24px;} +.font-title3 {font-size:22px;} +.font-title4 {font-size:22px;} +.font-title5 {font-size:16px;} + +.wh {color:#fff;} +.gy {color:#878890;} +.bk {color:#333;} +.main-title {color:#56585a;} +.sub-title {color:#86939e;} +.color-title {color:#6487c2;} +.wh-subtitle {color:#cccccc;} + +.tac {text-align:center;} +.tal {text-align:left;} +.tar {text-align:right;} +.fl {float:left;} +.fr {float:right;} +.line-none1 {display:-webkit-box; overflow:hidden; -webkit-box-orient:vertical; word-break:break-all; -webkit-line-clamp:1;} +.mg0 {margin:0;} +.pd0 {padding:0;} +.bd {font-weight:bold;} + + + +/*반응형 View*/ +@media only screen and (max-width:1220px) { +} + +@media only screen and (max-width: 1024px){ +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:516px) { +} + +@media only screen and (max-width:414px) { + .error .normal .img {margin-left:-150px; width:300px; margin-top:50px;} +} + +@media only screen and (max-width: 375px){ +} + +@media only screen and (max-width: 360px){ +} + +@media only screen and (max-width: 320px){ +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/font.css b/src/main/resources/static/css/admin/font.css new file mode 100644 index 0000000..e6f0ccb --- /dev/null +++ b/src/main/resources/static/css/admin/font.css @@ -0,0 +1,62 @@ +@font-face { + font-family: 'Pretendard'; + font-weight: 900; + font-display: swap; + src: local('Pretendard Black'), url(/font/admin/Pretendard-Black.woff2) format('woff2'), url(/font/admin/Pretendard-Black.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 800; + font-display: swap; + src: local('Pretendard ExtraBold'), url(/font/admin/Pretendard-ExtraBold.woff2) format('woff2'), url(/font/admin/Pretendard-ExtraBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 700; + font-display: swap; + src: local('Pretendard Bold'), url(/font/admin/Pretendard-Bold.woff2) format('woff2'), url(/font/admin/Pretendard-Bold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 600; + font-display: swap; + src: local('Pretendard SemiBold'), url(/font/admin/Pretendard-SemiBold.woff2) format('woff2'), url(/font/admin/Pretendard-SemiBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 500; + font-display: swap; + src: local('Pretendard Medium'), url(/font/admin/Pretendard-Medium.woff2) format('woff2'), url(/font/admin/Pretendard-Medium.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 400; + font-display: swap; + src: local('Pretendard Regular'), url(/font/admin/Pretendard-Regular.woff2) format('woff2'), url(/font/admin/Pretendard-Regular.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 300; + font-display: swap; + src: local('Pretendard Light'), url(/font/admin/Pretendard-Light.woff2) format('woff2'), url(/font/admin/Pretendard-Light.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 200; + font-display: swap; + src: local('Pretendard ExtraLight'), url(/font/admin/Pretendard-ExtraLight.woff2) format('woff2'), url(/font/admin/Pretendard-ExtraLight.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 100; + font-display: swap; + src: local('Pretendard Thin'), url(/font/admin/Pretendard-Thin.woff2) format('woff2'), url(/font/admin/Pretendard-Thin.woff) format('woff'); +} diff --git a/src/main/resources/static/css/admin/loadingAnimations2.css b/src/main/resources/static/css/admin/loadingAnimations2.css new file mode 100644 index 0000000..96c7050 --- /dev/null +++ b/src/main/resources/static/css/admin/loadingAnimations2.css @@ -0,0 +1,28 @@ +.loading-image-layer{margin:0; padding:0; background:#fff;} + +.loading-image-layer>ul {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); margin:0; padding:0; display:flex;} +.loading-image-layer>ul li {list-style:none; width:20px; height:20px; background:#c1cbda; margin:0 5px; border-radius:50%; animation:animate 1.4s linear infinite;} +@keyframes animate { + 0%{transform:translateY(0);} + 60%{transform:translateY(0);} + 80%{transform:translateY(-20px);} + 100%{transform:translateY(0);} +} +.loading-image-layer>ul li:nth-child(1) {animation-delay:0;} +.loading-image-layer>ul li:nth-child(2) {animation-delay:-1.2s;} +.loading-image-layer>ul li:nth-child(3) {animation-delay:-1s;} +.loading-image-layer>ul li:nth-child(4) {animation-delay:-.8s;} +.loading-image-layer>ul li:nth-child(5) {animation-delay:-.6s;} + + + + +.loading-image-layer2{margin:0; padding:0; background:#fff;} + +.loading-image-layer2>ul {position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); margin:0; padding:0; display:flex;} +.loading-image-layer2>ul li {list-style:none; width:20px; height:20px; background:#c1cbda; margin:0 5px; border-radius:50%; animation:animate 1.4s linear infinite;} +.loading-image-layer2>ul li:nth-child(1) {animation-delay:0;} +.loading-image-layer2>ul li:nth-child(2) {animation-delay:-1.2s;} +.loading-image-layer2>ul li:nth-child(3) {animation-delay:-1s;} +.loading-image-layer2>ul li:nth-child(4) {animation-delay:-.8s;} +.loading-image-layer2>ul li:nth-child(5) {animation-delay:-.6s;} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/login.css b/src/main/resources/static/css/admin/login.css new file mode 100644 index 0000000..d668860 --- /dev/null +++ b/src/main/resources/static/css/admin/login.css @@ -0,0 +1,68 @@ +@charset "UTF-8"; + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; text-shadow:none; +} + +/* .box-sizing(@box-model) { + -webkit-box-sizing: @box-model; //사파리 <= 5 + -moz-box-sizing: @box-model; //파이어폭스 <= 19 + box-sizing: @box-model; +} */ + + +html,body {height:100%;} +body {font-family: 'Pretendard', sans-serif; padding:0; margin:0; font-size:13px;display:-ms-flexbox; display:flex; -ms-flex-align:center; align-items:center; padding-top:40px; padding-bottom:40px; background-color:#f5f5f5;} + +.text-center {background:rgb(21,21,21); background:linear-gradient(180deg, rgba(21,21,21,1) 0%, rgb(55 126 193) 100%);} +.text-center .form-signin {padding:50px 50px; background:#f5f7f7; border-radius:4px; max-width:400px; width:100%; margin:auto;} +.text-center .form-signin svg {width:60px; height:60px;} +.pageName {font-size:26px; margin:40px 20px; margin-top:0;} + +.form-signin .checkbox {font-weight:400;} +.form-signin .form-control:focus {z-index:2; border:1px solid #00bbc5;} +.form-signin .form-control {margin-bottom:10px; height:36px; border:1px solid #dee2e6; display:block; width:100%; padding:0; padding-left:5px; background-color:#FFF; border-radius:0.267rem; box-shadow:none; font-size:13px; color:rgba(49, 58, 70, .8);} +input[type=text]:focus {border:1px solid #00bbc5;} +input[type=password]:focus {border:1px solid #00bbc5;} + +.form-signin .btn-primary {font-weight:400; line-height:36px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; font-size:13px; float:right; background:#5e5f62; color:#fff;} +.form-signin .btn-primary:hover, .form-signin .btn-primary:focus {outline:none; background:#848588;} +.copy {color:#929292; font-size:12px; margin-top:20px; margin-bottom:0;} + +.listBtn {overflow:hidden; display:inline-block; margin:auto; list-style:none; margin-top:20px; padding-inline-start:20px;} +.listBtn li {float:left;} +.listBtn li a {font-size:13px; color:#929292; cursor:pointer; text-decoration:none;} +.listBtn li:before {content:'l'; color:#929292; font-size:10px; margin:0 12px;} +.listBtn li:first-child:before {content:none;} + + + + + + +/*반응형 View*/ +@media only screen and (max-width:1220px) { +} + +@media only screen and (max-width:1024px) { +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:414px) { +} + +@media only screen and (max-width:375px) { +} + +@media only screen and (max-width:360px) { +} + +@media only screen and (max-width:320px) { +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/member.css b/src/main/resources/static/css/admin/member.css new file mode 100644 index 0000000..73dc587 --- /dev/null +++ b/src/main/resources/static/css/admin/member.css @@ -0,0 +1,111 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Noto Sans KR'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans KR Regular'), local('Noto Sans CJK KR Regular'), + url(/font/admin/NotoSansKR-Regular.woff2) format('woff2'), + url(/font/admin/NotoSansKR-Regular.woff) format('woff'), + url(/font/admin/NotoSansKR-Regular.otf) format('opentype'); +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; text-shadow:none; +} + +/* .box-sizing(@box-model) { + -webkit-box-sizing: @box-model; //사파리 <= 5 + -moz-box-sizing: @box-model; //파이어폭스 <= 19 + box-sizing: @box-model; +} */ + + +html,body {height:100%;} +body {font-family: "Noto Sans KR", "나눔고딕", "Dotum", "돋움", "Arial", "AppleSDGothicNeo", sans-serif; padding:0; margin:0; font-size:13px;display:-ms-flexbox; display:flex; -ms-flex-align:center; align-items:center; padding-top:40px; padding-bottom:40px; background-color:#f5f5f5;} + +.text-center {background:rgb(21,21,21); background:linear-gradient(180deg, rgba(21,21,21,1) 0%, rgba(0,147,155,1) 100%);} +.text-center .form-signin {padding:50px 50px; background:#f5f7f7; border-radius:4px; max-width:600px; width:100%; margin:auto;} +.text-center .form-signin svg {width:60px; height:60px;} +.pageName {font-size:26px; margin:40px 20px; margin-top:0;} +.scroll {overflow-y:scroll; height:500px; margin-bottom:30px; padding:0 20px;} + +.form-signin label {text-align:left; display:block; position:unset; width:unset; height:unset; margin:0; margin-bottom: 2px;} +.scroll::-webkit-scrollbar {width:6px; height:6px;} +.scroll::-webkit-scrollbar-thumb {border-radius:8px; background-color:#00bbc5;} +.scroll::-webkit-scrollbar-corner {background:#151515;} +.form-signin .form-control:focus {z-index:2; border:1px solid #00bbc5; outline:none;} +.form-signin .form-control {margin-bottom:10px; height:36px; border:1px solid #dee2e6; display:block; width:100%; padding:0; padding-left:5px; background-color:#FFF; border-radius:0.267rem; box-shadow:none; font-size:13px; color:rgba(49, 58, 70, .8);} +.form-signin .form-control.number, .form-signin .form-control.address1 {margin-bottom:5px;} +.form-signin .form-control.Last {margin-bottom:10px;} +.form-signin .form-control.disabled{background:#dee2e6;} +input[type=text]:focus {border:1px solid #00bbc5;} +input[type=password]:focus {border:1px solid #00bbc5;} +.form-signin .zipCodeBox {display:table; width:100%;} +.form-signin .zipCodeBox .form-control {width:calc(50% - 3px); float:left;} +.form-signin .zipCodeBox button {width:calc(50% - 3px); float:right; margin-right:0} + +.scroll textarea {border:1px solid #DFE3E7; border-radius:0.267rem; padding:10px; background:#fff; text-align:left; height:490px; color:#929292; width:100%;} + +.form-signin .checkbox {padding:0; display:block; margin-bottom:0; display:table; width:100%;} +.form-signin .checkbox.first {margin-bottom:20px; margin-top:30px;} +.form-signin .checkbox input[type=checkbox] {display:none;} +.form-signin input[type=checkbox] {box-sizing:border-box; padding:0;} +.form-signin .checkbox label {padding-left:5px; float:left; margin:0;} /* bradley 수정 */ +.form-signin .checkbox label:after, .form-signin .checkbox label:before {height:18px; width:18px; top:0; left:0; position:absolute; background:#fff;} /* bradley 수정 */ +.form-signin .checkbox label:after {content:''; background:#fff; border:1px solid #e6e6e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.form-signin .checkbox label:before {content:''; border-radius:4px;} +.form-signin .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #e6e6e6;} +.form-signin .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:.6rem; width:1rem; border-color:#50c3ca; border-radius:0; border-width:2px; top:4px; left:4px;} /* bradley 수정 */ +.form-signin .checkbox span {padding-left:25px; float:left;} /* bradley 추가 */ +.form-signin .checkbox a {} +.form-signin .checkbox a svg {width:18px; height:18px; float:right; color:#a4acb5;} + +.form-signin .btn-primary {font-weight:400; line-height:36px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; font-size:13px; float:right; background:#377ec1; color:#fff;} +.form-signin .btn-primary:hover, .form-signin .btn-primary:focus {outline:none; background:#377ec1;} +.copy {color:#929292; font-size:12px; margin-top:30px; margin-bottom:0;} + +.listBtn {overflow:hidden; display:inline-block; margin:auto; list-style:none; margin-top:20px; padding-inline-start:20px;} +.listBtn li {float:left;} +.listBtn li a {font-size:13px; color:#929292; cursor:pointer; text-decoration:none;} +.listBtn li:before {content:'l'; color:#929292; font-size:10px; margin:0 12px;} +.listBtn li:first-child:before {content:none;} + + + + +/*bradley 추가 시작*/ +.form-signin .btnBox {display:table; width:calc(100% - 40px); margin:0 auto;} +.form-signin .btnBox .btn-left {width:calc(50% - 3px); float:left; margin:0;} +.form-signin .btnBox .btn-right {width:calc(50% - 3px); float:right; margin:0;} +.form-signin .btnBox .btnGray {background:#8e949d; color:#fff;} +.form-signin .btnBox .btnGray:hover {background:#878c95;} + +/*bradley 추가 종료*/ + +/*반응형 View*/ +@media only screen and (max-width:1220px) { +} + +@media only screen and (max-width:1024px) { +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:414px) { +} + +@media only screen and (max-width:375px) { +} + +@media only screen and (max-width:360px) { +} + +@media only screen and (max-width:320px) { +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/modal.css b/src/main/resources/static/css/admin/modal.css new file mode 100644 index 0000000..2e5114a --- /dev/null +++ b/src/main/resources/static/css/admin/modal.css @@ -0,0 +1,401 @@ +/* +Ntsoft v1.0.1 +Copyright 2021.11 NTSOFT, Inc. +*/ + + +/* 팝업 */ +.modalNT.in .modal-dialog {width:407px; top:50%; transform:translateY(-50%); margin:0 auto;}/*인풋만있을시min-width:605px; 인풋사이 ~ 있을시min-width:620px; 최대min-width:1000px;*/ +.modalNT.fade .modal-dialog {width:407px; top:50%; transform:translateY(-50%); margin:0 auto;}/*인풋만있을시min-width:605px; 인풋사이 ~ 있을시min-width:620px; 최대min-width:1000px;*/ +.modalNT .modal-dialog .modal-content {position:relative; display:-ms-flexbox; display:flex; -ms-flex-direction:column; flex-direction:column; background-color:unset; background-clip:padding-box; border:none; border-radius:0.3rem; overflow:hidden; box-shadow:none;} +.modalNT .modal-dialog .modal-content.overflowN {overflow:unset;} +.modalNT .modal-dialog .modal-content .modal-header {display:-ms-flexbox; display:flex; -ms-flex-align:start; align-items:flex-start; border:none; padding:16px; background:#377ec1; border-radius:0; border:none; box-shadow:none; margin:0; position:relative; padding:10px 15px;} +.modalNT .modal-dialog .modal-content .modal-header .modal-name {font-size:18px; margin:0; color:#fff;} +.modalNT.fade .modal-dialog .modal-content .modal-header .close {padding:8px; -webkit-filter:invert(1) grayscale(100%) brightness(200%); filter:invert(1) grayscale(100%) brightness(200%); -webkit-box-sizing:content-box; box-sizing:content-box; color:#313a46; border:0; border-radius:0.25rem; opacity:1; text-shadow:none; position:absolute; top:50%; right:8px; transform:translateY(-50%); font-size:26px;} +.modalNT .modal-body {padding:16px; /*max-height:600px;*/ overflow:scroll; overflow-x:unset; background:#fff;} +.modalNT .modal-body.scrollN {overflow:unset;} + + +.modalNT .modal-body .form-group {display:table; width:100%; border-bottom:1px solid #dee2e6; border-left:none; border-right:none; margin:0; padding:0; background:#f5f7f7;} +/* 폼그룹2분할_영역제어 */ +.modalNT .modal-body .form-group50Wrap {margin-top:0; border-bottom:none; display:table; width:100%;} +/* 폼그룹2분할 */ +.modalNT .modal-body .form-group50 {width:50%; float:left; border-bottom:1px solid #dee2e6; background:#f5f7f7;} + +.modalNT .modal-body .formLine {border-top:1px solid #bdc3c7;} +.modalNT .modal-body .control-label {float:left; margin:0; width:170px; text-align:left; line-height:30px; padding:5px 0 5px 15px; font-weight:unset;} +.modalNT .modal-body .requisite {color:red; font-size:12px;} +.modalNT .modal-body .floatLeft {float:left;} +.modalNT .modal-body .rightWarp {padding:5px 0 5px 5px;} +.modalNT .modal-body .rightWidth {width:calc(100% - 170px); background:#fff;} +.modalNT .modal-body .rightWidthFull {width:100%; display:table;} + + + +/* 등록,수정페이지_인풋 */ +.modalNT .modal-body .pageWrapInput {width:200px; padding:5px 0 5px 5px;} +/* 등록,수정페이지_텍스트에어리어,에디터 */ +.modalNT .modal-body .pageWrapTextarea {padding:5px; width:100%;} + + + +.modalNT .modal-body .checkText {position:relative; bottom:0; margin:0 5px; font-weight:600; line-height:30px; padding:5px 0; float:left;} +.modalNT .modal-body .commentText {position:relative; bottom:-10px; margin:0 0 0 5px; font-weight:600;} +.modalNT .modal-body .inputcomment {clear:both; color:#97989b; margin:0; font-size:12px;} +.modalNT .modal-body .textareaText {line-height:30px; color:#97989b; position:relative; left:5px; bottom:-105px;} +.modalNT .modal-body .detailsBox {margin-top:0; border-bottom:none; margin-bottom:20px; display:inline-block; width:100%;} +.modalNT .modal-body .detailsBox .detailsTitle {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700; display:block;} +.modalNT .modal-body .imgWidth {width:137px; height:137px; overflow:hidden; margin:5px 0 5px 10px; float:left;} +.modalNT .modal-body .imgWidth img {width:100%;} +.modalNT .modal-body select.form-control:not([multiple=multiple]) {background-image:url(../../image/arrow-down.png); background-position:95%; background-size:14px 14px,10px 10px; background-repeat:no-repeat; -webkit-appearance:none; -moz-appearance:none; padding-right:1.5rem; height:30px; color:rgba(49, 58, 70, .8);} +.modalNT .modal-body .form-control {width:100%; border:1px solid #dee2e6; display:block; padding:.47rem .8rem; background-color:#FFF; border-radius:.267rem; box-shadow:none; height:30px; font-size:13px;} +.modalNT .modal-body .form-control.dateInput2 {border-radius:.267rem 0 0 .267rem;} +.modalNT .modal-body .form-control[disabled]{background:rgba(238, 242, 247, .6);} +.modalNT .modal-body .checkbox label {font-size:13px; line-height:30px; margin-left:7px; padding:0;} +.modalNT .modal-body textarea {font-size:13px; border:1px solid #dee2e6; outline:none; padding:.47rem .8rem; height:130px; display:block;} +.modalNT .modal-body textarea:disabled {background:rgba(238, 242, 247, .6);} +.modalNT .modal-body textarea:focus {border:1px solid #00bbc5;} +.modalNT .modal-body input[type=text]:focus {border:1px solid #00bbc5;} +.modalNT .modal-body select.form-control:not([multiple=multiple]):focus {border:1px solid #00bbc5;} + + + +.modalNT .modal-footer {border-top:1px solid #dee2e6; background:#fff; padding:10px 15px;} + +/* 버튼기본사이즈 (전체버튼공통) */ +.modalNT .btnCommon {width:100px; margin:0 3px; text-shadow:none; border:none; padding:0; border-radius:.267rem; box-shadow:none; line-height:30px; font-size:13px;} +.modal-footer .btn+.btn {margin:0 3px;} +/* 가운데 정렬 버튼 영역 */ +.modalNT .btnBox {padding: 10px 15px; margin:0 auto; float:none; min-width:10px; display:table; } +/* 초록색_버튼 */ +.modalNT .btnMint {background:#377ec1; color:#fff;} +.modalNT .btnMint:hover {background:#377ec1;} +/* 회색_버튼 */ +.modalNT .btnGray {background:#8e949d; color:#fff;} +.modalNT .btnGray:hover {background:#878c95;} +/* 빨간색_버튼 */ +.modalNT .btnRed {background:#c50049; color:#fff;} +.modalNT .btnRed:hover {background:#bb0045;} + +/* 체크,라디오 공통 */ +.modalNT .modal-body .checkbox, .modalNT .modal-body .radio {position:relative; display:inline-block;} +.modalNT .modal-body .checkbox input[type=checkbox], .modalNT .modal-body .radio input[type=radio] {display:none;} +.modalNT .modal-body input[type=radio], .modalNT .modal-body input[type=checkbox] {box-sizing:border-box; padding:0;} +.modalNT .modal-body .checkbox, .modalNT .modal-body .radio {min-height:29px; padding:0 5px 0 15px;} + + +/* 체크박스 */ +.modalNT .modal-body .checkbox label {font-size:13px; line-height:30px; margin-left:7px; padding:0;} +.modalNT .modal-body .checkbox label:after, .modalNT .modal-body .checkbox label:before {height:18px; width:18px; top:6px; left:0; position:absolute;} +.modalNT .modal-body .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.modalNT .modal-body .checkbox label:before {content:''; border-radius:4px;} +.modalNT .modal-body .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.modalNT .modal-body .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:5px; width:9px; border-color:#6A99F8; border-radius:0; border-width:2px; top:12px; left:5px;} + + +/* 라디오박스 */ +.modalNT .modal-body .radioWrap {padding:5px 0 5px 5px; display:inline;} +.modalNT .modal-body .radio label {font-size:13px; line-height:29px; margin-left:5px; padding:0;} +.modalNT .modal-body .radio label::after, .modalNT .modal-body .radio label::before {content:'';} +.modalNT .modal-body .radio label:after, .modalNT .modal-body .radio label:before {height:20px; width:20px; top:8px; left:0; position:absolute;} +.modalNT .modal-body .radio label::before {border:1px solid #e6e6e6; border-radius:50%; width:16px; height:16px; margin-right:.5rem;} +.modalNT .modal-body .radio label::after {position:absolute; display:-webkit-inline-box; display:-webkit-inline-flex; display:-ms-inline-flexbox; display:inline-flex; height:6px; width:6px; background-color:#377ec1; border-radius:50%; top:13px; left:5px; opacity:0; -webkit-transform:scale(3.6); -ms-transform:scale(3.6); transform:scale(3.6); border:none;} +.modalNT .modal-body .radio input[type=radio]:checked~label::after {opacity:1; -webkit-transform:scale(1); -ms-transform:scale(1); transform:scale(1); -webkit-transition:all .3s cubic-bezier(.35,.9,.4,.9); transition:all .3s cubic-bezier(.35,.9,.4,.9);} +/* 라디오 컬러선택 */ +.modalNT .modal-body .radio .rangeColorArea1 {background-color:#377ec1;width:15px;height:15px;display:inline-block;position:relative;top:3px;box-shadow:inset 0 0 0 1px rgba(0, 0, 0, .15);border-radius:2px;} +.modalNT .modal-body .radio .rangeColorArea2 {background-color:#fc5083;width:15px;height:15px;display:inline-block;position:relative;top:3px;box-shadow:inset 0 0 0 1px rgba(0, 0, 0, .15);border-radius:2px;} +.modalNT .modal-body .radioColor {display:inline-block;} +.modalNT .modal-body .radioColor .minicolors-swatch::after {box-shadow:inset 0 0 0 1px rgba(0, 0, 0, .15);} +.modalNT .modal-body .radioColor .minicolors {display:inline-block; width:200px;} +.modalNT .modal-body .radioColor .color-Control {padding-left:28px; width:100%;} +.modalNT .modal-body .radioColor .minicolors-theme-bootstrap .minicolors-swatch {width:17px; height:17px; top:6px; left:6px;} + + + +/* 리스트상단네비 */ +.modalNT .modal-body .listNav {display:inline-block; width:100%;} +.modalNT .modal-body .listNav .number {line-height:30px; margin:0; display:inline-block; padding:5px 0;} +.modalNT .modal-body .listNav .number .n-color {color:blue;} +.modalNT .modal-body .listNav .selectBox {float:right; padding:5px 0;} +.modalNT .modal-body .listNav .selectBox .selectList {width:150px; margin:0 7px; float:left;} +.modalNT .modal-body .listNav .selectBox .last {margin-right:0;} +.modalNT .modal-body .listNav .selectBox .selectList select.form-control:not([multiple=multiple]) {width:150px;} + +/* 리스트 왼쪽,오른쪽,마진제외 버튼 영역 */ +.modalNT .modal-body .btnlistBox {padding:5px 0; display:table; width:100%; border-top:1px solid #dee2e6;} +.modalNT .modal-body .btnlistLine {border-top:1px solid #a2a2a2;} +/*빨간색_왼쪽정렬버튼*/ +.modalNT .modal-body .btnlistBox .btnRed {background:#c50049; color:#fff; margin-left:0;} +.modalNT .modal-body .btnlistBox .btnRed:hover {background:#bb0045;} +/* 초록색_우측정렬버튼 */ +.modalNT .modal-body .btnlistBox .btnMint {background:#377ec1; color:#fff; float:right;} +.modalNT .modal-body .btnlistBox .btnMint:hover {background:#377ec1;} +/* 초록색_우측정렬우측마진제거버튼*/ +.modalNT .modal-body .btnlistBox .btnMintNoMargin {background:#377ec1; color:#fff; float:right; margin-right:0;} +.modalNT .modal-body .btnlistBox .btnMintNoMargin:hover {background:#377ec1;} +/* 회색_좌측정렬버튼 */ +.modalNT .modal-body .btnlistBox .btnMintLeft {background:#377ec1; color:#fff; float:left;} +.modalNT .modal-body .btnlistBox .btnMint:hover {background:#377ec1;} +/* 회색_우측정렬버튼 */ +.modalNT .modal-body .btnlistBox .btnGrayRight {background:#8e949d; color:rgba(49, 58, 70, .8); float:right;} +.modalNT .modal-body .btnlistBox .btnGrayRight:hover {background:#878c95;} +/* 회색_왼쪽정렬좌측마진제거버튼(맨끝 첫번째) */ +.modalNT .modal-body .btnlistBox .btnGrayLeftMargin {background:#8e949d; color:rgba(49, 58, 70, .8); margin-left:0;} +.modalNT .modal-body .btnlistBox .btnGrayLeft:hover {background:#878c95;} +/* 회색_우측정렬우측마진제거버튼(맨끝 첫번째) */ +.modalNT .modal-body .btnlistBox .btnGrayRightMargin {background:#8e949d; color:rgba(49, 58, 70, .8); float:right; margin-right:0;} +.modalNT .modal-body .btnlistBox .btnGrayRightMargin:hover {background:#878c95;} + + +/* 리스트 검색결과가 없습니다.*/ +.modalNT table .searchEmpty>td{cursor: default;} +.modalNT table .searchEmpty>td .noData {height:200px; vertical-align:middle; display:block; text-align:center; padding:70px 0;} +.modalNT table .searchEmpty>td .noData .noDataTitle {margin:0; font-size:18px; color:#777;} +.modalNT table .searchEmpty>td .noData .noDataText {margin:0; line-height:14px; color:#999;} +.modalNT table .searchEmpty>td .noData .noDataText span {color:#377ec1;} + + + +/* 해더고정스크롤 */ +.modalNT .modal-body .basicScroll {overflow:hidden; width:100%; min-width:100%; margin-bottom:21px;} +.modalNT .modal-body .basicScroll .grid-layout {margin:0 auto; width:100%; background:#fff; font-size:12px; color:#444; border:solid 1px #dddfe4; border-top:none; position:relative; box-sizing:border-box;} +/*툴팁레이어가 grid-layout 위에 있을 경우 overflow:hidden 제거 필요 */ + +/* 스크롤바 스타일 관련 */ +.modalNT .modal-body .basicScroll .grid-layout {scrollbar-highlight-color:#fff; scrollbar-shadow-color:#fff; scrollbar-arrow-color:#8a8a8a; scrollbar-face-color:#d9d9d9; scrollbar-3dlight-color:#fff; scrollbar-darkshadow-color:#fff; scrollbar-track-color:#fff;} +.modalNT .modal-body .basicScroll .grid-layout ::-webkit-scrollbar {-webkit-appearance:none; width:17px; height:17px; background-color:#fff;} +.modalNT .modal-body .basicScroll .grid-layout ::-webkit-scrollbar-thumb {background-color:#d9d9d9; border:5px solid transparent; border-radius:16px; background-clip:content-box;} +.modalNT .modal-body .basicScroll .grid-layout ::-webkit-scrollbar-thumb:hover {background-color:#c1c1c1;} +.modalNT .modal-body .basicScroll .grid-layout ::-webkit-scrollbar-corner {background-color:#f2f2f2;} + +/* 헤더 영역 */ +.modalNT .modal-body .basicScroll .grid-layout .header {position:relative; overflow:hidden;} +.modalNT .modal-body .basicScroll .grid-layout .header .headerBox {overflow:hidden; left:-1px; border-top:1px solid #dee2e6; border-bottom:1px solid #dee2e6; background:#f6f6f6;} +.modalNT .modal-body .basicScroll .grid-layout .header .base {overflow-x:scroll; margin-right:-1px;} +.modalNT .modal-body .basicScroll .grid-layout .header .config-button {display:none;} +.modalNT .modal-body .basicScroll .grid-layout .header tbody {background-color:#f6f6f6;} +.modalNT .modal-body .basicScroll .grid-layout .header .left {margin-right:16px;} + +/* 바디 영역 */ +.modalNT .modal-body .basicScroll .grid-layout .body {position:relative; overflow:hidden; margin-bottom:-1px;} +.modalNT .modal-body .basicScroll .grid-layout .body .height-bar {display:none;} +.modalNT .modal-body .basicScroll .grid-layout .body .base {margin-right:-1px;} +.modalNT .modal-body .basicScroll .grid-layout .body .bodyBox {top:-1px; left:-1px; overflow:hidden;} +.modalNT .modal-body .basicScroll .grid-layout .vertical-scrollbar-line {display:none;} +.modalNT .modal-body .basicScroll .grid-layout .horizontal-scrollbar-line {display:none; position:absolute; width:100%; height:1px; left:0px; background-color:#dddfe4;} +.modalNT .modal-body .basicScroll .grid-layout .container {position:relative;} +.modalNT .modal-body .basicScroll .grid-layout .body .left {display:none; position:absolute; top:0; margin:0;} +.modalNT .modal-body .basicScroll .grid-layout .right {display:none; position:absolute; top:0; right:-1px;} +.modalNT .modal-body .basicScroll .grid-layout .clipboard {position:absolute; left:-999px; width:1px; height:1px; bottom:0;} + +/* 데이터 없을 때 */ +.modalNT .modal-body .basicScroll .grid-layout .empty-layer {display:none; width:100%; height:100%; position:absolute; top:0; background:#fff;} +.modalNT .modal-body .basicScroll .grid-layout .empty-layer .content {display:table-cell; font-size:14px; height:100%; text-align:center; padding-top:100px; overflow-x:hidden; overscroll-behavior-x:none;} + +/* 그리드 전체 비활성화 */ +.modalNT .modal-body .basicScroll .grid-layout .blocker-layer {display:none; position:absolute; background:rgba(0, 0, 0, 0.05); width:100%; height:100%; top:0;} +.modalNT .modal-body .basicScroll .grid-layout.disabled, .modalNT .modal-body .basicScroll .grid-layout.disabled th, .modalNT .modal-body .basicScroll .grid-layout.disabled .content-holder {color:#e0e0e0 !important;} +.modalNT .modal-body .basicScroll .grid-layout.disabled .blocker-layer {display:block;} + +/* 수평 스크롤 가능 영역 */ +.modalNT .modal-body .basicScroll .grid-layout .horizontal-scrollable {overscroll-behavior-x:none;} + +/* 수직 스크롤바를 사용하지 않는 경우 */ +.modalNT .modal-body .basicScroll .grid-layout .virtual-horizontal-scrollbar {display:none;} +.modalNT .modal-body .basicScroll .grid-layout .virtual-horizontal-scrollbar .space {display:none;} + +/* 수직 스크롤바를 사용하는 경우 */ +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .header .config-button {display:block; position:absolute; border:solid 1px #dddfe4; top:0; right:-1px; width:18px; background-color:#f6f6f6;} +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .body {overflow-y:scroll; margin-right:-1px; min-height:255px; max-height:initial; height:301px;} +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .body .height-bar {display:block; position:absolute; width:1px; top:0; left:0; background:transparent;} +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .virtual-horizontal-scrollbar {margin-right:16px;} +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line {display:block; position:absolute; width:1px; height:100%; top:0; right:16px; background-color:#dddfe4;} +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line:after {position:absolute; right:-17px; top:0; width:1px; height:100%; background-color:#dddfe4; content:'';} + +/* grid-layout overflow:hidden 제거시 필요 */ +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .header .container {margin-right:16px;} +.modalNT .modal-body .basicScroll .grid-layout.vertical-scrollbar .horizontal-scrollbar-line {bottom:-1px;} + +/* 수평 스크롤바를 사용하는 경우 */ +.modalNT .modal-body .basicScroll .grid-layout.horizontal-scrollbar .container {overflow:hidden;} +.modalNT .modal-body .basicScroll .grid-layout.horizontal-scrollbar .body .base {overflow-x:scroll;} +.modalNT .modal-body .basicScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar {display:block; overflow-y:hidden; overflow-x:scroll; height:17px;} +.modalNT .modal-body .basicScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar .width-bar {height:1px;} +.modalNT .modal-body .basicScroll .grid-layout.horizontal-scrollbar .horizontal-scrollbar-line {bottom:16px;} + +/* 데이터 테이블 관련 */ +.modalNT .modal-body .basicScroll .grid-layout table {border:0; table-layout:fixed; border-collapse:collapse; border-spacing:1px; width:100%;} +.modalNT .modal-body .basicScroll .grid-layout table.titleTable {position:relative; right:2px;} +.modalNT .modal-body .basicScroll .grid-layout table col {background-color:#fff;} +.modalNT .modal-body .basicScroll .grid-layout table th {font-weight:normal; font-size:12px; overflow:hidden; white-space:nowrap; text-align:center; position:relative; border:1px solid #dee2e6; border-left:none; border-top:none;} +.modalNT .modal-body .basicScroll .grid-layout table tr {height:30px;} +.modalNT .modal-body .basicScroll .grid-layout table tr.hover {background-color:#fff;} +.modalNT .modal-body .basicScroll .grid-layout table tr.checked {background-color:#fff;} +.modalNT .modal-body .basicScroll .grid-layout table tr.focused {background-color:#fff;} +.modalNT .modal-body .basicScroll .grid-layout table tr.disabled, .modalNT .modal-body .basicScroll .grid-layout table tr.disabled-row {color:#b0b0b0;} +.modalNT .modal-body .basicScroll .grid-layout table td {overflow:hidden; font-size:12px; border:1px solid #dee2e6; border-top:none; border-left:none; background:#fff; text-align:center; height:35px;} +.modalNT .modal-body .basicScroll .grid-layout table td .content-holder {white-space:nowrap; word-break:break-all;} +.modalNT .modal-body .basicScroll .grid-layout .body.variable-row-height table td .content-holder {white-space:normal; white-space:initial;} +.modalNT .modal-body .basicScroll .grid-layout table td.no-padding {padding:0px !important;} +.modalNT .modal-body .basicScroll .grid-layout table td.multi-line .content-holder {white-space:normal !important;} +.modalNT .modal-body .basicScroll .grid-layout table td.ellipsis .content-holder {text-overflow:ellipsis; overflow:hidden;} +.modalNT .modal-body .basicScroll .grid-layout table td.focused {border:solid 1px #5a86dd; padding:7px 11px;} +.modalNT .modal-body .basicScroll .grid-layout table td a {color:#5a86dd;} +.modalNT .modal-body .basicScroll .grid-layout table td img {vertical-align:middle; margin:-1px;} +.modalNT .modal-body .basicScroll .grid-layout table td div.productNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .basicScroll .grid-layout table td div.productOptionType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .basicScroll .grid-layout table td div.couponNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .basicScroll .grid-layout table td div.contentType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} + +.modalNT .modal-body .basicScroll .checkbox, .modalNT .modal-body .basicScroll .radio {min-height:29px; padding:0 5px;} +/* 체크 박스 관련 스타일 */ +.modalNT .modal-body .basicScroll .grid-layout .checkbox label:after, .modalNT .modal-body .basicScroll .grid-layout .checkbox label:before {height:18px; width:18px; top:6px; left:0; position:absolute;} +.modalNT .modal-body .basicScroll .grid-layout .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.modalNT .modal-body .basicScroll .grid-layout .checkbox label:before {content:''; border-radius:4px;} +.modalNT .modal-body .basicScroll .grid-layout .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.modalNT .modal-body .basicScroll .grid-layout .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:.6rem; width:1rem; border-color:#377ec1; border-radius:0; border-width:2px; top:11px; left:4px;} + +/* 라디오 박스 관련 스타일 */ +.modalNT .modal-body .basicScroll .grid-layout .radio label::after, .modalNT .modal-body .basicScroll .grid-layout .radio label::before {content:'';} +.modalNT .modal-body .basicScroll .grid-layout .radio label:after, .modalNT .modal-body .basicScroll .grid-layout .radio label:before {height:20px; width:20px; top:6px; left:-5px; position:absolute;} +.modalNT .modal-body .basicScroll .grid-layout .radio label::before {border:1px solid #dee2e6; border-radius:50%; width:16px; height:16px; margin-right:.5rem;} +.modalNT .modal-body .basicScroll .grid-layout .radio label::after {position:absolute; display:-webkit-inline-box; display:-webkit-inline-flex; display:-ms-inline-flexbox; display:inline-flex; height:6px; width:6px; background-color:#377ec1; border-radius:50%; top:11px; left:0; opacity:0; -webkit-transform:scale(3.6); -ms-transform:scale(3.6); transform:scale(3.6); border:none;} +.modalNT .modal-body .basicScroll .grid-layout .radio input[type=radio]:checked~label::after {opacity:1; -webkit-transform:scale(1); -ms-transform:scale(1); transform:scale(1); -webkit-transition:all .3s cubic-bezier(.35,.9,.4,.9); transition:all .3s cubic-bezier(.35,.9,.4,.9);} + +.modalNT .modal-body .basicScroll .cui-grid-textbox {display:inline-block; width:100%; box-sizing:border-box;} + +/* 열고정 라인 그라데이션 스타일 */ +.modalNT .modal-body .basicScroll .grid-layout .line-gradient:after {position:absolute; top:0; bottom:0; width:6px; height:100%; content:'';} + + + + + + +/* 왼쪽고정,해더고정 스크롤 */ +.modalNT .modal-body .fixedScroll {overflow:hidden; width:961px; min-width:100%; margin-bottom:21px;} +.modalNT .modal-body .fixedScroll .grid-layout {margin:0 auto; width:100%; background:#fff; font-size:12px; color:#444; border:solid 1px #dddfe4; border-top:none; position:relative; box-sizing:border-box;} +/*툴팁레이어가 grid-layout 위에 있을 경우 overflow:hidden 제거 필요 */ + +/* 스크롤바 스타일 관련 */ +.modalNT .modal-body .fixedScroll .grid-layout {scrollbar-highlight-color:#fff; scrollbar-shadow-color:#fff; scrollbar-arrow-color:#8a8a8a; scrollbar-face-color:#d9d9d9; scrollbar-3dlight-color:#fff; scrollbar-darkshadow-color:#fff; scrollbar-track-color:#fff;} +.modalNT .modal-body .fixedScroll .grid-layout ::-webkit-scrollbar {-webkit-appearance:none; width:17px; height:17px; background-color:#fff;} +.modalNT .modal-body .fixedScroll .grid-layout ::-webkit-scrollbar-thumb {background-color:#d9d9d9; border:5px solid transparent; border-radius:16px; background-clip:content-box;} +.modalNT .modal-body .fixedScroll .grid-layout ::-webkit-scrollbar-thumb:hover {background-color:#c1c1c1;} +.modalNT .modal-body .fixedScroll .grid-layout ::-webkit-scrollbar-corner {background-color:#f2f2f2;} + +/* 헤더 영역 */ +.modalNT .modal-body .fixedScroll .grid-layout .header {position:relative; overflow:hidden; border-top:1px solid #dee2e6;} +.modalNT .modal-body .fixedScroll .grid-layout .header .headerBox {overflow:hidden; left:-1px; overflow-y:scroll; height:35px;} +.modalNT .modal-body .fixedScroll .grid-layout .header .base {overflow-x:hidden; margin-right:-1px;} +.modalNT .modal-body .fixedScroll .grid-layout .header .config-button {display:none;} +.modalNT .modal-body .fixedScroll .grid-layout .header tbody {background-color:#f6f6f6;} +.modalNT .modal-body .fixedScroll .grid-layout #headerBox::-webkit-scrollbar-thumb {background-color:#f6f6f6;} +.modalNT .modal-body .fixedScroll .grid-layout #headerBox::-webkit-scrollbar-track {background-color:#f6f6f6; border-bottom:1px solid #dee2e6;} + +/* 바디 영역 */ +.modalNT .modal-body .fixedScroll .grid-layout .body {position:relative; overflow:hidden; margin-bottom:-1px;} +.modalNT .modal-body .fixedScroll .grid-layout .body .height-bar {display:none;} +.modalNT .modal-body .fixedScroll .grid-layout .body .base {margin-right:-1px;} +.modalNT .modal-body .fixedScroll .grid-layout .body .bodyBox {top:-1px; left:-1px; overflow:hidden;} +.modalNT .modal-body .fixedScroll .grid-layout .vertical-scrollbar-line {display:none;} +.modalNT .modal-body .fixedScroll .grid-layout .horizontal-scrollbar-line {display:none; position:absolute; width:100%; height:1px; left:0px; background-color:#dddfe4;} +.modalNT .modal-body .fixedScroll .grid-layout .container {position:relative;} +.modalNT .modal-body .fixedScroll .grid-layout .left {display:none; position:absolute; top:0;} +.modalNT .modal-body .fixedScroll .grid-layout .right {display:none; position:absolute; top:0; right:-1px;} +.modalNT .modal-body .fixedScroll .grid-layout .clipboard {position:absolute; left:-999px; width:1px; height:1px; bottom:0;} + +/* 그리드 전체 비활성화 */ +.modalNT .modal-body .fixedScroll .grid-layout .blocker-layer {display:none; position:absolute; background:rgba(0, 0, 0, 0.05); width:100%; height:100%; top:0;} +.modalNT .modal-body .fixedScroll .grid-layout.disabled, .modalNT .modal-body .fixedScroll .grid-layout.disabled th, .modalNT .modal-body .fixedScroll .grid-layout.disabled .content-holder {color:#e0e0e0 !important;} +.modalNT .modal-body .fixedScroll .grid-layout.disabled .blocker-layer {display:block;} + +/* 수평 스크롤 가능 영역 */ +.modalNT .modal-body .fixedScroll .grid-layout .horizontal-scrollable {overscroll-behavior-x:none;} + +/* 수직 스크롤바를 사용하지 않는 경우 */ +.modalNT .modal-body .fixedScroll .grid-layout .virtual-horizontal-scrollbar {display:none;} +.modalNT .modal-body .fixedScroll .grid-layout .virtual-horizontal-scrollbar .space {display:none;} + +/* 수직 스크롤바를 사용하는 경우 */ +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .header .config-button {display:block; position:absolute; border:solid 1px #dddfe4; top:0; right:-1px; width:18px; background-color:#f6f6f6;} +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .body {overflow-y:scroll; margin-right:-1px; min-height:255px; max-height:initial; height:301px;} +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .body .height-bar {display:block; position:absolute; width:1px; top:0; left:0; background:transparent;} +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .virtual-horizontal-scrollbar {margin-right:16px;} +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line {display:block; position:absolute; width:1px; height:100%; top:0; right:16px; background-color:#dddfe4;} +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .vertical-scrollbar-line:after {position:absolute; right:-17px; top:0; width:1px; height:100%; background-color:#dddfe4; content:'';} + +/* grid-layout overflow:hidden 제거시 필요 */ +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .header .container {margin-right:16px;} +.modalNT .modal-body .fixedScroll .grid-layout.vertical-scrollbar .horizontal-scrollbar-line {bottom:-1px;} + +/* 수평 스크롤바를 사용하는 경우 */ +.modalNT .modal-body .fixedScroll .grid-layout.horizontal-scrollbar .container {overflow:hidden;} +.modalNT .modal-body .fixedScroll .grid-layout.horizontal-scrollbar .body .base {overflow-x:hidden;} +.modalNT .modal-body .fixedScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar {display:block; overflow-y:hidden; overflow-x:scroll; height:17px;} +.modalNT .modal-body .fixedScroll .grid-layout.horizontal-scrollbar .virtual-horizontal-scrollbar .width-bar {height:1px;} +.modalNT .modal-body .fixedScroll .grid-layout.horizontal-scrollbar .horizontal-scrollbar-line {bottom:16px;} + +/* 데이터 테이블 관련 */ +.modalNT .modal-body .fixedScroll .grid-layout table {border:0; table-layout:fixed; border-collapse:collapse; border-spacing:1px; width:100%; height:35px;} +.modalNT .modal-body .fixedScroll .grid-layout table.titleTable {position:relative; right:0;} +.modalNT .modal-body .fixedScroll .grid-layout table col {background-color:#fff;} +.modalNT .modal-body .fixedScroll .grid-layout table th {font-weight:normal; font-size:12px; overflow:hidden; white-space:nowrap; text-align:center; position:relative; border:1px solid #dee2e6; border-left:none; border-top:none;} +.modalNT .modal-body .fixedScroll .grid-layout table tr {height:30px;} +.modalNT .modal-body .fixedScroll .grid-layout table tr.hover {background-color:#fff;} +.modalNT .modal-body .fixedScroll .grid-layout table tr.checked {background-color:#fff;} +.modalNT .modal-body .fixedScroll .grid-layout table tr.focused {background-color:#fff;} +.modalNT .modal-body .fixedScroll .grid-layout table tr.disabled, .modalNT .modal-body .fixedScroll .grid-layout table tr.disabled-row {color:#b0b0b0;} +.modalNT .modal-body .fixedScroll .grid-layout table td {overflow:hidden; font-size:12px; border:1px solid #dee2e6; border-top:none; border-left:none; background:#fff; line-height:17px; text-align:center;} +.modalNT .modal-body .fixedScroll .grid-layout table td div.productNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .fixedScroll .grid-layout table td div.productOptionType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .fixedScroll .grid-layout table td div.couponNameType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .fixedScroll .grid-layout table td div.contentType {white-space:nowrap; overflow:hidden; text-overflow:ellipsis; padding:0 5px;} +.modalNT .modal-body .fixedScroll .grid-layout table td div.leftAlign {text-align:left;} +.modalNT .modal-body .fixedScroll .grid-layout table td div.rightAlign {text-align:right;} +.modalNT .modal-body .fixedScroll .grid-layout .body.variable-row-height table td .content-holder {white-space:normal; white-space:initial;} +.modalNT .modal-body .fixedScroll .grid-layout table td.no-padding {padding:0px !important;} +.modalNT .modal-body .fixedScroll .grid-layout table td.multi-line .content-holder {white-space:normal !important;} +.modalNT .modal-body .fixedScroll .grid-layout table td.ellipsis .content-holder {text-overflow:ellipsis; overflow:hidden;} +.modalNT .modal-body .fixedScroll .grid-layout table td.focused {border:solid 1px #5a86dd; padding:7px 11px;} +.modalNT .modal-body .fixedScroll .grid-layout table td a {color:#5a86dd;} +.modalNT .modal-body .fixedScroll .grid-layout table td img {vertical-align:middle; margin:-1px;} + +/* 체크 박스 관련 스타일 */ +.modalNT .modal-body .fixedScroll .grid-layout .checkbox label:after, .grid-layout .checkbox label:before {height:18px; width:18px; top:4px; left:7px; position:absolute;} +.modalNT .modal-body .fixedScroll .grid-layout .checkbox label:after {content:''; border:1px solid #dee2e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.modalNT .modal-body .fixedScroll .grid-layout .checkbox label:before {content:''; border-radius:4px;} +.modalNT .modal-body .fixedScroll .grid-layout .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #dee2e6;} +.modalNT .modal-body .fixedScroll .grid-layout .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:.6rem; width:1rem; border-color:#377ec1; border-radius:0; border-width:2px; top:10px; left:12px;} + +.modalNT .modal-body .fixedScroll .cui-grid-textbox {display:inline-block; width:100%; box-sizing:border-box;} + +/* 열고정 라인 그라데이션 스타일 */ +.modalNT .modal-body .fixedScroll .grid-layout .line-gradient:after {position:absolute; top:0; bottom:0; width:6px; height:100%; content:'';} + + + + + + + + + + + + +/* 파일업로드 */ + +/*.modalNT .modal-body .input-file {min-height:37px; padding-right:0; padding-left:15px;}*/ +.modalNT .modal-body .input-file {display:inline-block;} +.modalNT .modal-body .input-file [type="file"] {position:absolute; width:1px; height:1px; padding:0; overflow:hidden; clip:rect(0, 0, 0, 0); border:0 none; } +.modalNT .modal-body .input-file .file-label {background-color:#dee2e6; text-align:center; margin:0 0 0 7px; text-shadow:none; border:none; border-radius:.267rem; box-shadow:none; line-height:30px; font-weight:300; cursor:pointer; padding:0 12px 0 7px;} +.modalNT .modal-body .input-file .btnFile {width:100px; background:#377ec1; text-shadow:none; color:#fff; border:none; padding:0.47rem 0.8rem; border-radius:0.267rem; box-shadow:none; height:35px; margin:0; text-align:center; font-weight:normal; line-height:25px;} +/* 버튼아이콘 */ +.modalNT .modal-body .input-file .file-label svg {fill:rgba(49, 58, 70, .8); float:left; width:25px} +.modalNT .modal-body .input-file .file-name {width:245px; border:1px solid #dee2e6; padding:.47rem .8rem; background-color:#FFF; border-radius:.267rem; box-shadow:none; height:30px; outline:none; float:left;} +.modalNT .modal-body .input-file [type="file"]:focus {border:1px solid #50c3ca;} +/* 첨부파일_파일문구 */ +.modalNT .modal-body .download-file {padding-left:15px; height:30px; line-height:24px; color:#dee2e6;} +.modalNT .modal-body .download-file .fileDownloadTitle {color:#999; text-decoration:underline;} + diff --git a/src/main/resources/static/css/admin/modal_styles.css b/src/main/resources/static/css/admin/modal_styles.css new file mode 100644 index 0000000..0c7dc8b --- /dev/null +++ b/src/main/resources/static/css/admin/modal_styles.css @@ -0,0 +1,222 @@ +/* modal.css 수정금지 */ +/* 새로 css 추가시 어느 페이지에 어디위치인지 표시할것 */ +/* 기존 css 수정시 여기다가 수정할것 */ + + + +/* joy 추가 시작 */ + +/* 연차관리 날짜 선택 리스트 */ +.modalNT .choiceDateBox{display:block;overflow-y:scroll;border:1px solid #e6e6e6;outline:none;width:700px;height:130px;padding:.47rem .8rem;} + +/* 작은 모달 */ +.modalNT.fade .modal-dialog.modalSmall {min-width:800px;} + +/* 왼쪽 정렬 */ +.modalNT .basicScroll .grid-layout table td div.leftAlign {text-align:left;padding:0 5px;} + +/* 필수 표시 */ +.modalNT .modal-body .requisite {color:red; font-size:12px;} + + + +/* 반복주기 가로사이즈 */ +.modalNT .modal-body .form-control.inputRepeaInterval {width:calc(100% - 60px);} + +/* 팝업 반복 주기 글자 */ +.modalNT .modal-body .repeatCommentText {position:relative; bottom:-10px; margin:0 0 0 5px; font-weight:600;} + +/* 알림 css 시작 */ +.success .modal.in {z-index: 9991;} +.success .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.success .modal-header {border-bottom:none;} +.success .modal-name {text-align:center;} +.success .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#198754;} +.success .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.success .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + +.danger .modal.in {z-index: 9991;} +.danger .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.danger .modal-header {border-bottom:none;} +.danger .modal-name {text-align:center;} +.danger .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#dc3545;} +.danger .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.danger .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + +.warning .modal.in {z-index: 9991;} +.warning .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.warning .modal-header {border-bottom:none;} +.warning .modal-name {text-align:center;} +.warning .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#dc3545;} +.warning .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.warning .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + +.info .modal.in {z-index: 9991;} +.info .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.info .modal-header {border-bottom:none;} +.info .modal-name {text-align:center;} +.info .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#0dcaf0;} +.info .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.info .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + + +.popupColored .modal-footer {padding:0;} +/* 모달버튼 */ +.popupColored .modal .btn-box {padding:0; margin:10px auto; float:none; min-width:10px; display:table;} +.popupColored .modal .btnCommon {width:100px; margin:0 7px; text-shadow:none; border:none; padding:0; border-radius:.267rem; box-shadow:none; line-height:32px;} +/*취소*/ +.popupColored .modal .btn-cancel {background:#e6e6e6; color:#333;} +.popupColored .modal .btn-cancel:hover {background:#dedede;} +/*확인*/ +.popupColored .modal .btn-Success {background:#377ec1; color:#fff;} +.popupColored .modal .btn-Success:hover {background:#7caad7;} + +.modalNT .modal-body .form-group50 {width:50%; float:left; border-bottom:1px solid #e6e6e6; background:#f5f7f7;} + + + +@media only screen and (max-width:1200px) { + .success .modal.in .modal-dialog {margin:0 auto;} + .danger .modal.in .modal-dialog {margin:0 auto;} + .warning .modal.in .modal-dialog {margin:0 auto;} + .info .modal.in .modal-dialog {margin:0 auto;} +} +/* 알림 css 종료 */ + + +/* 라디오리스트팝업 */ +.modalNT.fade .modal-dialog.modalRadioList {width:300px;min-width:300px;} +.modalNT.fade .modal-dialog.modalRadioList .form-group {background:#fff;border-bottom:none;} +.modalNT.fade .modal-dialog.modalRadioList .form-group .radio {display:block;} + + + +/* joy 추가 종료 */ + + + + + + +/* bradley 추가 시작 */ +/* 등록,수정페이지_인풋 width 125 */ +.modalNT .modal-body .pageWrapInput.width125 {width:100px;} + +/* 송장출력관리 > 우측버튼 팝업 _ 운송장출력내용부분 */ +.modalNT.in .modal-dialog.imgPrint {min-width:1000px; top:50%; transform:translateY(-50%); margin:0 auto;} +.modalNT.fade .modal-dialog.imgPrint {min-width:1000px; top:50%; transform:translateY(-50%); margin:0 auto;} + +.modalNT .modal-body .imageBoxL {width:190px;} +.modalNT .modal-body .imageBoxL img {width:100%;} +.modalNT .modal-body .imageBoxR {width:300px;} +.modalNT .modal-body .imageBoxR img {width:100%;} +.modalNT.modalVisitLog .modal-dialog {width:900px;} + +.modalNT .modal-body .sub-name {width: 580px; clear:both; color:#97989b; margin:5px 0 0; font-size:12px; position:relative;} +.modalNT .modal-body .sub-name:first-child {margin-top:10px;} +.modalNT .modal-body .sub-name .deleteSvg {width:20px; height:20px; fill:rgba(49, 58, 70, .8); position:absolute;} + +#popup_insertUserPlanner .modal-dialog {width:408px;} +/* bradley 추가 종료 */ + + +/* kevin 추가 시작 */ + +/* 이미지 */ +/* .modalNT .modal-body form .photoBox {width:calc(100% - 200px); float:left; padding:0 0 0 10px;} */ +.modalNT .modal-content .photoSlash {width:300px; float:left; padding:0 0 0 10px;} +.modalNT .modal-content .title-name {margin:5px 0;} +.modalNT .modal-content .imgnumber {color:#97989b; position:relative; left:10px;} +.modalNT .modal-content input[type="file"] {position:absolute; opacity:0; cursor:pointer; z-index:1;} +.modalNT .modal-content .photoList {display:table; position:relative;} +.modalNT .modal-content .videoList {display:table;} +.modalNT .modal-content .imgBox {width:100px; height:100px; padding:0; float:left; margin-right:10px;} +.modalNT .modal-content .img-100 {border:1px solid #e6e6e6; width:100px; height:100px; background:none; color:#3e3f3a;} +.modalNT .modal-content .img-100:hover{background:none;border:1px solid #e6e6e6;box-shadow:none;} +.modalNT .modal-content .photoBorder {width:calc(100% - 200px); border-bottom:1px solid #e6e6e6; display:-webkit-box; float:right;} +.modalNT .modal-content .photoBorder.last {border:none;} + +/* kevin 추가 종료 */ + +/* emily 추가 시작 */ + +/* 모달 input x 버튼 투명도 조절 button -> input 변경*/ +.modalNT.fade .modal-dialog .modal-content .modal-header .close {background: 0 0;} + +/*사이즈 변경 pageWrap*/ +.modalNT .modal-body .form-group .width50, .modalNT .modal-body .form-group50 .width50 {width:42%; padding:5px;} +.modalNT .modal-body .form-group .width100, .modalNT .modal-body .form-group50 .width100 {width:100%; padding:5px;} + +/*첨부파일, URL 상세 조회(조회만) 파일 없을 때 height 사이즈 조절*/ +.modalNT .modal-body .rightWidth.minHeight {min-height: 40px;} +/*첨부파일 확장자*/ +.modalNT .modal-body .input-file .fileExt {color:red; padding-left:10px;} + + +/*탭이 있는 모달 위치 조정*/ +.modalNT.fade .modal-dialog.tapIn {top:0; margin:50px auto; transform: translate(0, 0);} + +/* 탭 리스트*/ +.modalNT .modal-tap {padding:16px; /*max-height:600px;*/ /*overflow:scroll;*/ overflow-x:unset; background:#fff;} +.modalNT .modal-tap .border {width:40px; height:3px; background:#00723e;} +.modalNT .modal-tap .listConbox {margin-bottom:1px;} +.modalNT .modal-tap .listConbox .tabList {list-style:none; padding:0; margin:1px; margin-bottom:-1px; width:100%; background:#fff;} +.modalNT .modal-tap .listConbox .tabList li {position:relative; display:table-cell; width:calc(100% / 7); border-left:0; text-align:center;} +.modalNT .modal-tap .listConbox .tabList li:after {content:''; position:absolute; top:0; bottom:0; left:-1px; right:0; border:1px solid #dedede;} +.modalNT .modal-tap .listConbox .tabList li a {position:relative; display:block; font-size:13px; line-height:38px; height:38px; z-index:1; margin:0; padding:0; border:0; background:#f5f7f7; border:1px solid #dee2e6; border-left:none; border-radius:0;} +.modalNT .modal-tap .listConbox .tabList li a:link {color:rgba(49, 58, 70, .8);} +.modalNT .modal-tap .listConbox .tabList li a:hover {background:#f5f7f7; color:rgba(49, 58, 70, .8);} +.modalNT .modal-tap .listConbox .tabList li.active a:after {content:''; position:absolute; top:0; left:0; right:0; bottom:0; border:0; z-index:2;} +.modalNT .modal-tap .listConbox .tabList li.active a:hover{background:none;} +.modalNT .modal-tap .listConbox .nav-tabs>li.active>a, .modalNT .modal-tap .listConbox .nav-tabs>li.active>a:focus, .modalNT .modal-tap .listConbox .nav-tabs>li.active>a:hover {color:#fff; background:#377ec1; border-radius:0; border:none;} /*선택시 배경 여기에 넣을것 */ +.modalNT .modal-tap .formSubstance .tab-pane {display:none;} +.modalNT .modal-tap .formSubstance .tab-pane.active {display:block;} /*bradley 수정*/ +/* 탭내용*/ +.modalNT .modal-tap .form-horizontal .conBox {border:1px solid #dee2e6; padding:10px;} +.modalNT .modal-tap .form-horizontal .conBox .title {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700;} +.modalNT .modal-tap .form-horizontal .conBox .title span {color:#97989b; font-size:13px; margin-left:10px;} +.modalNT .modal-tap .form-horizontal .conBox .marginBox {margin:30px;} + +/* 리스트상단네비 */ +.modalNT .modal-tap .listNav {display:inline-block; width:100%; height:30px; position:relative;} +.modalNT .modal-tap .listNav .numberBox {position: absolute;left: 0;} +.modalNT .modal-tap .listNav .numberBox .number {line-height:30px; margin:0; display:inline-block;} +.modalNT .modal-tap .listNav .numberBox .number .n-color {color:#377ec1; padding-left:3px;} +.modalNT .modal-tap .listNav .numberBox .slush {padding:0 5px; display:inline-block;} +.modalNT .modal-tap .listNav .text {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700; display:block; border-bottom:1px solid #dee2e6;} +/* 리스트우측셀렉트3종 */ +.modalNT .modal-tap .listNav .selectBox {position:absolute; top:0; right:0;} +.modalNT .modal-tap .listNav .selectBox .selectList {margin:0 0 0 7px; float:right; width:150px;} + + +.modalNT .modal-tap .form-control {width:100%; border:1px solid #dee2e6; display:block; padding:.47rem .8rem; background-color:#FFF; border-radius:.267rem; box-shadow:none; height:30px; font-size:13px;} +.modalNT .modal-tap select.form-control:not([multiple=multiple]) {background-image:url(../../image/arrow-down.png); background-position:95%; background-size:14px 14px,10px 10px; background-repeat:no-repeat; -webkit-appearance:none; -moz-appearance:none; padding-right:1.5rem; height:30px; color:rgba(49, 58, 70, .8);} +.modalNT .modal-tap select.form-control:not([multiple=multiple]):focus {border:1px solid #00bbc5;} + +/* 리스트 왼쪽,오른쪽,마진제외 버튼 영역 */ +.modalNT .modal-tap .btnlistBox {padding:5px 0; display:table; width:100%; border-top:1px solid #dee2e6;} +.modalNT .modal-tap .btnlistLine {border-top:1px solid #a2a2a2;} +/*빨간색_왼쪽정렬버튼*/ +.modalNT .modal-tap .btnlistBox .btnRed {background:#c50049; color:#fff; margin-left:0;} +.modalNT .modal-tap .btnlistBox .btnRed:hover {background:#bb0045;} +/* 초록색_우측정렬버튼 */ +.modalNT .modal-tap .btnlistBox .btnMint {background:#377ec1; color:#fff; float:right;} +.modalNT .modal-tap .btnlistBox .btnMint:hover {background:#377ec1;} +/* 초록색_우측정렬우측마진제거버튼*/ +.modalNT .modal-tap .btnlistBox .btnMintNoMargin {background:#377ec1; color:#fff; float:right; margin-right:0;} +.modalNT .modal-tap .btnlistBox .btnMintNoMargin:hover {background:#377ec1;} +/* 회색_좌측정렬버튼 */ +.modalNT .modal-tap .btnlistBox .btnMintLeft {background:#377ec1; color:#fff; float:left;} +.modalNT .modal-tap .btnlistBox .btnMint:hover {background:#377ec1;} +/* 회색_우측정렬버튼 */ +.modalNT .modal-tap .btnlistBox .btnGrayRight {background:#8e949d; color:rgba(49, 58, 70, .8); float:right;} +.modalNT .modal-tap .btnlistBox .btnGrayRight:hover {background:#878c95;} +/* 회색_왼쪽정렬좌측마진제거버튼(맨끝 첫번째) */ +.modalNT .modal-tap .btnlistBox .btnGrayLeftMargin {background:#8e949d; color:rgba(49, 58, 70, .8); margin-left:0;} +.modalNT .modal-tap .btnlistBox .btnGrayLeft:hover {background:#878c95;} +/* 회색_우측정렬우측마진제거버튼(맨끝 첫번째) */ +.modalNT .modal-tap .btnlistBox .btnGrayRightMargin {background:#8e949d; color:rgba(49, 58, 70, .8); float:right; margin-right:0;} +.modalNT .modal-tap .btnlistBox .btnGrayRightMargin:hover {background:#878c95;} + +.modalNT.in {overflow-y: auto;} +/* emily 추가 종료 */ \ No newline at end of file diff --git a/src/main/resources/static/css/admin/password.css b/src/main/resources/static/css/admin/password.css new file mode 100644 index 0000000..7594476 --- /dev/null +++ b/src/main/resources/static/css/admin/password.css @@ -0,0 +1,110 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Noto Sans KR'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans KR Regular'), local('Noto Sans CJK KR Regular'), + url(/font/admin/NotoSansKR-Regular.woff2) format('woff2'), + url(/font/admin/NotoSansKR-Regular.woff) format('woff'), + url(/font/admin/NotoSansKR-Regular.otf) format('opentype'); +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; text-shadow:none; +} + +/* .box-sizing(@box-model) { + -webkit-box-sizing: @box-model; //사파리 <= 5 + -moz-box-sizing: @box-model; //파이어폭스 <= 19 + box-sizing: @box-model; +} */ + + +html,body {height:100%;} +body {font-family: "Noto Sans KR", "나눔고딕", "Dotum", "돋움", "Arial", "AppleSDGothicNeo", sans-serif; padding:0; margin:0; font-size:13px;display:-ms-flexbox; display:flex; -ms-flex-align:center; align-items:center; padding-top:40px; padding-bottom:40px; background-color:#f5f5f5;} + +.text-center {background:url(/image/adminBg.png); background-position: center;} +.text-center .form-signin {padding: 50px 80px; background:rgb(255 255 255 / 90%); border-radius:4px; max-width:600px; width:100%; margin:auto; height:500px;} +.text-center .form-signin svg {width:80px; height:80px;} +.pageName {font-size:26px; margin:20px; font-weight:500;} +.scroll {overflow-y:scroll; height:220px; margin-bottom:50px; padding:0 5px;} + +.form-signin label {text-align:left; display:block; position:unset; width:unset; height:unset; margin:0; margin-bottom: 2px;} +.scroll::-webkit-scrollbar {width:6px; height:6px;} +.scroll::-webkit-scrollbar-thumb {border-radius:8px; background-color:#00bbc5;} +.scroll::-webkit-scrollbar-corner {background:#151515;} +.form-signin .form-control:focus {z-index:2; border:1px solid #00bbc5; outline:none;} +.form-signin .form-control {margin-bottom:10px; border:1px solid #dee2e6; display:block; width:100%; padding:0; padding-left:5px; background-color:#FFF; border-radius:0.267rem; box-shadow:none; height:40px; line-height:40px; font-size:14px; color:rgba(49, 58, 70, .8);} +.form-signin .form-control.number, .form-signin .form-control.address1 {margin-bottom:5px;} +.form-signin .form-control.Last {margin-bottom:10px;} +.form-signin .form-control.disabled{background:#dee2e6;} +input[type=text]:focus {border:1px solid #00bbc5;} +input[type=password]:focus {border:1px solid #00bbc5;} +.form-signin .zipCodeBox {display:table; width:100%;} +.form-signin .zipCodeBox .form-control {width:calc(50% - 3px); float:left;} +.form-signin .zipCodeBox button {width:calc(50% - 2px); float:right; margin-right:0} + +.scroll textarea {border:1px solid #DFE3E7; border-radius:0.267rem; padding:10px; background:#fff; text-align:left; height:490px; color:#929292; width:100%;} + +.form-signin .checkbox {padding:0; display:block; margin-bottom:0; display:table; width:100%;} +.form-signin .checkbox.first {margin-bottom:20px; margin-top:30px;} +.form-signin .checkbox input[type=checkbox] {display:none;} +.form-signin input[type=checkbox] {box-sizing:border-box; padding:0;} +.form-signin .checkbox label {padding-left:25px; float:left; margin:0;} +.form-signin .checkbox label:after, .form-signin .checkbox label:before {height:18px; width:18px; top:0; left:0; position:absolute; background:#fff;} /* bradley 수정 */ +.form-signin .checkbox label:after {content:''; background:#fff; border:1px solid #e6e6e6; border-radius:4px; -webkit-transition:.1s ease-in-out; transition:.1s ease-in-out;} +.form-signin .checkbox label:before {content:''; border-radius:4px;} +.form-signin .checkbox input:checked~label:before {background-color:#FFF; border:1px solid #e6e6e6;} +.form-signin .checkbox input:checked~label:after {border-top-style:none; border-right-style:none; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg); height:.6rem; width:1rem; border-color:#50c3ca; border-radius:0; border-width:2px; top:4px; left:4px;} /* bradley 수정 */ +.form-signin .checkbox a {} +.form-signin .checkbox a svg {width:18px; height:18px; float:right; color:#a4acb5;} + +.form-signin .btn-primary {font-weight:700; background:#00bbc5; margin-right:15px; padding-right:15px; text-shadow:none; color:#fff; display:inline-block; padding:6px 12px; height:40px; margin-bottom:0; font-size:14px; font-weight:400; line-height:1.42857143; text-align:center; white-space:nowrap; vertical-align:middle; -ms-touch-action:manipulation; touch-action:manipulation; cursor:pointer; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; background-image:none; border:1px solid transparent; border-radius:4px;} +.form-signin .btn-primary:hover, .form-signin .btn-primary:focus {outline:none; background:#00adb7;} +.copy {color:#929292; font-size:12px; margin-top:20px;} + +.listBtn {overflow:hidden; display:inline-block; margin:auto; list-style:none; margin-top:20px; padding-inline-start:20px;} +.listBtn li {float:left;} +.listBtn li a {font-size:13px; color:#929292; cursor:pointer; text-decoration:none;} +.listBtn li:before {content:'l'; color:#929292; font-size:10px; margin:0 12px;} +.listBtn li:first-child:before {content:none;} + + + + +/*bradley 추가 시작*/ +.form-signin .btnBox {display:table; width:100%;} +.form-signin .btnBox .btn-left {width:calc(50% - 5px); float:left; margin:0;} +.form-signin .btnBox .btn-right {width:calc(50% - 5px); float:right; margin:0;} +.form-signin .btnBox .btnGray {background:#8e949d; color:#fff;} +.form-signin .btnBox .btnGray:hover {background:#878c95;} + +/*bradley 추가 종료*/ + +/*반응형 View*/ +@media only screen and (max-width:1220px) { +} + +@media only screen and (max-width:1024px) { +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:414px) { +} + +@media only screen and (max-width:375px) { +} + +@media only screen and (max-width:360px) { +} + +@media only screen and (max-width:320px) { +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/password2.css b/src/main/resources/static/css/admin/password2.css new file mode 100644 index 0000000..50d9c8c --- /dev/null +++ b/src/main/resources/static/css/admin/password2.css @@ -0,0 +1,86 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Noto Sans KR'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans KR Regular'), local('Noto Sans CJK KR Regular'), + url(/font/admin/NotoSansKR-Regular.woff2) format('woff2'), + url(/font/admin/NotoSansKR-Regular.woff) format('woff'), + url(/font/admin/NotoSansKR-Regular.otf) format('opentype'); +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; text-shadow:none; +} + +/* .box-sizing(@box-model) { + -webkit-box-sizing: @box-model; //사파리 <= 5 + -moz-box-sizing: @box-model; //파이어폭스 <= 19 + box-sizing: @box-model; +} */ + + +html,body {height:100%;} +body {font-family: "Noto Sans KR", "나눔고딕", "Dotum", "돋움", "Arial", "AppleSDGothicNeo", sans-serif; padding:0; margin:0; font-size:13px;display:-ms-flexbox; display:flex; -ms-flex-align:center; align-items:center; padding-top:40px; padding-bottom:40px; background-color:#f5f5f5;} + +.text-center {background:rgb(21,21,21); background:linear-gradient(180deg, rgba(21,21,21,1) 0%, rgba(0,147,155,1) 100%);} +.text-center .form-signin {padding:50px 50px; background:#f5f7f7; border-radius:4px; max-width:400px; width:100%; margin:auto;} +.text-center .form-signin svg {width:60px; height:60px;} +.pageName {font-size:26px; margin:40px 20px; margin-top:0;} + +.form-signin .checkbox {font-weight:400;} +.form-signin .form-control:focus {z-index:2; border:1px solid #00bbc5;} +.form-signin .form-control {margin-bottom:10px; height:36px; border:1px solid #dee2e6; display:block; width:100%; padding:0; padding-left:5px; background-color:#FFF; border-radius:0.267rem; box-shadow:none; font-size:13px; color:rgba(49, 58, 70, .8);} +input[type=text]:focus {border:1px solid #00bbc5;} +input[type=password]:focus {border:1px solid #00bbc5;} + +.form-signin .btn-primary {font-weight:400; line-height:36px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; font-size:13px; float:right; background:#377ec1; color:#fff;} +.form-signin .btn-primary:hover, .form-signin .btn-primary:focus {outline:none; background:#377ec1;} +.copy {color:#929292; font-size:12px; margin-top:30px; margin-bottom:0;} + +.listBtn {overflow:hidden; display:inline-block; margin:auto; list-style:none; margin-top:20px; padding-inline-start:20px;} +.listBtn li {float:left;} +.listBtn li a {font-size:13px; color:#929292; cursor:pointer; text-decoration:none;} +.listBtn li:before {content:'l'; color:#929292; font-size:10px; margin:0 12px;} +.listBtn li:first-child:before {content:none;} + + + + + +/*bradley 추가 시작*/ +.form-signin .btnBox {display:table; width:100%;} +.form-signin .btnBox .btn-left {width:calc(50% - 3px); float:left; margin:0;} +.form-signin .btnBox .btn-right {width:calc(50% - 3px); float:right; margin:0;} +.form-signin .btnBox .btnGray {background:#8e949d; color:#fff;} +.form-signin .btnBox .btnGray:hover {background:#878c95;} + +/*bradley 추가 종료*/ + +/*반응형 View*/ +@media only screen and (max-width:1220px) { +} + +@media only screen and (max-width:1024px) { +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:414px) { +} + +@media only screen and (max-width:375px) { +} + +@media only screen and (max-width:360px) { +} + +@media only screen and (max-width:320px) { +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/passwordUpdate.css b/src/main/resources/static/css/admin/passwordUpdate.css new file mode 100644 index 0000000..c5775ab --- /dev/null +++ b/src/main/resources/static/css/admin/passwordUpdate.css @@ -0,0 +1,97 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Noto Sans KR'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans KR Regular'), local('Noto Sans CJK KR Regular'), + url(/font/admin/NotoSansKR-Regular.woff2) format('woff2'), + url(/font/admin/NotoSansKR-Regular.woff) format('woff'), + url(/font/admin/NotoSansKR-Regular.otf) format('opentype'); +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; text-shadow:none; +} + +/* .box-sizing(@box-model) { + -webkit-box-sizing: @box-model; //사파리 <= 5 + -moz-box-sizing: @box-model; //파이어폭스 <= 19 + box-sizing: @box-model; +} */ + + +html,body {height:100%;} +body {font-family: "Noto Sans KR", "나눔고딕", "Dotum", "돋움", "Arial", "AppleSDGothicNeo", sans-serif; padding:0; margin:0; font-size:13px;display:-ms-flexbox; display:flex; -ms-flex-align:center; align-items:center; padding-top:40px; padding-bottom:40px; background-color:#f5f5f5;} + +.text-center {background:rgb(21,21,21); background:linear-gradient(180deg, rgba(21,21,21,1) 0%, rgba(0,147,155,1) 100%);} +.text-center .form-signin {padding:50px 50px; background:#f5f7f7; border-radius:4px; max-width:600px; width:100%; margin:auto;} +.text-center .form-signin svg {width:60px; height:60px;} +.pageName {font-size:26px; margin:40px 20px; margin-top:0;} +.pageTxt {font-size:14px; margin:40px 20px; margin-top:0; word-break:keep-all; text-align:left; border:1px solid #dee2e6; padding:10px; color:rgba(49, 58, 70, .8);} +.scroll {overflow-y:scroll; margin-bottom:30px; padding:0 20px;} +div.inputBox {margin-bottom:10px;} + +.form-signin label {text-align:left; display:block; position:unset; width:unset; height:unset; margin:0; margin-bottom: 2px;} +.scroll::-webkit-scrollbar {width:6px; height:6px;} +.scroll::-webkit-scrollbar-thumb {border-radius:8px; background-color:#00bbc5;} +.scroll::-webkit-scrollbar-corner {background:#151515;} +.form-signin .form-control:focus {z-index:2; border:1px solid #00bbc5; outline:none;} +.form-signin .form-control {height:36px; border:1px solid #dee2e6; display:block; width:100%; padding:0; padding-left:5px; background-color:#FFF; border-radius:0.267rem; box-shadow:none; font-size:13px; color:rgba(49, 58, 70, .8);} +.form-signin .form-control.number, .form-signin .form-control.address1 {margin-bottom:5px;} +.form-signin .form-control.Last {margin-bottom:10px;} +.form-signin .form-control.disabled{background:#dee2e6;} +input[type=text]:focus {border:1px solid #00bbc5;} +input[type=password]:focus {border:1px solid #00bbc5;} + +.comment {margin:0; margin-bottom:10px; text-align:left; font-size:12px; opacity:.6;} + + +.form-signin .btn-primary {font-weight:400; line-height:36px; margin:0; margin-left:6px; text-shadow:none; border:none; padding:0 5px; border-radius:0.267rem; box-shadow:none; font-size:13px; float:right; background:#377ec1; color:#fff;} +.form-signin .btn-primary:hover, .form-signin .btn-primary:focus {outline:none; background:#377ec1;} +.copy {color:#929292; font-size:12px; margin-top:30px; margin-bottom:0;} + +.listBtn {overflow:hidden; display:inline-block; margin:auto; list-style:none; margin-top:20px; padding-inline-start:20px;} +.listBtn li {float:left;} +.listBtn li a {font-size:13px; color:#929292; cursor:pointer; text-decoration:none;} +.listBtn li:before {content:'l'; color:#929292; font-size:10px; margin:0 12px;} +.listBtn li:first-child:before {content:none;} + + + + +/*bradley 추가 시작*/ +.form-signin .btnBox {display:table; width:calc(100% - 40px); margin:0 auto;} +.form-signin .btnBox .btn-left {width:calc(50% - 3px); float:left; margin:0;} +.form-signin .btnBox .btn-right {width:calc(50% - 3px); float:right; margin:0;} +.form-signin .btnBox .btnGray {background:#8e949d; color:#fff;} +.form-signin .btnBox .btnGray:hover {background:#878c95;} + +/*bradley 추가 종료*/ + +/*반응형 View*/ +@media only screen and (max-width:1220px) { +} + +@media only screen and (max-width:1024px) { +} + +@media only screen and (max-width:768px) { +} + +@media only screen and (max-width:596px) { +} + +@media only screen and (max-width:414px) { +} + +@media only screen and (max-width:375px) { +} + +@media only screen and (max-width:360px) { +} + +@media only screen and (max-width:320px) { +} \ No newline at end of file diff --git a/src/main/resources/static/css/admin/pricacy.css b/src/main/resources/static/css/admin/pricacy.css new file mode 100644 index 0000000..f80b5a0 --- /dev/null +++ b/src/main/resources/static/css/admin/pricacy.css @@ -0,0 +1,38 @@ +body {background:#fff;} +.title {font-size:30px; color:#212529; font-weight:700; margin:0; line-height:40px; padding:10px 10px 0;} +textarea {width:100%; height:calc(100vh - 55px); border:none; color:#212529; padding:10px; font-size:16px; resize:none;} + + + + + +/*반응형 View*/ +@media only screen and (max-width: 1440px){ +} + +@media only screen and (max-width: 1220px){ +} + +@media only screen and (max-width: 1024px){ +} + +@media only screen and (max-width: 768px){ +} + +@media only screen and (max-width: 540px){ +} + +@media only screen and (max-width: 414px){ +} + +@media only screen and (max-width: 375px){ +} + +@media only screen and (max-width: 360px){ +} + +@media only screen and (max-width: 320px){ +} + +@media only screen and (max-width: 280px){ +} \ No newline at end of file diff --git a/src/main/resources/static/css/normalize.min.css b/src/main/resources/static/css/normalize.min.css new file mode 100644 index 0000000..4fad671 --- /dev/null +++ b/src/main/resources/static/css/normalize.min.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} +/*# sourceMappingURL=normalize.min.css.map */ \ No newline at end of file diff --git a/src/main/resources/static/css/web/accept/webAccept.css b/src/main/resources/static/css/web/accept/webAccept.css new file mode 100644 index 0000000..3518bc8 --- /dev/null +++ b/src/main/resources/static/css/web/accept/webAccept.css @@ -0,0 +1,114 @@ +/* 메이드유의원 개인정보처리방침 스타일 */ + +body { + background: #f7f8fa; +} + +main { + max-width: 1280px; + margin: 40px auto 60px auto; + background: #fff; + border-radius: 16px; + box-shadow: 0 4px 24px rgba(0,0,0,0.07); + padding: 48px 56px 56px 56px; + font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', Arial, sans-serif; + color: #222; + line-height: 1.8; + font-size: 1.08rem; +} + +.privacy-policy header { + margin-bottom: 2.5em; +} + +main h2, main h3, main h4 { + font-weight: 700; + color: #1a1a1a; + margin-top: 2.5em; + margin-bottom: 1em; +} + +main h2 { + font-size: 2rem; + border-bottom: 2px solid #e5e7eb; + padding-bottom: 0.5em; +} + +main h3 { + font-size: 1.3rem; + border-left: 4px solid #4f8cff; + padding-left: 0.7em; + background: #f3f6fa; + border-radius: 4px; +} + +main h4 { + font-size: 1.1rem; + color: #4f8cff; +} + +main ul, main ol { + margin-left: 1.5em; + margin-bottom: 1.5em; +} + +main li { + margin-bottom: 0.5em; +} + +main strong { + color: #2d5be3; +} + +main hr { + border: none; + border-top: 1px solid #e5e7eb; + margin: 2.5em 0; +} + +main a { + color: #2d5be3; + text-decoration: underline; +} + +.info-table { + width: 100%; + border-collapse: collapse; + margin: 1.5em 0; + font-size: 1rem; +} +.info-table th, .info-table td { + border: 1px solid #e5e7eb; + padding: 0.7em 1em; + text-align: left; +} +.info-table th { + background: #f3f6fa; + color: #2d5be3; + width: 180px; +} + +.project_wrap section:not(.main_img) { + padding-top: 0px; +} + +@media (max-width: 1400px) { + main { + max-width: 98vw; + padding: 32px 16px 40px 16px; + } +} + +@media (max-width: 768px) { + main { + max-width: 100vw; + padding: 16px 4vw 24px 4vw; + font-size: 0.98rem; + } + main h2 { + font-size: 1.3rem; + } + main h3 { + font-size: 1.08rem; + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/aos.css b/src/main/resources/static/css/web/aos.css new file mode 100644 index 0000000..66923fe --- /dev/null +++ b/src/main/resources/static/css/web/aos.css @@ -0,0 +1 @@ +[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)} \ No newline at end of file diff --git a/src/main/resources/static/css/web/common.css b/src/main/resources/static/css/web/common.css new file mode 100644 index 0000000..f045117 --- /dev/null +++ b/src/main/resources/static/css/web/common.css @@ -0,0 +1,191 @@ +* { + box-sizing:border-box; + margin:0; + padding:0; + color:#1a1a1a; +} + +body, h1, h2, h3, h4, h5 { font-family:"Pretendard", sans-serif; margin:0; } +a { cursor:pointer; color:#1a1a1a; text-decoration:none; } +a:hover, a:active, a:focus { text-decoration:none; } + +p { margin:0; } +dl, dt, dd, ul, ol, li { list-style:none; margin:0; } +img { border:none; vertical-align:top; } + +input[type="text"], input[type="password"], input[type="tel"] { padding: 0 5px; } +input[type="button"], input[type="submit"], button { cursor:pointer; -webkit-appearance:none; } +input:focus, button:focus, textarea { outline:none; } + +em, address { font-style:normal; } +legend, caption { position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden; font-size:0; line-height:0; } +textarea { overflow:auto; resize:none; border:1px solid #dadbdc; border-radius:5px; } +table { width:100%; border-collapse:collapse; border-spacing:0; } + +/* Placeholder styles */ +::-webkit-input-placeholder { color:#999; } +::-moz-placeholder { color:#999; } +:-ms-input-placeholder { color:#999; } +input:-moz-placeholder { color:#999; } + +/* Layout */ +.elp { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } +.mlp { overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; } + +/* 서브페이지 */ +/* ======================================== + MAIN CONTENT CSS +======================================== */ +.petit_center{width:100px;} +.petit_center img{width:100px;} + +/**************************************** + * 서브페이지 공통 css +*****************************************/ +.project_wrap .same { display:flex; } +.project_wrap .same section:not(.main_img) { padding-bottom:150px; } + +/********** aside **********/ +.project_wrap .same aside { width:500px; background:url('/image/web/aside.jpg')repeat-y; } +.project_wrap .same aside ul { position:fixed; top:180px; left:310px; } +.project_wrap .same aside ul li { margin-top:20px; } +.project_wrap .same aside ul li.first { margin-top:0; } +.project_wrap .same aside ul li a { width:100%; height:50px; line-height:50px; font-size:18px; font-weight:300; color:#6D5E50; display:inline-block; } +.project_wrap .same aside ul li a.active { font-weight:700; } + +/********** main **********/ +.project_wrap .same main { width:calc(100% - 500px); } +.project_wrap .same main .inner_wrap { width:90%; } +.project_wrap .same main section h3 { font-size:34px; font-weight:300; text-align:center; } +.project_wrap .same main section h3 span { font-weight:700; } + +/* main_img */ +.project_wrap .same main .main_img { position:relative; } +.project_wrap .same main .main_img img { width:100%; } +.project_wrap .same main .main_img .text_box { width:100%; position:absolute; bottom:0; left:0; display:flex; } +.project_wrap .same main .main_img .text_box p { margin-top:10px; color:#fff; } +.project_wrap .same main .main_img .text_box p.sub_title { font-size:23px; } +.project_wrap .same main .main_img .text_box p.sub_title span { font-weight:600; } +.project_wrap .same main .main_img .text_box p.title { font-size:52px; font-weight:700; } +.project_wrap .same main .main_img .text_box p.sub_text { font-size:15px; } +.project_wrap .same main .main_img .text_box > div { padding:80px 50px; } +.project_wrap .same main .main_img .text_box p span.black { color:black; } + +/* content1 */ +.project_wrap .same main .content1 { background:#FAFAFA; } +.project_wrap .same main .content1 .title { font-size:34px; font-weight:700; } +.project_wrap .same main .content1 .sub_title { margin-top:50px; font-size:28px; font-weight:600; } +.project_wrap .same main .content1 .sub_text { margin-top:10px; font-size:20px; word-break:keep-all; } + +/* content2 */ +.project_wrap .same main .content2 ul { margin-top:80px; display:flex; justify-content:center; } +.project_wrap .same main .content2 ul li { width:240px; height:240px; border-radius:50%; border:1px solid #000; margin-left:30px; display:flex; align-items:center; justify-content:center; } +.project_wrap .same main .content2 ul li p { font-size:25px; text-align:center; } +.project_wrap .same main .content2 ul li:first-child { margin-left:0; } +.project_wrap .same main .content2 ul li:nth-child(odd) { background:#000; } +.project_wrap .same main .content2 ul li:nth-child(odd) p { color:#fff; } + +/* content3 */ +.project_wrap .same main .content3 { background:#F6F6F6; } +.project_wrap .same main ul.box_list { margin-top:80px; } +.project_wrap .same main ul.box_list li { padding:20px 0; margin-top:20px; border-radius:10px; border:2px solid #e6e6e6; display:flex; align-items:center; position:relative; background:#fff; } +.project_wrap .same main ul.box_list li::after { content:''; display:block; width:2px; height:100%; background:#e6e6e6; position:absolute; top:0; left:80px; } +.project_wrap .same main ul.box_list li div { width:80px; height:100%; position:relative; } +.project_wrap .same main ul.box_list li div img { width:30px; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); } +.project_wrap .same main ul.box_list li p { padding-left:20px; font-size:24px; word-break:keep-all; } +.project_wrap .same main ul.box_list li p span { font-weight:700; } + +/* content4 */ +.project_wrap .same main .content4 { padding-bottom:0; } +.project_wrap .same main .content4 ul.box_list li div img { width:50px; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); } + +/* content4_1 */ +.project_wrap .same main .content4_1 { padding-bottom:0; } +.project_wrap .same main .content4_1 ul.box_list li div img { width:50px; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); } + +/* content5 */ +.project_wrap .same main .content5 ul.box_list li p { line-height:45px; } +.project_wrap .same main .content5 ul.box_list li div img { width:50px; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); } + +/* content6 */ +.project_wrap .same main .content6 { padding-bottom:0; } +.project_wrap .same main .img_cont { padding-top:30px; margin-top:120px; } +.project_wrap .same main .img_cont .inner_wrap > p { font-size:34px; } +.project_wrap .same main .img_cont .inner_wrap > p span { font-weight:700; } +.project_wrap .same main .img_cont ul { margin-top:80px; display:flex; justify-content:center; flex-wrap:wrap; } +.project_wrap .same main .img_cont ul li { width:530px; margin-left:20px; padding:50px; border-radius:30px; box-shadow:0 1px 5px #ddd; text-align:center; } +.project_wrap .same main .img_cont ul li:nth-child(odd) { margin-left:0; } +.project_wrap .same main .img_cont ul li:nth-child(n+3) { margin-top:20px; } +.project_wrap .same main .img_cont ul li .text_box { margin-top:50px; } +.project_wrap .same main .img_cont ul li .text_box p { text-align:center; } +.project_wrap .same main .img_cont ul li .text_box p.sub_title { font-size:23px; color:#E74455; } +.project_wrap .same main .img_cont ul li .text_box p.title { margin-top:10px; font-size:42px; font-weight:700; } +.project_wrap .same main .img_cont ul li .text_box p.sub_text { margin-top:30px; font-size:29px; } + +/* Main Content 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .petit_center{display:none;} + .project_wrap section:not(.main_img) { padding-top:50px; } + + /**************************************** + * 서브페이지 공통 css + *****************************************/ + .project_wrap .same aside { display:none; } + .project_wrap .same main { width:100%; } + .project_wrap .same section:not(.main_img) { padding-top:50px; } + .project_wrap .same section:not(.main_img) { padding-bottom:50px; } + .project_wrap .same main section h3 { font-size:14px; } + + /* main_img */ + .project_wrap .same main .main_img .text_box { justify-content:center; text-align:center; bottom:40px; } + .project_wrap .same main .main_img .text_box p { margin-top:5px; } + .project_wrap .same main .main_img .text_box > div { padding:0; } + .project_wrap .same main .main_img .text_box p.sub_title { font-size:12px; } + .project_wrap .same main .main_img .text_box p.title { font-size:26px; } + .project_wrap .same main .main_img .text_box p.sub_text { font-size:12px; } + + /* content1 */ + .project_wrap .same main .content1 .title { font-size:22px; text-align:center; } + .project_wrap .same main .content1 .sub_title { margin-top:10px; font-size:16px; text-align:center; } + .project_wrap .same main .content1 .sub_text { margin-top:5px; font-size:14px; text-align:center; } + .project_wrap .same main .content1 .sub_text br { display:none; } + + /* content2 */ + .project_wrap .same main .content2 ul { margin-top:40px; flex-wrap:wrap; } + .project_wrap .same main .content2 ul li { width:150px; height:150px; margin-left:10px; } + .project_wrap .same main .content2 ul li:nth-child(odd) { margin-left:0; } + .project_wrap .same main .content2 ul li:nth-child(n+3) { margin-top:10px; } + .project_wrap .same main .content2 ul li:nth-child(3) { margin-left:10px; order:3; } + .project_wrap .same main .content2 ul li:nth-child(4) { margin-left:0; } + .project_wrap .same main .content2 ul li p { font-size:16px; } + .project_wrap .same main .content4 { padding-bottom:0; } + .project_wrap .same main .content4_1 { padding-bottom:0; } + .project_wrap .same main .content6 { padding-bottom:0; } + + /* box_list */ + .project_wrap .same main ul.box_list { margin-top:40px; } + .project_wrap .same main ul.box_list li { padding:10px 5px; margin-top:10px; border:1px solid #e6e6e6 } + .project_wrap .same main ul.box_list li::after { display:none; } + .project_wrap .same main ul.box_list li p { padding-left:10px; font-size:14px; } + .project_wrap .same main ul.box_list li div { width:auto; } + .project_wrap .same main ul.box_list li div img { width:20px; position:static; transform:none; } + .project_wrap .same main .content4 ul.box_list li div img { width:20px; position:static; transform:none; } + .project_wrap .same main .content4_1 ul.box_list li div img { width:20px; position:static; transform:none; } + .project_wrap .same main .content5 ul.box_list li div img { width:20px; position:static; transform:none; } + .project_wrap .same main .content5 ul.box_list li p { line-height:22px; word-break:keep-all; } + + /* img_cont */ + .project_wrap .same main .img_cont{ margin-top:0; padding-top:50px; } + .project_wrap .same main .img_cont .inner_wrap > p { font-size:14px; text-align:center; } + .project_wrap .same main .img_cont ul { margin-top:40px; } + .project_wrap .same main .img_cont ul li { width:calc((100% - 10px) / 2); padding:15px; margin-left:10px; border-radius:10px; } + .project_wrap .same main .img_cont ul li:nth-child(n+3) { margin-top:10px; } + .project_wrap .same main .img_cont ul li img { width:100%; } + .project_wrap .same main .img_cont ul li .text_box { margin-top:15px; } + .project_wrap .same main .img_cont ul li .text_box p.sub_title { font-size:12px; line-height:13px; } + .project_wrap .same main .img_cont ul li .text_box p.title { margin-top:5px; font-size:18px; } + .project_wrap .same main .img_cont ul li .text_box p.sub_text { margin-top:5px; font-size:12px; word-break:keep-all; } + .project_wrap .same main .img_cont ul li .text_box p.sub_text br { display:none; } +} + + diff --git a/src/main/resources/static/css/web/diet/dietInjectionSelect.css b/src/main/resources/static/css/web/diet/dietInjectionSelect.css new file mode 100644 index 0000000..2aa8615 --- /dev/null +++ b/src/main/resources/static/css/web/diet/dietInjectionSelect.css @@ -0,0 +1,18 @@ +/* main_img */ +.project_wrap .same main .main_img .text_box > div { width:50%; } +.project_wrap .same main .main_img .text_box .right_text_box p { font-size:52px; color:#000; } +.project_wrap .same main .main_img .text_box .right_text_box p span { font-weight:700; } +.project_wrap .same main .main_img .text_box .left_text_box p { color:#fff; } +.project_wrap .same main .main_img .text_box .left_text_box p span { color:#fff; } +/* content5 */ +.project_wrap .same main .content5 { padding-bottom:0; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* main_img */ + .project_wrap .same main .content5 { padding-bottom:0; } + .project_wrap .same main .main_img .text_box > div { width:100%; } + .project_wrap .same main .main_img .text_box .right_text_box { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p br { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p span { color:#000; } +} diff --git a/src/main/resources/static/css/web/diet/dietLaserSelect.css b/src/main/resources/static/css/web/diet/dietLaserSelect.css new file mode 100644 index 0000000..1b75b0b --- /dev/null +++ b/src/main/resources/static/css/web/diet/dietLaserSelect.css @@ -0,0 +1,11 @@ +/* main_img */ +.project_wrap .same main #ulfit .main_img .text_box { top:0; } +.project_wrap .same main .main_img .text_box p { color:#000; } +.project_wrap .same main #tunebody .main_img .text_box > div { padding-bottom:50px; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .project_wrap .same main #ulfit .main_img .text_box { top:auto; bottom:30px; } + .project_wrap .same main #tunebody .main_img .text_box { text-align:left; justify-content:flex-start; bottom:20px; left:0; } + .project_wrap .same main #tunebody .main_img .text_box > div { padding-bottom:0; padding-left:20px; } +} diff --git a/src/main/resources/static/css/web/font.css b/src/main/resources/static/css/web/font.css new file mode 100644 index 0000000..bb7843c --- /dev/null +++ b/src/main/resources/static/css/web/font.css @@ -0,0 +1,97 @@ +@font-face { + font-family: 'Pretendard'; + font-weight: 900; + font-display: swap; + src: local('Pretendard Black'), url(/font/web/Pretendard-Black.woff2) format('woff2'), url(/font/web/Pretendard-Black.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 800; + font-display: swap; + src: local('Pretendard ExtraBold'), url(/font/web/Pretendard-ExtraBold.woff2) format('woff2'), url(/font/web/Pretendard-ExtraBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 700; + font-display: swap; + src: local('Pretendard Bold'), url(/font/web/Pretendard-Bold.woff2) format('woff2'), url(/font/web/Pretendard-Bold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 600; + font-display: swap; + src: local('Pretendard SemiBold'), url(/font/web/Pretendard-SemiBold.woff2) format('woff2'), url(/font/web/Pretendard-SemiBold.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 500; + font-display: swap; + src: local('Pretendard Medium'), url(/font/web/Pretendard-Medium.woff2) format('woff2'), url(/font/web/Pretendard-Medium.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 400; + font-display: swap; + src: local('Pretendard Regular'), url(/font/web/Pretendard-Regular.woff2) format('woff2'), url(/font/web/Pretendard-Regular.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 300; + font-display: swap; + src: local('Pretendard Light'), url(/font/web/Pretendard-Light.woff2) format('woff2'), url(/font/web/Pretendard-Light.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 200; + font-display: swap; + src: local('Pretendard ExtraLight'), url(/font/web/Pretendard-ExtraLight.woff2) format('woff2'), url(/font/web/Pretendard-ExtraLight.woff) format('woff'); +} + +@font-face { + font-family: 'Pretendard'; + font-weight: 100; + font-display: swap; + src: local('Pretendard Thin'), url(/font/web/Pretendard-Thin.woff2) format('woff2'), url(/font/web/Pretendard-Thin.woff) format('woff'); +} + +@font-face { + font-family: 'Jua'; + font-weight: 400; + font-style: normal; + src: url(/font/web/Jua-Regular.ttf) format('truetype'); +} + +@font-face { + font-family: 'Cafe24Classictype'; + font-weight: 400; + font-style: normal; + src: url(/font/web/Cafe24Classictype-v1.1.otf) format('opentype'), url(/font/web/Cafe24Classictype-v1.1.ttf) format('truetype'); +} + +@font-face { + font-family: 'GyeonggiCheonnyeon'; + font-weight: 300; + font-style: normal; + src: url(/font/web/경기천년제목OTF_Light.otf) format('opentype'), url(/font/web/경기천년제목_Light.ttf) format('truetype'); +} + +@font-face { + font-family: 'GyeonggiCheonnyeon'; + font-weight: 700; + font-style: normal; + src: url(/font/web/경기천년제목OTF_Bold.otf) format('opentype'), url(/font/web/경기천년제목_Bold.ttf) format('truetype'); +} + +@font-face { + font-family: 'Jalnan'; + font-weight: 700; + font-style: normal; + src: url(/font/web/Jalnan2.otf) format('opentype'), url(/font/web/Jalnan2.ttf) format('truetype'); +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/footer.css b/src/main/resources/static/css/web/footer.css new file mode 100644 index 0000000..01f37e2 --- /dev/null +++ b/src/main/resources/static/css/web/footer.css @@ -0,0 +1,80 @@ +/* ======================================== + FOOTER CSS +======================================== */ +/* footer */ +.project_wrap footer { + position: relative; + width: 100%; + min-height: 200px; + background-color: #222222; + background-size: cover; +} + +.project_wrap footer .inner_wrap { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + max-width: 1280px; + width: 90%; +} + +.project_wrap footer .inner_wrap .text_box ul { + padding-top: 20px; + margin-top: 20px; + border-top: 1px solid #fff; + display: flex; + flex-wrap: wrap; + list-style: none; + padding-left: 0; +} + +.project_wrap footer .inner_wrap .text_box ul li { + font-size: 16px; + color: #fff; +} + +.project_wrap footer .inner_wrap .text_box a { + float: right; + color: white; + margin-right: 1%; + text-decoration: none; +} + +/* Footer 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* footer */ + .project_wrap footer { + height: 120px; + background-color: #222222; + background-size: cover; + } + + .project_wrap footer .fLogo { + width: 70px; + } + + .project_wrap footer .inner_wrap { + top: 50%; + left: 5%; + transform: translateY(-50%); + width: 90%; + max-width: none; + } + + .project_wrap footer .inner_wrap .text_box ul { + padding-top: 5px; + margin-top: 5px; + } + + .project_wrap footer .inner_wrap .text_box ul li { + font-size: 10px; + } + + .project_wrap footer .inner_wrap .text_box a { + font-size: 10px; + float: right; + color: white; + margin-right: 1%; + } +} diff --git a/src/main/resources/static/css/web/header.css b/src/main/resources/static/css/web/header.css new file mode 100644 index 0000000..ffb4083 --- /dev/null +++ b/src/main/resources/static/css/web/header.css @@ -0,0 +1,228 @@ +/* ======================================== +HEADER CSS +======================================== */ + +html { scroll-behavior:smooth; } + +.inner_wrap { width:1280px; margin:0 auto; } + +.mb { display:none; } + +.project_wrap header nav ul.depth1 li a.open { font-weight:700; } + +/* header */ + +.project_wrap header { height:85px; position:relative; } + +.project_wrap header .inner_wrap { height:100%; display:flex; align-items:center; justify-content:space-between; } + +.project_wrap header nav { height:100%; } + +.project_wrap header nav ul { display:flex; height:100%; } + +.project_wrap header nav ul.depth1 > li { width:fit-content; line-height:85px; text-align:right; margin-left:30px; position:relative; } + +.project_wrap header nav ul.depth1 li a { display:block; width:100%; height:100%; font-size:18px; color:#6D5E50; } + +.project_wrap header nav ul.depth1 li a.active { font-weight:700; } + +/* 1depth 메뉴 hover 밑줄 효과 - PC만 */ +@media only screen and (min-width:769px) { + .project_wrap header nav ul.depth1 > li > a { + position: relative; + display: inline-block; + } + + .project_wrap header nav ul.depth1 > li > a::after { + content: ''; + position: absolute; + width: 100%; + height: 2px; + top: 60px; /* 1depth 밑줄 위치 */ + left: 0; + background-color: #C60B24; + transform: scaleX(0); + transform-origin: left; + transition: transform 0.3s ease-out; + } + + .project_wrap header nav ul.depth1 > li > a:hover::after { + transform: scaleX(1); + } +} + +/* 세로형 드롭다운 메뉴 - 타이트한 박스, 보더 제거 */ +.project_wrap header nav ul.depth1 li ul.depth2 { + width: 160px; + height: auto; + padding: 8px 0; + position: absolute; + top: 85px; + left: 50%; + transform: translateX(-50%); + background: #ffffff; + z-index: 5; + box-shadow: 0 4px 15px rgba(0,0,0,0.1); + border: none; + border-radius: 10px; + overflow: hidden; + display:none; +} + +.project_wrap header nav ul.depth1 li ul.depth2.active { display:block; } + +.project_wrap header nav ul.depth1 li ul.depth2 li { + width: 100%; + line-height: 36px; + margin-left: 0; + border-bottom: none; + text-align: center; +} + +.project_wrap header nav ul.depth1 li ul.depth2 li:first-child { + width: 100%; + margin-left: 0; +} + +.project_wrap header nav ul.depth1 li ul.depth2 li:nth-child(2) { + margin-left: 0; +} + +.project_wrap header nav ul.depth1 li ul.depth2 li:last-child { + border-bottom: none; +} + +.project_wrap header nav ul.depth1 li ul.depth2 li a { + padding: 0 8px; + display: block; + color: #6D5E50; + transition: all 0.3s ease; + height: 36px; + line-height: 36px; + font-size: 15px; + text-align: center; + border-radius: 6px; + margin: 1px 4px; + position: relative; /* 2depth 밑줄 효과를 위해 추가 */ +} + +/* 2depth 메뉴 hover 밑줄 효과 - PC만 */ +@media only screen and (min-width:769px) { + .project_wrap header nav ul.depth1 li ul.depth2 li a::after { + content: ''; + position: absolute; + width: 100%; + height: 2px; + bottom: -2px; /* 2depth 밑줄 위치 */ + left: 0; + background-color: #C60B24; + transform: scaleX(0); + transform-origin: left; + transition: transform 0.3s ease-out; + } + + .project_wrap header nav ul.depth1 li ul.depth2 li a:hover::after { + transform: scaleX(1); + } +} + +.project_wrap header nav ul.depth1 li ul.depth2 li a:hover { + font-weight: 700; + background: #f8f8f8; + color: #333; + box-shadow: 0 2px 8px rgba(0,0,0,0.1); +} + +/* 마지막 메뉴의 경우 화면을 벗어나지 않도록 조정 */ +.project_wrap header nav ul.depth1 li:last-child ul.depth2 { + left: auto; + right: 0; + transform: none; +} + +/* 첫번째 메뉴의 경우 화면을 벗어나지 않도록 조정 */ +.project_wrap header nav ul.depth1 li:first-child ul.depth2 { + left: 0; + transform: none; +} + +/* Header 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + +.inner_wrap { width:90%; } + +.mb { display:block; } + +.pc { display:none; } + +/* header */ + +.project_wrap header { height:60px; } + +.project_wrap header .inner_wrap { justify-content:center; } + +.project_wrap header .mbmenu { width:24px; height:24px; border:0; position:absolute; top:50%; left:5%; transform:translateY(-50%); background:url('/image/web/menu.svg')no-repeat 0 0; background-size:48px; } + +.project_wrap header .mbmenu.active { background-position:-24px 0; } + +.project_wrap header .logo img { width:100px; } + +.project_wrap header nav.active { display:block; } + +.project_wrap header nav { width:100%; height:calc(100vh - 60px); position:absolute; top:60px; left:0; z-index:5; display:none; } + +.project_wrap header nav ul { height:auto; flex-direction:column; background:#fff; } + +.project_wrap header nav ul.depth1 > li { width:100%; line-height:60px; text-align:left; border-bottom:1px solid #e3e3e3; margin:0;} + +.project_wrap header nav ul.depth1 li a { + padding-left:20px; + position:relative; + display: block; +} + +.project_wrap header nav ul.depth1 li a.mmenu::after { content:''; display:block; width:20px; height:20px; position:absolute; top:50%; right:20px; transform:translateY(-50%) rotate(90deg); background:url('/image/web/arrow.svg')no-repeat; background-size:20px; } + +.project_wrap header nav ul.depth1 li a.mmenu.active::after { transform:translateY(-50%) rotate(-90deg); } + +.project_wrap header nav ul.depth1 li ul.depth2 { + width:100%; + height:auto; + position:static; + background:none; + box-shadow:none; + border:none; + border-radius: 0; + padding: 0; + transform: none; + overflow: visible; +} + +.project_wrap header nav ul.depth1 li ul.depth2.active { display:block; } + +.project_wrap header nav ul.depth1 li ul.depth2 li:first-child { display:none; } + +.project_wrap header nav ul.depth1 li ul.depth2 li { + margin-left:0; + line-height:50px; + border-top:1px solid #eee; + border-bottom:none; + text-align: left; +} + +.project_wrap header nav ul.depth1 li ul.depth2 li a { + padding-left:40px; + height:50px; + line-height:50px; + text-align: left; + border-radius: 0; + margin: 0; +} + +.project_wrap header nav ul.depth1 li ul.depth2 li a:hover { + color:#fff; + background:#000; + box-shadow: none; +} + +} diff --git a/src/main/resources/static/css/web/index.css b/src/main/resources/static/css/web/index.css new file mode 100644 index 0000000..be8bac8 --- /dev/null +++ b/src/main/resources/static/css/web/index.css @@ -0,0 +1,264 @@ +/* banner */ +.project_wrap main .banner { padding-top:0; } +.project_wrap main .banner .main_banner_pagination { width:1280px; margin-left:calc((100% - 1280px) / 2); bottom:60px; display:flex; } +.project_wrap main .sub_banner .sub_banner_swiper .sub_banner_pagination { width:490px; margin-left:calc((100% - 1280px) / 2); bottom:60px; display:flex; } +.project_wrap main .banner .swiper-pagination-bullet { height:3px; margin:0; border-radius:0; background:#000; opacity:1; } +.project_wrap main .banner .swiper-pagination-bullet-active { background:#fff; } +.project_wrap main .banner .swiper-wrapper .swiper-slide { position:relative; } +.project_wrap main .banner .swiper-wrapper .swiper-slide img { cursor:pointer; width:100%;} +.project_wrap main .banner .swiper-wrapper .swiper-slide .detail_btn { font-size:17px; font-weight:700; border:0; position:absolute; bottom:120px; left:calc((100% - 1280px) / 2); background:none; } +/* cont */ + +.project_wrap main section:not(.banner) h3 { font-size:34px; line-height:40px; } +.project_wrap main section:not(.banner) h3 span { font-weight:700; } +.project_wrap main .cont .swiper { margin-top:60px; } +.swiper-area{ + max-width:1280px; + margin:0 auto; + padding:45px 0; +} +.project_wrap main .cont .swiper-pagination { + width: 100%; + max-width: 1280px; + height: 70px; + top: 0; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; +} +.project_wrap main .cont .swiper-pagination-bullet { + width: auto; + min-width: 40px; + flex: 1 1 0; + height: 3px; + border-radius: 0; + margin: 0 2px; + background: #c3c3c3; + opacity: 1; + transition: width 0.2s; + display: inline-block; +} +.project_wrap main .cont .swiper-pagination-bullet-active { background:#000; } +.project_wrap main .cont .swiper-pagination-bullet span { width:100%; padding-top:15px; font-size:19px; color:#c3c3c3; display:inline-block; } +.project_wrap main .cont .swiper-pagination-bullet-active span { font-weight:700; color:#000; } + +.project_wrap main .cont .cont1_swiper .swiper-pagination-bullet {background: #fff;} +.project_wrap main .cont .cont1_swiper .swiper-pagination-bullet-active { background:#ffcccc; } +.project_wrap main .cont .cont1_swiper .swiper-pagination-bullet span { color:#fff;} +.project_wrap main .cont .cont1_swiper .swiper-pagination-bullet-active span {color:#ffcccc; } + +.project_wrap main .cont .cont2_swiper .swiper-pagination-bullet {background: #000;} +.project_wrap main .cont .cont2_swiper .swiper-pagination-bullet-active { background:#fff; } +.project_wrap main .cont .cont2_swiper .swiper-pagination-bullet span { color:#000;} +.project_wrap main .cont .cont2_swiper .swiper-pagination-bullet-active span {color:#fff; } + +.project_wrap main .cont .swiper-wrapper .swiper-slide { margin-top:80px; position:relative; } +.project_wrap main .cont .swiper-wrapper .swiper-slide img { width:1280px;} + + +.project_wrap main .cont .swiper-wrapper .swiper-slide .text_box { position:absolute; top:60%; left:60px; transform:translateY(-50%); } +.project_wrap main .cont .swiper-wrapper .swiper-slide .text_box P.cont_tit { font-size:37px; font-weight:700; color:#000; } +.project_wrap main .cont .swiper-wrapper .swiper-slide .text_box P { margin-top:10px; font-size:17px; font-weight:700; color:#9A9A9A; } +.project_wrap main .cont .swiper-wrapper .swiper-slide .text_box button { margin-top:10px; border:0; font-size:17px; font-weight:700; color:#F77474; background:none; } +/* instagram */ +.project_wrap main .instagram .instagram_top { display:flex; align-items:flex-end; } +.project_wrap main .instagram .instagram_top .more_btn { margin-left:120px; border:0; font-size:19px; font-weight:700; line-height:30px; background:none; } +.project_wrap main .instagram .instagram_btm { margin-top:60px; } +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide .image { height:0; padding-top:56.25%; position:relative; border-radius:12px; overflow:hidden; } +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide .image iframe { width:100%; height:100%; position:absolute; top:0; left:0; } +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide p.title { font-size:18px; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; text-overflow:ellipsis; } +/* instagram feed style - pretty & responsive */ +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide { + position: relative; + border-radius: 16px; + overflow: hidden; + box-shadow: 0 2px 12px rgba(0,0,0,0.08); + background: #fff; + margin-bottom: 10px; + display: flex; + flex-direction: column; + align-items: stretch; +} +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide a { + display: block; + width: 100%; + aspect-ratio: 1/1; + background: #f7f7f7; +} +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + border-radius: 16px 16px 0 0; + aspect-ratio: 1/1; + max-width: 100%; + max-height: 100%; +} +.project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide .caption { + padding: 10px 12px; + font-size: 0.95em; + color: #333; + background: #fff; + min-height: 40px; + border-top: 1px solid #eee; + box-sizing: border-box; + word-break: break-all; +} +.popup .nav.nav-tabs { + display: flex; + width: 100%; + border-bottom: 1px solid #ddd; + padding: 0; + margin: 0; +} +.popup .nav.nav-tabs li[role="presentation"] { + flex: 1 1 0; + text-align: center; + margin: 0; + padding: 0; +} +.popup .nav.nav-tabs li[role="presentation"] a { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + padding: 10px 0; + border: none; + background: none; + font-size: 16px; + font-weight: 600; + color: #333; + border-radius: 0; + height: 100%; +} +.popup .nav.nav-tabs li.active a, +.popup .nav.nav-tabs li[role="presentation"].active a { + color: #F77474; + border-bottom: 2px solid #F77474; + background: #fff; +} +.popup .btm { + background: #000; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 18px 28px 18px 28px; + box-sizing: border-box; + position: relative; +} +.popup .btm .left_box { + display: flex; + align-items: center; +} +.popup .btm .left_box label { + color: #fff; + font-size: 16px; + margin-left: 8px; + cursor: pointer; +} +.popup .btm .right_box { + display: flex; + align-items: center; +} +.popup .btm .close_btn_btm { + background: none; + border: none; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; +} +.popup .btm .close_btn_btm img { + width: 24px; + height: 24px; + filter: invert(1); +} +.content1{ + background-color:#cc3333; +} +.content2{ + background-color:#ced4d2; +} + +.tab-content .tab-pane { display:none; } +.tab-content .tab-pane.active { display:block; } + +@media only screen and (max-width:768px){ + /* banner */ + .project_wrap main .banner .main_banner_pagination { width:90%; margin-left:5%; bottom:25px; } + .project_wrap main .sub_banner .sub_banner_swiper .sub_banner_pagination { width:90%; margin-left:5%; bottom:25px; } + .project_wrap main .banner .swiper-wrapper .swiper-slide { height:100%; } + .project_wrap main .banner .swiper-wrapper .swiper-slide .detail_btn { font-size:12px; bottom:40px; left:50%; transform:translateX(-50%); display:none; } + .project_wrap main .banner .swiper-pagination-bullet { height:2px; display:inline-block; } + /* cont */ + .project_wrap main section:not(.banner) { padding:70px 0 70px 5%; } + .project_wrap main section:not(.banner) h3 { font-size:18px; line-height:20px; text-align:center; } + .project_wrap main .cont .swiper { margin-top:20px; } + .project_wrap main .cont .swiper-pagination { width:95%; height:40px; } + .project_wrap main .cont .swiper-pagination-bullet { height:2px; } + .project_wrap main .cont .swiper-pagination-bullet span { padding-top:10px; font-size:14px; } + .project_wrap main .cont .swiper-wrapper .swiper-slide { margin-top:50px; } + .project_wrap main .cont .swiper-wrapper .swiper-slide img { width:100%; } + .project_wrap main .cont .swiper-wrapper .swiper-slide .text_box { left:20px; bottom:10px; top:auto; transform:none; } + .project_wrap main .cont .swiper-wrapper .swiper-slide .text_box P.cont_tit { font-size:16px; } + .project_wrap main .cont .swiper-wrapper .swiper-slide .text_box P { font-size:12px; margin-top:5px; line-height:14px; } + .project_wrap main .cont .swiper-wrapper .swiper-slide .text_box button { font-size:12px; margin-top:3px; } + .project_wrap main .cont.content1 .swiper-pagination-bullet:nth-child(1) { width:25%; } + .project_wrap main .cont.content1 .swiper-pagination-bullet:nth-child(2) { width:30%; } + .project_wrap main .cont.content1 .swiper-pagination-bullet:nth-child(3) { width:20%; } + .project_wrap main .cont.content1 .swiper-pagination-bullet:nth-child(4) { width:25%; } + .project_wrap main .cont.content2 .swiper-pagination-bullet:nth-child(1) { width:35%; } + .project_wrap main .cont.content2 .swiper-pagination-bullet:nth-child(2) { width:20%; } + .project_wrap main .cont.content2 .swiper-pagination-bullet:nth-child(3) { width:20%; } + .project_wrap main .cont.content2 .swiper-pagination-bullet:nth-child(4) { width:25%; } + /* instagram */ + .project_wrap main section.instagram { padding-top:0; } + .project_wrap main .instagram .instagram_top { position:relative; justify-content:center; } + .project_wrap main .instagram .instagram_top .more_btn { margin-left:0; font-size:12px; line-height:15px; position:absolute; bottom:0; right:5%; } + .project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide .video { border-radius:5px; } + .project_wrap main .instagram .instagram_btm .swiper .swiper-wrapper .swiper-slide p.title {font-size:14px;} + .project_wrap main .instagram .instagram_btm { margin-top:30px; } +} + +.popup-background-mask { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + z-index: 9998; + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; + pointer-events: none; +} + +.popup-background-mask.active { + opacity: 1; + visibility: visible; +} + +.popup { + position: fixed; + z-index: 9999; + transition: all 0.3s ease; +} + +body.popup-open { + overflow: hidden; +} + +body.popup-open main { + filter: blur(3px); + transition: filter 0.3s ease; +} + +body.popup-open main * { + pointer-events: none; +} diff --git a/src/main/resources/static/css/web/instagram-swiper-custom.css b/src/main/resources/static/css/web/instagram-swiper-custom.css new file mode 100644 index 0000000..4a507d4 --- /dev/null +++ b/src/main/resources/static/css/web/instagram-swiper-custom.css @@ -0,0 +1,67 @@ +/* Instagram Swiper Custom Footer Styles */ +.instagram-swiper-footer { + display: flex; + align-items: center; + justify-content: center; + gap: 24px; + margin-top: 18px; +} +.custom-swiper-btn { + width: 38px; + height: 38px; + border: none; + border-radius: 50%; + background: #fff; + box-shadow: 0 2px 8px rgba(0,0,0,0.08); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: background 0.2s; + position: relative; +} +.custom-swiper-btn.prev::before, +.custom-swiper-btn.next::before { + content: ''; + display: block; + width: 12px; + height: 12px; + border-top: 2px solid #222; + border-right: 2px solid #222; + position: absolute; +} +.custom-swiper-btn.prev::before { + transform: rotate(-135deg); + left: 13px; + top: 13px; +} +.custom-swiper-btn.next::before { + transform: rotate(45deg); + left: 13px; + top: 13px; +} +.custom-swiper-thumbs { + display: flex; + gap: 10px; +} +.custom-swiper-thumb { + width: 18px; + height: 18px; + border-radius: 50%; + background: #ddd; + border: 2px solid transparent; + cursor: pointer; + transition: border 0.2s, background 0.2s; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; +} +.custom-swiper-thumb.active { + border: 2px solid #ff6b6b; + background: #fff0f0; + box-shadow: 0 0 0 2px #ffeaea; +} +.custom-swiper-thumb img { + display: none; +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/introduction/introductionHospitalSelect.css b/src/main/resources/static/css/web/introduction/introductionHospitalSelect.css new file mode 100644 index 0000000..f9a3101 --- /dev/null +++ b/src/main/resources/static/css/web/introduction/introductionHospitalSelect.css @@ -0,0 +1,215 @@ +.project_wrap main p span.red { color:#B11246; } +.project_wrap main .text_box p { margin-top:20px; } +.project_wrap main .text_box .hashtag { margin-top:0; font-size:30px; color:#B11246; } +.project_wrap main .text_box .sub_text { font-size:23px; line-height:30px; color:#707070; } +.project_wrap main .text_box .sub_title { font-size:40px; line-height:47px; font-weight:300; } +.project_wrap main .text_box .sub_title span { font-weight:700; } + +/* main_img */ +.project_wrap main .main_img .inner_wrap { display:flex; } +.project_wrap main .main_img { background:#F8F8F8; } +.project_wrap main .main_img img { width:500px; } +.project_wrap main .main_img .text_box { width:calc(100% - 500px); text-align:center; display:flex; flex-direction:column; align-items:center; justify-content:center; } +.project_wrap main .main_img .text_box .title { font-size:48px; line-height:55px; } +.project_wrap main .main_img .text_box .title span { font-weight:700; } + +/* content1 */ +.project_wrap main .content1 .inner_wrap { display:flex; } +.project_wrap main .content1 .text_box { width:calc(100% - 618px); text-align:left; display:flex; flex-direction:column; justify-content:center; } +.project_wrap main .content1 .text_box .title { font-size:50px; line-height:55px; font-weight:700; } + +/* content2 */ +.project_wrap main .content2 ul { display:flex; justify-content:space-between; } +.project_wrap main .content2 ul li { position:relative; } +.project_wrap main .content2 ul li .text_box { position:absolute; top:50%; left:50px; transform:translateY(-50%); } +.project_wrap main .content2 ul li .text_box p:first-child { font-size:18px; color:#B11246; } +.project_wrap main .content2 ul li .text_box .sub_text { font-size:18px; line-height:22px; } + +/* content3 - 의료장비 카탈로그 스타일 (여백 추가) */ +.project_wrap main .content3 { + padding: 40px 0; +} +.project_wrap main .content3 .inner_wrap > p { + font-size: 34px; + text-align: center; + margin-bottom: 10px; + margin-left: 0; +} +.project_wrap main .content3 .inner_wrap > p span { + font-weight: 700; + color: #B11246; +} +.project_wrap main .content3 .equipment-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 15px; /* 카드 간 간격 */ + margin-top: 40px; + max-width: 1280px; + margin-left: auto; + margin-right: auto; +} +.project_wrap main .content3 .equipment-card { + background-color: white; + display: flex; + flex-direction: column; + transition: transform 0.2s ease, box-shadow 0.2s ease; + border: 1px solid #ccc; + box-shadow: 0 2px 6px rgba(0,0,0,0.1); + overflow: hidden; + border-radius: 8px; /* 모서리 둥글게 */ +} +.project_wrap main .content3 .equipment-card:hover { + transform: translateY(-3px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); +} +.project_wrap main .content3 .equipment-image { + width: 100%; + height: 292px; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + background-color: #f8f9fa; + border-bottom: 1px solid #eee; +} +.project_wrap main .content3 .equipment-image img { + width: 100%; + height: 100%; + object-fit: contain; + +} +.project_wrap main .content3 .equipment-info { + padding: 20px 15px; + text-align: center; + background-color: #cccccc; + color: white; + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: center; + min-height: 120px; +} +.project_wrap main .content3 .equipment-name { + font-size: 24px; + font-weight: 700; + margin-bottom: 8px; + color: #cc3333; + text-transform: uppercase; + letter-spacing: 0.5px; +} +.project_wrap main .content3 .equipment-desc { + font-size: 19px; + color: #222; + margin-bottom: 12px; + opacity: 0.9; + line-height: 1.4; +} +.project_wrap main .content3 .equipment-price { + font-size: 23px; + font-weight: 700; + color: #222; +} +.project_wrap main .content3 .equipment-price span { + font-size: 14px; + font-weight: 500; + margin-left: 2px; +} +.project_wrap main .content3 ul { + display: none; +} + +/* content4 */ +.project_wrap main .content4 { padding-bottom:150px; } +.project_wrap main .content4 .inner_wrap > p { font-size:34px; text-align:center; } +.project_wrap main .content4 .inner_wrap > p span { font-weight:45px; font-weight:700; } +.project_wrap main .content4 .inner_wrap > p span.red { font-weight:34px; } +.project_wrap main .content4 ul { margin-top:80px; } +.project_wrap main .content4 ul li { display:flex; align-items:flex-end; } +.project_wrap main .content4 ul li:not(.first) { margin-top:100px; } +.project_wrap main .content4 ul li img { width:750px; } +.project_wrap main .content4 ul li .text_box { width:calc(100% - 750px); } +.project_wrap main .content4 ul li .text_box p:first-child { font-size:34px; line-height:45px; } +.project_wrap main .content4 ul li .text_box p:last-child { margin-top:30px; font-size:20px; line-height:30px; } +.project_wrap main .content4 ul li .text_box p span { font-weight:700; } +.project_wrap main .content4 ul li.red_box .text_box p { color:#B11246; } +.project_wrap main .content4 ul li.red_box .text_box p span { color:#B11246; } + +.mt20 { margin-top: 20px !important; } +.height_292 { height: 292.844px !important; background: #9EAAB9 !important;} + +/* 반응형 디자인 */ +@media only screen and (max-width: 1280px) { + .project_wrap main .content3 .equipment-grid { + grid-template-columns: repeat(3, 1fr); + gap: 12px; + padding: 12px; + } +} + +@media only screen and (max-width: 768px) { + .project_wrap main .text_box p { margin-top:10px; } + .project_wrap main .text_box .hashtag { font-size:12px; } + .project_wrap main .text_box .sub_text { font-size:10px; line-height:15px; } + .project_wrap main .text_box .sub_title { font-size:12px; line-height:15px; } + + /* main_img */ + .project_wrap main .main_img .inner_wrap { width:100%; align-items:center; } + .project_wrap main .main_img img { width:50%; } + .project_wrap main .main_img .text_box { width:50%; } + .project_wrap main .main_img .text_box .title { margin-top:5px; font-size:18px; line-height:22px; } + + /* content1 */ + .project_wrap main .content1 .inner_wrap { width:100%; align-items:center; } + .project_wrap main .content1 img { width:50%; } + .project_wrap main .content1 .text_box { width:50%; padding-left:5%; } + .project_wrap main .content1 .text_box .title { margin-top:5px; font-size:18px; line-height:22px; } + + /* content2 */ + .project_wrap main .content2 .inner_wrap > p { font-size:14px; text-align:center; } + .project_wrap main .content2 .inner_wrap > p span { font-weight:700; } + .project_wrap main .content2 ul { margin-top:30px; flex-wrap:wrap; } + .project_wrap main .content2 ul li img { width:100%; } + .project_wrap main .content2 ul li .text_box { left:20px; } + .project_wrap main .content2 ul li .text_box p:first-child { font-size:12px; } + .project_wrap main .content2 ul li .text_box .sub_title { font-size:20px; line-height:24px; } + .project_wrap main .content2 ul li .text_box .sub_text { font-size:12px; line-height:15px; } + .project_wrap main .content2 ul li:last-child { margin-top:10px; } + + /* content3 */ + .project_wrap main .content3 .equipment-grid { + grid-template-columns: repeat(2, 1fr); + gap: 10px; + padding: 10px; + } + + .project_wrap main .content3 .equipment-image { + height: 200px; + } + + .project_wrap main .content3 .inner_wrap > p { + font-size: 20px; + } + + /* content4 */ + .project_wrap main .content4 { padding-bottom:50px; } + .project_wrap main .content4 .inner_wrap { width:100%; } + .project_wrap main .content4 .inner_wrap > p { font-size:14px; } + .project_wrap main .content4 ul li:not(.first) { margin-top:30px; } + .project_wrap main .content4 ul li img { width:50%; } + .project_wrap main .content4 ul li .text_box { width:50%; padding-left:5%; } + .project_wrap main .content4 ul li .text_box p { word-break:keep-all; } + .project_wrap main .content4 ul li .text_box p:first-child { margin-top:0; font-size:14px; line-height:17px; } + .project_wrap main .content4 ul li .text_box p:last-child { margin-top:10px; font-size:10px; line-height:14px; } +} + +@media only screen and (max-width: 480px) { + .project_wrap main .content3 .equipment-grid { + grid-template-columns: 1fr; + gap: 8px; + padding: 8px; + } + + .project_wrap main .content3 .equipment-image { + height: 250px; + } +} diff --git a/src/main/resources/static/css/web/introduction/introductionPriceSelect.css b/src/main/resources/static/css/web/introduction/introductionPriceSelect.css new file mode 100644 index 0000000..f440c11 --- /dev/null +++ b/src/main/resources/static/css/web/introduction/introductionPriceSelect.css @@ -0,0 +1,26 @@ +/* content1 */ +.project_wrap main .content1 { padding-bottom:150px; } +.project_wrap main .content1 .text_box p { margin-top:20px; text-align:center; } +.project_wrap main .content1 .text_box .hashtag { margin-top:0; font-size:30px; color:#B11246; } +.project_wrap main .content1 .text_box .title { font-size:48px; line-height:55px; } +.project_wrap main .content1 .text_box .title span { font-weight:700; } +.project_wrap main .content1 .text_box .sub_text { font-size:23px; line-height:30px; color:#707070; } +.project_wrap main .content1 .table_box { margin-top:100px; } +.project_wrap main .content1 .table_box table tr.thead { font-weight:700; font-size:16px; background:#EDEDED; } +.project_wrap main .content1 .table_box table tr.sub_thead { font-weight:700; font-size:16px; background:#F8F8F8; } +.project_wrap main .content1 .table_box table tr td { height:50px; padding:0 10px; border:1px solid #e5e5e5; text-align:center; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* content1 */ + .project_wrap main .content1 { padding-bottom:50px; } + .project_wrap main .content1 .text_box p { margin-top:10px; } + .project_wrap main .content1 .text_box .hashtag { font-size:14px; } + .project_wrap main .content1 .text_box .title { font-size:24px; line-height:30px; } + .project_wrap main .content1 .text_box .sub_text { font-size:14px; line-height:20px; } + .project_wrap main .content1 .table_box { margin-top:50px; } + .project_wrap main .content1 .table_box img { width:100%; } + .project_wrap main .content1 .table_box table tr.thead { font-size:14px; } + .project_wrap main .content1 .table_box table tr.sub_thead { font-size:12px; } + .project_wrap main .content1 .table_box table tr td { font-size:10px } +} diff --git a/src/main/resources/static/css/web/introduction/introductionStaffSelect.css b/src/main/resources/static/css/web/introduction/introductionStaffSelect.css new file mode 100644 index 0000000..c5f0e44 --- /dev/null +++ b/src/main/resources/static/css/web/introduction/introductionStaffSelect.css @@ -0,0 +1,50 @@ +.project_wrap main p span { font-weight:700; } +/* main_img */ +.project_wrap main .main_img img { width:100%; } +/* content1 */ +.project_wrap main .content1 .captain_box { position:relative; } +.project_wrap main .content1 .captain_box img { width:100%; } +.project_wrap main .content1 .captain_box .text_box { position:absolute; top:50%; left:100px; transform:translateY(-50%); } +.project_wrap main .content1 .captain_box .text_box .sub_title { margin-top:0; font-size:26px; } +.project_wrap main .content1 .captain_box .text_box .title { margin-top:10px; font-size:70px; font-weight:700; } +.project_wrap main .content1 .captain_box .text_box .sub_text { margin-top:20px; font-size:20px; } +/* content2 */ +.project_wrap main .content2 { padding-bottom:150px; } +.project_wrap main .content2 .inner_wrap { padding-left:100px; } +.project_wrap main .content2 .inner_wrap > p { font-size:34px; } +.project_wrap main .content2 ul { margin-top:50px; } +.project_wrap main .content2 ul li { display:flex; margin-top:100px; } +.project_wrap main .content2 ul li:first-child { margin-top:0; } +.project_wrap main .content2 ul li .text_box { margin-left:100px; } +.project_wrap main .content2 ul li .text_box p { margin-top:30px; color:#707070; } +.project_wrap main .content2 ul li .text_box p span { color:#707070; } +.project_wrap main .content2 ul li .text_box p.field { margin-top:0; font-size:18px; } +.project_wrap main .content2 ul li .text_box p.field span { width:80px; height:36px; line-height:36px; font-weight:400; text-align:center; border-radius:50px; display:inline-block; background:#FBFBFB; } +.project_wrap main .content2 ul li .text_box p.name { font-size:18px; } +.project_wrap main .content2 ul li .text_box p.name span.name { margin-right:20px; font-size:25px; } +.project_wrap main .content2 ul li .text_box p.last { font-size:20px; font-weight:300; line-height:35px; } +.project_wrap main .content2 ul li .text_box p.last span { margin-bottom:10px; font-weight:600; display:inline-block; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* content1 */ + .project_wrap main .content1 .inner_wrap { width:100%; } + .project_wrap main .content1 .captain_box .text_box { width:100%; text-align:center; top:auto; bottom:20px; left:50%; transform:translateY(0) translateX(-50%); } + .project_wrap main .content1 .captain_box .text_box .sub_title { font-size:14px; } + .project_wrap main .content1 .captain_box .text_box .title { margin-top:5px; font-size:22px; } + .project_wrap main .content1 .captain_box .text_box .sub_text { margin-top:10px; font-size:14px; } + /* content2 */ + .project_wrap main .content2 { padding-bottom:50px; } + .project_wrap main .content2 .inner_wrap { padding-left:0; } + .project_wrap main .content2 .inner_wrap > p { font-size:14px; text-align:center; } + .project_wrap main .content2 ul { margin-top:30px; } + .project_wrap main .content2 ul li { margin-top:50px; flex-direction:column; } + .project_wrap main .content2 ul li img { width:70%; margin:0 auto; } + .project_wrap main .content2 ul li .text_box { margin-left:0; margin-top:30px; } + .project_wrap main .content2 ul li .text_box p { margin-top:20px; margin-left:5%; } + .project_wrap main .content2 ul li .text_box p.field { margin-left:0; font-size:16px; text-align:center; } + .project_wrap main .content2 ul li .text_box p.name { font-size:14px; } + .project_wrap main .content2 ul li .text_box p.name span.name { margin-right:10px; font-size:20px; } + .project_wrap main .content2 ul li .text_box p.last { font-size:14px; line-height:25px; } + .project_wrap main .content2 ul li .text_box p.last span { margin-bottom:5px; font-size:16px; } +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/introduction/introductionWaySelect.css b/src/main/resources/static/css/web/introduction/introductionWaySelect.css new file mode 100644 index 0000000..5942c85 --- /dev/null +++ b/src/main/resources/static/css/web/introduction/introductionWaySelect.css @@ -0,0 +1,91 @@ +/* main_img */ +.project_wrap main .main_img ul { display:flex; } +.project_wrap main .main_img ul li { width:calc((100% - 40px) / 3); margin-left:20px; } +.project_wrap main .main_img ul li:first-child { margin-left:0; } +.project_wrap main .main_img ul li img { width:100%; } +/* content1 */ +.project_wrap main .content1 .inner_wrap > p { font-size:34px; } +.project_wrap main .content1 .inner_wrap > p span { font-weight:700; } +.project_wrap main .content1 .top { margin-top:100px; display:flex; justify-content:space-between; position:relative; } +.project_wrap main .content1 .top .text_box { text-align:center; position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); } +.project_wrap main .content1 .top .text_box p { font-size:38px; font-weight:700; position:relative; } +.project_wrap main .content1 .top .text_box p::after { content:''; display:block; width:30px; height:50px; position:absolute; top:-70px; left:50%; transform:translateX(-50%); background:url('../image/pin.svg')no-repeat; background-size:30px; } +.project_wrap main .content1 .top .text_box p span { color:#B70135; } +.project_wrap main .content1 .top .img_box { position:relative; } +.project_wrap main .content1 .top .img_box::after { content:''; display:block; width:150px; height:1px; border:1px dashed #B70135; position:absolute; top:50%; } +.project_wrap main .content1 .top .img_box.img_left::after { right:-150px; } +.project_wrap main .content1 .top .img_box.img_right::after { left:-150px; } +.project_wrap main .content1 .btm { margin-top:50px; } +.project_wrap main .content1 .btm ul { display:flex; } +.project_wrap main .content1 .btm ul li { width:25%; height:100px; text-align:center; font-size:25px; font-weight:700; color:#D8D8D8; position:relative; } +.project_wrap main .content1 .btm ul li.red { color:#B70135; } +.project_wrap main .content1 .btm ul li::after { content:''; display:block; width:35px; height:35px; position:absolute; left:50%; bottom:0; transform:translateX(-50%); background:url('../image/pin2.svg')no-repeat -35px 0; } +.project_wrap main .content1 .btm ul li.red::after { background-position:0 0; } +.project_wrap main .content1 .btm ul li::before { content:''; display:block; width:100%; height:3px; position:absolute; bottom:16px; right:-50%; background:#D8D8D8; } +.project_wrap main .content1 .btm ul li:last-child::before { display:none; } +/* content3 */ +.project_wrap main .content3 ul { display:flex; justify-content:center; } +.project_wrap main .content3 ul li { width:40%; text-align:center; display:flex; flex-direction:column; align-items:center; } +.project_wrap main .content3 ul li div { width:86px; height:86px; background:url('../image/introduction_way_con3.png')no-repeat; } +.project_wrap main .content3 ul li:last-child div { background-position:-86px 0; } +.project_wrap main .content3 ul li p { margin-top:30px; font-size:33px; color:#707070; } +.project_wrap main .content3 ul li p span { font-weight:700; } +.project_wrap main .content3 ul li p span.red { color:#B70135; } +/* content4 */ +.project_wrap main .content4 { padding-bottom:150px; } +.project_wrap main .content4 ul { display:flex; } +.project_wrap main .content4 ul li { width:calc(37.5% - 5px); height:282px; margin-right:5px; overflow:hidden; } +.project_wrap main .content4 ul li:last-child { width:25%; margin-right:0; } +.project_wrap main .content4 ul li img { width:100%; } +.project_wrap main .content4 .inner_wrap > div { padding:30px 100px; display:flex; justify-content:space-between; background:#000; } +.project_wrap main .content4 .inner_wrap > div p { margin-top:20px; color:#fff; font-size:18px; } +.project_wrap main .content4 .inner_wrap > div p span { font-weight:700; } +.project_wrap main .content4 .inner_wrap > div .left_box p:first-child { margin:0; font-size:37px; font-weight:700; } +.project_wrap main .content4 .inner_wrap > div .left_box p:first-child span.red { color:#B70135; } +.project_wrap main .content4 .inner_wrap > div .right_box { text-align:right; } +.project_wrap main .content4 .inner_wrap > div .right_box p { margin:0; } +.project_wrap main .content4 .inner_wrap > div .right_box p span { font-size:34px; color:#fff; } +.project_wrap main .content4 .inner_wrap > div .right_box button { height:50px; margin-top:20px; padding:0 20px; border:0; border-radius:5px; font-size:20px; color:#fff; display:flex; align-items:center; background:#03CF5D; } +.project_wrap main .content4 .inner_wrap > div .right_box button span { margin-right:5px; color:#fff; font-weight:700; display:inline-block; } +.project_wrap main .content4 .inner_wrap > div .right_box button img { margin-left:30px; } +.project_wrap main .content4 .inner_wrap > div .right_box button img.naver_img { margin-left:0; margin-right:10px; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* main_img */ + .project_wrap main .main_img ul li { width:calc((100% - 5px) / 2); margin-left:10px; } + .project_wrap main .main_img ul li:first-child { display:none; } + .project_wrap main .main_img ul li:nth-child(2) { margin-left:0; } + /* content1 */ + .project_wrap main .content1 .inner_wrap > p { font-size:14px; text-align:center; } + .project_wrap main .content1 .top { margin-top:30px; } + .project_wrap main .content1 .top .img_box img { width:100px; } + .project_wrap main .content1 .top .text_box p { font-size:12px; } + .project_wrap main .content1 .top .text_box p::after { width:10px; height:18px; top:-20px; background-size:10px; } + .project_wrap main .content1 .top .img_box::after { width:40px; } + .project_wrap main .content1 .top .img_box.img_right::after { left:-40px; } + .project_wrap main .content1 .top .img_box.img_left::after { right:-40px; } + .project_wrap main .content1 .btm { margin-top:30px; } + .project_wrap main .content1 .btm ul li { height:50px; font-size:12px; line-height:14px; } + .project_wrap main .content1 .btm ul li::after { width:13px; height:13px; background-size:26px; background-position:-13px 0; } + .project_wrap main .content1 .btm ul li::before { height:2px; bottom:5px; } + /* content3 */ + .project_wrap main .content3 ul li div { width:55px; height:55px; background-size:110px; } + .project_wrap main .content3 ul li:last-child div { background-position:-55px 0; } + .project_wrap main .content3 ul li p { margin-top:15px; font-size:12px; } + /* content4 */ + .project_wrap main .content4 { padding-bottom:0; } + .project_wrap main .content4 .inner_wrap { width:100%; } + .project_wrap main .content4 .inner_wrap > div { padding:30px 20px; flex-direction:column; } + .project_wrap main .content4 .inner_wrap > div p { margin-top:5px; font-size:12px; text-align:center; } + .project_wrap main .content4 .inner_wrap > div .left_box p:first-child { font-size:20px; } + .project_wrap main .content4 .inner_wrap > div .right_box { text-align:center; } + .project_wrap main .content4 .inner_wrap > div .right_box p { margin-top:20px; } + .project_wrap main .content4 .inner_wrap > div .right_box p span { font-size:25px; } + .project_wrap main .content4 .inner_wrap > div .right_box button { height:35px; margin:20px auto 0 auto; font-size:13px; } + .project_wrap main .content4 .inner_wrap > div .right_box button img { width:14px; margin-left:10px; } + .project_wrap main .content4 .inner_wrap > div .right_box button img.naver_img { width:18px; } + .project_wrap main .content4 ul li { width:calc(50% - 2px); height:auto; margin-right:4px; } + .project_wrap main .content4 ul li:nth-child(2) { margin-right:0; } + +} diff --git a/src/main/resources/static/css/web/jquery-ui.css b/src/main/resources/static/css/web/jquery-ui.css new file mode 100644 index 0000000..57de806 --- /dev/null +++ b/src/main/resources/static/css/web/jquery-ui.css @@ -0,0 +1,1311 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px .4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-button { + padding: .4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} + +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; + +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: .4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: .4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc( 100% - 2.4em ); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); + height: 100%; + filter: alpha(opacity=25); /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: .222em 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; +} +body .ui-tooltip { + border-width: 2px; +} +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_555555_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_777620_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cc0000_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_777777_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + filter: Alpha(Opacity=30); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/src/main/resources/static/css/web/modal.css b/src/main/resources/static/css/web/modal.css new file mode 100644 index 0000000..acd1b28 --- /dev/null +++ b/src/main/resources/static/css/web/modal.css @@ -0,0 +1,52 @@ +.popup { + width: 436px; /* 이미지 정확한 너비 */ + + margin:0; + position:absolute; + top:50%; + left:50%; + transform:translate(-50%, -50%); + z-index:5; + display:none; +} +.popup.open { display:block; } +.popup .top { height:100%; padding:0; background:#000; } +.popup .top button { width:48px; height:48px; border:0; border-radius:5px; position:absolute; top:0; right:-53px; background:#fff; } +.popup .top .nav-tabs { width:100%; } +.popup .top .nav-tabs li { width:calc(100% / 5); height:48px; background:#fff; } +.popup .top .nav-tabs li a { width:100%; height:100%; padding:0; text-align:center; line-height:48px; border:0; border-radius:0; display:inline-block; } +.popup .top .nav-tabs li a:hover { color:#000; } +.popup .top .nav-tabs li.active a:hover { color:#fff; } +.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover { color:#fff; font-weight:700; background:#000; } +.popup .top .tab-pane { + text-align:center; + overflow:auto; +} +.popup .top .tab-pane img { + width: 100%; + object-fit: cover; + cursor:pointer; +} +.popup .btm { position:absolute; right:0; } +.popup .btm input { display:none; } +.popup .btm label { margin:0; padding-left:25px; font-weight:400; position:relative; } +.popup .btm label::after { content:''; display:block; width:15px; height:15px; border:2px solid #666; border-radius:3px; position:absolute; left:0; top:3px; } +.popup .btm input:checked + label::before { content:''; display:block; width:4px; height:7px; border-bottom:2px solid #666; border-right:2px solid #666; position:absolute; left:5.5px; top:6px; transform:rotate(45deg); } +.popup .btm button { border:0; background:none; } + +.mb { display:none; } +/* 반응형 */ +@media only screen and (max-width:768px){ + .popup { + width:90vw; + } + .mb { display:block; } + .popup .top .tab-content { height:100%; } + .popup .top button { width:30px; height:30px; padding:5px; top:5px; right:5px; } + .popup .top button img { width:100%; } + .popup .top .nav-tabs li a { padding-top:10px; font-size:12px; line-height:15px; } + .popup .top .tab-pane { height:100%; } + .popup .btm label { padding-left:22px; font-size:12px; } + .popup .btm label::after { top:0; } + .popup .btm input:checked + label::before { top:3px; } +} diff --git a/src/main/resources/static/css/web/modal_styles.css b/src/main/resources/static/css/web/modal_styles.css new file mode 100644 index 0000000..0c7dc8b --- /dev/null +++ b/src/main/resources/static/css/web/modal_styles.css @@ -0,0 +1,222 @@ +/* modal.css 수정금지 */ +/* 새로 css 추가시 어느 페이지에 어디위치인지 표시할것 */ +/* 기존 css 수정시 여기다가 수정할것 */ + + + +/* joy 추가 시작 */ + +/* 연차관리 날짜 선택 리스트 */ +.modalNT .choiceDateBox{display:block;overflow-y:scroll;border:1px solid #e6e6e6;outline:none;width:700px;height:130px;padding:.47rem .8rem;} + +/* 작은 모달 */ +.modalNT.fade .modal-dialog.modalSmall {min-width:800px;} + +/* 왼쪽 정렬 */ +.modalNT .basicScroll .grid-layout table td div.leftAlign {text-align:left;padding:0 5px;} + +/* 필수 표시 */ +.modalNT .modal-body .requisite {color:red; font-size:12px;} + + + +/* 반복주기 가로사이즈 */ +.modalNT .modal-body .form-control.inputRepeaInterval {width:calc(100% - 60px);} + +/* 팝업 반복 주기 글자 */ +.modalNT .modal-body .repeatCommentText {position:relative; bottom:-10px; margin:0 0 0 5px; font-weight:600;} + +/* 알림 css 시작 */ +.success .modal.in {z-index: 9991;} +.success .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.success .modal-header {border-bottom:none;} +.success .modal-name {text-align:center;} +.success .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#198754;} +.success .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.success .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + +.danger .modal.in {z-index: 9991;} +.danger .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.danger .modal-header {border-bottom:none;} +.danger .modal-name {text-align:center;} +.danger .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#dc3545;} +.danger .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.danger .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + +.warning .modal.in {z-index: 9991;} +.warning .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.warning .modal-header {border-bottom:none;} +.warning .modal-name {text-align:center;} +.warning .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#dc3545;} +.warning .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.warning .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + +.info .modal.in {z-index: 9991;} +.info .modal.in .modal-dialog{top:50%; transform:translateY(-50%); width:300px;} +.info .modal-header {border-bottom:none;} +.info .modal-name {text-align:center;} +.info .modal-name svg {width:40px; height:40px; margin:10px 0; fill:#0dcaf0;} +.info .modal-name .title {font-size:16px; word-break:keep-all; font-weight:700; margin-bottom:5px;} +.info .modal-name .text {font-size:14px; margin:0; word-break:keep-all;} + + +.popupColored .modal-footer {padding:0;} +/* 모달버튼 */ +.popupColored .modal .btn-box {padding:0; margin:10px auto; float:none; min-width:10px; display:table;} +.popupColored .modal .btnCommon {width:100px; margin:0 7px; text-shadow:none; border:none; padding:0; border-radius:.267rem; box-shadow:none; line-height:32px;} +/*취소*/ +.popupColored .modal .btn-cancel {background:#e6e6e6; color:#333;} +.popupColored .modal .btn-cancel:hover {background:#dedede;} +/*확인*/ +.popupColored .modal .btn-Success {background:#377ec1; color:#fff;} +.popupColored .modal .btn-Success:hover {background:#7caad7;} + +.modalNT .modal-body .form-group50 {width:50%; float:left; border-bottom:1px solid #e6e6e6; background:#f5f7f7;} + + + +@media only screen and (max-width:1200px) { + .success .modal.in .modal-dialog {margin:0 auto;} + .danger .modal.in .modal-dialog {margin:0 auto;} + .warning .modal.in .modal-dialog {margin:0 auto;} + .info .modal.in .modal-dialog {margin:0 auto;} +} +/* 알림 css 종료 */ + + +/* 라디오리스트팝업 */ +.modalNT.fade .modal-dialog.modalRadioList {width:300px;min-width:300px;} +.modalNT.fade .modal-dialog.modalRadioList .form-group {background:#fff;border-bottom:none;} +.modalNT.fade .modal-dialog.modalRadioList .form-group .radio {display:block;} + + + +/* joy 추가 종료 */ + + + + + + +/* bradley 추가 시작 */ +/* 등록,수정페이지_인풋 width 125 */ +.modalNT .modal-body .pageWrapInput.width125 {width:100px;} + +/* 송장출력관리 > 우측버튼 팝업 _ 운송장출력내용부분 */ +.modalNT.in .modal-dialog.imgPrint {min-width:1000px; top:50%; transform:translateY(-50%); margin:0 auto;} +.modalNT.fade .modal-dialog.imgPrint {min-width:1000px; top:50%; transform:translateY(-50%); margin:0 auto;} + +.modalNT .modal-body .imageBoxL {width:190px;} +.modalNT .modal-body .imageBoxL img {width:100%;} +.modalNT .modal-body .imageBoxR {width:300px;} +.modalNT .modal-body .imageBoxR img {width:100%;} +.modalNT.modalVisitLog .modal-dialog {width:900px;} + +.modalNT .modal-body .sub-name {width: 580px; clear:both; color:#97989b; margin:5px 0 0; font-size:12px; position:relative;} +.modalNT .modal-body .sub-name:first-child {margin-top:10px;} +.modalNT .modal-body .sub-name .deleteSvg {width:20px; height:20px; fill:rgba(49, 58, 70, .8); position:absolute;} + +#popup_insertUserPlanner .modal-dialog {width:408px;} +/* bradley 추가 종료 */ + + +/* kevin 추가 시작 */ + +/* 이미지 */ +/* .modalNT .modal-body form .photoBox {width:calc(100% - 200px); float:left; padding:0 0 0 10px;} */ +.modalNT .modal-content .photoSlash {width:300px; float:left; padding:0 0 0 10px;} +.modalNT .modal-content .title-name {margin:5px 0;} +.modalNT .modal-content .imgnumber {color:#97989b; position:relative; left:10px;} +.modalNT .modal-content input[type="file"] {position:absolute; opacity:0; cursor:pointer; z-index:1;} +.modalNT .modal-content .photoList {display:table; position:relative;} +.modalNT .modal-content .videoList {display:table;} +.modalNT .modal-content .imgBox {width:100px; height:100px; padding:0; float:left; margin-right:10px;} +.modalNT .modal-content .img-100 {border:1px solid #e6e6e6; width:100px; height:100px; background:none; color:#3e3f3a;} +.modalNT .modal-content .img-100:hover{background:none;border:1px solid #e6e6e6;box-shadow:none;} +.modalNT .modal-content .photoBorder {width:calc(100% - 200px); border-bottom:1px solid #e6e6e6; display:-webkit-box; float:right;} +.modalNT .modal-content .photoBorder.last {border:none;} + +/* kevin 추가 종료 */ + +/* emily 추가 시작 */ + +/* 모달 input x 버튼 투명도 조절 button -> input 변경*/ +.modalNT.fade .modal-dialog .modal-content .modal-header .close {background: 0 0;} + +/*사이즈 변경 pageWrap*/ +.modalNT .modal-body .form-group .width50, .modalNT .modal-body .form-group50 .width50 {width:42%; padding:5px;} +.modalNT .modal-body .form-group .width100, .modalNT .modal-body .form-group50 .width100 {width:100%; padding:5px;} + +/*첨부파일, URL 상세 조회(조회만) 파일 없을 때 height 사이즈 조절*/ +.modalNT .modal-body .rightWidth.minHeight {min-height: 40px;} +/*첨부파일 확장자*/ +.modalNT .modal-body .input-file .fileExt {color:red; padding-left:10px;} + + +/*탭이 있는 모달 위치 조정*/ +.modalNT.fade .modal-dialog.tapIn {top:0; margin:50px auto; transform: translate(0, 0);} + +/* 탭 리스트*/ +.modalNT .modal-tap {padding:16px; /*max-height:600px;*/ /*overflow:scroll;*/ overflow-x:unset; background:#fff;} +.modalNT .modal-tap .border {width:40px; height:3px; background:#00723e;} +.modalNT .modal-tap .listConbox {margin-bottom:1px;} +.modalNT .modal-tap .listConbox .tabList {list-style:none; padding:0; margin:1px; margin-bottom:-1px; width:100%; background:#fff;} +.modalNT .modal-tap .listConbox .tabList li {position:relative; display:table-cell; width:calc(100% / 7); border-left:0; text-align:center;} +.modalNT .modal-tap .listConbox .tabList li:after {content:''; position:absolute; top:0; bottom:0; left:-1px; right:0; border:1px solid #dedede;} +.modalNT .modal-tap .listConbox .tabList li a {position:relative; display:block; font-size:13px; line-height:38px; height:38px; z-index:1; margin:0; padding:0; border:0; background:#f5f7f7; border:1px solid #dee2e6; border-left:none; border-radius:0;} +.modalNT .modal-tap .listConbox .tabList li a:link {color:rgba(49, 58, 70, .8);} +.modalNT .modal-tap .listConbox .tabList li a:hover {background:#f5f7f7; color:rgba(49, 58, 70, .8);} +.modalNT .modal-tap .listConbox .tabList li.active a:after {content:''; position:absolute; top:0; left:0; right:0; bottom:0; border:0; z-index:2;} +.modalNT .modal-tap .listConbox .tabList li.active a:hover{background:none;} +.modalNT .modal-tap .listConbox .nav-tabs>li.active>a, .modalNT .modal-tap .listConbox .nav-tabs>li.active>a:focus, .modalNT .modal-tap .listConbox .nav-tabs>li.active>a:hover {color:#fff; background:#377ec1; border-radius:0; border:none;} /*선택시 배경 여기에 넣을것 */ +.modalNT .modal-tap .formSubstance .tab-pane {display:none;} +.modalNT .modal-tap .formSubstance .tab-pane.active {display:block;} /*bradley 수정*/ +/* 탭내용*/ +.modalNT .modal-tap .form-horizontal .conBox {border:1px solid #dee2e6; padding:10px;} +.modalNT .modal-tap .form-horizontal .conBox .title {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700;} +.modalNT .modal-tap .form-horizontal .conBox .title span {color:#97989b; font-size:13px; margin-left:10px;} +.modalNT .modal-tap .form-horizontal .conBox .marginBox {margin:30px;} + +/* 리스트상단네비 */ +.modalNT .modal-tap .listNav {display:inline-block; width:100%; height:30px; position:relative;} +.modalNT .modal-tap .listNav .numberBox {position: absolute;left: 0;} +.modalNT .modal-tap .listNav .numberBox .number {line-height:30px; margin:0; display:inline-block;} +.modalNT .modal-tap .listNav .numberBox .number .n-color {color:#377ec1; padding-left:3px;} +.modalNT .modal-tap .listNav .numberBox .slush {padding:0 5px; display:inline-block;} +.modalNT .modal-tap .listNav .text {color:#324767; text-decoration:none; padding:0px 10px; text-align:left; line-height:34px; margin:0; font-size:16px; font-weight:700; display:block; border-bottom:1px solid #dee2e6;} +/* 리스트우측셀렉트3종 */ +.modalNT .modal-tap .listNav .selectBox {position:absolute; top:0; right:0;} +.modalNT .modal-tap .listNav .selectBox .selectList {margin:0 0 0 7px; float:right; width:150px;} + + +.modalNT .modal-tap .form-control {width:100%; border:1px solid #dee2e6; display:block; padding:.47rem .8rem; background-color:#FFF; border-radius:.267rem; box-shadow:none; height:30px; font-size:13px;} +.modalNT .modal-tap select.form-control:not([multiple=multiple]) {background-image:url(../../image/arrow-down.png); background-position:95%; background-size:14px 14px,10px 10px; background-repeat:no-repeat; -webkit-appearance:none; -moz-appearance:none; padding-right:1.5rem; height:30px; color:rgba(49, 58, 70, .8);} +.modalNT .modal-tap select.form-control:not([multiple=multiple]):focus {border:1px solid #00bbc5;} + +/* 리스트 왼쪽,오른쪽,마진제외 버튼 영역 */ +.modalNT .modal-tap .btnlistBox {padding:5px 0; display:table; width:100%; border-top:1px solid #dee2e6;} +.modalNT .modal-tap .btnlistLine {border-top:1px solid #a2a2a2;} +/*빨간색_왼쪽정렬버튼*/ +.modalNT .modal-tap .btnlistBox .btnRed {background:#c50049; color:#fff; margin-left:0;} +.modalNT .modal-tap .btnlistBox .btnRed:hover {background:#bb0045;} +/* 초록색_우측정렬버튼 */ +.modalNT .modal-tap .btnlistBox .btnMint {background:#377ec1; color:#fff; float:right;} +.modalNT .modal-tap .btnlistBox .btnMint:hover {background:#377ec1;} +/* 초록색_우측정렬우측마진제거버튼*/ +.modalNT .modal-tap .btnlistBox .btnMintNoMargin {background:#377ec1; color:#fff; float:right; margin-right:0;} +.modalNT .modal-tap .btnlistBox .btnMintNoMargin:hover {background:#377ec1;} +/* 회색_좌측정렬버튼 */ +.modalNT .modal-tap .btnlistBox .btnMintLeft {background:#377ec1; color:#fff; float:left;} +.modalNT .modal-tap .btnlistBox .btnMint:hover {background:#377ec1;} +/* 회색_우측정렬버튼 */ +.modalNT .modal-tap .btnlistBox .btnGrayRight {background:#8e949d; color:rgba(49, 58, 70, .8); float:right;} +.modalNT .modal-tap .btnlistBox .btnGrayRight:hover {background:#878c95;} +/* 회색_왼쪽정렬좌측마진제거버튼(맨끝 첫번째) */ +.modalNT .modal-tap .btnlistBox .btnGrayLeftMargin {background:#8e949d; color:rgba(49, 58, 70, .8); margin-left:0;} +.modalNT .modal-tap .btnlistBox .btnGrayLeft:hover {background:#878c95;} +/* 회색_우측정렬우측마진제거버튼(맨끝 첫번째) */ +.modalNT .modal-tap .btnlistBox .btnGrayRightMargin {background:#8e949d; color:rgba(49, 58, 70, .8); float:right; margin-right:0;} +.modalNT .modal-tap .btnlistBox .btnGrayRightMargin:hover {background:#878c95;} + +.modalNT.in {overflow-y: auto;} +/* emily 추가 종료 */ \ No newline at end of file diff --git a/src/main/resources/static/css/web/petit/petitAntiagingSelect.css b/src/main/resources/static/css/web/petit/petitAntiagingSelect.css new file mode 100644 index 0000000..e68af4c --- /dev/null +++ b/src/main/resources/static/css/web/petit/petitAntiagingSelect.css @@ -0,0 +1,5 @@ +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .project_wrap .same main .main_img .text_box { bottom:0; text-align:left; justify-content:flex-start; } + .project_wrap .same main .main_img .text_box > div { padding:30px 20px; } + } \ No newline at end of file diff --git a/src/main/resources/static/css/web/petit/petitFillerSelect.css b/src/main/resources/static/css/web/petit/petitFillerSelect.css new file mode 100644 index 0000000..33e3492 --- /dev/null +++ b/src/main/resources/static/css/web/petit/petitFillerSelect.css @@ -0,0 +1,11 @@ +/* main_img */ +.project_wrap .same main .main_img .text_box { top:0; } +.project_wrap .same main .main_img .text_box p { color:#000; } +.project_wrap .same main .content1 .sub_text span { font-weight:700; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .project_wrap .same main .main_img .text_box { height:100%; justify-content:flex-start; text-align:left; } + .project_wrap .same main .main_img .text_box > div { padding:30px 20px; } + .project_wrap .same main .main_img .text_box p.sub_text { margin-top:30px; } + } \ No newline at end of file diff --git a/src/main/resources/static/css/web/petit/petitLaserSelect.css b/src/main/resources/static/css/web/petit/petitLaserSelect.css new file mode 100644 index 0000000..4fcd303 --- /dev/null +++ b/src/main/resources/static/css/web/petit/petitLaserSelect.css @@ -0,0 +1,11 @@ +/* main_img */ +.project_wrap .same aside ul li a { line-height:normal; } +.project_wrap .same main .main_img .text_box { top:0; } +.project_wrap .same main .main_img .text_box p { color:#000; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ +.project_wrap .same main .main_img .text_box { height:100%; justify-content:flex-start; text-align:left; } +.project_wrap .same main .main_img .text_box > div { padding:30px 20px; } +.project_wrap .same main .main_img .text_box p.sub_text { margin-top:30px; } +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/quick_menu/quick_menu.css b/src/main/resources/static/css/web/quick_menu/quick_menu.css new file mode 100644 index 0000000..19731e9 --- /dev/null +++ b/src/main/resources/static/css/web/quick_menu/quick_menu.css @@ -0,0 +1,217 @@ +/* 퀵메뉴 전체가 함께 둥실둥실하는 애니메이션 - 더 임팩트있게 */ +@keyframes groupFloat { + 0% { transform: translateY(0px) translateX(0px) rotate(0deg); } + 20% { transform: translateY(-25px) translateX(5px) rotate(1.5deg); } + 40% { transform: translateY(-35px) translateX(-3px) rotate(-1deg); } + 60% { transform: translateY(-20px) translateX(7px) rotate(2deg); } + 80% { transform: translateY(-15px) translateX(-4px) rotate(-0.5deg); } + 100% { transform: translateY(0px) translateX(0px) rotate(0deg); } +} + +/* 개별 아이템 미세 움직임 - 더 다이나믹하게 */ +@keyframes itemWiggle1 { + 0%, 100% { transform: rotate(0deg) scale(1); } + 25% { transform: rotate(2deg) scale(1.03); } + 50% { transform: rotate(0deg) scale(1.05); } + 75% { transform: rotate(-1.5deg) scale(1.02); } +} + +@keyframes itemWiggle2 { + 0%, 100% { transform: rotate(0deg) scale(1); } + 25% { transform: rotate(-2.5deg) scale(1.02); } + 50% { transform: rotate(0deg) scale(1.04); } + 75% { transform: rotate(1.8deg) scale(1.03); } +} + +/* 간단한 퀵메뉴 - 큰 이미지에 맞춘 위치 */ +.quick-menu-simple { + position: fixed; + bottom: 0px; + right: 20px; + z-index: 2000; + display: flex; + flex-direction: column; + gap: 5px; + animation: groupFloat 5.5s ease-in-out infinite; + transform-origin: center center; +} + +/* 퀵메뉴 아이템 기본 스타일 - width만 지정, 높이는 자동 비율 조정 */ +.quick-item { + width: 180px; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: visible; + background: none; + border: none; + border-radius: 0; + box-shadow: none; +} + +.quick-item:hover { + transform: scale(1.05); + z-index: 2001; +} + +.quick-item img { + width: 180px; + object-fit: contain; + transition: all 0.3s ease; +} + +/* 카카오톡 상담 - 미세한 추가 움직임 */ +.kakao-consult { + animation: itemWiggle1 3.2s ease-in-out infinite; + animation-delay: 0.3s; +} + +/* 전화 상담 - 슬라이드 효과 (높이 문제 해결) */ +.phone-consult { + animation: itemWiggle2 3.8s ease-in-out infinite; + animation-delay: 1s; + overflow: hidden; + position: relative; +} + +/* 기본 이미지는 relative로 높이를 만들어줌 */ +.phone-default { + position: relative; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + transition: transform 0.3s ease; + transform: translateX(0); +} + +.phone-default img { + width: 180px; +} + +/* 전화번호 이미지는 absolute로 오버레이 */ +.phone-number { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + transition: transform 0.3s ease; + transform: translateX(100%); +} + +.phone-number img { + width: 180px; +} + +/* 호버 시 슬라이드 효과 */ +.phone-consult:hover .phone-default { + transform: translateX(-100%); +} + +.phone-consult:hover .phone-number { + transform: translateX(0); +} + +/* 전화상담 호버시 애니메이션 일시정지 */ +.phone-consult:hover { + animation-play-state: paused; +} + +/* 추가 애니메이션 효과 - 페이드 인 */ +.quick-menu-simple { + animation: fadeInUp 0.8s ease-out, groupFloat 5.5s ease-in-out infinite 0.8s; +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(30px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* 모바일 반응형 */ +@media (max-width: 768px) { + .quick-menu-simple { + bottom: 100px; + right: 10px; + gap: 4px; + animation: fadeInUp 0.8s ease-out, groupFloat 6s ease-in-out infinite 0.8s; + } + + .quick-item { + width: 140px; + } + + .quick-item img { + width: 140px; + } + + .phone-default img { + width: 140px; + } + + .phone-number img { + width: 140px; + } + + .kakao-consult { + animation: itemWiggle1 4.2s ease-in-out infinite; + } + + .phone-consult { + animation: itemWiggle2 4.8s ease-in-out infinite; + } + + @keyframes groupFloat { + 0% { transform: translateY(0px) translateX(0px) rotate(0deg); } + 20% { transform: translateY(-18px) translateX(3px) rotate(1deg); } + 40% { transform: translateY(-25px) translateX(-2px) rotate(-0.8deg); } + 60% { transform: translateY(-12px) translateX(4px) rotate(1.2deg); } + 80% { transform: translateY(-8px) translateX(-2px) rotate(-0.5deg); } + 100% { transform: translateY(0px) translateX(0px) rotate(0deg); } + } +} + +/* 작은 화면에서 더 축소 */ +@media (max-width: 480px) { + .quick-menu-simple { + bottom: 80px; + gap: 3px; + } + + .quick-item { + width: 120px; + } + + .quick-item img { + width: 120px; + } + + .phone-default img { + width: 120px; + } + + .phone-number img { + width: 120px; + } + + @keyframes groupFloat { + 0% { transform: translateY(0px) translateX(0px) rotate(0deg); } + 20% { transform: translateY(-15px) translateX(2px) rotate(0.8deg); } + 40% { transform: translateY(-22px) translateX(-1px) rotate(-0.6deg); } + 60% { transform: translateY(-10px) translateX(3px) rotate(1deg); } + 80% { transform: translateY(-6px) translateX(-1px) rotate(-0.4deg); } + 100% { transform: translateY(0px) translateX(0px) rotate(0deg); } + } +} diff --git a/src/main/resources/static/css/web/service/makeReservation.css b/src/main/resources/static/css/web/service/makeReservation.css new file mode 100644 index 0000000..037299a --- /dev/null +++ b/src/main/resources/static/css/web/service/makeReservation.css @@ -0,0 +1,616 @@ +.fix_area { + min-width: 1200px; + width: 1200px; + margin: 0 auto; + padding: 0 16px; +} + +.contents_area{ + margin-top:50px; + margin-bottom:30px; +} + +.reservation_ul{ + display: flex; + gap: 20px; +} + +.reservation_ul>li{ + width: calc((100% - 40px) / 3); + border-radius: 20px; + overflow: hidden; + box-shadow: 2px 2px 15px rgba(0, 0, 0, .05); + padding-right: 0; + padding-left: 0; + +} + +.section_div{ + position: relative; + height: 800px; + background-color: #f5f5f5; + border: 1px solid #ddd; + overflow: hidden; +} + +.section_div_wrap { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #fff; +} + +.tit-box_div{ + position: relative; + padding: 1.6rem 2.8rem 0; + display: flex; + gap: 19px; + align-items: center; +} + + +.step_span{ + color: #A73439; + font-size:2rem; +} + +.reservation-box_div { + position: absolute; + top: 60px; + left: 0; + right: 0; + bottom: 0; + padding: 1rem; +} + +.main-item-info{ + position: relative; + height: 100%; +} + +.w_top_select { + height: calc(100% - 155px); + overflow-y: auto; + overflow-x: hidden; +} + +.service-list-wrap { + padding-top: .666rem; + position: relative; + height: 100%; +} + +.service-list-wrap li{ + width:100%; +} + +.s_item{ + padding-bottom:20px; +} + +.w_top_select .selt_info_wrap:first-child { + padding-top: 0; +} + +.w_top_select .selt_info_wrap { + padding: 20px 0; + display: flex; + align-items: center; + border-bottom: 1px solid #ddd; + +} + + +.selt_info_wrap { + position: relative; + min-height: 4.5rem; +} + +.w_top_select .selt_info_wrap .selt { + padding-top: 0; + padding-left: 10px; + padding-right: 0.5em; + width: 61%; +} + +.item_subprice { + min-height: 42px; +} + +.item_subprice>span{ + font-size:1.8rem; +} + + +.w_top_select .selt_info_wrap .info { + position: relative; + padding-right: 30px; + width: 45%; + top: 0.7rem; + width: 9em; +} + +.w_top_select .selt_info_wrap .info div{ + display:block; + text-align:right; +} + +.w_top_select .selt_info_wrap .info button { + position: absolute; + top: 1rem; + right: 0; +} + +.bn{ + border:none; + background-color:#fff; +} + +button > img { + display: block; +} + +img { + border-style: none; +} + +.d-block{ + display:block; +} + +.original_price { + color: #757575; + opacity: 0.7; +} + +.discount_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + font-size:2rem; + color: #A73439; +} + + + +.section-botton_div .total { + background-color: #F5F5F5; + border-top: 2px solid #A73439; +} + +.section-botton_div .total { + position: relative; + background-color: #e6e6e6; + padding: 20px 20px 15px; + font-size: 16px; +} + +.border-t.dk { + border-color: #221e1f; +} + +.section-botton_div{ + position:absolute; + bottom:0; + left:0; + width:100%; +} + + +.section-botton_div .total .left { + position: absolute; + top: 2.5rem; + left: 1.5rem; + font-size:1.8rem; +} + +.section-botton_div .total .right { + text-align: right; + padding-left: 5em; + padding-bottom: 1rem; + line-height: 1.5rem; +} + + +.section-botton_div .total .txt-small { + font-size: 9pt; + line-height: 1.5em; + opacity: 0.7; + font-weight: 400; + letter-spacing: -1px; +} + +.total_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.calender_div{ + position:relative; + padding:30px; + height:460px; +} + +.tui-datepicker { + position:relative; +} + +.customer-info_div{ + padding:20px 30px; + height:460px; +} +.customer-info_div .form-label{ + float: none; + padding-top: 0; + width: 100%; + display: block; + margin-bottom: 4px; + color: #444; + font-weight: 500; + font-size: 2rem; + margin-top: 0; +} + +.form-box{ + margin-top:10px; +} + +.form-box > .right_sec { + float: none; + width: 100%; + flex-wrap: wrap; + gap: 8px 4px; +} + +.fm_ctrl { + display: block; + width: 100%; + padding: 7px 5px !important; + font-size: 1.7rem; + line-height: 1; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius:3px; + transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; +} + +.__counsl_wrap .wsnwp { + position: relative; + display: flex; + justify-content: center; + align-items: center; + border: 1px solid #A73439; + border-radius: 5px; + overflow: hidden; +} + +.__counsl_wrap .wsnwp > label { + width: 50%; + text-align: center; + margin-bottom:0px !important; +} + +._cs-radio input[type=radio]:not(old):checked + .r_visible > span { + background-color: #A73439; + color: #FFFFFF; +} + +._cs-radio input[type=radio] + .r_visible > span { + background-color: #FFFFFF; + display: block; + width: 100%; + height: 100%; + padding: 7px 0; + color: #A73439; + cursor: pointer; +} + +._cs-radio input[type=radio]:not(old) { + width: 0; + margin: 0; + padding: 0; + opacity: 0; + font-size: 1em; +} + +._cs-radio input[type="radio"] { + display: none; +} + +.request_memo{ + width:100%; + font-size: 1.7rem; + padding:3px; +} + +.section-bottom_div{ + position:relative; + width:100%; +} + + + +.b-border{ + border-bottom:solid 1px #ddd; +} + +.time_div{ + margin:15px 0px; +} +.time-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 16px 12px; /* 세로, 가로 간격 */ + max-width: 350px; + margin: 0 auto; +} +.time-btn { + display: inline-block; + width: 100%; + padding: 10px 0; + border: 1px solid #bbb; + border-radius: 20px; + background: #fff; + color: #444; + font-size: 1.3rem; + text-align: center; + cursor: pointer; + transition: background 0.2s, color 0.2s, border 0.2s; +} +.time-btn.active { + background: #007bff; + color: #fff; + border-color: #007bff; +} + + +.tui-calendar-date.tui-calendar-sun { + color: #e74c3c !important; +} + +/* 토요일: 회색 */ +.tui-calendar-date.tui-calendar-sat { + color: #0000ff !important; +} + +.tui-datepicker-type-date{ + width:100% !important; +} + +/* 달력 전체 폰트 크기 및 셀 크기 키우기 */ +.tui-datepicker { + width:83%; + font-size: 22px !important; /* 달력 전체 폰트 크기 */ +} + +.tui-calendar { + width:100% !important; + font-size: 22px !important; /* 달력 내부 폰트 크기 */ +} + +.tui-calendar-date { + font-size: 22px !important; /* 날짜 숫자 크기 */ + min-width: 48px; + min-height: 48px; + line-height: 48px; +} + +/* 요일(일~토) 폰트 크기 */ +.tui-calendar-day { + font-size: 20px !important; +} + +/* 달력 헤더(년/월) 폰트 크기 */ +.tui-calendar-header { + font-size: 24px !important; +} + +/* 네비게이션(이전/다음) 버튼 크기 */ +.tui-calendar-btn { + font-size: 24px !important; + width: 40px; + height: 40px; +} + +.selected-time_div{ + padding:10px 30px; + text-align:center; +} + +.selected-time_div>span{ + display:inline-block; + +} + +.selected-time_div .tit_span{ + color:#6a6a6a; + font-size:1.5rem; + width:20%; + text-align:center; +} +.person-cnt_span{ + color:#0080ff; + font-size:2rem; +} +.person-cnt_span>b{ + color:#6a6a6a; + font-size:1.5rem; +} + +.checkbox-area_div{ + padding:30px; + min-height:240px; +} + +.btn-primary { + border: 1px solid #a73439; + background-color: #a73439; + color: #fff; + width: 100%; + height: 56px; +} + +.disabled-sunday { + color: #e74c3c !important; /* 빨간색 */ + background: #f9d6d5 !important; /* 연한 빨간 배경 (선택) */ + cursor: not-allowed !important; +} + +.height850{ + height: 850px; +} + +/* ====== 반응형 웹 미디어 쿼리 추가 ====== */ + +/* 1. PC 기준(1200px 이상) */ +@media (min-width: 1200px) { + .fix_area { + min-width: 1200px; + width: 1200px; + margin: 0 auto; + padding: 0 16px; + } +} + +/* 2. 태블릿(1200px 미만 ~ 768px 이상) */ +@media (max-width: 1199px) and (min-width: 768px) { + .fix_area { + min-width: 100%; + width: 100%; + padding: 0 10px; + } + .reservation_ul { + gap: 12px; + } + .reservation_ul > li { + width: calc((100% - 24px) / 3); + border-radius: 16px; + } + .section_div { + height: 650px; + } + .calender_div, + .customer-info_div, + .checkbox-area_div { + padding: 16px; + height: 350px; + } + .selected-time_div { + padding: 8px 10px; + } + .btn-primary { + height: 48px; + font-size: 1.2rem; + } + .time-grid { + grid-template-columns: repeat(3, 1fr); + max-width: 270px; + } +} + +/* 3. 모바일(767px 이하) */ +@media (max-width: 767px) { + .fix_area { + min-width: 100%; + width: 100%; + padding: 0 4px; + } + .reservation_ul { + flex-direction: column; + gap: 12px; + } + .reservation_ul > li { + width: 100%; + border-radius: 12px; + } + .section_div { + height: auto; + min-height: 500px; + padding: 0; + } + .section_div_wrap, + .reservation-box_div, + .main-item-info, + .service-list-wrap, + .customer-info_div, + .calender_div, + .checkbox-area_div { + position: static; + width: 100%; + height: auto; + padding: 10px 4px; + } + .tit-box_div { + padding: 1rem 1rem 0; + gap: 10px; + flex-direction: column; + align-items: flex-start; + } + .step_span, + .form-label, + .item_subprice > span, + .discount_price, + .total_price, + .person-cnt_span { + font-size: 1.2rem !important; + } + .w_top_select .selt_info_wrap { + flex-direction: column; + align-items: flex-start; + padding: 10px 0; + } + .w_top_select .selt_info_wrap .selt, + .w_top_select .selt_info_wrap .info { + width: 100%; + padding: 0; + text-align: left; + } + .section-botton_div .total { + padding: 10px 4px 10px; + font-size: 1rem; + } + .section-botton_div .total .left, + .section-botton_div .total .right { + position: static; + padding: 0; + font-size: 1rem; + text-align: left; + } + .selected-time_div { + padding: 4px 0; + font-size: 1rem; + } + .selected-time_div .tit_span { + font-size: 1rem; + width: auto; + } + .btn-primary { + height: 44px; + font-size: 1rem; + } + .time-grid { + grid-template-columns: repeat(2, 1fr); + max-width: 180px; + gap: 8px 6px; + } + .tui-datepicker, + .tui-calendar { + width: 100% !important; + font-size: 1rem !important; + } + .tui-calendar-date, + .tui-calendar-day, + .tui-calendar-header, + .tui-calendar-btn { + font-size: 1rem !important; + min-width: 32px; + min-height: 32px; + line-height: 32px; + } +} + +/* ====== 끝 ====== */ + diff --git a/src/main/resources/static/css/web/service/serviceInfo.css b/src/main/resources/static/css/web/service/serviceInfo.css new file mode 100644 index 0000000..6d19093 --- /dev/null +++ b/src/main/resources/static/css/web/service/serviceInfo.css @@ -0,0 +1,95 @@ +/* main_img */ +.project_wrap .same{min-height:880px;} +.project_wrap .same main .main_img .text_box > div { width:50%; } +.project_wrap .same main .main_img .text_box .right_text_box p { font-size:52px; color:#000; } +.project_wrap .same main .main_img .text_box .right_text_box p span { font-weight:700; } +.project_wrap .same main .main_img .text_box .left_text_box p { color:#fff; } +.project_wrap .same main .main_img .text_box .left_text_box p span { color:#fff; } +/* content5 */ +.project_wrap .same main .content5 { padding-bottom:0; } + +.project_wrap .same aside {background: white; width: 30%; top: 12%;} +.project_wrap .same aside ul{position: fixed; left: 5%; width: 19%;} +.project_wrap .same aside ul li{margin-bottom: 0.5rem; margin-top: 0px;} +.project_wrap .same aside .first {padding-top: 1rem; padding-bottom: 1rem;} +.project_wrap .same aside .nonactive {border: 1px solid #d8d8d8; background-color: #f9f9fb;} +.project_wrap .same aside .active {border: 1px solid #d8d8d8; color: #a73439; background-color: rgba(118, 35, 47, 0); border-left: 2px solid #a73439;} +.project_wrap .same aside ul a{padding-left: 10px;} +.project_wrap .same main {width: 60%; padding-top: 7%;} +.project_wrap .same main ul{padding-top: 2%; width:102%;} + +.add-ticket-btn { + font-size: 1.2rem; + font-weight: 400; + letter-spacing: -0.03em; + padding: .35rem 1rem; + border: 1px solid #ced4da; + border-radius: 50em; + transition: 0.2s; + background:white; +} +.right { float: right;} +.left { float: left;} +.card_otxt { + position: relative; + display: block; + border-radius: 1rem; + padding: 1rem; +} +.border { + border: 1px solid #ddd; +} +.__card_otxt { + height: 95px; +} +.row>.col2 { + width: 50%; + margin-bottom: 2rem; +} +.row.row_padding>.col2, .row.row_padding>.col3, .row.row_padding>.col4, .row.row_padding>.col5 { + padding-right: 1rem; + padding-left: 1rem; +} +.row.row_padding { + margin-left: -1rem; + margin-right: -1rem; + display: flex; + flex-wrap: wrap; +} +.border-b { + border-bottom: 1px solid #ddd; + height:5%; +} +.txt_num { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} +.card_otxt .ab_cont { + position: absolute; + right: 1rem; + top: 3.4rem; + width: 8.5em; + text-align: right; +} +.card_otxt .fix_cont { + padding-right: 11.5rem; +} +.card_otxt .fix_cont p { + margin-bottom: 0; + word-break: keep-all; +} +.pagination li a{float: none;} +.mb3{margin-bottom: 3rem;} +.mt70{margin-top: 70%;} + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* main_img */ + .project_wrap .same main .content5 { padding-bottom:0; } + .project_wrap .same main .main_img .text_box > div { width:100%; } + .project_wrap .same main .main_img .text_box .right_text_box { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p br { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p span { color:#000; } + .project_wrap .same main {width: 100%;} +} diff --git a/src/main/resources/static/css/web/service/webServiceDetail.css b/src/main/resources/static/css/web/service/webServiceDetail.css new file mode 100644 index 0000000..bb99eaa --- /dev/null +++ b/src/main/resources/static/css/web/service/webServiceDetail.css @@ -0,0 +1,435 @@ +/* main_img */ +.project_wrap .same main .main_img .text_box > div { width:50%; } +.project_wrap .same main .main_img .text_box .right_text_box p { font-size:52px; color:#000; } +.project_wrap .same main .main_img .text_box .right_text_box p span { font-weight:700; } +.project_wrap .same main .main_img .text_box .left_text_box p { color:#fff; } +.project_wrap .same main .main_img .text_box .left_text_box p span { color:#fff; } +/* content5 */ +.project_wrap .same main .content5 { padding-bottom:0; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* main_img */ + .project_wrap .same main .content5 { padding-bottom:0; } + .project_wrap .same main .main_img .text_box > div { width:100%; } + .project_wrap .same main .main_img .text_box .right_text_box { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p br { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p span { color:#000; } +} + + +.fix_area { + min-width: 1200px; + width: 1200px; + margin: 0 auto; + padding: 0 16px; +} + +.btn-basic { + width:120px; + height:40px; + border: 1px solid #a73439; + border-radius:5px; + background-color: white; + color: #a73439; +} + +.clear:after { + display: block; + visibility: hidden; + height: 0; + font-size: 0; + clear: both; + content: ""; +} + + +.clear > .right { + float: right; +} + +.clear > .left{ + float:left; +} + +.main-img-size { + position: relative; + width: 655px; + height: 368px; + overflow: hidden; + border-radius: 0.25rem; + text-align: center; +} +.img_center img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + margin: 0; +} + + +.thumbnail-bottom-txt { + padding-top: 15px; +} + +.thumbnail-bottom-txt > span { + display: block; + color: #6c696a; + font-size: 13.5px; +} + +.content>.wp60 { + width: 60%; +} +.content>.wp40 { + width: 40%; +} + +.wp10{ + width:10%; +} +.wp90{ + width:90%; +} + + +.content>[class^=wp] { + float: left; +} + +.consultation-info h2{ + font-size: 4rem; +} +.consultation-info p{ + margin-top: 2rem; + font-size:2rem; +} + + +.consultation-info .price { + display: block; + font-size: 3rem; + margin-top: 3rem; + margin-bottom: 1rem; +} +.price-area .border-line { + height: 1px; + background-color: #ddd; +} + + +.hashtag_list{ + padding: 1rem 0 1.5rem; +} + +.hashtag_list span{ + font-size:1.6rem; + color:#a94442; +} + + +.procedure-area>.procedure_select_txt{ + float: left; + width: 7rem; + line-height: 1.5; + padding-top: 0.375rem; +} + +.procedure-area > .dropdown_area { + float: right; + width: calc(100% - 7rem); +} + +.select_procedure_div { + position: relative; +} + +.select_procedure_div .default_item { + padding-top: 0.5rem; + padding-left: 0.5rem; + padding-bottom: 0.5rem; +} + +.select_procedure_div .default_item { + position: relative; + width: 100%; + padding-right: 2.5rem; + background-color: #fff; + border: 1px solid #cb9f76; + text-align: left; + border-radius: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + + +.option_scrl_wrap { + display: none; + overflow: hidden; + position: relative; + z-index:1; +} + +.select_procedure_div.active .option_scrl_wrap { + border: 1px solid #76232f; +} + +.select_service_form.active .default_item:after { + border-top-color: #333; +} + +.default_item:after { + content: ''; + display: block; + position: absolute; + top: 50%; + right: 1.1em; + margin-top: -0.2rem; + border: 0.28571428em solid transparent; + border-top-color: #999; +} + + +.optipon_item { + padding: 0.4rem 0.5rem; +} + +.sepr_wrap { + position: relative; + min-height: 2.5rem; +} + +.item_subprice { + min-height: 42px; +} + +.select_procedure_div.active .option_scrl_wrap { + display: block; + position: absolute; + right: -1px; + left: -1px; + background-color: #fff; + user-select: none; +} + +.cs-checkbox > label.d-block { + display: block; +} +.cs-checkbox > label { + position: relative; + display: inline-block; + cursor: pointer; + padding-left: 30px; + margin: 0; + line-height: 20px; + transition: color .3s ease-out; +} + + + +.oi-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +/* .cs-checkbox input[type="checkbox"] { */ +/* visibility: hidden; */ +/* display: none; */ +/* } */ + +/* .cs-checkbox > label:before, .cs-radio > .r_visible { */ +/* border: 1px solid #ccc; */ +/* } */ + +input[type="checkbox"] { + transform: scale(1.5); /* 크기를 1.5배로 확대 */ +} + +.idxChk{ + position:absolute; +} + +.cs-checkbox > label:before { + content: ""; + position: absolute; + top: 0; + left: 0; + display: inline-block; + margin-right: 0.8em; + border-radius: 0; + background-color: #fff; +} + +.oi-wrap .oi-txt { + flex: 0 0 65%; + max-width: 65%; +} + +.option_list { + display: block; + background: #fff; + max-height: 224px; + overflow-y: auto; + overflow-x: hidden; +} + + +.oi-wrap .oi-price { + flex: 0 0 35%; + max-width: 35%; + text-align: right; +} + +.original_price { + color: #757575; + opacity: 0.7; +} + +.d-block { + display: block; +} + +.discount_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.procedure-area:after { + display: block; + visibility: hidden; + height: 0; + font-size: 0; + clear: both; + content: ""; +} + +.selected-procedure{ + margin-top:20px; + position:relative; +} + + +.selected-procedure .selt_info_wrap .info { + top: 0.7rem; + width: 9.5em; + padding-top: 0.3em; +} + +.selt_info_wrap .info { + position: absolute; + top: 0.2rem; + right: 0.2rem; + width: 8.5em; + padding-right: 1rem; + padding-top: 0.2em; + text-align: right; +} +.selt_info_wrap .info button{ + border:none; + background-color:#fff; +} + + +.real_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.selected-procedure .selt_info_wrap { + padding: 0.8rem 0; + z-index:0; +} + +.selt_info_wrap { + position: relative; + min-height: 2.5rem; + background-color:#fff; + border:1px solid #eee; +} + +.selected-procedure .selt_info_wrap .selt { + padding-right: 9.5em; + padding-left: 1rem; + width: 100%; +} + +.selt_info_wrap .selt { + padding-top: 0.3em; + padding-right: 8.5em; +} + +.total-price-area .total { + position: relative; + background-color: #e6e6e6; + padding: 25px 25px 60px; + display: flex; + justify-content: space-between; +} + +.total-price-area .total .txt_sub { + color: #222222; + font-size: 2rem; + opacity: 1; +} +.total-price-area .total .right strong { + font-size: 22px; + font-weight: 600; +} + +.total-price-area .total-price-txt { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.total-price-area .total .bs-txt { + position: absolute; + bottom: 17px; + right: 25px; + display: block; + margin-top: 4px; + font-size: 12px; + color: #999999; + letter-spacing: -1px; +} + + +.main_btn { + text-align: right; + margin: 1rem 0; +} + +.main_btn button { + width: 180px; + height: 50px; +} + + +.fastrack-btn { + position: relative; +} + +.btn-primary { + border: 1px solid #a73439; + background-color: #a73439; + color: #fff; +} + +.img-content{ + background-color: #eee; +} + +.img-area{ + padding-top: 70px; + padding-bottom: 200px; + text-align:center; +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/skin/skinTextureSelect.css b/src/main/resources/static/css/web/skin/skinTextureSelect.css new file mode 100644 index 0000000..1265de1 --- /dev/null +++ b/src/main/resources/static/css/web/skin/skinTextureSelect.css @@ -0,0 +1,8 @@ +.project_wrap .same main .main_img .text_box { bottom:auto; top:50%; transform:translateY(-50%); } +.project_wrap .same main .main_img .text_box p { color:#000; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .project_wrap .same main .main_img .text_box { text-align:left; justify-content:flex-start; } + .project_wrap .same main .main_img .text_box > div { padding:30px 20px; } +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/skin/skinWaxingSelect.css b/src/main/resources/static/css/web/skin/skinWaxingSelect.css new file mode 100644 index 0000000..e68af4c --- /dev/null +++ b/src/main/resources/static/css/web/skin/skinWaxingSelect.css @@ -0,0 +1,5 @@ +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .project_wrap .same main .main_img .text_box { bottom:0; text-align:left; justify-content:flex-start; } + .project_wrap .same main .main_img .text_box > div { padding:30px 20px; } + } \ No newline at end of file diff --git a/src/main/resources/static/css/web/swiper-bundle.min.css b/src/main/resources/static/css/web/swiper-bundle.min.css new file mode 100644 index 0000000..bb03888 --- /dev/null +++ b/src/main/resources/static/css/web/swiper-bundle.min.css @@ -0,0 +1,13 @@ +/** + * Swiper 11.1.9 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2024 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: July 31, 2024 + */ + +@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next svg,.swiper-button-prev svg{width:100%;height:100%;object-fit:contain;transform-origin:center}.swiper-rtl .swiper-button-next svg,.swiper-rtl .swiper-button-prev svg{transform:rotate(180deg)}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-lock{display:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:'prev'}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:'next'}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);top:var(--swiper-pagination-top,auto);left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:var(--swiper-pagination-bullet-border-radius,50%);background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:var(--swiper-pagination-right,8px);left:var(--swiper-pagination-left,auto);top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,rgba(0,0,0,.25));position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:var(--swiper-pagination-progressbar-size,4px);height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move;touch-action:none}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active{pointer-events:auto}.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube .swiper-slide-next+.swiper-slide{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden} \ No newline at end of file diff --git a/src/main/resources/static/css/web/voc/webVOC.css b/src/main/resources/static/css/web/voc/webVOC.css new file mode 100644 index 0000000..73b4947 --- /dev/null +++ b/src/main/resources/static/css/web/voc/webVOC.css @@ -0,0 +1,61 @@ +.project_wrap main { padding:100px; } +.project_wrap main h3 { font-size:34px; font-weight:400; line-height:45px; } +.project_wrap main h3 span { font-weight:700; } +.project_wrap main ul { margin-top:50px; display:flex; flex-wrap:wrap; } +.project_wrap main ul li { width:calc((100% - 40px) / 3); margin-left:20px; } +.project_wrap main ul li:nth-child(3n-2) { margin-left:0; } +.project_wrap main ul li:nth-child(n+4) { margin-top:50px; } +.project_wrap main ul li a { display:block; } +.project_wrap main ul li .img_box { width:100%; background:#f5f5f5; } +.project_wrap main ul li .img_box img { width:100%; } +.project_wrap main ul li .text_box { padding-top:30px; } +.project_wrap main ul li .text_box p { color:#777; } +.project_wrap main ul li .text_box p.title { font-size:30px; font-weight:700; } +.project_wrap main ul li .text_box p.date { margin-top:5px; font-size:23px; } + + +.hrtag {width: 60em; background-color: rgb(249,249,251); margin-top:1.5em; margin-bottom:1.5em;} +.board_write {width: 60em; border:1px;} +.board_write th{ margin-top:1%; height:3em; background-color: rgb(249,249,251);} +.board_write td{ margin-top:1%; height:3em;} +.board_write .teltd{margin: 0; padding-top: 0; padding-bottom: 0; padding-right: 0; text-align: right;} +.board_write .input_select {height:3em; width: -webkit-fill-available; border:none;} +.board_write .input_text { height:3em; width: -webkit-fill-available; border:none;} +.board_write .input_text_area { width: -webkit-fill-available; border:none;} +.board_write .input_button { height:4em; margin-left:1%; width: 38%; border:none; background-color: rgb(199, 0, 21); color: white;} +.board_write .input_tel {width: 60%; height:4em; border:none;} +.board_write .input_auth {width: 51%; height:4em; border:none;} +.board_write .input_time {color: #3985EA; width: 10%; display: contents;} +.board_write .input_radio {margin-left:1%; height:3em; vertical-align: super;} +.board_write .label_radio {margin-left:1%; height:3em; margin-bottom:0; vertical-align: bottom;} +.inner_wrap p {text-align:right; width: 60em; font-weight: bold;} +.inner_wrap p .input_button { height:3em; width:50%; border:none; background-color: rgb(199, 0, 21); color: white; width: 20%; border-radius: 30px;} +.inner_wrap .noactive{background-color: gray;} +.bd-top{border-top: 1px solid #ddd;} + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + .project_wrap main { padding:50px 0; } + .project_wrap main h3 { font-size:14px; text-align:center; line-height:20px; } + .project_wrap main ul { margin-top:30px; } + .project_wrap main ul li { width:calc((100% - 20px) / 2); margin-left:10px; } + .project_wrap main ul li:nth-child(3n-2) { margin-left:10px; } + .project_wrap main ul li:nth-child(odd) { margin-top:0; } + .project_wrap main ul li:nth-child(n+3) { margin-top:20px; } + .project_wrap main ul li .text_box { padding-top:10px; } + .project_wrap main ul li .text_box p.title { font-size:14px; } + .project_wrap main ul li .text_box p.date { margin-top:3px; font-size:12px; } + + .hrtag {width: 40em; background-color: rgb(249,249,251);} + .board_write {width: 40em; font-size:12px; border:1px;} + .board_write td{ margin-top:1%; height:2.5em;} + .board_write .input_select {height:2em; width: -webkit-fill-available} + .board_write .input_text { height:2em; width: -webkit-fill-available} + .board_write .input_text_area { width: -webkit-fill-available} + .board_write .input_button { height:2.5em; margin-left:0.5%; width: 28%;} + .board_write .input_tel {width: 70%; height:2.5em;} + .board_write .input_radio {margin-left:1%; height:2em;} + .board_write .label_radio {margin-left:1%; height:2em; margin-bottom:0; vertical-align: text-bottom;} + .inner_wrap p {text-align:right; width: 40em; font-weight: bold;} + .inner_wrap p .input_button { height:3em; width: 7em; background-color: rgb(199, 0, 21); color: white;} +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/webevent/webEventSelect.css b/src/main/resources/static/css/web/webevent/webEventSelect.css new file mode 100644 index 0000000..bb99eaa --- /dev/null +++ b/src/main/resources/static/css/web/webevent/webEventSelect.css @@ -0,0 +1,435 @@ +/* main_img */ +.project_wrap .same main .main_img .text_box > div { width:50%; } +.project_wrap .same main .main_img .text_box .right_text_box p { font-size:52px; color:#000; } +.project_wrap .same main .main_img .text_box .right_text_box p span { font-weight:700; } +.project_wrap .same main .main_img .text_box .left_text_box p { color:#fff; } +.project_wrap .same main .main_img .text_box .left_text_box p span { color:#fff; } +/* content5 */ +.project_wrap .same main .content5 { padding-bottom:0; } + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* main_img */ + .project_wrap .same main .content5 { padding-bottom:0; } + .project_wrap .same main .main_img .text_box > div { width:100%; } + .project_wrap .same main .main_img .text_box .right_text_box { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p br { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p span { color:#000; } +} + + +.fix_area { + min-width: 1200px; + width: 1200px; + margin: 0 auto; + padding: 0 16px; +} + +.btn-basic { + width:120px; + height:40px; + border: 1px solid #a73439; + border-radius:5px; + background-color: white; + color: #a73439; +} + +.clear:after { + display: block; + visibility: hidden; + height: 0; + font-size: 0; + clear: both; + content: ""; +} + + +.clear > .right { + float: right; +} + +.clear > .left{ + float:left; +} + +.main-img-size { + position: relative; + width: 655px; + height: 368px; + overflow: hidden; + border-radius: 0.25rem; + text-align: center; +} +.img_center img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + margin: 0; +} + + +.thumbnail-bottom-txt { + padding-top: 15px; +} + +.thumbnail-bottom-txt > span { + display: block; + color: #6c696a; + font-size: 13.5px; +} + +.content>.wp60 { + width: 60%; +} +.content>.wp40 { + width: 40%; +} + +.wp10{ + width:10%; +} +.wp90{ + width:90%; +} + + +.content>[class^=wp] { + float: left; +} + +.consultation-info h2{ + font-size: 4rem; +} +.consultation-info p{ + margin-top: 2rem; + font-size:2rem; +} + + +.consultation-info .price { + display: block; + font-size: 3rem; + margin-top: 3rem; + margin-bottom: 1rem; +} +.price-area .border-line { + height: 1px; + background-color: #ddd; +} + + +.hashtag_list{ + padding: 1rem 0 1.5rem; +} + +.hashtag_list span{ + font-size:1.6rem; + color:#a94442; +} + + +.procedure-area>.procedure_select_txt{ + float: left; + width: 7rem; + line-height: 1.5; + padding-top: 0.375rem; +} + +.procedure-area > .dropdown_area { + float: right; + width: calc(100% - 7rem); +} + +.select_procedure_div { + position: relative; +} + +.select_procedure_div .default_item { + padding-top: 0.5rem; + padding-left: 0.5rem; + padding-bottom: 0.5rem; +} + +.select_procedure_div .default_item { + position: relative; + width: 100%; + padding-right: 2.5rem; + background-color: #fff; + border: 1px solid #cb9f76; + text-align: left; + border-radius: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + + +.option_scrl_wrap { + display: none; + overflow: hidden; + position: relative; + z-index:1; +} + +.select_procedure_div.active .option_scrl_wrap { + border: 1px solid #76232f; +} + +.select_service_form.active .default_item:after { + border-top-color: #333; +} + +.default_item:after { + content: ''; + display: block; + position: absolute; + top: 50%; + right: 1.1em; + margin-top: -0.2rem; + border: 0.28571428em solid transparent; + border-top-color: #999; +} + + +.optipon_item { + padding: 0.4rem 0.5rem; +} + +.sepr_wrap { + position: relative; + min-height: 2.5rem; +} + +.item_subprice { + min-height: 42px; +} + +.select_procedure_div.active .option_scrl_wrap { + display: block; + position: absolute; + right: -1px; + left: -1px; + background-color: #fff; + user-select: none; +} + +.cs-checkbox > label.d-block { + display: block; +} +.cs-checkbox > label { + position: relative; + display: inline-block; + cursor: pointer; + padding-left: 30px; + margin: 0; + line-height: 20px; + transition: color .3s ease-out; +} + + + +.oi-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +/* .cs-checkbox input[type="checkbox"] { */ +/* visibility: hidden; */ +/* display: none; */ +/* } */ + +/* .cs-checkbox > label:before, .cs-radio > .r_visible { */ +/* border: 1px solid #ccc; */ +/* } */ + +input[type="checkbox"] { + transform: scale(1.5); /* 크기를 1.5배로 확대 */ +} + +.idxChk{ + position:absolute; +} + +.cs-checkbox > label:before { + content: ""; + position: absolute; + top: 0; + left: 0; + display: inline-block; + margin-right: 0.8em; + border-radius: 0; + background-color: #fff; +} + +.oi-wrap .oi-txt { + flex: 0 0 65%; + max-width: 65%; +} + +.option_list { + display: block; + background: #fff; + max-height: 224px; + overflow-y: auto; + overflow-x: hidden; +} + + +.oi-wrap .oi-price { + flex: 0 0 35%; + max-width: 35%; + text-align: right; +} + +.original_price { + color: #757575; + opacity: 0.7; +} + +.d-block { + display: block; +} + +.discount_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.procedure-area:after { + display: block; + visibility: hidden; + height: 0; + font-size: 0; + clear: both; + content: ""; +} + +.selected-procedure{ + margin-top:20px; + position:relative; +} + + +.selected-procedure .selt_info_wrap .info { + top: 0.7rem; + width: 9.5em; + padding-top: 0.3em; +} + +.selt_info_wrap .info { + position: absolute; + top: 0.2rem; + right: 0.2rem; + width: 8.5em; + padding-right: 1rem; + padding-top: 0.2em; + text-align: right; +} +.selt_info_wrap .info button{ + border:none; + background-color:#fff; +} + + +.real_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.selected-procedure .selt_info_wrap { + padding: 0.8rem 0; + z-index:0; +} + +.selt_info_wrap { + position: relative; + min-height: 2.5rem; + background-color:#fff; + border:1px solid #eee; +} + +.selected-procedure .selt_info_wrap .selt { + padding-right: 9.5em; + padding-left: 1rem; + width: 100%; +} + +.selt_info_wrap .selt { + padding-top: 0.3em; + padding-right: 8.5em; +} + +.total-price-area .total { + position: relative; + background-color: #e6e6e6; + padding: 25px 25px 60px; + display: flex; + justify-content: space-between; +} + +.total-price-area .total .txt_sub { + color: #222222; + font-size: 2rem; + opacity: 1; +} +.total-price-area .total .right strong { + font-size: 22px; + font-weight: 600; +} + +.total-price-area .total-price-txt { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.total-price-area .total .bs-txt { + position: absolute; + bottom: 17px; + right: 25px; + display: block; + margin-top: 4px; + font-size: 12px; + color: #999999; + letter-spacing: -1px; +} + + +.main_btn { + text-align: right; + margin: 1rem 0; +} + +.main_btn button { + width: 180px; + height: 50px; +} + + +.fastrack-btn { + position: relative; +} + +.btn-primary { + border: 1px solid #a73439; + background-color: #a73439; + color: #fff; +} + +.img-content{ + background-color: #eee; +} + +.img-area{ + padding-top: 70px; + padding-bottom: 200px; + text-align:center; +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/webevent/webEventSelectList.css b/src/main/resources/static/css/web/webevent/webEventSelectList.css new file mode 100644 index 0000000..f803d76 --- /dev/null +++ b/src/main/resources/static/css/web/webevent/webEventSelectList.css @@ -0,0 +1,110 @@ +/* main_img */ +.project_wrap .same main .main_img .text_box > div { width:50%; } +.project_wrap .same main .main_img .text_box .right_text_box p { font-size:52px; color:#000; } +.project_wrap .same main .main_img .text_box .right_text_box p span { font-weight:700; } +.project_wrap .same main .main_img .text_box .left_text_box p { color:#fff; } +.project_wrap .same main .main_img .text_box .left_text_box p span { color:#fff; } +/* content5 */ +.project_wrap .same main .content5 { padding-bottom:0; } + +.project_wrap .same aside {background: white; width: 30%; top: 12%;} +.project_wrap .same aside ul{position: fixed; left: 5%; width: 19%;} +.project_wrap .same aside ul li{margin-bottom: 0.5rem; margin-top: 0px;} +.project_wrap .same aside .first {padding-top: 1rem; padding-bottom: 1rem;} +.project_wrap .same aside .nonactive {border: 1px solid #d8d8d8; background-color: #f9f9fb;} +.project_wrap .same aside .active {border: 1px solid #d8d8d8; color: #a73439; background-color: rgba(118, 35, 47, 0); border-left: 2px solid #a73439;} +.project_wrap .same aside ul a{padding-left: 10px;} +.project_wrap .same main {width: 60%; padding-top: 7%;} +.project_wrap .same main ul{padding-top: 2%; width:102%;} +.event-card-list > ul { display: block; list-style-type: disc; margin-block-start: 1em; margin-block-end: 1em; padding-inline-start: 40px; unicode-bidi: isolate; } +.event-card-list > li { margin-bottom: 70px; opacity: 1;} +.event-card-list .event-card { display: block; position: relative; width: 775px; height: 196px; padding-right: 10px; margin-left: auto; overflow: hidden;} +.event-card .img_box { position: relative; width: 350px; height: 100%; background-color: black; float: left; overflow: hidden; } +.event-card .img_box img { position: absolute; min-width: 100%; min-height: 100%; width: 100%; height: 100%; margin: auto; top: 0; bottom: 0; left: 0; right: 0; opacity: 1; transform: scale(1); transition: .4s ease-out;} +.event-card .txt-box { position: relative; padding-top: 115px; width: 343px; height: 100%; float: right;} +.event-card .txt-box .tit-txt { position: absolute; left: 0; bottom: 88px;} +.txt-box .tit-txt > p { margin: 0; font-size: 22px; font-weight: 500; line-height: 1.3;} +.event-card .txt-box > .sub-txt { font-size: 12px;} +.one-ellip { position: relative;overflow: hidden; white-space: nowrap; text-overflow: ellipsis; left: 0%; width: 100%;-webkit-transition: left 3s, width 3s; -moz-transition: left 3s, width 3s; transition: left 3s, width 3s;} +.event-card .txt-box .ab_cont { padding-top: 10px;} +.ab_cont .cost { font-size: 13px; font-weight: 400; color: #7D7971;} +del { text-decoration: line-through;} +.ab_cont .discount { display: block; font-size: 1rem;} +.ab_cont .discount .txt_num { font-size: 1.6em; font-weight: 600; color: #9F2A2A;} +.event-card .txt-box .tit-txt:After { content: ''; position: absolute; top: -49px; left: 0; width: 18px; height: 35px; background: center / contain url(https://www.toxnfill2.com/imges/ico-toxnfill-g.png) no-repeat;} +.event-card-list .event-card:after { content: ''; position: absolute; bottom: 9px; right: 0; width: 58px; height: 15px; background: center / contain url(https://www.toxnfill2.com/imges/long-arrow-right-g.png) no-repeat;} +.add-ticket-btn { + font-size: 1.2rem; + font-weight: 400; + letter-spacing: -0.03em; + padding: .35rem 1rem; + border: 1px solid #ced4da; + border-radius: 50em; + transition: 0.2s; + background:white; +} +.right { float: right;} +.left { float: left;} +.card_otxt { + position: relative; + display: block; + border-radius: 1rem; + padding: 1rem; +} +.border { + border: 1px solid #ddd; +} +.__card_otxt { + height: 95px; +} +.row>.col2 { + width: 50%; + margin-bottom: 2rem; +} +.row.row_padding>.col2, .row.row_padding>.col3, .row.row_padding>.col4, .row.row_padding>.col5 { + padding-right: 1rem; + padding-left: 1rem; +} +.row.row_padding { + margin-left: -1rem; + margin-right: -1rem; + display: flex; + flex-wrap: wrap; +} +.border-b { + border-bottom: 1px solid #ddd; + height:5%; +} +.txt_num { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} +.card_otxt .ab_cont { + position: absolute; + right: 1rem; + top: 3.4rem; + width: 8.5em; + text-align: right; +} +.card_otxt .fix_cont { + padding-right: 11.5rem; +} +.card_otxt .fix_cont p { + margin-bottom: 0; + word-break: keep-all; +} +.mb3{margin-bottom: 3rem;} +.mt70{margin-top: 70%;} + + +/* 반응형 - 모바일 */ +@media only screen and (max-width:768px){ + /* main_img */ + .project_wrap .same main .content5 { padding-bottom:0; } + .project_wrap .same main .main_img .text_box > div { width:100%; } + .project_wrap .same main .main_img .text_box .right_text_box { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p br { display:none; } + .project_wrap .same main .main_img .text_box .left_text_box p span { color:#000; } + .project_wrap .same main {width: 100%;} +} diff --git a/src/main/resources/static/css/web/webevent/webEventSelectList_style.css b/src/main/resources/static/css/web/webevent/webEventSelectList_style.css new file mode 100644 index 0000000..d97b36c --- /dev/null +++ b/src/main/resources/static/css/web/webevent/webEventSelectList_style.css @@ -0,0 +1 @@ +.project_wrap main ul li .img_box img { height:260px; } \ No newline at end of file diff --git a/src/main/resources/static/font/admin/Pretendard-Black.otf b/src/main/resources/static/font/admin/Pretendard-Black.otf new file mode 100644 index 0000000..a0d849e Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Black.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-Black.woff b/src/main/resources/static/font/admin/Pretendard-Black.woff new file mode 100644 index 0000000..d07848c Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Black.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-Black.woff2 b/src/main/resources/static/font/admin/Pretendard-Black.woff2 new file mode 100644 index 0000000..eafe683 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Black.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-Bold.otf b/src/main/resources/static/font/admin/Pretendard-Bold.otf new file mode 100644 index 0000000..8e5e30a Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Bold.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-Bold.woff b/src/main/resources/static/font/admin/Pretendard-Bold.woff new file mode 100644 index 0000000..7837ae5 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Bold.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-Bold.woff2 b/src/main/resources/static/font/admin/Pretendard-Bold.woff2 new file mode 100644 index 0000000..4d40a1a Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Bold.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-ExtraBold.otf b/src/main/resources/static/font/admin/Pretendard-ExtraBold.otf new file mode 100644 index 0000000..388f3ca Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-ExtraBold.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-ExtraBold.woff b/src/main/resources/static/font/admin/Pretendard-ExtraBold.woff new file mode 100644 index 0000000..8058b76 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-ExtraBold.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-ExtraBold.woff2 b/src/main/resources/static/font/admin/Pretendard-ExtraBold.woff2 new file mode 100644 index 0000000..dcd57e7 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-ExtraBold.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-ExtraLight.otf b/src/main/resources/static/font/admin/Pretendard-ExtraLight.otf new file mode 100644 index 0000000..40c8b69 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-ExtraLight.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-ExtraLight.woff b/src/main/resources/static/font/admin/Pretendard-ExtraLight.woff new file mode 100644 index 0000000..f9498d8 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-ExtraLight.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-ExtraLight.woff2 b/src/main/resources/static/font/admin/Pretendard-ExtraLight.woff2 new file mode 100644 index 0000000..e510402 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-ExtraLight.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-Light.otf b/src/main/resources/static/font/admin/Pretendard-Light.otf new file mode 100644 index 0000000..228679e Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Light.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-Light.woff b/src/main/resources/static/font/admin/Pretendard-Light.woff new file mode 100644 index 0000000..2cad608 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Light.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-Light.woff2 b/src/main/resources/static/font/admin/Pretendard-Light.woff2 new file mode 100644 index 0000000..7f82fe8 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Light.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-Medium.otf b/src/main/resources/static/font/admin/Pretendard-Medium.otf new file mode 100644 index 0000000..0575069 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Medium.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-Medium.woff b/src/main/resources/static/font/admin/Pretendard-Medium.woff new file mode 100644 index 0000000..5370409 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Medium.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-Medium.woff2 b/src/main/resources/static/font/admin/Pretendard-Medium.woff2 new file mode 100644 index 0000000..f8c743d Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Medium.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-Regular.otf b/src/main/resources/static/font/admin/Pretendard-Regular.otf new file mode 100644 index 0000000..08bf4cf Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Regular.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-Regular.woff b/src/main/resources/static/font/admin/Pretendard-Regular.woff new file mode 100644 index 0000000..e3b3a35 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Regular.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-Regular.woff2 b/src/main/resources/static/font/admin/Pretendard-Regular.woff2 new file mode 100644 index 0000000..a9f6231 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Regular.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-SemiBold.otf b/src/main/resources/static/font/admin/Pretendard-SemiBold.otf new file mode 100644 index 0000000..e7e36ab Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-SemiBold.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-SemiBold.woff b/src/main/resources/static/font/admin/Pretendard-SemiBold.woff new file mode 100644 index 0000000..682e7a4 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-SemiBold.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-SemiBold.woff2 b/src/main/resources/static/font/admin/Pretendard-SemiBold.woff2 new file mode 100644 index 0000000..4c6a32d Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-SemiBold.woff2 differ diff --git a/src/main/resources/static/font/admin/Pretendard-Thin.otf b/src/main/resources/static/font/admin/Pretendard-Thin.otf new file mode 100644 index 0000000..77e792d Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Thin.otf differ diff --git a/src/main/resources/static/font/admin/Pretendard-Thin.woff b/src/main/resources/static/font/admin/Pretendard-Thin.woff new file mode 100644 index 0000000..d28e448 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Thin.woff differ diff --git a/src/main/resources/static/font/admin/Pretendard-Thin.woff2 b/src/main/resources/static/font/admin/Pretendard-Thin.woff2 new file mode 100644 index 0000000..6c9bc96 Binary files /dev/null and b/src/main/resources/static/font/admin/Pretendard-Thin.woff2 differ diff --git a/src/main/resources/static/font/web/11롯데마트드림Light.otf b/src/main/resources/static/font/web/11롯데마트드림Light.otf new file mode 100644 index 0000000..9ffe610 Binary files /dev/null and b/src/main/resources/static/font/web/11롯데마트드림Light.otf differ diff --git a/src/main/resources/static/font/web/12롯데마트드림Bold.ttf b/src/main/resources/static/font/web/12롯데마트드림Bold.ttf new file mode 100644 index 0000000..0432ce7 Binary files /dev/null and b/src/main/resources/static/font/web/12롯데마트드림Bold.ttf differ diff --git a/src/main/resources/static/font/web/12롯데마트드림Light.ttf b/src/main/resources/static/font/web/12롯데마트드림Light.ttf new file mode 100644 index 0000000..6117485 Binary files /dev/null and b/src/main/resources/static/font/web/12롯데마트드림Light.ttf differ diff --git a/src/main/resources/static/font/web/12롯데마트드림Medium.ttf b/src/main/resources/static/font/web/12롯데마트드림Medium.ttf new file mode 100644 index 0000000..8cdf67f Binary files /dev/null and b/src/main/resources/static/font/web/12롯데마트드림Medium.ttf differ diff --git a/src/main/resources/static/font/web/Cafe24Classictype-v1.1.otf b/src/main/resources/static/font/web/Cafe24Classictype-v1.1.otf new file mode 100644 index 0000000..6b2071b Binary files /dev/null and b/src/main/resources/static/font/web/Cafe24Classictype-v1.1.otf differ diff --git a/src/main/resources/static/font/web/Cafe24Classictype-v1.1.ttf b/src/main/resources/static/font/web/Cafe24Classictype-v1.1.ttf new file mode 100644 index 0000000..e5b72c5 Binary files /dev/null and b/src/main/resources/static/font/web/Cafe24Classictype-v1.1.ttf differ diff --git a/src/main/resources/static/font/web/Jalnan2.otf b/src/main/resources/static/font/web/Jalnan2.otf new file mode 100644 index 0000000..1e3ef1d Binary files /dev/null and b/src/main/resources/static/font/web/Jalnan2.otf differ diff --git a/src/main/resources/static/font/web/Jalnan2TTF.ttf b/src/main/resources/static/font/web/Jalnan2TTF.ttf new file mode 100644 index 0000000..8357acc Binary files /dev/null and b/src/main/resources/static/font/web/Jalnan2TTF.ttf differ diff --git a/src/main/resources/static/font/web/Jua-Regular.ttf b/src/main/resources/static/font/web/Jua-Regular.ttf new file mode 100644 index 0000000..f0943a5 Binary files /dev/null and b/src/main/resources/static/font/web/Jua-Regular.ttf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeo-Bd.ttf b/src/main/resources/static/font/web/NanumSquareNeo-Bd.ttf new file mode 100644 index 0000000..ccde7f7 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeo-Bd.ttf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeo-Eb.ttf b/src/main/resources/static/font/web/NanumSquareNeo-Eb.ttf new file mode 100644 index 0000000..0f3b2a8 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeo-Eb.ttf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeo-Hv.ttf b/src/main/resources/static/font/web/NanumSquareNeo-Hv.ttf new file mode 100644 index 0000000..51a02ab Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeo-Hv.ttf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeo-Lt.ttf b/src/main/resources/static/font/web/NanumSquareNeo-Lt.ttf new file mode 100644 index 0000000..5946187 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeo-Lt.ttf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeo-Rg.ttf b/src/main/resources/static/font/web/NanumSquareNeo-Rg.ttf new file mode 100644 index 0000000..8680fb3 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeo-Rg.ttf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeoOTF-Bd.otf b/src/main/resources/static/font/web/NanumSquareNeoOTF-Bd.otf new file mode 100644 index 0000000..5fc4445 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeoOTF-Bd.otf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeoOTF-Eb.otf b/src/main/resources/static/font/web/NanumSquareNeoOTF-Eb.otf new file mode 100644 index 0000000..4a78a42 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeoOTF-Eb.otf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeoOTF-Hv.otf b/src/main/resources/static/font/web/NanumSquareNeoOTF-Hv.otf new file mode 100644 index 0000000..b8f8cf6 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeoOTF-Hv.otf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeoOTF-Lt.otf b/src/main/resources/static/font/web/NanumSquareNeoOTF-Lt.otf new file mode 100644 index 0000000..e1e3bb3 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeoOTF-Lt.otf differ diff --git a/src/main/resources/static/font/web/NanumSquareNeoOTF-Rg.otf b/src/main/resources/static/font/web/NanumSquareNeoOTF-Rg.otf new file mode 100644 index 0000000..a43f932 Binary files /dev/null and b/src/main/resources/static/font/web/NanumSquareNeoOTF-Rg.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Black.otf b/src/main/resources/static/font/web/Pretendard-Black.otf new file mode 100644 index 0000000..a0d849e Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Black.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Black.woff b/src/main/resources/static/font/web/Pretendard-Black.woff new file mode 100644 index 0000000..d07848c Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Black.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-Black.woff2 b/src/main/resources/static/font/web/Pretendard-Black.woff2 new file mode 100644 index 0000000..eafe683 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Black.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-Bold.otf b/src/main/resources/static/font/web/Pretendard-Bold.otf new file mode 100644 index 0000000..8e5e30a Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Bold.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Bold.woff b/src/main/resources/static/font/web/Pretendard-Bold.woff new file mode 100644 index 0000000..7837ae5 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Bold.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-Bold.woff2 b/src/main/resources/static/font/web/Pretendard-Bold.woff2 new file mode 100644 index 0000000..4d40a1a Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Bold.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-ExtraBold.otf b/src/main/resources/static/font/web/Pretendard-ExtraBold.otf new file mode 100644 index 0000000..388f3ca Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-ExtraBold.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-ExtraBold.woff b/src/main/resources/static/font/web/Pretendard-ExtraBold.woff new file mode 100644 index 0000000..8058b76 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-ExtraBold.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-ExtraBold.woff2 b/src/main/resources/static/font/web/Pretendard-ExtraBold.woff2 new file mode 100644 index 0000000..dcd57e7 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-ExtraBold.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-ExtraLight.otf b/src/main/resources/static/font/web/Pretendard-ExtraLight.otf new file mode 100644 index 0000000..40c8b69 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-ExtraLight.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-ExtraLight.woff b/src/main/resources/static/font/web/Pretendard-ExtraLight.woff new file mode 100644 index 0000000..f9498d8 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-ExtraLight.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-ExtraLight.woff2 b/src/main/resources/static/font/web/Pretendard-ExtraLight.woff2 new file mode 100644 index 0000000..e510402 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-ExtraLight.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-Light.otf b/src/main/resources/static/font/web/Pretendard-Light.otf new file mode 100644 index 0000000..228679e Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Light.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Light.woff b/src/main/resources/static/font/web/Pretendard-Light.woff new file mode 100644 index 0000000..2cad608 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Light.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-Light.woff2 b/src/main/resources/static/font/web/Pretendard-Light.woff2 new file mode 100644 index 0000000..7f82fe8 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Light.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-Medium.otf b/src/main/resources/static/font/web/Pretendard-Medium.otf new file mode 100644 index 0000000..0575069 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Medium.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Medium.woff b/src/main/resources/static/font/web/Pretendard-Medium.woff new file mode 100644 index 0000000..5370409 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Medium.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-Medium.woff2 b/src/main/resources/static/font/web/Pretendard-Medium.woff2 new file mode 100644 index 0000000..f8c743d Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Medium.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-Regular.otf b/src/main/resources/static/font/web/Pretendard-Regular.otf new file mode 100644 index 0000000..08bf4cf Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Regular.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Regular.woff b/src/main/resources/static/font/web/Pretendard-Regular.woff new file mode 100644 index 0000000..e3b3a35 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Regular.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-Regular.woff2 b/src/main/resources/static/font/web/Pretendard-Regular.woff2 new file mode 100644 index 0000000..a9f6231 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Regular.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-SemiBold.otf b/src/main/resources/static/font/web/Pretendard-SemiBold.otf new file mode 100644 index 0000000..e7e36ab Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-SemiBold.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-SemiBold.woff b/src/main/resources/static/font/web/Pretendard-SemiBold.woff new file mode 100644 index 0000000..682e7a4 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-SemiBold.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-SemiBold.woff2 b/src/main/resources/static/font/web/Pretendard-SemiBold.woff2 new file mode 100644 index 0000000..4c6a32d Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-SemiBold.woff2 differ diff --git a/src/main/resources/static/font/web/Pretendard-Thin.otf b/src/main/resources/static/font/web/Pretendard-Thin.otf new file mode 100644 index 0000000..77e792d Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Thin.otf differ diff --git a/src/main/resources/static/font/web/Pretendard-Thin.woff b/src/main/resources/static/font/web/Pretendard-Thin.woff new file mode 100644 index 0000000..d28e448 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Thin.woff differ diff --git a/src/main/resources/static/font/web/Pretendard-Thin.woff2 b/src/main/resources/static/font/web/Pretendard-Thin.woff2 new file mode 100644 index 0000000..6c9bc96 Binary files /dev/null and b/src/main/resources/static/font/web/Pretendard-Thin.woff2 differ diff --git a/src/main/resources/static/font/web/YangJuByeolsan.otf b/src/main/resources/static/font/web/YangJuByeolsan.otf new file mode 100644 index 0000000..f43b841 Binary files /dev/null and b/src/main/resources/static/font/web/YangJuByeolsan.otf differ diff --git a/src/main/resources/static/font/web/경기천년제목OTF_Bold.otf b/src/main/resources/static/font/web/경기천년제목OTF_Bold.otf new file mode 100644 index 0000000..e867b91 Binary files /dev/null and b/src/main/resources/static/font/web/경기천년제목OTF_Bold.otf differ diff --git a/src/main/resources/static/font/web/경기천년제목OTF_Light.otf b/src/main/resources/static/font/web/경기천년제목OTF_Light.otf new file mode 100644 index 0000000..b089e53 Binary files /dev/null and b/src/main/resources/static/font/web/경기천년제목OTF_Light.otf differ diff --git a/src/main/resources/static/font/web/경기천년제목_Bold.ttf b/src/main/resources/static/font/web/경기천년제목_Bold.ttf new file mode 100644 index 0000000..6378ae4 Binary files /dev/null and b/src/main/resources/static/font/web/경기천년제목_Bold.ttf differ diff --git a/src/main/resources/static/font/web/경기천년제목_Light.ttf b/src/main/resources/static/font/web/경기천년제목_Light.ttf new file mode 100644 index 0000000..962b6c4 Binary files /dev/null and b/src/main/resources/static/font/web/경기천년제목_Light.ttf differ diff --git a/src/main/resources/static/font/web/나눔손글씨손편지체.ttf b/src/main/resources/static/font/web/나눔손글씨손편지체.ttf new file mode 100644 index 0000000..e167b1a Binary files /dev/null and b/src/main/resources/static/font/web/나눔손글씨손편지체.ttf differ diff --git a/src/main/resources/static/image/admin/logo.svg b/src/main/resources/static/image/admin/logo.svg new file mode 100644 index 0000000..454a1d8 --- /dev/null +++ b/src/main/resources/static/image/admin/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/main/resources/static/image/admin/logo_white.svg b/src/main/resources/static/image/admin/logo_white.svg new file mode 100644 index 0000000..454a1d8 --- /dev/null +++ b/src/main/resources/static/image/admin/logo_white.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/main/resources/static/image/adminBg.png b/src/main/resources/static/image/adminBg.png new file mode 100644 index 0000000..2cbd667 Binary files /dev/null and b/src/main/resources/static/image/adminBg.png differ diff --git a/src/main/resources/static/image/arrow-down.png b/src/main/resources/static/image/arrow-down.png new file mode 100644 index 0000000..ccbbd41 Binary files /dev/null and b/src/main/resources/static/image/arrow-down.png differ diff --git a/src/main/resources/static/image/close-btn.png b/src/main/resources/static/image/close-btn.png new file mode 100644 index 0000000..fc630ba Binary files /dev/null and b/src/main/resources/static/image/close-btn.png differ diff --git a/src/main/resources/static/image/equip/라비앙.jpg b/src/main/resources/static/image/equip/라비앙.jpg new file mode 100644 index 0000000..cadecda Binary files /dev/null and b/src/main/resources/static/image/equip/라비앙.jpg differ diff --git a/src/main/resources/static/image/equip/리포덤.jpg b/src/main/resources/static/image/equip/리포덤.jpg new file mode 100644 index 0000000..c77f76f Binary files /dev/null and b/src/main/resources/static/image/equip/리포덤.jpg differ diff --git a/src/main/resources/static/image/equip/바디고주파테라피.jpg b/src/main/resources/static/image/equip/바디고주파테라피.jpg new file mode 100644 index 0000000..bcb35f0 Binary files /dev/null and b/src/main/resources/static/image/equip/바디고주파테라피.jpg differ diff --git a/src/main/resources/static/image/equip/슈링크유니버스.jpg b/src/main/resources/static/image/equip/슈링크유니버스.jpg new file mode 100644 index 0000000..ac60cb8 Binary files /dev/null and b/src/main/resources/static/image/equip/슈링크유니버스.jpg differ diff --git a/src/main/resources/static/image/equip/써마지.jpg b/src/main/resources/static/image/equip/써마지.jpg new file mode 100644 index 0000000..4513e1a Binary files /dev/null and b/src/main/resources/static/image/equip/써마지.jpg differ diff --git a/src/main/resources/static/image/equip/울쎄라.jpg b/src/main/resources/static/image/equip/울쎄라.jpg new file mode 100644 index 0000000..6b8ba0e Binary files /dev/null and b/src/main/resources/static/image/equip/울쎄라.jpg differ diff --git a/src/main/resources/static/image/equip/울핏.jpg b/src/main/resources/static/image/equip/울핏.jpg new file mode 100644 index 0000000..7f61063 Binary files /dev/null and b/src/main/resources/static/image/equip/울핏.jpg differ diff --git a/src/main/resources/static/image/equip/인모드.jpg b/src/main/resources/static/image/equip/인모드.jpg new file mode 100644 index 0000000..4968f48 Binary files /dev/null and b/src/main/resources/static/image/equip/인모드.jpg differ diff --git a/src/main/resources/static/image/equip/튠바디.jpg b/src/main/resources/static/image/equip/튠바디.jpg new file mode 100644 index 0000000..0066181 Binary files /dev/null and b/src/main/resources/static/image/equip/튠바디.jpg differ diff --git a/src/main/resources/static/image/equip/튠페이스.jpg b/src/main/resources/static/image/equip/튠페이스.jpg new file mode 100644 index 0000000..a6bd9ab Binary files /dev/null and b/src/main/resources/static/image/equip/튠페이스.jpg differ diff --git a/src/main/resources/static/image/equip/티타늄.jpg b/src/main/resources/static/image/equip/티타늄.jpg new file mode 100644 index 0000000..3203daa Binary files /dev/null and b/src/main/resources/static/image/equip/티타늄.jpg differ diff --git a/src/main/resources/static/image/equip/포텐자.jpg b/src/main/resources/static/image/equip/포텐자.jpg new file mode 100644 index 0000000..daa6eef Binary files /dev/null and b/src/main/resources/static/image/equip/포텐자.jpg differ diff --git a/src/main/resources/static/image/favicon.ico b/src/main/resources/static/image/favicon.ico new file mode 100644 index 0000000..c1e3589 Binary files /dev/null and b/src/main/resources/static/image/favicon.ico differ diff --git a/src/main/resources/static/image/index/diet_center_960x1080.mp4 b/src/main/resources/static/image/index/diet_center_960x1080.mp4 new file mode 100644 index 0000000..5c02c32 Binary files /dev/null and b/src/main/resources/static/image/index/diet_center_960x1080.mp4 differ diff --git a/src/main/resources/static/image/index/petit_skin_center_960x1080.mp4 b/src/main/resources/static/image/index/petit_skin_center_960x1080.mp4 new file mode 100644 index 0000000..61bc112 Binary files /dev/null and b/src/main/resources/static/image/index/petit_skin_center_960x1080.mp4 differ diff --git a/src/main/resources/static/image/logo_1119x304.PNG b/src/main/resources/static/image/logo_1119x304.PNG new file mode 100644 index 0000000..1172d38 Binary files /dev/null and b/src/main/resources/static/image/logo_1119x304.PNG differ diff --git a/src/main/resources/static/image/logo_121x33.png b/src/main/resources/static/image/logo_121x33.png new file mode 100644 index 0000000..8c5e0d4 Binary files /dev/null and b/src/main/resources/static/image/logo_121x33.png differ diff --git a/src/main/resources/static/image/logo_121x33_W.png b/src/main/resources/static/image/logo_121x33_W.png new file mode 100644 index 0000000..f4054f3 Binary files /dev/null and b/src/main/resources/static/image/logo_121x33_W.png differ diff --git a/src/main/resources/static/image/logo_199x54.png b/src/main/resources/static/image/logo_199x54.png new file mode 100644 index 0000000..8809bea Binary files /dev/null and b/src/main/resources/static/image/logo_199x54.png differ diff --git a/src/main/resources/static/image/logo_199x54_W.png b/src/main/resources/static/image/logo_199x54_W.png new file mode 100644 index 0000000..bee70e0 Binary files /dev/null and b/src/main/resources/static/image/logo_199x54_W.png differ diff --git a/src/main/resources/static/image/main-slide/signature_diet_medicine_20251001.jpg b/src/main/resources/static/image/main-slide/signature_diet_medicine_20251001.jpg new file mode 100644 index 0000000..98dbe8d Binary files /dev/null and b/src/main/resources/static/image/main-slide/signature_diet_medicine_20251001.jpg differ diff --git a/src/main/resources/static/image/main-slide/다이어트약_20250911.jpg b/src/main/resources/static/image/main-slide/다이어트약_20250911.jpg new file mode 100644 index 0000000..08940f0 Binary files /dev/null and b/src/main/resources/static/image/main-slide/다이어트약_20250911.jpg differ diff --git a/src/main/resources/static/image/main-slide/울핏_20250911.jpg b/src/main/resources/static/image/main-slide/울핏_20250911.jpg new file mode 100644 index 0000000..33f1088 Binary files /dev/null and b/src/main/resources/static/image/main-slide/울핏_20250911.jpg differ diff --git a/src/main/resources/static/image/main-slide/지방분해주사_20250911.jpg b/src/main/resources/static/image/main-slide/지방분해주사_20250911.jpg new file mode 100644 index 0000000..0f39745 Binary files /dev/null and b/src/main/resources/static/image/main-slide/지방분해주사_20250911.jpg differ diff --git a/src/main/resources/static/image/main-slide/튠바디_20250911.jpg b/src/main/resources/static/image/main-slide/튠바디_20250911.jpg new file mode 100644 index 0000000..598f319 Binary files /dev/null and b/src/main/resources/static/image/main-slide/튠바디_20250911.jpg differ diff --git a/src/main/resources/static/image/quick_menu/call_consultation.png b/src/main/resources/static/image/quick_menu/call_consultation.png new file mode 100644 index 0000000..6f46277 Binary files /dev/null and b/src/main/resources/static/image/quick_menu/call_consultation.png differ diff --git a/src/main/resources/static/image/quick_menu/diet_center.png b/src/main/resources/static/image/quick_menu/diet_center.png new file mode 100644 index 0000000..91d580e Binary files /dev/null and b/src/main/resources/static/image/quick_menu/diet_center.png differ diff --git a/src/main/resources/static/image/quick_menu/kakao_consultation.png b/src/main/resources/static/image/quick_menu/kakao_consultation.png new file mode 100644 index 0000000..d53eaf8 Binary files /dev/null and b/src/main/resources/static/image/quick_menu/kakao_consultation.png differ diff --git a/src/main/resources/static/image/quick_menu/madeu_phone_number.png b/src/main/resources/static/image/quick_menu/madeu_phone_number.png new file mode 100644 index 0000000..c351d8d Binary files /dev/null and b/src/main/resources/static/image/quick_menu/madeu_phone_number.png differ diff --git a/src/main/resources/static/image/quick_menu/petit_center.png b/src/main/resources/static/image/quick_menu/petit_center.png new file mode 100644 index 0000000..795eed3 Binary files /dev/null and b/src/main/resources/static/image/quick_menu/petit_center.png differ diff --git a/src/main/resources/static/image/sample.jpg b/src/main/resources/static/image/sample.jpg new file mode 100644 index 0000000..e20a3a0 Binary files /dev/null and b/src/main/resources/static/image/sample.jpg differ diff --git a/src/main/resources/static/image/search.svg b/src/main/resources/static/image/search.svg new file mode 100644 index 0000000..b2edd2b --- /dev/null +++ b/src/main/resources/static/image/search.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/static/image/thumb.jpg b/src/main/resources/static/image/thumb.jpg new file mode 100644 index 0000000..12ed458 Binary files /dev/null and b/src/main/resources/static/image/thumb.jpg differ diff --git a/src/main/resources/static/image/web/Mcontent11.png b/src/main/resources/static/image/web/Mcontent11.png new file mode 100644 index 0000000..d1241eb Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent11.png differ diff --git a/src/main/resources/static/image/web/Mcontent12.png b/src/main/resources/static/image/web/Mcontent12.png new file mode 100644 index 0000000..1c825bb Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent12.png differ diff --git a/src/main/resources/static/image/web/Mcontent13.png b/src/main/resources/static/image/web/Mcontent13.png new file mode 100644 index 0000000..7a6c196 Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent13.png differ diff --git a/src/main/resources/static/image/web/Mcontent14.png b/src/main/resources/static/image/web/Mcontent14.png new file mode 100644 index 0000000..bd77daf Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent14.png differ diff --git a/src/main/resources/static/image/web/Mcontent21.png b/src/main/resources/static/image/web/Mcontent21.png new file mode 100644 index 0000000..c62d8c4 Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent21.png differ diff --git a/src/main/resources/static/image/web/Mcontent22.png b/src/main/resources/static/image/web/Mcontent22.png new file mode 100644 index 0000000..78fbef6 Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent22.png differ diff --git a/src/main/resources/static/image/web/Mcontent23.png b/src/main/resources/static/image/web/Mcontent23.png new file mode 100644 index 0000000..0f88dc7 Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent23.png differ diff --git a/src/main/resources/static/image/web/Mcontent24.png b/src/main/resources/static/image/web/Mcontent24.png new file mode 100644 index 0000000..9360ed4 Binary files /dev/null and b/src/main/resources/static/image/web/Mcontent24.png differ diff --git a/src/main/resources/static/image/web/Mdiet_main.jpg b/src/main/resources/static/image/web/Mdiet_main.jpg new file mode 100644 index 0000000..c958786 Binary files /dev/null and b/src/main/resources/static/image/web/Mdiet_main.jpg differ diff --git a/src/main/resources/static/image/web/Mdiet_main2.jpg b/src/main/resources/static/image/web/Mdiet_main2.jpg new file mode 100644 index 0000000..a774d37 Binary files /dev/null and b/src/main/resources/static/image/web/Mdiet_main2.jpg differ diff --git a/src/main/resources/static/image/web/Mdiet_main3_1.jpg b/src/main/resources/static/image/web/Mdiet_main3_1.jpg new file mode 100644 index 0000000..122697a Binary files /dev/null and b/src/main/resources/static/image/web/Mdiet_main3_1.jpg differ diff --git a/src/main/resources/static/image/web/Mdiet_main3_2.jpg b/src/main/resources/static/image/web/Mdiet_main3_2.jpg new file mode 100644 index 0000000..5814b65 Binary files /dev/null and b/src/main/resources/static/image/web/Mdiet_main3_2.jpg differ diff --git a/src/main/resources/static/image/web/Mdiet_main4.jpg b/src/main/resources/static/image/web/Mdiet_main4.jpg new file mode 100644 index 0000000..b87df06 Binary files /dev/null and b/src/main/resources/static/image/web/Mdiet_main4.jpg differ diff --git a/src/main/resources/static/image/web/Mfooter.png b/src/main/resources/static/image/web/Mfooter.png new file mode 100644 index 0000000..7b45e4f Binary files /dev/null and b/src/main/resources/static/image/web/Mfooter.png differ diff --git a/src/main/resources/static/image/web/Mintroduction_content4-1.jpg b/src/main/resources/static/image/web/Mintroduction_content4-1.jpg new file mode 100644 index 0000000..586906f Binary files /dev/null and b/src/main/resources/static/image/web/Mintroduction_content4-1.jpg differ diff --git a/src/main/resources/static/image/web/Mintroduction_content4-2.jpg b/src/main/resources/static/image/web/Mintroduction_content4-2.jpg new file mode 100644 index 0000000..75e1a99 Binary files /dev/null and b/src/main/resources/static/image/web/Mintroduction_content4-2.jpg differ diff --git a/src/main/resources/static/image/web/Mintroduction_content4-3.jpg b/src/main/resources/static/image/web/Mintroduction_content4-3.jpg new file mode 100644 index 0000000..144a31c Binary files /dev/null and b/src/main/resources/static/image/web/Mintroduction_content4-3.jpg differ diff --git a/src/main/resources/static/image/web/Mpetit_main1.jpg b/src/main/resources/static/image/web/Mpetit_main1.jpg new file mode 100644 index 0000000..928bf85 Binary files /dev/null and b/src/main/resources/static/image/web/Mpetit_main1.jpg differ diff --git a/src/main/resources/static/image/web/Mpetit_main2.jpg b/src/main/resources/static/image/web/Mpetit_main2.jpg new file mode 100644 index 0000000..461b500 Binary files /dev/null and b/src/main/resources/static/image/web/Mpetit_main2.jpg differ diff --git a/src/main/resources/static/image/web/Mpetit_main2_2.jpg b/src/main/resources/static/image/web/Mpetit_main2_2.jpg new file mode 100644 index 0000000..ee978fc Binary files /dev/null and b/src/main/resources/static/image/web/Mpetit_main2_2.jpg differ diff --git a/src/main/resources/static/image/web/Mpetit_main3.jpg b/src/main/resources/static/image/web/Mpetit_main3.jpg new file mode 100644 index 0000000..eaa342b Binary files /dev/null and b/src/main/resources/static/image/web/Mpetit_main3.jpg differ diff --git a/src/main/resources/static/image/web/Mskin_main1.jpg b/src/main/resources/static/image/web/Mskin_main1.jpg new file mode 100644 index 0000000..7ea3196 Binary files /dev/null and b/src/main/resources/static/image/web/Mskin_main1.jpg differ diff --git a/src/main/resources/static/image/web/Mskin_main2.jpg b/src/main/resources/static/image/web/Mskin_main2.jpg new file mode 100644 index 0000000..57de3c2 Binary files /dev/null and b/src/main/resources/static/image/web/Mskin_main2.jpg differ diff --git a/src/main/resources/static/image/web/Mskin_main3.jpg b/src/main/resources/static/image/web/Mskin_main3.jpg new file mode 100644 index 0000000..22ffe04 Binary files /dev/null and b/src/main/resources/static/image/web/Mskin_main3.jpg differ diff --git a/src/main/resources/static/image/web/Mskin_main4.jpg b/src/main/resources/static/image/web/Mskin_main4.jpg new file mode 100644 index 0000000..300971e Binary files /dev/null and b/src/main/resources/static/image/web/Mskin_main4.jpg differ diff --git a/src/main/resources/static/image/web/Mstaff_cont1.jpg b/src/main/resources/static/image/web/Mstaff_cont1.jpg new file mode 100644 index 0000000..ffb97ed Binary files /dev/null and b/src/main/resources/static/image/web/Mstaff_cont1.jpg differ diff --git a/src/main/resources/static/image/web/arrow.svg b/src/main/resources/static/image/web/arrow.svg new file mode 100644 index 0000000..e1fdce0 --- /dev/null +++ b/src/main/resources/static/image/web/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/image/web/arrow2.svg b/src/main/resources/static/image/web/arrow2.svg new file mode 100644 index 0000000..69e39b8 --- /dev/null +++ b/src/main/resources/static/image/web/arrow2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/image/web/aside.jpg b/src/main/resources/static/image/web/aside.jpg new file mode 100644 index 0000000..0572f41 Binary files /dev/null and b/src/main/resources/static/image/web/aside.jpg differ diff --git a/src/main/resources/static/image/web/check.svg b/src/main/resources/static/image/web/check.svg new file mode 100644 index 0000000..46e70f4 --- /dev/null +++ b/src/main/resources/static/image/web/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/image/web/close.png b/src/main/resources/static/image/web/close.png new file mode 100644 index 0000000..9dc53a4 Binary files /dev/null and b/src/main/resources/static/image/web/close.png differ diff --git a/src/main/resources/static/image/web/close.svg b/src/main/resources/static/image/web/close.svg new file mode 100644 index 0000000..0e5702f --- /dev/null +++ b/src/main/resources/static/image/web/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/image/web/cont6_1.jpg b/src/main/resources/static/image/web/cont6_1.jpg new file mode 100644 index 0000000..bf084e7 Binary files /dev/null and b/src/main/resources/static/image/web/cont6_1.jpg differ diff --git a/src/main/resources/static/image/web/cont6_2.jpg b/src/main/resources/static/image/web/cont6_2.jpg new file mode 100644 index 0000000..c06b80d Binary files /dev/null and b/src/main/resources/static/image/web/cont6_2.jpg differ diff --git a/src/main/resources/static/image/web/cont6_3.jpg b/src/main/resources/static/image/web/cont6_3.jpg new file mode 100644 index 0000000..5204955 Binary files /dev/null and b/src/main/resources/static/image/web/cont6_3.jpg differ diff --git a/src/main/resources/static/image/web/cont6_4.jpg b/src/main/resources/static/image/web/cont6_4.jpg new file mode 100644 index 0000000..a885d9f Binary files /dev/null and b/src/main/resources/static/image/web/cont6_4.jpg differ diff --git a/src/main/resources/static/image/web/cont7_1.jpg b/src/main/resources/static/image/web/cont7_1.jpg new file mode 100644 index 0000000..6dada9b Binary files /dev/null and b/src/main/resources/static/image/web/cont7_1.jpg differ diff --git a/src/main/resources/static/image/web/cont7_2.jpg b/src/main/resources/static/image/web/cont7_2.jpg new file mode 100644 index 0000000..5ab2116 Binary files /dev/null and b/src/main/resources/static/image/web/cont7_2.jpg differ diff --git a/src/main/resources/static/image/web/cont7_3.jpg b/src/main/resources/static/image/web/cont7_3.jpg new file mode 100644 index 0000000..6b9ecf1 Binary files /dev/null and b/src/main/resources/static/image/web/cont7_3.jpg differ diff --git a/src/main/resources/static/image/web/cont7_4.jpg b/src/main/resources/static/image/web/cont7_4.jpg new file mode 100644 index 0000000..d3ba858 Binary files /dev/null and b/src/main/resources/static/image/web/cont7_4.jpg differ diff --git a/src/main/resources/static/image/web/content11.png b/src/main/resources/static/image/web/content11.png new file mode 100644 index 0000000..606c080 Binary files /dev/null and b/src/main/resources/static/image/web/content11.png differ diff --git a/src/main/resources/static/image/web/content12.png b/src/main/resources/static/image/web/content12.png new file mode 100644 index 0000000..6828db4 Binary files /dev/null and b/src/main/resources/static/image/web/content12.png differ diff --git a/src/main/resources/static/image/web/content13.png b/src/main/resources/static/image/web/content13.png new file mode 100644 index 0000000..50aba04 Binary files /dev/null and b/src/main/resources/static/image/web/content13.png differ diff --git a/src/main/resources/static/image/web/content14.png b/src/main/resources/static/image/web/content14.png new file mode 100644 index 0000000..5d76fb6 Binary files /dev/null and b/src/main/resources/static/image/web/content14.png differ diff --git a/src/main/resources/static/image/web/content21.png b/src/main/resources/static/image/web/content21.png new file mode 100644 index 0000000..fd53be5 Binary files /dev/null and b/src/main/resources/static/image/web/content21.png differ diff --git a/src/main/resources/static/image/web/content22.png b/src/main/resources/static/image/web/content22.png new file mode 100644 index 0000000..709beb0 Binary files /dev/null and b/src/main/resources/static/image/web/content22.png differ diff --git a/src/main/resources/static/image/web/content23.png b/src/main/resources/static/image/web/content23.png new file mode 100644 index 0000000..03ba4bd Binary files /dev/null and b/src/main/resources/static/image/web/content23.png differ diff --git a/src/main/resources/static/image/web/content24.png b/src/main/resources/static/image/web/content24.png new file mode 100644 index 0000000..d0e33c2 Binary files /dev/null and b/src/main/resources/static/image/web/content24.png differ diff --git a/src/main/resources/static/image/web/diet_content_injection.JPG b/src/main/resources/static/image/web/diet_content_injection.JPG new file mode 100644 index 0000000..2392818 Binary files /dev/null and b/src/main/resources/static/image/web/diet_content_injection.JPG differ diff --git a/src/main/resources/static/image/web/diet_content_main_banner1.jpg b/src/main/resources/static/image/web/diet_content_main_banner1.jpg new file mode 100644 index 0000000..8ca68fd Binary files /dev/null and b/src/main/resources/static/image/web/diet_content_main_banner1.jpg differ diff --git a/src/main/resources/static/image/web/diet_content_main_banner2.jpg b/src/main/resources/static/image/web/diet_content_main_banner2.jpg new file mode 100644 index 0000000..427e1a7 Binary files /dev/null and b/src/main/resources/static/image/web/diet_content_main_banner2.jpg differ diff --git a/src/main/resources/static/image/web/diet_content_medicine.JPG b/src/main/resources/static/image/web/diet_content_medicine.JPG new file mode 100644 index 0000000..26f6a03 Binary files /dev/null and b/src/main/resources/static/image/web/diet_content_medicine.JPG differ diff --git a/src/main/resources/static/image/web/diet_machine_tunebody.jpg b/src/main/resources/static/image/web/diet_machine_tunebody.jpg new file mode 100644 index 0000000..752a033 Binary files /dev/null and b/src/main/resources/static/image/web/diet_machine_tunebody.jpg differ diff --git a/src/main/resources/static/image/web/diet_machine_ulfit.jpg b/src/main/resources/static/image/web/diet_machine_ulfit.jpg new file mode 100644 index 0000000..7dce6f2 Binary files /dev/null and b/src/main/resources/static/image/web/diet_machine_ulfit.jpg differ diff --git a/src/main/resources/static/image/web/diet_main.jpg b/src/main/resources/static/image/web/diet_main.jpg new file mode 100644 index 0000000..4c1dc74 Binary files /dev/null and b/src/main/resources/static/image/web/diet_main.jpg differ diff --git a/src/main/resources/static/image/web/diet_main2.jpg b/src/main/resources/static/image/web/diet_main2.jpg new file mode 100644 index 0000000..f177f07 Binary files /dev/null and b/src/main/resources/static/image/web/diet_main2.jpg differ diff --git a/src/main/resources/static/image/web/diet_main3_1.jpg b/src/main/resources/static/image/web/diet_main3_1.jpg new file mode 100644 index 0000000..5ebf5c3 Binary files /dev/null and b/src/main/resources/static/image/web/diet_main3_1.jpg differ diff --git a/src/main/resources/static/image/web/diet_main3_2.jpg b/src/main/resources/static/image/web/diet_main3_2.jpg new file mode 100644 index 0000000..6eeb3b0 Binary files /dev/null and b/src/main/resources/static/image/web/diet_main3_2.jpg differ diff --git a/src/main/resources/static/image/web/diet_main4.jpg b/src/main/resources/static/image/web/diet_main4.jpg new file mode 100644 index 0000000..b8b23fa Binary files /dev/null and b/src/main/resources/static/image/web/diet_main4.jpg differ diff --git a/src/main/resources/static/image/web/equipment1.png b/src/main/resources/static/image/web/equipment1.png new file mode 100644 index 0000000..ae40f3e Binary files /dev/null and b/src/main/resources/static/image/web/equipment1.png differ diff --git a/src/main/resources/static/image/web/equipment2.png b/src/main/resources/static/image/web/equipment2.png new file mode 100644 index 0000000..011fa5c Binary files /dev/null and b/src/main/resources/static/image/web/equipment2.png differ diff --git a/src/main/resources/static/image/web/equipment3.png b/src/main/resources/static/image/web/equipment3.png new file mode 100644 index 0000000..286eb01 Binary files /dev/null and b/src/main/resources/static/image/web/equipment3.png differ diff --git a/src/main/resources/static/image/web/equipment4.png b/src/main/resources/static/image/web/equipment4.png new file mode 100644 index 0000000..258c319 Binary files /dev/null and b/src/main/resources/static/image/web/equipment4.png differ diff --git a/src/main/resources/static/image/web/event.jpg b/src/main/resources/static/image/web/event.jpg new file mode 100644 index 0000000..4efb2a2 Binary files /dev/null and b/src/main/resources/static/image/web/event.jpg differ diff --git a/src/main/resources/static/image/web/event_con.jpg b/src/main/resources/static/image/web/event_con.jpg new file mode 100644 index 0000000..71c7267 Binary files /dev/null and b/src/main/resources/static/image/web/event_con.jpg differ diff --git a/src/main/resources/static/image/web/fLogo.png b/src/main/resources/static/image/web/fLogo.png new file mode 100644 index 0000000..e5e78db Binary files /dev/null and b/src/main/resources/static/image/web/fLogo.png differ diff --git a/src/main/resources/static/image/web/footer.png b/src/main/resources/static/image/web/footer.png new file mode 100644 index 0000000..41b5358 Binary files /dev/null and b/src/main/resources/static/image/web/footer.png differ diff --git a/src/main/resources/static/image/web/introduction_content1.png b/src/main/resources/static/image/web/introduction_content1.png new file mode 100644 index 0000000..12d40d0 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_content1.png differ diff --git a/src/main/resources/static/image/web/introduction_content2-1.png b/src/main/resources/static/image/web/introduction_content2-1.png new file mode 100644 index 0000000..41fc068 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_content2-1.png differ diff --git a/src/main/resources/static/image/web/introduction_content2-2.png b/src/main/resources/static/image/web/introduction_content2-2.png new file mode 100644 index 0000000..1dfad10 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_content2-2.png differ diff --git a/src/main/resources/static/image/web/introduction_content4-1.jpg b/src/main/resources/static/image/web/introduction_content4-1.jpg new file mode 100644 index 0000000..7ced8ba Binary files /dev/null and b/src/main/resources/static/image/web/introduction_content4-1.jpg differ diff --git a/src/main/resources/static/image/web/introduction_content4-2.jpg b/src/main/resources/static/image/web/introduction_content4-2.jpg new file mode 100644 index 0000000..8efa803 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_content4-2.jpg differ diff --git a/src/main/resources/static/image/web/introduction_content4-3.jpg b/src/main/resources/static/image/web/introduction_content4-3.jpg new file mode 100644 index 0000000..1d712bb Binary files /dev/null and b/src/main/resources/static/image/web/introduction_content4-3.jpg differ diff --git a/src/main/resources/static/image/web/introduction_main.png b/src/main/resources/static/image/web/introduction_main.png new file mode 100644 index 0000000..1d7ff5a Binary files /dev/null and b/src/main/resources/static/image/web/introduction_main.png differ diff --git a/src/main/resources/static/image/web/introduction_way_con1_1.png b/src/main/resources/static/image/web/introduction_way_con1_1.png new file mode 100644 index 0000000..5f05bad Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_con1_1.png differ diff --git a/src/main/resources/static/image/web/introduction_way_con1_2.png b/src/main/resources/static/image/web/introduction_way_con1_2.png new file mode 100644 index 0000000..eeecab0 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_con1_2.png differ diff --git a/src/main/resources/static/image/web/introduction_way_con3.png b/src/main/resources/static/image/web/introduction_way_con3.png new file mode 100644 index 0000000..2fbd481 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_con3.png differ diff --git a/src/main/resources/static/image/web/introduction_way_con4_1.jpg b/src/main/resources/static/image/web/introduction_way_con4_1.jpg new file mode 100644 index 0000000..9ac3088 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_con4_1.jpg differ diff --git a/src/main/resources/static/image/web/introduction_way_con4_2.jpg b/src/main/resources/static/image/web/introduction_way_con4_2.jpg new file mode 100644 index 0000000..dac3859 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_con4_2.jpg differ diff --git a/src/main/resources/static/image/web/introduction_way_con4_3.jpg b/src/main/resources/static/image/web/introduction_way_con4_3.jpg new file mode 100644 index 0000000..77fac4e Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_con4_3.jpg differ diff --git a/src/main/resources/static/image/web/introduction_way_main1.jpg b/src/main/resources/static/image/web/introduction_way_main1.jpg new file mode 100644 index 0000000..49c50d5 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_main1.jpg differ diff --git a/src/main/resources/static/image/web/introduction_way_main2.jpg b/src/main/resources/static/image/web/introduction_way_main2.jpg new file mode 100644 index 0000000..21e840c Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_main2.jpg differ diff --git a/src/main/resources/static/image/web/introduction_way_main3.jpg b/src/main/resources/static/image/web/introduction_way_main3.jpg new file mode 100644 index 0000000..0a25f04 Binary files /dev/null and b/src/main/resources/static/image/web/introduction_way_main3.jpg differ diff --git a/src/main/resources/static/image/web/knowhow.png b/src/main/resources/static/image/web/knowhow.png new file mode 100644 index 0000000..4752119 Binary files /dev/null and b/src/main/resources/static/image/web/knowhow.png differ diff --git a/src/main/resources/static/image/web/logo.svg b/src/main/resources/static/image/web/logo.svg new file mode 100644 index 0000000..291dd6c --- /dev/null +++ b/src/main/resources/static/image/web/logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/image/web/menu.svg b/src/main/resources/static/image/web/menu.svg new file mode 100644 index 0000000..eeaf51c --- /dev/null +++ b/src/main/resources/static/image/web/menu.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/main/resources/static/image/web/naver.svg b/src/main/resources/static/image/web/naver.svg new file mode 100644 index 0000000..d4cdd63 --- /dev/null +++ b/src/main/resources/static/image/web/naver.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/main/resources/static/image/web/notice.png b/src/main/resources/static/image/web/notice.png new file mode 100644 index 0000000..356e367 Binary files /dev/null and b/src/main/resources/static/image/web/notice.png differ diff --git a/src/main/resources/static/image/web/petit_main1.jpg b/src/main/resources/static/image/web/petit_main1.jpg new file mode 100644 index 0000000..9f9de2b Binary files /dev/null and b/src/main/resources/static/image/web/petit_main1.jpg differ diff --git a/src/main/resources/static/image/web/petit_main2.jpg b/src/main/resources/static/image/web/petit_main2.jpg new file mode 100644 index 0000000..01792e1 Binary files /dev/null and b/src/main/resources/static/image/web/petit_main2.jpg differ diff --git a/src/main/resources/static/image/web/petit_main2_2.jpg b/src/main/resources/static/image/web/petit_main2_2.jpg new file mode 100644 index 0000000..7030494 Binary files /dev/null and b/src/main/resources/static/image/web/petit_main2_2.jpg differ diff --git a/src/main/resources/static/image/web/petit_main3.jpg b/src/main/resources/static/image/web/petit_main3.jpg new file mode 100644 index 0000000..668efd5 Binary files /dev/null and b/src/main/resources/static/image/web/petit_main3.jpg differ diff --git a/src/main/resources/static/image/web/pin.svg b/src/main/resources/static/image/web/pin.svg new file mode 100644 index 0000000..814424a --- /dev/null +++ b/src/main/resources/static/image/web/pin.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/resources/static/image/web/pin2.svg b/src/main/resources/static/image/web/pin2.svg new file mode 100644 index 0000000..2f5ad14 --- /dev/null +++ b/src/main/resources/static/image/web/pin2.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/static/image/web/price.png b/src/main/resources/static/image/web/price.png new file mode 100644 index 0000000..fc9b48f Binary files /dev/null and b/src/main/resources/static/image/web/price.png differ diff --git a/src/main/resources/static/image/web/profile1.jpg b/src/main/resources/static/image/web/profile1.jpg new file mode 100644 index 0000000..84de364 Binary files /dev/null and b/src/main/resources/static/image/web/profile1.jpg differ diff --git a/src/main/resources/static/image/web/profile2.png b/src/main/resources/static/image/web/profile2.png new file mode 100644 index 0000000..e733478 Binary files /dev/null and b/src/main/resources/static/image/web/profile2.png differ diff --git a/src/main/resources/static/image/web/profile3.png b/src/main/resources/static/image/web/profile3.png new file mode 100644 index 0000000..2046a7f Binary files /dev/null and b/src/main/resources/static/image/web/profile3.png differ diff --git a/src/main/resources/static/image/web/profile4.png b/src/main/resources/static/image/web/profile4.png new file mode 100644 index 0000000..acdf966 Binary files /dev/null and b/src/main/resources/static/image/web/profile4.png differ diff --git a/src/main/resources/static/image/web/skin_main1.jpg b/src/main/resources/static/image/web/skin_main1.jpg new file mode 100644 index 0000000..8bec60b Binary files /dev/null and b/src/main/resources/static/image/web/skin_main1.jpg differ diff --git a/src/main/resources/static/image/web/skin_main2.jpg b/src/main/resources/static/image/web/skin_main2.jpg new file mode 100644 index 0000000..7af9dd1 Binary files /dev/null and b/src/main/resources/static/image/web/skin_main2.jpg differ diff --git a/src/main/resources/static/image/web/skin_main3.jpg b/src/main/resources/static/image/web/skin_main3.jpg new file mode 100644 index 0000000..63d3d5e Binary files /dev/null and b/src/main/resources/static/image/web/skin_main3.jpg differ diff --git a/src/main/resources/static/image/web/skin_main4.jpg b/src/main/resources/static/image/web/skin_main4.jpg new file mode 100644 index 0000000..444d087 Binary files /dev/null and b/src/main/resources/static/image/web/skin_main4.jpg differ diff --git a/src/main/resources/static/image/web/staff_cont1.jpg b/src/main/resources/static/image/web/staff_cont1.jpg new file mode 100644 index 0000000..cd29faf Binary files /dev/null and b/src/main/resources/static/image/web/staff_cont1.jpg differ diff --git a/src/main/resources/static/image/web/staff_main.png b/src/main/resources/static/image/web/staff_main.png new file mode 100644 index 0000000..5561331 Binary files /dev/null and b/src/main/resources/static/image/web/staff_main.png differ diff --git a/src/main/resources/static/image/web/time.png b/src/main/resources/static/image/web/time.png new file mode 100644 index 0000000..610480d Binary files /dev/null and b/src/main/resources/static/image/web/time.png differ diff --git a/src/main/resources/static/include/home.html b/src/main/resources/static/include/home.html new file mode 100644 index 0000000..093420c --- /dev/null +++ b/src/main/resources/static/include/home.html @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 더예쁜의원 + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ main + main +
+
+ +
+ telephone +

051.202.1997

+
+
+
+

고객의 생각을 생각하는 더예쁜 마음

+

내일이 더 예쁜
당신을 기대합니다

+
+
+ +
+ +
+ bg3 + bg3 +
+
+

박지선 대표원장 약력

+ +

+ Canada, Douglas College
+ USA, University of Rochester, Neuroscience
+ DongA Medical College
+

+ +

+ 현, 더예쁜의원 원장
+ 전, 파라다이스의원 원장
+ 대한미용성형레이저의학회 정회원
+ 대한비만미용체형학회 정회원
+ 대한레이저피부모발의학 정회원
+ 대한임상레이저학회 정회원
+ 대한임상피부관리학회 정회원 +

+
+
+
+
+ bg4 + bg4 +
+

Equipment

+
+
+
+
+
+ all +
+
+
+

레이저 리프팅

+
    +
  • 브이로
  • +
  • 볼뉴머
  • +
  • 에어젯2
  • +
+
+
+ razer +
+
+
+
+

여드름 | 흉터

+
    +
  • 아큐토닝
  • +
  • 유펄스
  • +
  • CO2
  • +
  • 아그네스
  • +
+
+
+ scar +
+
+
+
+

색소 | 미백

+
    +
  • 스타워커
  • +
  • 유펄스
  • +
  • 헬렌
  • +
  • 엑셀V
  • +
+
+
+ pigment +
+
+
+
+

쁘띠성형

+
    +
  • 제오민
  • +
  • 리즈톡신
  • +
  • 리쥬란
  • +
  • 아놀브
  • +
+
+
+ razer +
+
+
+
+

스킨 부스터

+
    +
  • 라즈네
  • +
  • 콜라쥬
  • +
  • 리쥬란
  • +
  • 물광주사
  • +
+
+
+ skin +
+
+
+
+
+
+
+
+
+

Interior Design

+
+ +
+ con5_sub +
+ +
+
+
+ con5_1 +
+
+ con5_2 +
+
+ con5_3 +
+
+ con5_4 +
+
+
+ +
+
+
+
+
+ bg6 +
+

Promotion

+
+
+
    +
  • + con6_1 +

    더예쁜 2024 EVENT

    +
  • +
  • + con6_2 +

    겨울&기미 EVENT

    +
  • +
  • + con6_3 +

    봄맞이 새학기 EVENT

    +
  • +
  • + con6_4 +

    깨끗하게 EVENT

    +
  • +
  • + con6_5 +

    가정의 달 EVENT

    +
  • +
  • + con6_6 +

    여름이니까 EVENT

    +
  • +
+
+
+
+ icon +
+

Contact Us

+
    +
  • +

    |  도로명  |

    +

    부산 강서구 명지국제2로28번길 23 네오웨스턴스퀘아 2동 2층

    +
  • +
  • +

    |  지번  |

    +

    명지동 3432-1

    +
  • +
  • +

    |  차량 진입 가능 경로

    +
  • +
  • 부산 강서구 명지국제2로28번길 23
    (지번 : 명지동 3432-1)
  • +
  • 명지파출소 옆, 네오웨스턴스퀘아 2동 2층
  • +
  • 051 - 202 - 1997
  • +
  • 차량 진입 가능 경로
  • +
+
+ course +
+
+

진료시간

+
    +
  • 월 화 목 금10:00 ~ 19:00
  • +
  • 수요일10:00 ~ 16:00
  • +
  • 토요일10:00 ~ 15:00
  • +
  • 점 심 시 간13:00 ~ 14:00
  • +
  • * 수/토 점심시간 없음
  • +
  • * 공휴일 휴무
  • +
+
    +
  • * 수/토 점심시간 없음
  • +
  • * 공휴일 휴무
  • +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/aos.js b/src/main/resources/static/js/aos.js new file mode 100644 index 0000000..0ba1c7b --- /dev/null +++ b/src/main/resources/static/js/aos.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},_=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},z=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?_():(document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||(0,d.default)("[data-aos]",O),w)};e.exports={init:z,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e,t){var n=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=new r(o);i=t,a.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute("data-aos")}).length;o&&i()})}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){};t.default=n},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])}); \ No newline at end of file diff --git a/src/main/resources/static/js/bootstrap-datetimepicker/bootstrap-datetimepicker.css b/src/main/resources/static/js/bootstrap-datetimepicker/bootstrap-datetimepicker.css new file mode 100644 index 0000000..6e3c013 --- /dev/null +++ b/src/main/resources/static/js/bootstrap-datetimepicker/bootstrap-datetimepicker.css @@ -0,0 +1,374 @@ +/*! + * Datetimepicker for Bootstrap 3 + * version : 4.17.47 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */ +.bootstrap-datetimepicker-widget { + list-style: none; +} +.bootstrap-datetimepicker-widget.dropdown-menu { + display: block; + margin: 2px 0; + padding: 4px; + width: 19em; +} +@media (min-width: 768px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; + } +} +@media (min-width: 992px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; + } +} +@media (min-width: 1200px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; + } +} +.bootstrap-datetimepicker-widget.dropdown-menu:before, +.bootstrap-datetimepicker-widget.dropdown-menu:after { + content: ''; + display: inline-block; + position: absolute; +} +.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + top: -7px; + left: 7px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + top: -6px; + left: 8px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.top:before { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + bottom: -7px; + left: 6px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.top:after { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid white; + bottom: -6px; + left: 7px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before { + left: auto; + right: 6px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after { + left: auto; + right: 7px; +} +.bootstrap-datetimepicker-widget .list-unstyled { + margin: 0; +} +.bootstrap-datetimepicker-widget a[data-action] { + padding: 6px 0; +} +.bootstrap-datetimepicker-widget a[data-action]:active { + box-shadow: none; +} +.bootstrap-datetimepicker-widget .timepicker-hour, +.bootstrap-datetimepicker-widget .timepicker-minute, +.bootstrap-datetimepicker-widget .timepicker-second { + width: 54px; + font-weight: bold; + font-size: 1.2em; + margin: 0; +} +.bootstrap-datetimepicker-widget button[data-action] { + padding: 6px; +} +.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Increment Hours"; +} +.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Increment Minutes"; +} +.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Decrement Hours"; +} +.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Decrement Minutes"; +} +.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Show Hours"; +} +.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Show Minutes"; +} +.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Toggle AM/PM"; +} +.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Clear the picker"; +} +.bootstrap-datetimepicker-widget .btn[data-action="today"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Set the date to today"; +} +.bootstrap-datetimepicker-widget .picker-switch { + text-align: center; +} +.bootstrap-datetimepicker-widget .picker-switch::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Toggle Date and Time Screens"; +} +.bootstrap-datetimepicker-widget .picker-switch td { + padding: 0; + margin: 0; + height: auto; + width: auto; + line-height: inherit; +} +.bootstrap-datetimepicker-widget .picker-switch td span { + line-height: 2.5; + height: 2.5em; + width: 100%; +} +.bootstrap-datetimepicker-widget table { + width: 100%; + margin: 0; +} +.bootstrap-datetimepicker-widget table td, +.bootstrap-datetimepicker-widget table th { + text-align: center; + border-radius: 4px; +} +.bootstrap-datetimepicker-widget table th { + height: 20px; + line-height: 20px; + width: 20px; +} +.bootstrap-datetimepicker-widget table th.picker-switch { + width: 145px; +} +.bootstrap-datetimepicker-widget table th.disabled, +.bootstrap-datetimepicker-widget table th.disabled:hover { + background: none; + color: #777777; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget table th.prev::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Previous Month"; +} +.bootstrap-datetimepicker-widget table th.next::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Next Month"; +} +.bootstrap-datetimepicker-widget table thead tr:first-child th { + cursor: pointer; +} +.bootstrap-datetimepicker-widget table thead tr:first-child th:hover { + background: #eeeeee; +} +.bootstrap-datetimepicker-widget table td { + height: 54px; + line-height: 54px; + width: 54px; +} +.bootstrap-datetimepicker-widget table td.cw { + font-size: .8em; + height: 20px; + line-height: 20px; + color: #777777; +} +.bootstrap-datetimepicker-widget table td.day { + height: 20px; + line-height: 20px; + width: 20px; +} +.bootstrap-datetimepicker-widget table td.day:hover, +.bootstrap-datetimepicker-widget table td.hour:hover, +.bootstrap-datetimepicker-widget table td.minute:hover, +.bootstrap-datetimepicker-widget table td.second:hover { + background: #eeeeee; + cursor: pointer; +} +.bootstrap-datetimepicker-widget table td.old, +.bootstrap-datetimepicker-widget table td.new { + color: #777777; +} +.bootstrap-datetimepicker-widget table td.today { + position: relative; +} +.bootstrap-datetimepicker-widget table td.today:before { + content: ''; + display: inline-block; + border: solid transparent; + border-width: 0 0 7px 7px; + border-bottom-color: #337ab7; + border-top-color: rgba(0, 0, 0, 0.2); + position: absolute; + bottom: 4px; + right: 4px; +} +.bootstrap-datetimepicker-widget table td.active, +.bootstrap-datetimepicker-widget table td.active:hover { + background-color: #337ab7; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.bootstrap-datetimepicker-widget table td.active.today:before { + border-bottom-color: #fff; +} +.bootstrap-datetimepicker-widget table td.disabled, +.bootstrap-datetimepicker-widget table td.disabled:hover { + background: none; + color: #777777; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget table td span { + display: inline-block; + width: 54px; + height: 54px; + line-height: 54px; + margin: 2px 1.5px; + cursor: pointer; + border-radius: 4px; +} +.bootstrap-datetimepicker-widget table td span:hover { + background: #eeeeee; +} +.bootstrap-datetimepicker-widget table td span.active { + background-color: #337ab7; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.bootstrap-datetimepicker-widget table td span.old { + color: #777777; +} +.bootstrap-datetimepicker-widget table td span.disabled, +.bootstrap-datetimepicker-widget table td span.disabled:hover { + background: none; + color: #777777; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget.usetwentyfour td.hour { + height: 27px; + line-height: 27px; +} +.bootstrap-datetimepicker-widget.wider { + width: 21em; +} +.bootstrap-datetimepicker-widget .datepicker-decades .decade { + line-height: 1.8em !important; +} +.input-group.date .input-group-addon { + cursor: pointer; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} diff --git a/src/main/resources/static/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js b/src/main/resources/static/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js new file mode 100644 index 0000000..cad2d46 --- /dev/null +++ b/src/main/resources/static/js/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js @@ -0,0 +1,2 @@ +!function(a){"use strict";if("function"==typeof define&&define.amd)define(["jquery","moment"],a);else if("object"==typeof exports)module.exports=a(require("jquery"),require("moment"));else{if("undefined"==typeof jQuery)throw"bootstrap-datetimepicker requires jQuery to be loaded first";if("undefined"==typeof moment)throw"bootstrap-datetimepicker requires Moment.js to be loaded first";a(jQuery,moment)}}(function(a,b){"use strict";if(!b)throw new Error("bootstrap-datetimepicker requires Moment.js to be loaded first");var c=function(c,d){var e,f,g,h,i,j,k,l={},m=!0,n=!1,o=!1,p=0,q=[{clsName:"days",navFnc:"M",navStep:1},{clsName:"months",navFnc:"y",navStep:1},{clsName:"years",navFnc:"y",navStep:10},{clsName:"decades",navFnc:"y",navStep:100}],r=["days","months","years","decades"],s=["top","bottom","auto"],t=["left","right","auto"],u=["default","top","bottom"],v={up:38,38:"up",down:40,40:"down",left:37,37:"left",right:39,39:"right",tab:9,9:"tab",escape:27,27:"escape",enter:13,13:"enter",pageUp:33,33:"pageUp",pageDown:34,34:"pageDown",shift:16,16:"shift",control:17,17:"control",space:32,32:"space",t:84,84:"t",delete:46,46:"delete"},w={},x=function(){return void 0!==b.tz&&void 0!==d.timeZone&&null!==d.timeZone&&""!==d.timeZone},y=function(a){var c;return c=void 0===a||null===a?b():b.isDate(a)||b.isMoment(a)?b(a):x()?b.tz(a,j,d.useStrict,d.timeZone):b(a,j,d.useStrict),x()&&c.tz(d.timeZone),c},z=function(a){if("string"!=typeof a||a.length>1)throw new TypeError("isEnabled expects a single character string parameter");switch(a){case"y":return i.indexOf("Y")!==-1;case"M":return i.indexOf("M")!==-1;case"d":return i.toLowerCase().indexOf("d")!==-1;case"h":case"H":return i.toLowerCase().indexOf("h")!==-1;case"m":return i.indexOf("m")!==-1;case"s":return i.indexOf("s")!==-1;default:return!1}},A=function(){return z("h")||z("m")||z("s")},B=function(){return z("y")||z("M")||z("d")},C=function(){var b=a("").append(a("").append(a("").addClass("prev").attr("data-action","previous").append(a("").addClass(d.icons.previous))).append(a("").addClass("picker-switch").attr("data-action","pickerSwitch").attr("colspan",d.calendarWeeks?"6":"5")).append(a("").addClass("next").attr("data-action","next").append(a("").addClass(d.icons.next)))),c=a("").append(a("").append(a("").attr("colspan",d.calendarWeeks?"8":"7")));return[a("
").addClass("datepicker-days").append(a("").addClass("table-condensed").append(b).append(a(""))),a("
").addClass("datepicker-months").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
").addClass("datepicker-years").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
").addClass("datepicker-decades").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone()))]},D=function(){var b=a(""),c=a(""),e=a("");return z("h")&&(b.append(a("
").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementHour}).addClass("btn").attr("data-action","incrementHours").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-hour").attr({"data-time-component":"hours",title:d.tooltips.pickHour}).attr("data-action","showHours"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementHour}).addClass("btn").attr("data-action","decrementHours").append(a("").addClass(d.icons.down))))),z("m")&&(z("h")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementMinute}).addClass("btn").attr("data-action","incrementMinutes").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-minute").attr({"data-time-component":"minutes",title:d.tooltips.pickMinute}).attr("data-action","showMinutes"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementMinute}).addClass("btn").attr("data-action","decrementMinutes").append(a("").addClass(d.icons.down))))),z("s")&&(z("m")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementSecond}).addClass("btn").attr("data-action","incrementSeconds").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-second").attr({"data-time-component":"seconds",title:d.tooltips.pickSecond}).attr("data-action","showSeconds"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementSecond}).addClass("btn").attr("data-action","decrementSeconds").append(a("").addClass(d.icons.down))))),h||(b.append(a("").addClass("separator")),c.append(a("").append(a("").addClass("separator"))),a("
").addClass("timepicker-picker").append(a("").addClass("table-condensed").append([b,c,e]))},E=function(){var b=a("
").addClass("timepicker-hours").append(a("
").addClass("table-condensed")),c=a("
").addClass("timepicker-minutes").append(a("
").addClass("table-condensed")),d=a("
").addClass("timepicker-seconds").append(a("
").addClass("table-condensed")),e=[D()];return z("h")&&e.push(b),z("m")&&e.push(c),z("s")&&e.push(d),e},F=function(){var b=[];return d.showTodayButton&&b.push(a(" from table fragments + if ( !support.tbody ) { + + // String was a
").append(a("").attr({"data-action":"today",title:d.tooltips.today}).append(a("").addClass(d.icons.today)))),!d.sideBySide&&B()&&A()&&b.push(a("").append(a("").attr({"data-action":"togglePicker",title:d.tooltips.selectTime}).append(a("").addClass(d.icons.time)))),d.showClear&&b.push(a("").append(a("").attr({"data-action":"clear",title:d.tooltips.clear}).append(a("").addClass(d.icons.clear)))),d.showClose&&b.push(a("").append(a("").attr({"data-action":"close",title:d.tooltips.close}).append(a("").addClass(d.icons.close)))),a("").addClass("table-condensed").append(a("").append(a("").append(b)))},G=function(){var b=a("
").addClass("bootstrap-datetimepicker-widget dropdown-menu"),c=a("
").addClass("datepicker").append(C()),e=a("
").addClass("timepicker").append(E()),f=a("
    ").addClass("list-unstyled"),g=a("
  • ").addClass("picker-switch"+(d.collapse?" accordion-toggle":"")).append(F());return d.inline&&b.removeClass("dropdown-menu"),h&&b.addClass("usetwentyfour"),z("s")&&!h&&b.addClass("wider"),d.sideBySide&&B()&&A()?(b.addClass("timepicker-sbs"),"top"===d.toolbarPlacement&&b.append(g),b.append(a("
    ").addClass("row").append(c.addClass("col-md-6")).append(e.addClass("col-md-6"))),"bottom"===d.toolbarPlacement&&b.append(g),b):("top"===d.toolbarPlacement&&f.append(g),B()&&f.append(a("
  • ").addClass(d.collapse&&A()?"collapse in":"").append(c)),"default"===d.toolbarPlacement&&f.append(g),A()&&f.append(a("
  • ").addClass(d.collapse&&B()?"collapse":"").append(e)),"bottom"===d.toolbarPlacement&&f.append(g),b.append(f))},H=function(){var b,e={};return b=c.is("input")||d.inline?c.data():c.find("input").data(),b.dateOptions&&b.dateOptions instanceof Object&&(e=a.extend(!0,e,b.dateOptions)),a.each(d,function(a){var c="date"+a.charAt(0).toUpperCase()+a.slice(1);void 0!==b[c]&&(e[a]=b[c])}),e},I=function(){var b,e=(n||c).position(),f=(n||c).offset(),g=d.widgetPositioning.vertical,h=d.widgetPositioning.horizontal;if(d.widgetParent)b=d.widgetParent.append(o);else if(c.is("input"))b=c.after(o).parent();else{if(d.inline)return void(b=c.append(o));b=c,c.children().first().after(o)}if("auto"===g&&(g=f.top+1.5*o.height()>=a(window).height()+a(window).scrollTop()&&o.height()+c.outerHeight()a(window).width()?"right":"left"),"top"===g?o.addClass("top").removeClass("bottom"):o.addClass("bottom").removeClass("top"),"right"===h?o.addClass("pull-right"):o.removeClass("pull-right"),"static"===b.css("position")&&(b=b.parents().filter(function(){return"static"!==a(this).css("position")}).first()),0===b.length)throw new Error("datetimepicker component should be placed within a non-static positioned container");o.css({top:"top"===g?"auto":e.top+c.outerHeight(),bottom:"top"===g?b.outerHeight()-(b===c?0:e.top):"auto",left:"left"===h?b===c?0:e.left:"auto",right:"left"===h?"auto":b.outerWidth()-c.outerWidth()-(b===c?0:e.left)})},J=function(a){"dp.change"===a.type&&(a.date&&a.date.isSame(a.oldDate)||!a.date&&!a.oldDate)||c.trigger(a)},K=function(a){"y"===a&&(a="YYYY"),J({type:"dp.update",change:a,viewDate:f.clone()})},L=function(a){o&&(a&&(k=Math.max(p,Math.min(3,k+a))),o.find(".datepicker > div").hide().filter(".datepicker-"+q[k].clsName).show())},M=function(){var b=a("
"),c=f.clone().startOf("w").startOf("d");for(d.calendarWeeks===!0&&b.append(a(""),d.calendarWeeks&&c.append('"),j.push(c)),k=["day"],b.isBefore(f,"M")&&k.push("old"),b.isAfter(f,"M")&&k.push("new"),b.isSame(e,"d")&&!m&&k.push("active"),R(b,"d")||k.push("disabled"),b.isSame(y(),"d")&&k.push("today"),0!==b.day()&&6!==b.day()||k.push("weekend"),J({type:"dp.classify",date:b,classNames:k}),c.append('"),b.add(1,"d");h.find("tbody").empty().append(j),T(),U(),V()}},X=function(){var b=o.find(".timepicker-hours table"),c=f.clone().startOf("d"),d=[],e=a("");for(f.hour()>11&&!h&&c.hour(12);c.isSame(f,"d")&&(h||f.hour()<12&&c.hour()<12||f.hour()>11);)c.hour()%4===0&&(e=a(""),d.push(e)),e.append('"),c.add(1,"h");b.empty().append(d)},Y=function(){for(var b=o.find(".timepicker-minutes table"),c=f.clone().startOf("h"),e=[],g=a(""),h=1===d.stepping?5:d.stepping;f.isSame(c,"h");)c.minute()%(4*h)===0&&(g=a(""),e.push(g)),g.append('"),c.add(h,"m");b.empty().append(e)},Z=function(){for(var b=o.find(".timepicker-seconds table"),c=f.clone().startOf("m"),d=[],e=a("");f.isSame(c,"m");)c.second()%20===0&&(e=a(""),d.push(e)),e.append('"),c.add(5,"s");b.empty().append(d)},$=function(){var a,b,c=o.find(".timepicker span[data-time-component]");h||(a=o.find(".timepicker [data-action=togglePeriod]"),b=e.clone().add(e.hours()>=12?-12:12,"h"),a.text(e.format("A")),R(b,"h")?a.removeClass("disabled"):a.addClass("disabled")),c.filter("[data-time-component=hours]").text(e.format(h?"HH":"hh")),c.filter("[data-time-component=minutes]").text(e.format("mm")),c.filter("[data-time-component=seconds]").text(e.format("ss")),X(),Y(),Z()},_=function(){o&&(W(),$())},aa=function(a){var b=m?null:e;if(!a)return m=!0,g.val(""),c.data("date",""),J({type:"dp.change",date:!1,oldDate:b}),void _();if(a=a.clone().locale(d.locale),x()&&a.tz(d.timeZone),1!==d.stepping)for(a.minutes(Math.round(a.minutes()/d.stepping)*d.stepping).seconds(0);d.minDate&&a.isBefore(d.minDate);)a.add(d.stepping,"minutes");R(a)?(e=a,f=e.clone(),g.val(e.format(i)),c.data("date",e.format(i)),m=!1,_(),J({type:"dp.change",date:e.clone(),oldDate:b})):(d.keepInvalid?J({type:"dp.change",date:a,oldDate:b}):g.val(m?"":e.format(i)),J({type:"dp.error",date:a,oldDate:b}))},ba=function(){var b=!1;return o?(o.find(".collapse").each(function(){var c=a(this).data("collapse");return!c||!c.transitioning||(b=!0,!1)}),b?l:(n&&n.hasClass("btn")&&n.toggleClass("active"),o.hide(),a(window).off("resize",I),o.off("click","[data-action]"),o.off("mousedown",!1),o.remove(),o=!1,J({type:"dp.hide",date:e.clone()}),g.blur(),f=e.clone(),l)):l},ca=function(){aa(null)},da=function(a){return void 0===d.parseInputDate?(!b.isMoment(a)||a instanceof Date)&&(a=y(a)):a=d.parseInputDate(a),a},ea={next:function(){var a=q[k].navFnc;f.add(q[k].navStep,a),W(),K(a)},previous:function(){var a=q[k].navFnc;f.subtract(q[k].navStep,a),W(),K(a)},pickerSwitch:function(){L(1)},selectMonth:function(b){var c=a(b.target).closest("tbody").find("span").index(a(b.target));f.month(c),k===p?(aa(e.clone().year(f.year()).month(f.month())),d.inline||ba()):(L(-1),W()),K("M")},selectYear:function(b){var c=parseInt(a(b.target).text(),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDecade:function(b){var c=parseInt(a(b.target).data("selection"),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDay:function(b){var c=f.clone();a(b.target).is(".old")&&c.subtract(1,"M"),a(b.target).is(".new")&&c.add(1,"M"),aa(c.date(parseInt(a(b.target).text(),10))),A()||d.keepOpen||d.inline||ba()},incrementHours:function(){var a=e.clone().add(1,"h");R(a,"h")&&aa(a)},incrementMinutes:function(){var a=e.clone().add(d.stepping,"m");R(a,"m")&&aa(a)},incrementSeconds:function(){var a=e.clone().add(1,"s");R(a,"s")&&aa(a)},decrementHours:function(){var a=e.clone().subtract(1,"h");R(a,"h")&&aa(a)},decrementMinutes:function(){var a=e.clone().subtract(d.stepping,"m");R(a,"m")&&aa(a)},decrementSeconds:function(){var a=e.clone().subtract(1,"s");R(a,"s")&&aa(a)},togglePeriod:function(){aa(e.clone().add(e.hours()>=12?-12:12,"h"))},togglePicker:function(b){var c,e=a(b.target),f=e.closest("ul"),g=f.find(".in"),h=f.find(".collapse:not(.in)");if(g&&g.length){if(c=g.data("collapse"),c&&c.transitioning)return;g.collapse?(g.collapse("hide"),h.collapse("show")):(g.removeClass("in"),h.addClass("in")),e.is("span")?e.toggleClass(d.icons.time+" "+d.icons.date):e.find("span").toggleClass(d.icons.time+" "+d.icons.date)}},showPicker:function(){o.find(".timepicker > div:not(.timepicker-picker)").hide(),o.find(".timepicker .timepicker-picker").show()},showHours:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-hours").show()},showMinutes:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-seconds").show()},selectHour:function(b){var c=parseInt(a(b.target).text(),10);h||(e.hours()>=12?12!==c&&(c+=12):12===c&&(c=0)),aa(e.clone().hours(c)),ea.showPicker.call(l)},selectMinute:function(b){aa(e.clone().minutes(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},selectSecond:function(b){aa(e.clone().seconds(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},clear:ca,today:function(){var a=y();R(a,"d")&&aa(a)},close:ba},fa=function(b){return!a(b.currentTarget).is(".disabled")&&(ea[a(b.currentTarget).data("action")].apply(l,arguments),!1)},ga=function(){var b,c={year:function(a){return a.month(0).date(1).hours(0).seconds(0).minutes(0)},month:function(a){return a.date(1).hours(0).seconds(0).minutes(0)},day:function(a){return a.hours(0).seconds(0).minutes(0)},hour:function(a){return a.seconds(0).minutes(0)},minute:function(a){return a.seconds(0)}};return g.prop("disabled")||!d.ignoreReadonly&&g.prop("readonly")||o?l:(void 0!==g.val()&&0!==g.val().trim().length?aa(da(g.val().trim())):m&&d.useCurrent&&(d.inline||g.is("input")&&0===g.val().trim().length)&&(b=y(),"string"==typeof d.useCurrent&&(b=c[d.useCurrent](b)),aa(b)),o=G(),M(),S(),o.find(".timepicker-hours").hide(),o.find(".timepicker-minutes").hide(),o.find(".timepicker-seconds").hide(),_(),L(),a(window).on("resize",I),o.on("click","[data-action]",fa),o.on("mousedown",!1),n&&n.hasClass("btn")&&n.toggleClass("active"),I(),o.show(),d.focusOnShow&&!g.is(":focus")&&g.focus(),J({type:"dp.show"}),l)},ha=function(){return o?ba():ga()},ia=function(a){var b,c,e,f,g=null,h=[],i={},j=a.which,k="p";w[j]=k;for(b in w)w.hasOwnProperty(b)&&w[b]===k&&(h.push(b),parseInt(b,10)!==j&&(i[b]=!0));for(b in d.keyBinds)if(d.keyBinds.hasOwnProperty(b)&&"function"==typeof d.keyBinds[b]&&(e=b.split(" "),e.length===h.length&&v[j]===e[e.length-1])){for(f=!0,c=e.length-2;c>=0;c--)if(!(v[e[c]]in i)){f=!1;break}if(f){g=d.keyBinds[b];break}}g&&(g.call(l,o),a.stopPropagation(),a.preventDefault())},ja=function(a){w[a.which]="r",a.stopPropagation(),a.preventDefault()},ka=function(b){var c=a(b.target).val().trim(),d=c?da(c):null;return aa(d),b.stopImmediatePropagation(),!1},la=function(){g.on({change:ka,blur:d.debug?"":ba,keydown:ia,keyup:ja,focus:d.allowInputToggle?ga:""}),c.is("input")?g.on({focus:ga}):n&&(n.on("click",ha),n.on("mousedown",!1))},ma=function(){g.off({change:ka,blur:blur,keydown:ia,keyup:ja,focus:d.allowInputToggle?ba:""}),c.is("input")?g.off({focus:ga}):n&&(n.off("click",ha),n.off("mousedown",!1))},na=function(b){var c={};return a.each(b,function(){var a=da(this);a.isValid()&&(c[a.format("YYYY-MM-DD")]=!0)}),!!Object.keys(c).length&&c},oa=function(b){var c={};return a.each(b,function(){c[this]=!0}),!!Object.keys(c).length&&c},pa=function(){var a=d.format||"L LT";i=a.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){var b=e.localeData().longDateFormat(a)||a;return b.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){return e.localeData().longDateFormat(a)||a})}),j=d.extraFormats?d.extraFormats.slice():[],j.indexOf(a)<0&&j.indexOf(i)<0&&j.push(i),h=i.toLowerCase().indexOf("a")<1&&i.replace(/\[.*?\]/g,"").indexOf("h")<1,z("y")&&(p=2),z("M")&&(p=1),z("d")&&(p=0),k=Math.max(p,k),m||aa(e)};if(l.destroy=function(){ba(),ma(),c.removeData("DateTimePicker"),c.removeData("date")},l.toggle=ha,l.show=ga,l.hide=ba,l.disable=function(){return ba(),n&&n.hasClass("btn")&&n.addClass("disabled"),g.prop("disabled",!0),l},l.enable=function(){return n&&n.hasClass("btn")&&n.removeClass("disabled"),g.prop("disabled",!1),l},l.ignoreReadonly=function(a){if(0===arguments.length)return d.ignoreReadonly;if("boolean"!=typeof a)throw new TypeError("ignoreReadonly () expects a boolean parameter");return d.ignoreReadonly=a,l},l.options=function(b){if(0===arguments.length)return a.extend(!0,{},d);if(!(b instanceof Object))throw new TypeError("options() options parameter should be an object");return a.extend(!0,d,b),a.each(d,function(a,b){if(void 0===l[a])throw new TypeError("option "+a+" is not recognized!");l[a](b)}),l},l.date=function(a){if(0===arguments.length)return m?null:e.clone();if(!(null===a||"string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("date() parameter must be one of [null, string, moment or Date]");return aa(null===a?null:da(a)),l},l.format=function(a){if(0===arguments.length)return d.format;if("string"!=typeof a&&("boolean"!=typeof a||a!==!1))throw new TypeError("format() expects a string or boolean:false parameter "+a);return d.format=a,i&&pa(),l},l.timeZone=function(a){if(0===arguments.length)return d.timeZone;if("string"!=typeof a)throw new TypeError("newZone() expects a string parameter");return d.timeZone=a,l},l.dayViewHeaderFormat=function(a){if(0===arguments.length)return d.dayViewHeaderFormat;if("string"!=typeof a)throw new TypeError("dayViewHeaderFormat() expects a string parameter");return d.dayViewHeaderFormat=a,l},l.extraFormats=function(a){if(0===arguments.length)return d.extraFormats;if(a!==!1&&!(a instanceof Array))throw new TypeError("extraFormats() expects an array or false parameter");return d.extraFormats=a,j&&pa(),l},l.disabledDates=function(b){if(0===arguments.length)return d.disabledDates?a.extend({},d.disabledDates):d.disabledDates;if(!b)return d.disabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledDates() expects an array parameter");return d.disabledDates=na(b),d.enabledDates=!1,_(),l},l.enabledDates=function(b){if(0===arguments.length)return d.enabledDates?a.extend({},d.enabledDates):d.enabledDates;if(!b)return d.enabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledDates() expects an array parameter");return d.enabledDates=na(b),d.disabledDates=!1,_(),l},l.daysOfWeekDisabled=function(a){if(0===arguments.length)return d.daysOfWeekDisabled.splice(0);if("boolean"==typeof a&&!a)return d.daysOfWeekDisabled=!1,_(),l;if(!(a instanceof Array))throw new TypeError("daysOfWeekDisabled() expects an array parameter");if(d.daysOfWeekDisabled=a.reduce(function(a,b){return b=parseInt(b,10),b>6||b<0||isNaN(b)?a:(a.indexOf(b)===-1&&a.push(b),a)},[]).sort(),d.useCurrent&&!d.keepInvalid){for(var b=0;!R(e,"d");){if(e.add(1,"d"),31===b)throw"Tried 31 times to find a valid date";b++}aa(e)}return _(),l},l.maxDate=function(a){if(0===arguments.length)return d.maxDate?d.maxDate.clone():d.maxDate;if("boolean"==typeof a&&a===!1)return d.maxDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("maxDate() Could not parse date parameter: "+a);if(d.minDate&&b.isBefore(d.minDate))throw new TypeError("maxDate() date parameter is before options.minDate: "+b.format(i));return d.maxDate=b,d.useCurrent&&!d.keepInvalid&&e.isAfter(a)&&aa(d.maxDate),f.isAfter(b)&&(f=b.clone().subtract(d.stepping,"m")),_(),l},l.minDate=function(a){if(0===arguments.length)return d.minDate?d.minDate.clone():d.minDate;if("boolean"==typeof a&&a===!1)return d.minDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("minDate() Could not parse date parameter: "+a);if(d.maxDate&&b.isAfter(d.maxDate))throw new TypeError("minDate() date parameter is after options.maxDate: "+b.format(i));return d.minDate=b,d.useCurrent&&!d.keepInvalid&&e.isBefore(a)&&aa(d.minDate),f.isBefore(b)&&(f=b.clone().add(d.stepping,"m")),_(),l},l.defaultDate=function(a){if(0===arguments.length)return d.defaultDate?d.defaultDate.clone():d.defaultDate;if(!a)return d.defaultDate=!1,l;"string"==typeof a&&(a="now"===a||"moment"===a?y():y(a));var b=da(a);if(!b.isValid())throw new TypeError("defaultDate() Could not parse date parameter: "+a);if(!R(b))throw new TypeError("defaultDate() date passed is invalid according to component setup validations");return d.defaultDate=b,(d.defaultDate&&d.inline||""===g.val().trim())&&aa(d.defaultDate),l},l.locale=function(a){if(0===arguments.length)return d.locale;if(!b.localeData(a))throw new TypeError("locale() locale "+a+" is not loaded from moment locales!");return d.locale=a,e.locale(d.locale),f.locale(d.locale),i&&pa(),o&&(ba(),ga()),l},l.stepping=function(a){return 0===arguments.length?d.stepping:(a=parseInt(a,10),(isNaN(a)||a<1)&&(a=1),d.stepping=a,l)},l.useCurrent=function(a){var b=["year","month","day","hour","minute"];if(0===arguments.length)return d.useCurrent;if("boolean"!=typeof a&&"string"!=typeof a)throw new TypeError("useCurrent() expects a boolean or string parameter");if("string"==typeof a&&b.indexOf(a.toLowerCase())===-1)throw new TypeError("useCurrent() expects a string parameter of "+b.join(", "));return d.useCurrent=a,l},l.collapse=function(a){if(0===arguments.length)return d.collapse;if("boolean"!=typeof a)throw new TypeError("collapse() expects a boolean parameter");return d.collapse===a?l:(d.collapse=a,o&&(ba(),ga()),l)},l.icons=function(b){if(0===arguments.length)return a.extend({},d.icons);if(!(b instanceof Object))throw new TypeError("icons() expects parameter to be an Object");return a.extend(d.icons,b),o&&(ba(),ga()),l},l.tooltips=function(b){if(0===arguments.length)return a.extend({},d.tooltips);if(!(b instanceof Object))throw new TypeError("tooltips() expects parameter to be an Object");return a.extend(d.tooltips,b),o&&(ba(),ga()),l},l.useStrict=function(a){if(0===arguments.length)return d.useStrict;if("boolean"!=typeof a)throw new TypeError("useStrict() expects a boolean parameter");return d.useStrict=a,l},l.sideBySide=function(a){if(0===arguments.length)return d.sideBySide;if("boolean"!=typeof a)throw new TypeError("sideBySide() expects a boolean parameter");return d.sideBySide=a,o&&(ba(),ga()),l},l.viewMode=function(a){if(0===arguments.length)return d.viewMode;if("string"!=typeof a)throw new TypeError("viewMode() expects a string parameter");if(r.indexOf(a)===-1)throw new TypeError("viewMode() parameter must be one of ("+r.join(", ")+") value");return d.viewMode=a,k=Math.max(r.indexOf(a),p),L(),l},l.toolbarPlacement=function(a){if(0===arguments.length)return d.toolbarPlacement;if("string"!=typeof a)throw new TypeError("toolbarPlacement() expects a string parameter");if(u.indexOf(a)===-1)throw new TypeError("toolbarPlacement() parameter must be one of ("+u.join(", ")+") value");return d.toolbarPlacement=a,o&&(ba(),ga()),l},l.widgetPositioning=function(b){if(0===arguments.length)return a.extend({},d.widgetPositioning);if("[object Object]"!=={}.toString.call(b))throw new TypeError("widgetPositioning() expects an object variable");if(b.horizontal){if("string"!=typeof b.horizontal)throw new TypeError("widgetPositioning() horizontal variable must be a string");if(b.horizontal=b.horizontal.toLowerCase(),t.indexOf(b.horizontal)===-1)throw new TypeError("widgetPositioning() expects horizontal parameter to be one of ("+t.join(", ")+")");d.widgetPositioning.horizontal=b.horizontal}if(b.vertical){if("string"!=typeof b.vertical)throw new TypeError("widgetPositioning() vertical variable must be a string");if(b.vertical=b.vertical.toLowerCase(),s.indexOf(b.vertical)===-1)throw new TypeError("widgetPositioning() expects vertical parameter to be one of ("+s.join(", ")+")");d.widgetPositioning.vertical=b.vertical}return _(),l},l.calendarWeeks=function(a){if(0===arguments.length)return d.calendarWeeks;if("boolean"!=typeof a)throw new TypeError("calendarWeeks() expects parameter to be a boolean value");return d.calendarWeeks=a,_(),l},l.showTodayButton=function(a){if(0===arguments.length)return d.showTodayButton;if("boolean"!=typeof a)throw new TypeError("showTodayButton() expects a boolean parameter");return d.showTodayButton=a,o&&(ba(),ga()),l},l.showClear=function(a){if(0===arguments.length)return d.showClear;if("boolean"!=typeof a)throw new TypeError("showClear() expects a boolean parameter");return d.showClear=a,o&&(ba(),ga()),l},l.widgetParent=function(b){if(0===arguments.length)return d.widgetParent;if("string"==typeof b&&(b=a(b)),null!==b&&"string"!=typeof b&&!(b instanceof a))throw new TypeError("widgetParent() expects a string or a jQuery object parameter");return d.widgetParent=b,o&&(ba(),ga()),l},l.keepOpen=function(a){if(0===arguments.length)return d.keepOpen;if("boolean"!=typeof a)throw new TypeError("keepOpen() expects a boolean parameter");return d.keepOpen=a,l},l.focusOnShow=function(a){if(0===arguments.length)return d.focusOnShow;if("boolean"!=typeof a)throw new TypeError("focusOnShow() expects a boolean parameter");return d.focusOnShow=a,l},l.inline=function(a){if(0===arguments.length)return d.inline;if("boolean"!=typeof a)throw new TypeError("inline() expects a boolean parameter");return d.inline=a,l},l.clear=function(){return ca(),l},l.keyBinds=function(a){return 0===arguments.length?d.keyBinds:(d.keyBinds=a,l)},l.getMoment=function(a){return y(a)},l.debug=function(a){if("boolean"!=typeof a)throw new TypeError("debug() expects a boolean parameter");return d.debug=a,l},l.allowInputToggle=function(a){if(0===arguments.length)return d.allowInputToggle;if("boolean"!=typeof a)throw new TypeError("allowInputToggle() expects a boolean parameter");return d.allowInputToggle=a,l},l.showClose=function(a){if(0===arguments.length)return d.showClose;if("boolean"!=typeof a)throw new TypeError("showClose() expects a boolean parameter");return d.showClose=a,l},l.keepInvalid=function(a){if(0===arguments.length)return d.keepInvalid;if("boolean"!=typeof a)throw new TypeError("keepInvalid() expects a boolean parameter"); +return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)return d.datepickerInput;if("string"!=typeof a)throw new TypeError("datepickerInput() expects a string parameter");return d.datepickerInput=a,l},l.parseInputDate=function(a){if(0===arguments.length)return d.parseInputDate;if("function"!=typeof a)throw new TypeError("parseInputDate() sholud be as function");return d.parseInputDate=a,l},l.disabledTimeIntervals=function(b){if(0===arguments.length)return d.disabledTimeIntervals?a.extend({},d.disabledTimeIntervals):d.disabledTimeIntervals;if(!b)return d.disabledTimeIntervals=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledTimeIntervals() expects an array parameter");return d.disabledTimeIntervals=b,_(),l},l.disabledHours=function(b){if(0===arguments.length)return d.disabledHours?a.extend({},d.disabledHours):d.disabledHours;if(!b)return d.disabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledHours() expects an array parameter");if(d.disabledHours=oa(b),d.enabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.enabledHours=function(b){if(0===arguments.length)return d.enabledHours?a.extend({},d.enabledHours):d.enabledHours;if(!b)return d.enabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledHours() expects an array parameter");if(d.enabledHours=oa(b),d.disabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.viewDate=function(a){if(0===arguments.length)return f.clone();if(!a)return f=e.clone(),l;if(!("string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("viewDate() parameter must be one of [string, moment or Date]");return f=da(a),K(),l},c.is("input"))g=c;else if(g=c.find(d.datepickerInput),0===g.length)g=c.find("input");else if(!g.is("input"))throw new Error('CSS class "'+d.datepickerInput+'" cannot be applied to non input element');if(c.hasClass("input-group")&&(n=0===c.find(".datepickerbutton").length?c.find(".input-group-addon"):c.find(".datepickerbutton")),!d.inline&&!g.is("input"))throw new Error("Could not initialize DateTimePicker without an input element");return e=y(),f=e.clone(),a.extend(!0,d,H()),l.options(d),pa(),la(),g.prop("disabled")&&l.disable(),g.is("input")&&0!==g.val().trim().length?aa(da(g.val().trim())):d.defaultDate&&void 0===g.attr("placeholder")&&aa(d.defaultDate),d.inline&&ga(),l};return a.fn.datetimepicker=function(b){b=b||{};var d,e=Array.prototype.slice.call(arguments,1),f=!0,g=["destroy","hide","show","toggle"];if("object"==typeof b)return this.each(function(){var d,e=a(this);e.data("DateTimePicker")||(d=a.extend(!0,{},a.fn.datetimepicker.defaults,b),e.data("DateTimePicker",c(e,d)))});if("string"==typeof b)return this.each(function(){var c=a(this),g=c.data("DateTimePicker");if(!g)throw new Error('bootstrap-datetimepicker("'+b+'") method was called on an element that is not using DateTimePicker');d=g[b].apply(g,e),f=d===g}),f||a.inArray(b,g)>-1?this:d;throw new TypeError("Invalid arguments for DateTimePicker: "+b)},a.fn.datetimepicker.defaults={timeZone:"",format:!1,dayViewHeaderFormat:"MMMM YYYY",extraFormats:!1,stepping:1,minDate:!1,maxDate:!1,useCurrent:!0,collapse:!0,locale:b.locale(),defaultDate:!1,disabledDates:!1,enabledDates:!1,icons:{time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down",previous:"glyphicon glyphicon-chevron-left",next:"glyphicon glyphicon-chevron-right",today:"glyphicon glyphicon-screenshot",clear:"glyphicon glyphicon-trash",close:"glyphicon glyphicon-remove"},tooltips:{today:"Go to today",clear:"Clear selection",close:"Close the picker",selectMonth:"Select Month",prevMonth:"Previous Month",nextMonth:"Next Month",selectYear:"Select Year",prevYear:"Previous Year",nextYear:"Next Year",selectDecade:"Select Decade",prevDecade:"Previous Decade",nextDecade:"Next Decade",prevCentury:"Previous Century",nextCentury:"Next Century",pickHour:"Pick Hour",incrementHour:"Increment Hour",decrementHour:"Decrement Hour",pickMinute:"Pick Minute",incrementMinute:"Increment Minute",decrementMinute:"Decrement Minute",pickSecond:"Pick Second",incrementSecond:"Increment Second",decrementSecond:"Decrement Second",togglePeriod:"Toggle Period",selectTime:"Select Time"},useStrict:!1,sideBySide:!1,daysOfWeekDisabled:!1,calendarWeeks:!1,viewMode:"days",toolbarPlacement:"default",showTodayButton:!1,showClear:!1,showClose:!1,widgetPositioning:{horizontal:"auto",vertical:"auto"},widgetParent:null,ignoreReadonly:!1,keepOpen:!1,focusOnShow:!0,inline:!1,keepInvalid:!1,datepickerInput:".datepickerinput",keyBinds:{up:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(7,"d")):this.date(b.clone().add(this.stepping(),"m"))}},down:function(a){if(!a)return void this.show();var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(7,"d")):this.date(b.clone().subtract(this.stepping(),"m"))},"control up":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(1,"y")):this.date(b.clone().add(1,"h"))}},"control down":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(1,"y")):this.date(b.clone().subtract(1,"h"))}},left:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"d"))}},right:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"d"))}},pageUp:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"M"))}},pageDown:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"M"))}},enter:function(){this.hide()},escape:function(){this.hide()},"control space":function(a){a&&a.find(".timepicker").is(":visible")&&a.find('.btn[data-action="togglePeriod"]').click()},t:function(){this.date(this.getMoment())},delete:function(){this.clear()}},debug:!1,allowInputToggle:!1,disabledTimeIntervals:!1,disabledHours:!1,enabledHours:!1,viewDate:!1},a.fn.datetimepicker}); \ No newline at end of file diff --git a/src/main/resources/static/js/bootstrap-datetimepicker/ko.js b/src/main/resources/static/js/bootstrap-datetimepicker/ko.js new file mode 100644 index 0000000..5e79493 --- /dev/null +++ b/src/main/resources/static/js/bootstrap-datetimepicker/ko.js @@ -0,0 +1,69 @@ +//! moment.js locale configuration +//! locale : Korean [ko] +//! author : Kyungwook, Park : https://github.com/kyungw00k +//! author : Jeeeyul Lee + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var ko = moment.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd A h:mm' + }, + calendar : { + sameDay : '오늘 LT', + nextDay : '내일 LT', + nextWeek : 'dddd LT', + lastDay : '어제 LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s 후', + past : '%s 전', + s : '몇 초', + ss : '%d초', + m : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' + }, + dayOfMonthOrdinalParse : /\d{1,2}일/, + ordinal : '%d일', + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + } +}); + +return ko; + +}))); diff --git a/src/main/resources/static/js/bootstrap-datetimepicker/moment-with-locales.min.js b/src/main/resources/static/js/bootstrap-datetimepicker/moment-with-locales.min.js new file mode 100644 index 0000000..305b3ca --- /dev/null +++ b/src/main/resources/static/js/bootstrap-datetimepicker/moment-with-locales.min.js @@ -0,0 +1,2 @@ +!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):e.moment=a()}(this,function(){"use strict";var e,n;function M(){return e.apply(null,arguments)}function i(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function _(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function h(e,a){return Object.prototype.hasOwnProperty.call(e,a)}function o(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var a in e)if(h(e,a))return;return 1}function r(e){return void 0===e}function m(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function u(e,a){for(var t=[],s=0;s>>0,s=0;sFe(e)?(r=e+1,d-Fe(e)):(r=e,d);return{year:r,dayOfYear:i}}function Ce(e,a,t){var s,n,r=Je(e.year(),a,t),d=Math.floor((e.dayOfYear()-r-1)/7)+1;return d<1?s=d+Ie(n=e.year()-1,a,t):d>Ie(e.year(),a,t)?(s=d-Ie(e.year(),a,t),n=e.year()+1):(n=e.year(),s=d),{week:s,year:n}}function Ie(e,a,t){var s=Je(e,a,t),n=Je(e+1,a,t);return(Fe(e)-s+n)/7}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),z("week","w"),z("isoWeek","W"),C("week",5),C("isoWeek",5),le("w",ae),le("ww",ae,$),le("W",ae),le("WW",ae,$),Ye(["w","ww","W","WW"],function(e,a,t,s){a[s.substr(0,1)]=G(e)});function Ue(e,a){return e.slice(a,7).concat(e.slice(0,a))}W("d",0,"do","day"),W("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),W("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),W("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),z("day","d"),z("weekday","e"),z("isoWeekday","E"),C("day",11),C("weekday",11),C("isoWeekday",11),le("d",ae),le("e",ae),le("E",ae),le("dd",function(e,a){return a.weekdaysMinRegex(e)}),le("ddd",function(e,a){return a.weekdaysShortRegex(e)}),le("dddd",function(e,a){return a.weekdaysRegex(e)}),Ye(["dd","ddd","dddd"],function(e,a,t,s){var n=t._locale.weekdaysParse(e,s,t._strict);null!=n?a.d=n:L(t).invalidWeekday=e}),Ye(["d","e","E"],function(e,a,t,s){a[s]=G(e)});var Ge="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Ve="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Be="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ke=ue,qe=ue,Ze=ue;function $e(){function e(e,a){return a.length-e.length}for(var a,t,s,n,r=[],d=[],i=[],_=[],o=0;o<7;o++)a=c([2e3,1]).day(o),t=he(this.weekdaysMin(a,"")),s=he(this.weekdaysShort(a,"")),n=he(this.weekdays(a,"")),r.push(t),d.push(s),i.push(n),_.push(t),_.push(s),_.push(n);r.sort(e),d.sort(e),i.sort(e),_.sort(e),this._weekdaysRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,a){W(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),a)})}function ea(e,a){return a._meridiemParse}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,Qe),W("k",["kk",2],0,function(){return this.hours()||24}),W("hmm",0,0,function(){return""+Qe.apply(this)+H(this.minutes(),2)}),W("hmmss",0,0,function(){return""+Qe.apply(this)+H(this.minutes(),2)+H(this.seconds(),2)}),W("Hmm",0,0,function(){return""+this.hours()+H(this.minutes(),2)}),W("Hmmss",0,0,function(){return""+this.hours()+H(this.minutes(),2)+H(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),z("hour","h"),C("hour",13),le("a",ea),le("A",ea),le("H",ae),le("h",ae),le("k",ae),le("HH",ae,$),le("hh",ae,$),le("kk",ae,$),le("hmm",te),le("hmmss",se),le("Hmm",te),le("Hmmss",se),Le(["H","HH"],De),Le(["k","kk"],function(e,a,t){var s=G(e);a[De]=24===s?0:s}),Le(["a","A"],function(e,a,t){t._isPm=t._locale.isPM(e),t._meridiem=e}),Le(["h","hh"],function(e,a,t){a[De]=G(e),L(t).bigHour=!0}),Le("hmm",function(e,a,t){var s=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s)),L(t).bigHour=!0}),Le("hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s,2)),a[ge]=G(e.substr(n)),L(t).bigHour=!0}),Le("Hmm",function(e,a,t){var s=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s))}),Le("Hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[De]=G(e.substr(0,s)),a[Te]=G(e.substr(s,2)),a[ge]=G(e.substr(n))});var aa=V("Hours",!0);var ta,sa={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:je,week:{dow:0,doy:6},weekdays:Ge,weekdaysMin:Be,weekdaysShort:Ve,meridiemParse:/[ap]\.?m?\.?/i},na={},ra={};function da(e){return e?e.toLowerCase().replace("_","-"):e}function ia(e){for(var a,t,s,n,r=0;r=a&&function(e,a){for(var t=Math.min(e.length,a.length),s=0;s=a-1)break;a--}r++}return ta}function _a(a){var e;if(void 0===na[a]&&"undefined"!=typeof module&&module&&module.exports)try{e=ta._abbr,require("./locale/"+a),oa(e)}catch(e){na[a]=null}return na[a]}function oa(e,a){var t;return e&&((t=r(a)?ua(e):ma(e,a))?ta=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),ta._abbr}function ma(e,a){if(null===a)return delete na[e],null;var t,s=sa;if(a.abbr=e,null!=na[e])w("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=na[e]._config;else if(null!=a.parentLocale)if(null!=na[a.parentLocale])s=na[a.parentLocale]._config;else{if(null==(t=_a(a.parentLocale)))return ra[a.parentLocale]||(ra[a.parentLocale]=[]),ra[a.parentLocale].push({name:e,config:a}),null;s=t._config}return na[e]=new S(b(s,a)),ra[e]&&ra[e].forEach(function(e){ma(e.name,e.config)}),oa(e),na[e]}function ua(e){var a;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return ta;if(!i(e)){if(a=_a(e))return a;e=[e]}return ia(e)}function la(e){var a,t=e._a;return t&&-2===L(e).overflow&&(a=t[pe]<0||11Se(t[fe],t[pe])?ke:t[De]<0||24Ie(t,r,d)?L(e)._overflowWeeks=!0:null!=_?L(e)._overflowWeekday=!0:(i=Re(t,s,n,r,d),e._a[fe]=i.year,e._dayOfYear=i.dayOfYear)}(e),null!=e._dayOfYear&&(r=ga(e._a[fe],s[fe]),(e._dayOfYear>Fe(r)||0===e._dayOfYear)&&(L(e)._overflowDayOfYear=!0),t=Ne(r,0,e._dayOfYear),e._a[pe]=t.getUTCMonth(),e._a[ke]=t.getUTCDate()),a=0;a<3&&null==e._a[a];++a)e._a[a]=_[a]=s[a];for(;a<7;a++)e._a[a]=_[a]=null==e._a[a]?2===a?1:0:e._a[a];24===e._a[De]&&0===e._a[Te]&&0===e._a[ge]&&0===e._a[we]&&(e._nextDay=!0,e._a[De]=0),e._d=(e._useUTC?Ne:function(e,a,t,s,n,r,d){var i;return e<100&&0<=e?(i=new Date(e+400,a,t,s,n,r,d),isFinite(i.getFullYear())&&i.setFullYear(e)):i=new Date(e,a,t,s,n,r,d),i}).apply(null,_),n=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[De]=24),e._w&&void 0!==e._w.d&&e._w.d!==n&&(L(e).weekdayMismatch=!0)}}function va(e){if(e._f!==M.ISO_8601)if(e._f!==M.RFC_2822){e._a=[],L(e).empty=!0;for(var a,t,s,n,r,d,i,_=""+e._i,o=_.length,m=0,u=E(e._f,e._locale).match(j)||[],l=0;lt.valueOf():t.valueOf()"}),yt.toJSON=function(){return this.isValid()?this.toISOString():null},yt.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},yt.unix=function(){return Math.floor(this.valueOf()/1e3)},yt.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},yt.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},yt.eraName=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;tthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},yt.isLocal=function(){return!!this.isValid()&&!this._isUTC},yt.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},yt.isUtc=Ca,yt.isUTC=Ca,yt.zoneAbbr=function(){return this._isUTC?"UTC":""},yt.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},yt.dates=t("dates accessor is deprecated. Use date instead.",lt),yt.months=t("months accessor is deprecated. Use month instead",Ae),yt.years=t("years accessor is deprecated. Use year instead",ze),yt.zone=t("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,a){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,a),this):-this.utcOffset()}),yt.isDSTShifted=t("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!r(this._isDSTShifted))return this._isDSTShifted;var e,a={};return p(a,this),(a=ba(a))._a?(e=(a._isUTC?c:Ha)(a._a),this._isDSTShifted=this.isValid()&&0= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
").addClass("cw").text("#"));c.isBefore(f.clone().endOf("w"));)b.append(a("").addClass("dow").text(c.format("dd"))),c.add(1,"d");o.find(".datepicker-days thead").append(b)},N=function(a){return d.disabledDates[a.format("YYYY-MM-DD")]===!0},O=function(a){return d.enabledDates[a.format("YYYY-MM-DD")]===!0},P=function(a){return d.disabledHours[a.format("H")]===!0},Q=function(a){return d.enabledHours[a.format("H")]===!0},R=function(b,c){if(!b.isValid())return!1;if(d.disabledDates&&"d"===c&&N(b))return!1;if(d.enabledDates&&"d"===c&&!O(b))return!1;if(d.minDate&&b.isBefore(d.minDate,c))return!1;if(d.maxDate&&b.isAfter(d.maxDate,c))return!1;if(d.daysOfWeekDisabled&&"d"===c&&d.daysOfWeekDisabled.indexOf(b.day())!==-1)return!1;if(d.disabledHours&&("h"===c||"m"===c||"s"===c)&&P(b))return!1;if(d.enabledHours&&("h"===c||"m"===c||"s"===c)&&!Q(b))return!1;if(d.disabledTimeIntervals&&("h"===c||"m"===c||"s"===c)){var e=!1;if(a.each(d.disabledTimeIntervals,function(){if(b.isBetween(this[0],this[1]))return e=!0,!1}),e)return!1}return!0},S=function(){for(var b=[],c=f.clone().startOf("y").startOf("d");c.isSame(f,"y");)b.push(a("").attr("data-action","selectMonth").addClass("month").text(c.format("MMM"))),c.add(1,"M");o.find(".datepicker-months td").empty().append(b)},T=function(){var b=o.find(".datepicker-months"),c=b.find("th"),g=b.find("tbody").find("span");c.eq(0).find("span").attr("title",d.tooltips.prevYear),c.eq(1).attr("title",d.tooltips.selectYear),c.eq(2).find("span").attr("title",d.tooltips.nextYear),b.find(".disabled").removeClass("disabled"),R(f.clone().subtract(1,"y"),"y")||c.eq(0).addClass("disabled"),c.eq(1).text(f.year()),R(f.clone().add(1,"y"),"y")||c.eq(2).addClass("disabled"),g.removeClass("active"),e.isSame(f,"y")&&!m&&g.eq(e.month()).addClass("active"),g.each(function(b){R(f.clone().month(b),"M")||a(this).addClass("disabled")})},U=function(){var a=o.find(".datepicker-years"),b=a.find("th"),c=f.clone().subtract(5,"y"),g=f.clone().add(6,"y"),h="";for(b.eq(0).find("span").attr("title",d.tooltips.prevDecade),b.eq(1).attr("title",d.tooltips.selectDecade),b.eq(2).find("span").attr("title",d.tooltips.nextDecade),a.find(".disabled").removeClass("disabled"),d.minDate&&d.minDate.isAfter(c,"y")&&b.eq(0).addClass("disabled"),b.eq(1).text(c.year()+"-"+g.year()),d.maxDate&&d.maxDate.isBefore(g,"y")&&b.eq(2).addClass("disabled");!c.isAfter(g,"y");)h+=''+c.year()+"",c.add(1,"y");a.find("td").html(h)},V=function(){var a,c=o.find(".datepicker-decades"),g=c.find("th"),h=b({y:f.year()-f.year()%100-1}),i=h.clone().add(100,"y"),j=h.clone(),k=!1,l=!1,m="";for(g.eq(0).find("span").attr("title",d.tooltips.prevCentury),g.eq(2).find("span").attr("title",d.tooltips.nextCentury),c.find(".disabled").removeClass("disabled"),(h.isSame(b({y:1900}))||d.minDate&&d.minDate.isAfter(h,"y"))&&g.eq(0).addClass("disabled"),g.eq(1).text(h.year()+"-"+i.year()),(h.isSame(b({y:2e3}))||d.maxDate&&d.maxDate.isBefore(i,"y"))&&g.eq(2).addClass("disabled");!h.isAfter(i,"y");)a=h.year()+12,k=d.minDate&&d.minDate.isAfter(h,"y")&&d.minDate.year()<=a,l=d.maxDate&&d.maxDate.isAfter(h,"y")&&d.maxDate.year()<=a,m+=''+(h.year()+1)+" - "+(h.year()+12)+"",h.add(12,"y");m+="",c.find("td").html(m),g.eq(1).text(j.year()+1+"-"+h.year())},W=function(){var b,c,g,h=o.find(".datepicker-days"),i=h.find("th"),j=[],k=[];if(B()){for(i.eq(0).find("span").attr("title",d.tooltips.prevMonth),i.eq(1).attr("title",d.tooltips.selectMonth),i.eq(2).find("span").attr("title",d.tooltips.nextMonth),h.find(".disabled").removeClass("disabled"),i.eq(1).text(f.format(d.dayViewHeaderFormat)),R(f.clone().subtract(1,"M"),"M")||i.eq(0).addClass("disabled"),R(f.clone().add(1,"M"),"M")||i.eq(2).addClass("disabled"),b=f.clone().startOf("M").startOf("w").startOf("d"),g=0;g<42;g++)0===b.weekday()&&(c=a("
'+b.week()+"'+b.date()+"
'+c.format(h?"HH":"hh")+"
'+c.format("mm")+"
'+c.format("ss")+"
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = /
, *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "