Browse Source

Init

master
장선근 7 years ago
parent
commit
508f5c2e38
  1. 1
      .gitignore
  2. 40
      README.md
  3. 2
      dist/assets/css/style.min.css
  4. 1
      dist/assets/css/style.min.css.map
  5. BIN
      dist/assets/fonts/fa-brands-400.eot
  6. 3570
      dist/assets/fonts/fa-brands-400.svg
  7. BIN
      dist/assets/fonts/fa-brands-400.ttf
  8. BIN
      dist/assets/fonts/fa-brands-400.woff
  9. BIN
      dist/assets/fonts/fa-brands-400.woff2
  10. BIN
      dist/assets/fonts/fa-duotone-900.eot
  11. 15055
      dist/assets/fonts/fa-duotone-900.svg
  12. BIN
      dist/assets/fonts/fa-duotone-900.ttf
  13. BIN
      dist/assets/fonts/fa-duotone-900.woff
  14. BIN
      dist/assets/fonts/fa-duotone-900.woff2
  15. BIN
      dist/assets/fonts/fa-light-300.eot
  16. 12330
      dist/assets/fonts/fa-light-300.svg
  17. BIN
      dist/assets/fonts/fa-light-300.ttf
  18. BIN
      dist/assets/fonts/fa-light-300.woff
  19. BIN
      dist/assets/fonts/fa-light-300.woff2
  20. BIN
      dist/assets/fonts/fa-regular-400.eot
  21. 11256
      dist/assets/fonts/fa-regular-400.svg
  22. BIN
      dist/assets/fonts/fa-regular-400.ttf
  23. BIN
      dist/assets/fonts/fa-regular-400.woff
  24. BIN
      dist/assets/fonts/fa-regular-400.woff2
  25. BIN
      dist/assets/fonts/fa-solid-900.eot
  26. 9588
      dist/assets/fonts/fa-solid-900.svg
  27. BIN
      dist/assets/fonts/fa-solid-900.ttf
  28. BIN
      dist/assets/fonts/fa-solid-900.woff
  29. BIN
      dist/assets/fonts/fa-solid-900.woff2
  30. 2
      dist/assets/js/common.min.js
  31. 1
      dist/assets/js/common.min.js.map
  32. 34
      dist/index.html
  33. 113
      gulpfile.js
  34. 28
      package.json
  35. 29
      source.info.json
  36. 6
      src/html/include/footer.html
  37. 13
      src/html/include/header.html
  38. 12
      src/html/include/meta.html
  39. 2
      src/html/include/tail.html
  40. 5
      src/html/index.html
  41. 25
      src/icons/iconsTemplates.scss.handlebars
  42. 0
      src/js/common.js
  43. 862
      src/js/wheeparam.js
  44. 29
      src/scss/_variables.scss
  45. 3
      src/scss/boot/_fonts.scss
  46. 37
      src/scss/boot/_function.scss
  47. 125
      src/scss/boot/_mixins.scss
  48. 330
      src/scss/boot/_reset.scss
  49. 3
      src/scss/common/_animation.scss
  50. 3
      src/scss/common/_layout.scss
  51. 108
      src/scss/common/_utility.scss
  52. 3
      src/scss/components/_button.scss
  53. 3
      src/scss/components/_icons.scss
  54. 3
      src/scss/pages/main.scss
  55. 20
      src/scss/plugins/FontAwesome-5.13.0/_animated.scss
  56. 20
      src/scss/plugins/FontAwesome-5.13.0/_bordered-pulled.scss
  57. 21
      src/scss/plugins/FontAwesome-5.13.0/_core.scss
  58. 6
      src/scss/plugins/FontAwesome-5.13.0/_fixed-width.scss
  59. 2296
      src/scss/plugins/FontAwesome-5.13.0/_icons.scss
  60. 23
      src/scss/plugins/FontAwesome-5.13.0/_larger.scss
  61. 18
      src/scss/plugins/FontAwesome-5.13.0/_list.scss
  62. 56
      src/scss/plugins/FontAwesome-5.13.0/_mixins.scss
  63. 24
      src/scss/plugins/FontAwesome-5.13.0/_rotated-flipped.scss
  64. 5
      src/scss/plugins/FontAwesome-5.13.0/_screen-reader.scss
  65. 2066
      src/scss/plugins/FontAwesome-5.13.0/_shims.scss
  66. 31
      src/scss/plugins/FontAwesome-5.13.0/_stacked.scss
  67. 2313
      src/scss/plugins/FontAwesome-5.13.0/_variables.scss
  68. 23
      src/scss/plugins/FontAwesome-5.13.0/brands.scss
  69. 1916
      src/scss/plugins/FontAwesome-5.13.0/duotone.scss
  70. 16
      src/scss/plugins/FontAwesome-5.13.0/fontawesome.scss
  71. 23
      src/scss/plugins/FontAwesome-5.13.0/light.scss
  72. 23
      src/scss/plugins/FontAwesome-5.13.0/regular.scss
  73. 24
      src/scss/plugins/FontAwesome-5.13.0/solid.scss
  74. 6
      src/scss/plugins/FontAwesome-5.13.0/v4-shims.scss
  75. 3
      src/scss/plugins/_custom.scss
  76. 28
      src/scss/style.scss
  77. 3873
      yarn.lock

1
.gitignore

@ -46,3 +46,4 @@ com_crashlytics_export_strings.xml
crashlytics.properties crashlytics.properties
crashlytics-build.properties crashlytics-build.properties
node_modules/

40
README.md

@ -1,3 +1,41 @@
# publisingTemplate # publisingTemplate
퍼블리싱용 기본 템플릿
### 초기 세팅
초기 세팅시 npm 또는 yarn 을 이용한 의존패키지 설치가 필요합니다.
다음의 명령어를 입력하여 의존패키지를 먼저 설치해 주세요.
<code>npm install</code>
또는
<code>yarn install</code>
※ 가급적 yarn 을 사용하길 권장합니다.
### 폴더 구조
```
+-- dist # 배포용 폴더
+-- src # 소스 폴더
| +-- html # HTML 소스 폴더
| | +-- include # HTML 소스에 Include 해서 사용할 파일들을 넣어놓는 폴더
| +-- js # Javascript 소스 폴더
| +-- scss # Sass 소스 폴더
| +-- icons # Sprite 소스 폴더
+-- .gitignore
+-- gulpfile.js
+-- package.json
+-- README.md
+-- source.info.json # Gulp 사용시 소스디렉토리 설정 파일
```
- 패킹이 완료된 파일은 배포용폴더 /dist 에 자동으로 파일이 생성됩니다.
- source.info.json 파일에서 패킹할 파일을 정의하거나 디렉토리를 지정할 수 있습니다.
- src/html/include 에 들어있는 파일은 HTML 패킹시 파일을 생성하지 않습니다.
### GULP 명령어
```
gulp # 전체 패키징을 처리합니다.
gulp html # HTML 파일 패킹을 처리합니다.
gulp scss:compile # sass 패킹을 처리합니다.
gulp js:compile # javascript 패킹을 처리합니다.
gulp sprite # Sprite 패킹을 처리합니다.
gulp watch # 파일변경을 감지하여 자동으로 패킹을 처리합니다. (추천)
```
### 포함된 플러그인
FontAwesome Pro 5.13.0 (http://fontawesome.io)

2
dist/assets/css/style.min.css
File diff suppressed because it is too large
View File

1
dist/assets/css/style.min.css.map
File diff suppressed because it is too large
View File

BIN
dist/assets/fonts/fa-brands-400.eot

3570
dist/assets/fonts/fa-brands-400.svg
File diff suppressed because it is too large
View File

BIN
dist/assets/fonts/fa-brands-400.ttf

BIN
dist/assets/fonts/fa-brands-400.woff

BIN
dist/assets/fonts/fa-brands-400.woff2

BIN
dist/assets/fonts/fa-duotone-900.eot

15055
dist/assets/fonts/fa-duotone-900.svg
File diff suppressed because it is too large
View File

BIN
dist/assets/fonts/fa-duotone-900.ttf

BIN
dist/assets/fonts/fa-duotone-900.woff

BIN
dist/assets/fonts/fa-duotone-900.woff2

BIN
dist/assets/fonts/fa-light-300.eot

12330
dist/assets/fonts/fa-light-300.svg
File diff suppressed because it is too large
View File

BIN
dist/assets/fonts/fa-light-300.ttf

BIN
dist/assets/fonts/fa-light-300.woff

BIN
dist/assets/fonts/fa-light-300.woff2

BIN
dist/assets/fonts/fa-regular-400.eot

11256
dist/assets/fonts/fa-regular-400.svg
File diff suppressed because it is too large
View File

BIN
dist/assets/fonts/fa-regular-400.ttf

BIN
dist/assets/fonts/fa-regular-400.woff

BIN
dist/assets/fonts/fa-regular-400.woff2

BIN
dist/assets/fonts/fa-solid-900.eot

9588
dist/assets/fonts/fa-solid-900.svg
File diff suppressed because it is too large
View File

BIN
dist/assets/fonts/fa-solid-900.ttf

BIN
dist/assets/fonts/fa-solid-900.woff

BIN
dist/assets/fonts/fa-solid-900.woff2

2
dist/assets/js/common.min.js
File diff suppressed because it is too large
View File

1
dist/assets/js/common.min.js.map
File diff suppressed because it is too large
View File

34
dist/index.html

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<title>메인 페이지</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/earlyaccess/notosanskr.css">
<link rel="stylesheet" href="./assets/css/style.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="./assets/js/common.min.js"></script>
</head>
<body>
<!--S: 숨김 메뉴-->
<ul class="sr-only sr-only-focusable">
<li><a href="#contents">컨텐츠 바로가기</a></li>
<li><a href="#nav">메뉴 바로가기</a></li>
</ul>
<!--E: 숨김 메뉴-->
<!--S: 헤더 영역-->
<!--E: 헤더 영역-->
<!--S: 컨텐츠 영역-->
<section id="contents">
</section>
<!--E: 컨텐츠 영역-->
<!--S: 푸터 영역-->
<!--E: 푸터 영역-->
</body>
</html>

113
gulpfile.js

@ -0,0 +1,113 @@
let fs = require('fs'),
gulp = require('gulp'),
concat = require('gulp-concat'),
cleanCSS = require('gulp-clean-css'),
sass = require('gulp-sass'),
minify = require('gulp-minify'),
size = require('gulp-size'),
cached = require('gulp-cached'),
fileInclude = require('gulp-file-include'),
sourcemaps = require('gulp-sourcemaps'),
spritesmith = require('gulp.spritesmith');
let packageFile = JSON.parse(fs.readFileSync('source.info.json'));
let source = packageFile.source;
let destPath = packageFile.destPath;
let watchPath = packageFile.watch;
function reloadSourceData()
{
packageFile = JSON.parse(fs.readFileSync('source.info.json'));
source = packageFile.source;
destPath = packageFile.destPath;
watchPath = packageFile.watch;
}
/**********************************************************************************************************
* TASKS
***********************************************************************************************************/
gulp.task('html', function(){
reloadSourceData();
let dest = destPath.root + "/";
return gulp.src(source.html)
.pipe(fileInclude({
prefix : '@@',
context : {
ROOT : '.'
}
}))
.pipe(cached('include'))
.pipe(size({ gzip:true, showFiles:true }))
.pipe(gulp.dest(dest));
});
gulp.task('scss:compile', function () {
reloadSourceData();
let dest = destPath.root + "/" + destPath.assets + "/" + destPath.css;
let fileName = "style.min.css";
return gulp.src( source.css )
.pipe(sourcemaps.init())
.pipe( sass({outputStyle: 'compact'}).on('error', sass.logError))
.pipe( concat(fileName)) //병합하고
.pipe(cleanCSS().on('error', function(e){console.log(e);}))
.pipe(size({ gzip: true, showFiles: true }))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(dest));
});
gulp.task('js:combine', function(){
reloadSourceData();
let dest = destPath.root + "/" + destPath.assets + "/" + destPath.js;
let fileName = "common.js";
return gulp.src( source.js )
.pipe(sourcemaps.init())
.pipe(concat(fileName))
.pipe(minify({ext: {min : '.min.js'},noSource:true}))
.pipe(size({ gzip: true, showFiles: true }))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(dest));
});
gulp.task('sprite', function () {
reloadSourceData();
var spriteData = null;
let dest = destPath.root + "/" + destPath.assets + "/icons";
var packages = fs.readdirSync(source.icons);
for(var i in packages) {
spriteData = gulp.src('src/icons/'+packages[i]+'/*.png').pipe(spritesmith({
imgName: packages[i] + '.png',
cssName: packages[i] +'.css',
padding:2,
cssTemplate: 'src/icons/iconsTemplates.scss.handlebars',
cssHandlebarsHelpers : {'packageName' : packages[i]},
imgPath : '../icons/' + packages[i] + '.png',
algorithm:'left-right',
algorithmOpts:false
}));
spriteData.img.pipe(gulp.dest(dest));
spriteData.css.pipe(gulp.dest("src/icons/"));
}
return true;
});
gulp.task('watch', function(){
gulp.watch(watchPath.html, gulp.series(['html']));
gulp.watch(watchPath.js, gulp.series(['js:combine']));
gulp.watch(watchPath.css, gulp.series(['scss:compile']));
});
gulp.task('default', gulp.series(['html', 'js:combine', 'scss:compile']));

28
package.json

@ -0,0 +1,28 @@
{
"name": "wheeparam",
"version": "1.0.0",
"description": "퍼블리싱용 기본 템플릿",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "http://git.wheeparam.com/wheeparam/publisingTemplate.git"
},
"author": "",
"license": "ISC",
"devDependencies": {
"gulp": "^4.0.2",
"gulp-cached": "^1.1.1",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-file-include": "^2.2.2",
"gulp-minify": "^3.1.0",
"gulp-sass": "^4.1.0",
"gulp-size": "^3.0.0",
"gulp-sourcemaps": "^2.6.5",
"gulp.spritesmith": "^6.11.0"
},
"dependencies": {}
}

29
source.info.json

@ -0,0 +1,29 @@
{
"destPath" : {
"root" : "dist",
"assets" : "assets",
"css" : "css",
"js" : "js"
},
"source" : {
"html" : [
"src/html/*.html",
"src/html/**/*.html",
"src/html/**/**/*.html",
"!src/html/include/**"
],
"css" : [
"src/scss/style.scss"
],
"js" : [
"src/js/wheeparam.js",
"src/js/common.js"
],
"icons": "src/icons"
},
"watch" : {
"html" : ["src/html/*.html", "src/html/**/*.html","!src/html/include/*.html","src/html/**/**/*.html"],
"css" : ["src/scss/*.scss","src/scss/**/*.scss"],
"js" : [ "src/js/*.js","src/js/**/*.js"]
}
}

6
src/html/include/footer.html

@ -0,0 +1,6 @@
</section>
<!--E: 컨텐츠 영역-->
<!--S: 푸터 영역-->
<!--E: 푸터 영역-->

13
src/html/include/header.html

@ -0,0 +1,13 @@
<!--S: 숨김 메뉴-->
<ul class="sr-only sr-only-focusable">
<li><a href="#contents">컨텐츠 바로가기</a></li>
<li><a href="#nav">메뉴 바로가기</a></li>
</ul>
<!--E: 숨김 메뉴-->
<!--S: 헤더 영역-->
<!--E: 헤더 영역-->
<!--S: 컨텐츠 영역-->
<section id="contents">

12
src/html/include/meta.html

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<title>@@pageTitle</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/earlyaccess/notosanskr.css">
<link rel="stylesheet" href="@@ROOT/assets/css/style.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="@@ROOT/assets/js/common.min.js"></script>
</head>
<body>

2
src/html/include/tail.html

@ -0,0 +1,2 @@
</body>
</html>

5
src/html/index.html

@ -0,0 +1,5 @@
@@include("./include/meta.html", {"pageTitle" : "메인 페이지"})
@@include("./include/header.html")
@@include("./include/footer.html")
@@include("./include/tail.html")

25
src/icons/iconsTemplates.scss.handlebars

@ -0,0 +1,25 @@
[class^={{packageName}}-] {
display:inline-block;
vertical-align:middle;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
background-image: url('{{{spritesheet.escaped_image}}}');
{{#spritesheet}}
$total_width: {{width}};
$total_height: {{height}};
{{/spritesheet}}
{{#block "sprites"}}
{{#each sprites}}
&.{{packageName}}-{{name}} {
background-size: (($total_width / {{width}}) * 100%) (($total_height / {{height}}) * 100%);
background-position: (({{offset_x}} / ($total_width - {{width}})) * -100%) (({{offset_y}} / ($total_height - {{height}})) * -100%);
width: {{px.width}};
height: {{px.height}};
}
{{/each}}
{{/block}}
}

0
src/js/common.js

862
src/js/wheeparam.js

@ -0,0 +1,862 @@
var Wheeparam = {
version: '0.0.1'
};
Wheeparam.init = function() {};
Wheeparam.onDocuemntReady = function(fn) {
if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading"){
fn();
} else {
document.addEventListener('DOMContentLoaded', fn);
}
};
Wheeparam.Easing = {
easeInQuad: function (t, b, c, d) {
return c*(t/=d)*t + b;
},
easeOutQuad: function (t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
},
easeInOutQuad: function (t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2) - 1) + b;
},
easeInCubic: function (t, b, c, d) {
return c*(t/=d)*t*t + b;
},
easeOutCubic: function (t, b, c, d) {
return c*((t=t/d-1)*t*t + 1) + b;
},
easeInOutCubic: function (t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t + b;
return c/2*((t-=2)*t*t + 2) + b;
},
easeInQuart: function (t, b, c, d) {
return c*(t/=d)*t*t*t + b;
},
easeOutQuart: function (t, b, c, d) {
return -c * ((t=t/d-1)*t*t*t - 1) + b;
},
easeInOutQuart: function (t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
return -c/2 * ((t-=2)*t*t*t - 2) + b;
},
easeInQuint: function (t, b, c, d) {
return c*(t/=d)*t*t*t*t + b;
},
easeOutQuint: function (t, b, c, d) {
return c*((t=t/d-1)*t*t*t*t + 1) + b;
},
easeInOutQuint: function (t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
return c/2*((t-=2)*t*t*t*t + 2) + b;
},
easeInSine: function (t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
},
easeOutSine: function (t, b, c, d) {
return c * Math.sin(t/d * (Math.PI/2)) + b;
},
easeInOutSine: function (t, b, c, d) {
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
},
easeInExpo: function (t, b, c, d) {
return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
},
easeOutExpo: function (t, b, c, d) {
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
},
easeInOutExpo: function (t, b, c, d) {
if (t==0) return b;
if (t==d) return b+c;
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
},
easeInCirc: function (t, b, c, d) {
return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
},
easeOutCirc: function (t, b, c, d) {
return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
},
easeInOutCirc: function (t, b, c, d) {
if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
},
easeInElastic: function (t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
},
easeOutElastic: function (t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
},
easeInOutElastic: function (t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
},
easeInBack: function (t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*(t/=d)*t*((s+1)*t - s) + b;
},
easeOutBack: function (t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
},
easeInOutBack: function (t, b, c, d, s) {
if (s == undefined) s = 1.70158;
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
},
easeInBounce: function (t, b, c, d) {
return c - Wheeparam.Easing.easeOutBounce (d-t, 0, c, d) + b;
},
easeOutBounce: function (t, b, c, d) {
if ((t/=d) < (1/2.75)) {
return c*(7.5625*t*t) + b;
} else if (t < (2/2.75)) {
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
} else if (t < (2.5/2.75)) {
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
} else {
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
}
},
easeInOutBounce: function (t, b, c, d) {
if (t < d/2) return Wheeparam.Easing.easeInBounce (t*2, 0, c, d) * .5 + b;
return Wheeparam.Easing.easeOutBounce (t*2-d, 0, c, d) * .5 + c*.5 + b;
}
};
/*!
autosize 4.0.2
license: MIT
http://www.jacklmoore.com/autosize
*/
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['module', 'exports'], factory);
} else if (typeof exports !== "undefined") {
factory(module, exports);
} else {
var mod = {
exports: {}
};
factory(mod, mod.exports);
global.autosize = mod.exports;
}
})(this, function (module, exports) {
'use strict';
var map = typeof Map === "function" ? new Map() : function () {
var keys = [];
var values = [];
return {
has: function has(key) {
return keys.indexOf(key) > -1;
},
get: function get(key) {
return values[keys.indexOf(key)];
},
set: function set(key, value) {
if (keys.indexOf(key) === -1) {
keys.push(key);
values.push(value);
}
},
delete: function _delete(key) {
var index = keys.indexOf(key);
if (index > -1) {
keys.splice(index, 1);
values.splice(index, 1);
}
}
};
}();
var createEvent = function createEvent(name) {
return new Event(name, { bubbles: true });
};
try {
new Event('test');
} catch (e) {
// IE does not support `new Event()`
createEvent = function createEvent(name) {
var evt = document.createEvent('Event');
evt.initEvent(name, true, false);
return evt;
};
}
function assign(ta) {
if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;
var heightOffset = null;
var clientWidth = null;
var cachedHeight = null;
function init() {
var style = window.getComputedStyle(ta, null);
if (style.resize === 'vertical') {
ta.style.resize = 'none';
} else if (style.resize === 'both') {
ta.style.resize = 'horizontal';
}
if (style.boxSizing === 'content-box') {
heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));
} else {
heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
}
// Fix when a textarea is not on document body and heightOffset is Not a Number
if (isNaN(heightOffset)) {
heightOffset = 0;
}
update();
}
function changeOverflow(value) {
{
// Chrome/Safari-specific fix:
// When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space
// made available by removing the scrollbar. The following forces the necessary text reflow.
var width = ta.style.width;
ta.style.width = '0px';
// Force reflow:
/* jshint ignore:start */
ta.offsetWidth;
/* jshint ignore:end */
ta.style.width = width;
}
ta.style.overflowY = value;
}
function getParentOverflows(el) {
var arr = [];
while (el && el.parentNode && el.parentNode instanceof Element) {
if (el.parentNode.scrollTop) {
arr.push({
node: el.parentNode,
scrollTop: el.parentNode.scrollTop
});
}
el = el.parentNode;
}
return arr;
}
function resize() {
if (ta.scrollHeight === 0) {
// If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.
return;
}
var overflows = getParentOverflows(ta);
var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)
ta.style.height = '';
ta.style.height = ta.scrollHeight + heightOffset + 'px';
// used to check if an update is actually necessary on window.resize
clientWidth = ta.clientWidth;
// prevents scroll-position jumping
overflows.forEach(function (el) {
el.node.scrollTop = el.scrollTop;
});
if (docTop) {
document.documentElement.scrollTop = docTop;
}
}
function update() {
resize();
var styleHeight = Math.round(parseFloat(ta.style.height));
var computed = window.getComputedStyle(ta, null);
// Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box
var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight;
// The actual height not matching the style height (set via the resize method) indicates that
// the max-height has been exceeded, in which case the overflow should be allowed.
if (actualHeight < styleHeight) {
if (computed.overflowY === 'hidden') {
changeOverflow('scroll');
resize();
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
}
} else {
// Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.
if (computed.overflowY !== 'hidden') {
changeOverflow('hidden');
resize();
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
}
}
if (cachedHeight !== actualHeight) {
cachedHeight = actualHeight;
var evt = createEvent('autosize:resized');
try {
ta.dispatchEvent(evt);
} catch (err) {
// Firefox will throw an error on dispatchEvent for a detached element
// https://bugzilla.mozilla.org/show_bug.cgi?id=889376
}
}
}
var pageResize = function pageResize() {
if (ta.clientWidth !== clientWidth) {
update();
}
};
var destroy = function (style) {
window.removeEventListener('resize', pageResize, false);
ta.removeEventListener('input', update, false);
ta.removeEventListener('keyup', update, false);
ta.removeEventListener('autosize:destroy', destroy, false);
ta.removeEventListener('autosize:update', update, false);
Object.keys(style).forEach(function (key) {
ta.style[key] = style[key];
});
map.delete(ta);
}.bind(ta, {
height: ta.style.height,
resize: ta.style.resize,
overflowY: ta.style.overflowY,
overflowX: ta.style.overflowX,
wordWrap: ta.style.wordWrap
});
ta.addEventListener('autosize:destroy', destroy, false);
// IE9 does not fire onpropertychange or oninput for deletions,
// so binding to onkeyup to catch most of those events.
// There is no way that I know of to detect something like 'cut' in IE9.
if ('onpropertychange' in ta && 'oninput' in ta) {
ta.addEventListener('keyup', update, false);
}
window.addEventListener('resize', pageResize, false);
ta.addEventListener('input', update, false);
ta.addEventListener('autosize:update', update, false);
ta.style.overflowX = 'hidden';
ta.style.wordWrap = 'break-word';
map.set(ta, {
destroy: destroy,
update: update
});
init();
}
function destroy(ta) {
var methods = map.get(ta);
if (methods) {
methods.destroy();
}
}
function update(ta) {
var methods = map.get(ta);
if (methods) {
methods.update();
}
}
var autosize = null;
// Do nothing in Node.js environment and IE8 (or lower)
if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {
autosize = function autosize(el) {
return el;
};
autosize.destroy = function (el) {
return el;
};
autosize.update = function (el) {
return el;
};
} else {
autosize = function autosize(el, options) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], function (x) {
return assign(x, options);
});
}
return el;
};
autosize.destroy = function (el) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], destroy);
}
return el;
};
autosize.update = function (el) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], update);
}
return el;
};
}
exports.default = autosize;
module.exports = exports['default'];
});
/**********************************************************************************************************************
* 숫자에 컴마를 붙여서 리턴한다
* @returns {*}
*********************************************************************************************************************/
Number.prototype.numberFormat = function(){
if(this==0) return 0;
var reg = /(^[+-]?\d+)(\d{3})/;
var n = (this + '');
while (reg.test(n)) n = n.replace(reg, '$1' + ',' + '$2');
return n;
};
String.prototype.numberFormat = function() { return isNaN( parseFloat(this) ) ? "0" : (parseFloat(this)).numberFormat(); };
/**********************************************************************************************************************
* 컴마가 붙어있는 숫자에서 콤마를 삭제하고 숫자로 반환한다.
* @returns {*}
*********************************************************************************************************************/
String.prototype.unNumberFormat = function() {
var str = this;
if(typeof str == 'number') return str;
str = ("" + str).replace(/,/gi,''); // 콤마 제거
str = str.replace(/(^\s*)|(\s*$)/g, ""); // trim
var returnStr = new Number(str);
return isNaN(returnStr) ? str : returnStr;
};
Number.prototype.unNumberFormat = function() {
return this;
};
/**********************************************************************************************************************
* 날짜를 원하는 포맷 형식으로 출력
* @param f
* @returns {*}
*********************************************************************************************************************/
Date.prototype.dateFormat = function(f) {
if (!this.valueOf()) return " ";
if (!f) return this;
var weekName = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],
shortWeekName = ["일", "월", "화", "수", "목", "금", "토"],
d = this;
return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function($1) {
switch ($1) {
case "yyyy": return d.getFullYear();
case "yy": return (d.getFullYear() % 1000).zf(2);
case "MM": return (d.getMonth() + 1).zf(2);
case "dd": return d.getDate().zf(2);
case "E": return weekName[d.getDay()];
case "e": return shortWeekName[d.getDay()];
case "HH": return d.getHours().zf(2);
case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);
case "mm": return d.getMinutes().zf(2);
case "ss": return d.getSeconds().zf(2);
case "a/p": return d.getHours() < 12 ? "오전" : "오후";
default: return $1;
}
});
};
String.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};
String.prototype.zf = function(len){return "0".string(len - this.length) + this;};
Number.prototype.zf = function(len){return this.toString().zf(len);};
String.prototype.dateFormat = function(f) {
var d = new Date(this);
return ( d == 'Invalid Date') ? '' : d.dateFormat(f);
}
/**********************************************************************************************************************
* 숫자를 한글명으로 바꿔서 보여줍니다.
*********************************************************************************************************************/
Number.prototype.toKorean = function() {
var hanA = new Array("","일","이","삼","사","오","육","칠","팔","구","십"),
danA = new Array("","십","백","천","","십","백","천","","십","백","천","","십","백","천"),
num = new String(this),
result = '';
for(var i=0; i<num.length; i++) {
var str = "",
han = hanA[num.charAt(num.length-(i+1))];
if(han != "") str += han+danA[i];
if(i == 4) str += "만";
if(i == 8) str += "억";
if(i == 12) str += "조";
result = str + result;
}
return result;
}
String.prototype.toKorean = function() {
return (this.unNumberFormat()).toKorean();
}
/************************************************************************************************************************
* 해당 문자열의 regex 검사
* @param regexType
*************************************************************************************************************************/
String.prototype.regex = function(regexType) {
var phoneRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})([0-9]{3,4})([0-9]{4})$/,
phoneWithHypenRegex = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/,
telRegex = /(^02.{0}|^01.{1}|[0-9]{3})([0-9]{3,4})([0-9]{4})/,
telCheckRegex = /^\d{2,3}-\d{3,4}-\d{4}$/,
emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
str = this;
switch(regexType) {
case "phone" :
var transNum = str.replace(/\s/gi, '').replace(/-/gi,'');
if(transNum.length == 11 || transNum.length == 10) {
if( phoneRegex.test(transNum) ) {
transNum = transNum.replace(phoneWithHypenRegex, '$1-$2-$3');
return transNum;
}
}
return false;
case "tel":
var transNum = str.replace(/\s/gi, '').replace(/-/gi,'');
transNum = transNum.replace(telRegex, '$1-$2-$3');
if(telCheckRegex.test(transNum)) {
return transNum;
}
return false;
case "email":
return emailRegex.test(str);
case "biznum" :
var checkID = new Array(1, 3, 7, 1, 3, 7, 1, 3, 5, 1),
tmpBizID, i, chkSum=0, c2, remander,
bizID = str.replace(/-/gi,'');
for (i=0; i<=7; i++) chkSum += checkID[i] * bizID.charAt(i);
c2 = "0" + (checkID[8] * bizID.charAt(8));
c2 = c2.substring(c2.length - 2, c2.length);
chkSum += Math.floor(c2.charAt(0)) + Math.floor(c2.charAt(1));
remander = (10 - (chkSum % 10)) % 10 ;
if (Math.floor(bizID.charAt(9)) == remander) return bizID.replace(/(\d{3})(\d{2})(\d{5})/, '$1-$2-$3');
return false;
}
};
/************************************************************************************************************
* 특정 엘리먼트 또는 최상단으로 스크롤을 이동시킵니다.
* @param elementSelector 셀렉터
* @param animation 애니메이션 효과
* @param duration 지속시간
* @constructor
*************************************************************************************************************/
Wheeparam.ScrollTo = function( elementSelector, animation, duration ) {
elementSelector = typeof elementSelector != 'undefined' && elementSelector ? elementSelector : false;
animation = typeof animation != 'undefined' && animation ? animation : false;
duration = typeof duration != 'undefined' && duration && animation ? duration : 0;
var start = window.pageYOffset || document.body.scrollTop,
element = elementSelector ? document.querySelector(elementSelector) : document.body,
to = element.offsetTop,
change = to - start,
currentTime = 0,
increment = 20;
var animateScroll = function() {
currentTime += increment;
var value = animation ? Wheeparam.Easing[animation]( currentTime, start, change, duration ) : to;
window.scrollTo(0, value);
if(currentTime < duration) {
setTimeout(animateScroll, increment);
}
}
animateScroll();
};
/************************************************************************************************************
* 배열을 합쳐줍니다.
* @param out 합칠 배열들
* @returns {*|{}}
************************************************************************************************************/
Wheeparam.extend = function( out ) {
out = out || {};
for (var i = 1; i < arguments.length; i++) {
var obj = arguments[i];
if (!obj)
continue;
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object')
out[key] = Wheeparam.extend(out[key], obj[key]);
else
out[key] = obj[key];
}
}
}
return out;
};
/************************************************************************************************************
* 팝업창을 띄웁니다.
* @param options
************************************************************************************************************/
Wheeparam.popup = function( options ) {
var defaults={
title : '_blank',
width : 800,
height : 600,
url : '',
onFailed: function() {
alert("팝업 차단 기능이 설정되어있습니다.\n차단 기능을 해제(팝업허용) 한 후 다시 이용해 주십시오.");
}
};
var option = Wheeparam.extend({}, defaults, options),
cw = screen.availWidth,
ch = screen.availHeight,
sw = option.width,
sh = option.height,
ml = (cw - sw) / 2,
mt = (ch - sh) / 2,
opt = 'width='+sw+',height='+sh+',top='+mt+',left='+ml+',scrollbars=yes,resizable=no',
win = window.open(options.url, options.title, opt);
if (win == null || typeof(win) == "undefined" || (win == null && win.outerWidth == 0) || (win != null && win.outerHeight == 0))
{
option.onFailed();
return;
}
};
/************************************************************************************************************
* 소셜 공유 팝업창을 띄우거나 페이지로 이동합니다.
* @param options
************************************************************************************************************/
Wheeparam.shareSNS = function( options ) {
var defaults = {
title : '',
provider: '',
url: '',
imgSrc: '',
width: 800,
height: 600,
onFailed: function() {
alert("팝업 차단 기능이 설정되어있습니다.\n차단 기능을 해제(팝업허용) 한 후 다시 이용해 주십시오.");
}
};
var option = Wheeparam.extend({}, defaults, options);
if(! option.title) {
option.title = document.querySelector('meta[property="og:title"]')
? document.querySelector('meta[property="og:title"]').getAttribute('content')
: (document.querySelector('title')
? document.querySelector('title').innerText
: ''
);
}
if(! option.url) {
option.url = window.location.href;
}
if(! option.imgSrc) {
option.imgSrc = document.querySelector('meta[property="og:image"]')
? document.querySelector('meta[property="og:image"]').getAttribute('content')
: (document.querySelector('link[rel="image_src"]')
? document.querySelector('link[rel="image_src"]').innerText
: ''
);
}
option.url = encodeURIComponent(option.url);
option.title = encodeURIComponent(option.title);
var loc = "";
switch (option.provider) {
case 'facebook' :
loc = '//www.facebook.com/sharer/sharer.php?u='+option.url;
break;
case 'twitter':
loc = '//twitter.com/home?status='+option.title+' '+ option.url;
break;
case 'google':
loc = '//plus.google.com/share?url='+option.url;
break;
case 'pinterest':
loc = '//www.pinterest.com/pin/create/button/?url='+option.url+ ( option.imgSrc ? '&media='+ option.imgSrc : '' )+'&description='+option.title;
break;
case 'kakaostory':
loc = 'https://story.kakao.com/share?url='+option.url;
break;
case 'band':
loc = 'http://www.band.us/plugin/share?body='+option.title+'%0A'+option.url;
break;
case 'naver':
loc = "http://share.naver.com/web/shareView.nhn?url="+option.url+"&title="+option.title;
break;
case 'line':
loc = "http://line.me/R/msg/text/?" + option.title + encodeURIComponent("\n") + option.url;
break;
}
if( loc ) {
Wheeparam.popup({ url : loc, width: option.width, height: option.height, onFailed:option.onFailed });
}
return false;
};
/***********************************************************************************************************************
* 전체체크박스 / 체크박스 연동
***********************************************************************************************************************/
Wheeparam.onDocuemntReady(function() {
var checkboxs = document.querySelectorAll('[data-checkbox]');
if(checkboxs.length > 0) {
for( var i = 0; i<checkboxs.length; i++) {
checkboxs[i].addEventListener('change', function(event) {
var $check = this,
is_all = this.getAttribute('data-checkbox-all') != null ? true : false,
name = this.getAttribute('data-checkbox'),
checked = this.checked,
$allCheck = is_all ? $check : (document.querySelectorAll('[data-checkbox="'+name+'"][data-checkbox-all]').length > 0 ? document.querySelectorAll('[data-checkbox="'+name+'"][data-checkbox-all]')[0] : null ),
checks = document.querySelectorAll('[data-checkbox="'+name+'"]');
if(! $allCheck) return;
if( is_all ) {
for(var k =0; k<checks.length; k++) {
checks[k].checked = checked;
}
}
else {
var is_all_check = true;
for(var k =0; k<checks.length; k++) {
if(checks[k].getAttribute('data-checkbox-all') != null) continue;
if(checks[k].checked == false) {
is_all_check = false;
break;
}
}
$allCheck.checked = is_all_check;
}
});
}
}
});
/***********************************************************************************************************************
* 숫자 3자리마다 Comma 자동 입력 Input
***********************************************************************************************************************/
Wheeparam.onDocuemntReady(function() {
var $input = document.querySelectorAll('input[data-number-format]');
if($input.length > 0) {
for(var i=0; i<$input.length; i++)
{
$input[i].addEventListener('keyup', function() {
var value = this.value.unNumberFormat().numberFormat();
this.value = value;
});
}
}
});
/***********************************************************************************************************************
* 숫자만 입력가능한 Input
***********************************************************************************************************************/
Wheeparam.onDocuemntReady(function() {
var $input = document.querySelectorAll('[data-number-only]');
if($input.length <=0 ) return;
for(var i=0; i<$input.length; i++) {
$input[i].addEventListener('keypress', function(e) {
if (e.which != 8 && e.which != 0 && e.which != 45 && (e.which < 48 || e.which > 57)) {
e.preventDefault();
}
})
}
});
/***********************************************************************************************************************
* 높이가 자동 조정되는 textarea
***********************************************************************************************************************/
Wheeparam.onDocuemntReady(function() {
var $input = document.querySelectorAll('textarea[data-autosize]');
if($input.length > 0)
{
for(var i =0; i<$input.length; i++)
{
$input[i].addEventListener('keyup', function() {
autosize(this);
});
}
}
});
/***********************************************************************************************************************
* 소셜 공유 버튼
***********************************************************************************************************************/
Wheeparam.onDocuemntReady(function() {
var $socialParentElement = document.querySelectorAll('[data-sns-share]');
if($socialParentElement.length > 0)
{
for(var i =0; i<$socialParentElement.length; i++)
{
var el = $socialParentElement[i],
title = el.getAttribute('data-title') ? el.getAttribute('data-title') : '',
url = el.getAttribute('data-url') ? el.getAttribute('data-url') : '',
imgSrc = el.getAttribute('data-img-src') ? el.getAttribute('data-img-src') : '',
width = el.getAttribute('data-width') ? el.getAttribute('data-width') : 800,
height = el.getAttribute('data-height') ? el.getAttribute('data-height') : 600,
providers = el.querySelectorAll('[data-sns-provider]');
for(var k=0; k<providers.length; k ++)
{
providers[k].addEventListener('click', function() {
var provider = this.getAttribute('data-sns-provider') ? this.getAttribute('data-sns-provider') : '';
if(! provider) return false;
Wheeparam.shareSNS({
title : title,
provider : provider,
url : url,
imgSrc: imgSrc,
width: width,
height: height
})
});
}
}
}
});

29
src/scss/_variables.scss

@ -0,0 +1,29 @@
// 색상 변수
$color-primary : #282828; // 메인 컬러
$color-secondary : #282828; // 서브 컬러
$body-color : #212529; // 기본 텍스트 색상
$body-bg-color : #FFFFFF; // 기본 배경 색상
$link-color : $body-color; // 링크 텍스트 색상
$link-hover-color : $color-primary; // 링크 오버시 텍스트 색상
// 폰트 관련
$font-family-base : 'Noto Sans KR',sans-serif; // 기본글자에 사용 되는 폰트
$font-family-heading : $font-family-base; // 헤딩태그에 사용 되는 폰트
$font-size-base : 16px;
$font-weight-base : 400;
$font-weight-bold : 700;
$line-height-base : 1.5em;
// 애니메이션
$default-animation : ease;
// 반응형 포인트
$break-lg : 1200px;
$break-md : 992px;
$break-sm : 768px;
// 테이블 관련
$table-cell-padding: .75rem !default;
$table-cell-padding-sm: .3rem !default;

3
src/scss/boot/_fonts.scss

@ -0,0 +1,3 @@
/***************************************************************************************
* 폰트
****************************************************************************************/

37
src/scss/boot/_function.scss

@ -0,0 +1,37 @@
// 기본 픽셀 사이즈를 rem 단위 사이즈로 변환
@function REM($pxSize:16px){
$remSize : $pxSize / $font-size-base !global;
@return #{$remSize}rem;
}
@function strip-unit($number) {
@if type-of($number) == 'number' and not unitless($number) {
@return $number / ($number * 0 + 1);
}
@return $number;
}
@function VW($pxSize:16px) {
$vwSize: strip-unit($pxSize) / 1080 * 100;
@return #{$vwSize}vw;
}
// Media Query를 위한 함수
@function translate-media-condition($c) {
$break-desktop: $break-desktop !global;
$break-tablet : $break-tablet !global;
$break-mobile : $break-mobile !global;
$condMap: (
"screen": "only screen",
"print": "only print",
"retina": "(-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-device-pixel-ratio: 1.5), (min-resolution: 120dpi)",
">desktop" : "(min-width: #{$break-desktop + 1})",
'<desktop' : "(max-width: #{$break-desktop})",
">tablet": "(min-width: #{$break-tablet + 1})",
"<tablet": "(max-width: #{$break-tablet})",
">mobile": "(min-width: #{$break-mobile})"
);
@return map-get( $condMap, $c );
}

125
src/scss/boot/_mixins.scss

@ -0,0 +1,125 @@
// Clear FIX
@mixin clear-fix() {
display:block;
clear:both;
content:"";
}
@mixin clear-fix-after() {
&:after {
@include clear-fix();
}
}
// Button Default Style
@mixin button-default() {
display: inline-block;
margin:0;
font-weight: normal;
text-align: center;
white-space: nowrap;
user-select: none;
text-decoration: none;
outline:0;
vertical-align:middle;
&:disabled,
&.disabled {
opacity:0.65;
}
&:not([disabled]):not(.disabled) {
cursor: pointer;
}
}
// background Image
@mixin background-image( $image_url, $bg_color:transparent, $background-repeat:no-repeat, $background-position-x:center, $background-position-y:center )
{
background-color:$bg_color;
background-image:url($image_url);
background-repeat: $background-repeat;
background-position-x:$background-position-x;
background-position-y:$background-position-y;
}
// Global Transition
@mixin transition($second:.3s, $target:all, $animation:$default-animation)
{
-webkit-transition: $target $second $animation;
-moz-transition: $target $second $animation;
-ms-transition: $target $second $animation;
-o-transition: $target $second $animation;
transition: $target $second $animation;
}
// Display flex & Prefix
@mixin display-flex()
{
-webkit-display:flex;
display:-ms-flex;
display:flex;
}
// Media Query
@mixin media($args...) {
$query: "";
@each $arg in $args {
$op: "";
@if ( $query != "" ) {
$op: " and ";
}
$query: $query + $op + translate-media-condition($arg);
}
@media #{$query} { @content; }
}
@mixin display-lg() {
@media screen and (min-width:$break-lg + 1) {
@content;
}
}
@mixin display-md() {
@media screen and (max-width:$break-lg) {
@content;
}
}
@mixin display-sm() {
@media screen and (max-width:$break-md) {
@content;
}
}
@mixin display-xs() {
@media screen and (max-width:$break-sm) {
@content;
}
}
@mixin background-image-retina($path, $ext: "png", $w: 100%, $h: 100%, $pos-x: center, $pos-y:center, $repeat: no-repeat) {
$at1x_path: "#{$path}.#{$ext}";
$at2x_path: "#{$path}@2x.#{$ext}";
$at3x_path: "#{$path}@3x.#{$ext}";
background-image: url("#{$at1x_path}");
background-size: $w $h;
background-position-x: $pos-x;
background-position-y: $pos-y;
background-repeat: $repeat;
@media all and (-webkit-min-device-pixel-ratio : 1.5),
all and (-o-min-device-pixel-ratio: 3/2),
all and (min--moz-device-pixel-ratio: 1.5),
all and (min-device-pixel-ratio: 1.5) {
background-image: url("#{$at2x_path}");
}
@media all and (-webkit-min-device-pixel-ratio : 2.5),
all and (-o-min-device-pixel-ratio: 5/2),
all and (min--moz-device-pixel-ratio: 2.5),
all and (min-device-pixel-ratio: 2.5) {
background-image: url("#{$at3x_path}");
}
}

330
src/scss/boot/_reset.scss

@ -0,0 +1,330 @@
/**********************************************************************************************************************
* RESET
***********************************************************************************************************************/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif; // 2
line-height: 1.15; // 3
-webkit-text-size-adjust: 100%; // 4
-ms-text-size-adjust: 100%; // 4
-ms-overflow-style: scrollbar; // 5
-webkit-tap-highlight-color: rgba(#000, 0); // 6
}
// IE10+ 에서 viewport 메타 태그가 먹지않는경우를 대비
@at-root {
@-ms-viewport {
width: device-width;
}
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: $font-family-base;
font-size: $font-size-base;
font-weight: $font-weight-base;
line-height: $line-height-base;
color: $body-color;
text-align: left;
background-color: $body-bg-color;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin:0;
font-family:$font-family-heading;
line-height:$line-height-base;
}
p {
margin:0;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
text-decoration: underline dotted;
cursor: help; // 3
border-bottom: 0; // 1
}
address {
margin:0;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin:0;
list-style:none;
padding:0;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin:0;
}
dt {
font-weight: $font-weight-base;
}
dd {
margin:0;
}
blockquote {
margin:0;
}
dfn {
font-style: italic;
}
b,
strong {
font-weight: $font-weight-bold;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub { bottom: -.25em; }
sup { top: -.5em; }
// 링크
a {
color: $link-color;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
&:hover {
color: $link-hover-color;
text-decoration:none;
}
&:not([href]):not([tabindedx]) {
color: inherit;
text-decoration: none;
&:hover,
&:focus {
color: inherit;
text-decoration: none;
}
&:focus {
outline: 0;
}
}
}
// 코드 관련
pre,
code,
kbd,
samp {
font-family: $font-family-base;
font-size: 1em;
}
pre {
margin:0;
overflow: auto;
-ms-overflow-style: scrollbar;
}
// 이미지 관련
figure {
margin: 0;
}
img {
vertical-align: middle;
border-style: none;
}
svg:not(:root) {
overflow: hidden;
}
// 테이블 관련
table {
border-collapse: collapse;
}
caption {
padding-top: $table-cell-padding;
padding-bottom: $table-cell-padding;
color: $body-color;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
// 폼관련
label {
display: inline-block;
margin:0;
}
button {
border-radius: 0;
&:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin:0;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}

3
src/scss/common/_animation.scss

@ -0,0 +1,3 @@
/***************************************************************************************
* 애니메이션
****************************************************************************************/

3
src/scss/common/_layout.scss

@ -0,0 +1,3 @@
/***************************************************************************************
* 레이아웃
****************************************************************************************/

108
src/scss/common/_utility.scss

@ -0,0 +1,108 @@
/***************************************************************************************
* 유틸리티
****************************************************************************************/
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
&.sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
overflow: visible;
clip: auto;
white-space: normal;
}
}
}
.clearfix {
&,
&:before,
&:after {
@include clear-fix();
}
}
@for $i from 1 to 100{
.W#{$i * 5} {
width: 5px * $i !important;
}
.H#{$i * 5} {
height:5px * $i !important;
}
}
@for $i from 0 to 21 {
.M#{$i * 5} {
margin:5px * $i !important;
}
.MT#{$i * 5} {
margin-top:5px * $i !important;
}
.MR#{$i*5} {
margin-right:5px * $i !important;
}
.MB#{$i * 5} {
margin-bottom:5px * $i !important;
}
.ML#{$i * 5} {
margin-left:5px * $i !important;
}
.PT#{$i * 5} {
padding-top:5px * $i !important;
}
.PR#{$i * 5} {
padding-right:5px * $i !important;
}
.PB#{$i * 5} {
padding-bottom:5px * $i !important;
}
.PL#{$i * 5} {
padding-left:5px * $i !important;
}
.P#{$i * 5} {
padding:5px * $i !important;
}
}
@for $i from 1 to 21{
.W#{$i * 5}P {
width: 5% * $i !important;
}
}
.text-left {
text-align: left !important;
}
.text-right {
text-align:right !important;;
}
.text-center {
text-align:center !important;
}
.display-flex {
@include display-flex;
&.align-center {
align-items: center;
}
&.justify-center {
justify-content: center;
}
&.dir-column {
flex-direction: column;
}
}

3
src/scss/components/_button.scss

@ -0,0 +1,3 @@
/***************************************************************************************
* 버튼
****************************************************************************************/

3
src/scss/components/_icons.scss

@ -0,0 +1,3 @@
/***************************************************************************************
* 아이콘
****************************************************************************************/

3
src/scss/pages/main.scss

@ -0,0 +1,3 @@
/**********************************************************************************************************************
* 메인페이지
***********************************************************************************************************************/

20
src/scss/plugins/FontAwesome-5.13.0/_animated.scss

@ -0,0 +1,20 @@
// Animated Icons
// --------------------------
.#{$fa-css-prefix}-spin {
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
animation: fa-spin 1s infinite steps(8);
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

20
src/scss/plugins/FontAwesome-5.13.0/_bordered-pulled.scss

@ -0,0 +1,20 @@
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
border: solid .08em $fa-border-color;
border-radius: .1em;
padding: .2em .25em .15em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix},
.fas,
.far,
.fal,
.fab {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}

21
src/scss/plugins/FontAwesome-5.13.0/_core.scss

@ -0,0 +1,21 @@
// Base Class Definition
// -------------------------
.#{$fa-css-prefix},
.fas,
.far,
.fal,
.fad,
.fab {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1;
}
%fa-icon {
@include fa-icon;
}

6
src/scss/plugins/FontAwesome-5.13.0/_fixed-width.scss

@ -0,0 +1,6 @@
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
text-align: center;
width: $fa-fw-width;
}

2296
src/scss/plugins/FontAwesome-5.13.0/_icons.scss
File diff suppressed because it is too large
View File

23
src/scss/plugins/FontAwesome-5.13.0/_larger.scss

@ -0,0 +1,23 @@
// Icon Sizes
// -------------------------
// makes the font 33% larger relative to the icon container
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -.0667em;
}
.#{$fa-css-prefix}-xs {
font-size: .75em;
}
.#{$fa-css-prefix}-sm {
font-size: .875em;
}
@for $i from 1 through 10 {
.#{$fa-css-prefix}-#{$i}x {
font-size: $i * 1em;
}
}

18
src/scss/plugins/FontAwesome-5.13.0/_list.scss

@ -0,0 +1,18 @@
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
list-style-type: none;
margin-left: $fa-li-width * 5/4;
padding-left: 0;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
left: -$fa-li-width;
position: absolute;
text-align: center;
width: $fa-li-width;
line-height: inherit;
}

56
src/scss/plugins/FontAwesome-5.13.0/_mixins.scss

@ -0,0 +1,56 @@
// Mixins
// --------------------------
@mixin fa-icon {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
display: inline-block;
font-style: normal;
font-variant: normal;
font-weight: normal;
line-height: 1;
}
@mixin fa-icon-rotate($degrees, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
transform: scale($horiz, $vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto;
}
}

24
src/scss/plugins/FontAwesome-5.13.0/_rotated-flipped.scss

@ -0,0 +1,24 @@
// Rotated & Flipped Icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
.#{$fa-css-prefix}-flip-both, .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root {
.#{$fa-css-prefix}-rotate-90,
.#{$fa-css-prefix}-rotate-180,
.#{$fa-css-prefix}-rotate-270,
.#{$fa-css-prefix}-flip-horizontal,
.#{$fa-css-prefix}-flip-vertical,
.#{$fa-css-prefix}-flip-both {
filter: none;
}
}

5
src/scss/plugins/FontAwesome-5.13.0/_screen-reader.scss

@ -0,0 +1,5 @@
// Screen Readers
// -------------------------
.sr-only { @include sr-only; }
.sr-only-focusable { @include sr-only-focusable; }

2066
src/scss/plugins/FontAwesome-5.13.0/_shims.scss
File diff suppressed because it is too large
View File

31
src/scss/plugins/FontAwesome-5.13.0/_stacked.scss

@ -0,0 +1,31 @@
// Stacked Icons
// -------------------------
.#{$fa-css-prefix}-stack {
display: inline-block;
height: 2em;
line-height: 2em;
position: relative;
vertical-align: middle;
width: ($fa-fw-width*2);
}
.#{$fa-css-prefix}-stack-1x,
.#{$fa-css-prefix}-stack-2x {
left: 0;
position: absolute;
text-align: center;
width: 100%;
}
.#{$fa-css-prefix}-stack-1x {
line-height: inherit;
}
.#{$fa-css-prefix}-stack-2x {
font-size: 2em;
}
.#{$fa-css-prefix}-inverse {
color: $fa-inverse;
}

2313
src/scss/plugins/FontAwesome-5.13.0/_variables.scss
File diff suppressed because it is too large
View File

23
src/scss/plugins/FontAwesome-5.13.0/brands.scss

@ -0,0 +1,23 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Brands';
font-style: normal;
font-weight: 400;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-brands-400.eot');
src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
url('#{$fa-font-path}/fa-brands-400.woff') format('woff'),
url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'),
url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
}
.fab {
font-family: 'Font Awesome 5 Brands';
font-weight: 400;
}

1916
src/scss/plugins/FontAwesome-5.13.0/duotone.scss
File diff suppressed because it is too large
View File

16
src/scss/plugins/FontAwesome-5.13.0/fontawesome.scss

@ -0,0 +1,16 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@import 'mixins';
@import 'core';
@import 'larger';
@import 'fixed-width';
@import 'list';
@import 'bordered-pulled';
@import 'animated';
@import 'rotated-flipped';
@import 'stacked';
@import 'icons';
@import 'screen-reader';

23
src/scss/plugins/FontAwesome-5.13.0/light.scss

@ -0,0 +1,23 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 300;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-light-300.eot');
src: url('#{$fa-font-path}/fa-light-300.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-light-300.woff2') format('woff2'),
url('#{$fa-font-path}/fa-light-300.woff') format('woff'),
url('#{$fa-font-path}/fa-light-300.ttf') format('truetype'),
url('#{$fa-font-path}/fa-light-300.svg#fontawesome') format('svg');
}
.fal {
font-family: 'Font Awesome 5 Pro';
font-weight: 300;
}

23
src/scss/plugins/FontAwesome-5.13.0/regular.scss

@ -0,0 +1,23 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 400;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-regular-400.eot');
src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
}
.far {
font-family: 'Font Awesome 5 Pro';
font-weight: 400;
}

24
src/scss/plugins/FontAwesome-5.13.0/solid.scss

@ -0,0 +1,24 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'variables';
@font-face {
font-family: 'Font Awesome 5 Pro';
font-style: normal;
font-weight: 900;
font-display: $fa-font-display;
src: url('#{$fa-font-path}/fa-solid-900.eot');
src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}
.fa,
.fas {
font-family: 'Font Awesome 5 Pro';
font-weight: 900;
}

6
src/scss/plugins/FontAwesome-5.13.0/v4-shims.scss

@ -0,0 +1,6 @@
/*!
* Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Commercial License)
*/
@import 'FontAwesome-5.13.0/variables';
@import 'FontAwesome-5.13.0/shims';

3
src/scss/plugins/_custom.scss

@ -0,0 +1,3 @@
/***************************************************************************************
* 플러그인 커스텀
****************************************************************************************/

28
src/scss/style.scss

@ -0,0 +1,28 @@
// 기본
@import "boot/fonts";
@import "boot/mixins";
@import "boot/function";
@import "variables";
@import "boot/reset";
// FontAwesome
@import "plugins/FontAwesome-5.13.0/fontawesome";
@import "plugins/FontAwesome-5.13.0/regular";
@import "plugins/FontAwesome-5.13.0/light";
@import "plugins/FontAwesome-5.13.0/solid";
@import "plugins/FontAwesome-5.13.0/brands";
// 애니메이션,레이아웃,유틸리티,컴포넌트
@import "common/animation";
@import "common/layout";
@import "common/utility";
// 각종 컴포넌트
@import "components/icons";
@import "components/button";
// 각종 플러그인 SCSS 플러그인 커스텀
@import "plugins/custom";
// 레이아웃 페이지 SCSS 파일
@import 'pages/main';

3873
yarn.lock
File diff suppressed because it is too large
View File

Loading…
Cancel
Save