├── README.md ├── _app ├── jade │ ├── _files │ │ ├── _avatar.jade │ │ └── _jobs.jade │ ├── _layout │ │ └── _master.jade │ └── index.jade ├── js │ └── script.js └── sass │ └── style.scss ├── gulpfile.js └── package.json /README.md: -------------------------------------------------------------------------------- 1 | #cv-editor 2 | [CV Page Design](http://emretekin.com.tr) 3 | 4 | ## Install and build 5 | `npm i && gulp` -------------------------------------------------------------------------------- /_app/jade/_files/_avatar.jade: -------------------------------------------------------------------------------- 1 | extends ../_layout/_master 2 | 3 | block body 4 | body#image 5 | img(src="https://avatars2.githubusercontent.com/u/9803183?v=3&s=460" alt=title_name + " Avatar") 6 | small 250 x 250 pixels (Natural: 460 x 460 pixels) -------------------------------------------------------------------------------- /_app/jade/_files/_jobs.jade: -------------------------------------------------------------------------------- 1 | extends ../_layout/_master 2 | 3 | block body 4 | body#code 5 | .row.t1.end 6 | .cmd /** 7 | .row.t2.end 8 | .cmd Emre Tekin CV - Update 01.2017 9 | .row.t1.end 10 | .cmd **/ 11 | .row.t1.end 12 | .row.t1.end 13 | .obj { 14 | .row.t2 15 | .name "name" 16 | .value "Emre Tekin" 17 | .row.t2 18 | .name "title" 19 | .value "Front-End Developer" 20 | .row.t2.end 21 | .name "personal" 22 | .obj { 23 | .row.t3 24 | .name "birth" 25 | .value "1993/11/16 02:26:44 GMT+0200 (+02)" 26 | .row.t3 27 | .name "place_of_brith" 28 | .value "Kocaeli TR" 29 | .row.t3 30 | .name "military_service" 31 | .boo false 32 | .row.t3 33 | .name "single" 34 | .boo true 35 | .row.t3.end 36 | .name "driving_licence" 37 | .boo true 38 | .row.t2 39 | .obj } 40 | .row.t2.end 41 | .name "contact" 42 | .obj { 43 | .row.t3 44 | .name "address" 45 | .value "Esenkent mh. Çınaraltı sk. no:22 Maltepe/İSTANBUL" 46 | .row.t3 47 | .name "mobile_phone" 48 | a(href="tel:05448890130").value "+90 544 889 01 30" 49 | .row.t3.end 50 | .name "email" 51 | .obj [ 52 | .row.t4 53 | a(href="mailto:web.exxe@gmail.com").value "web.exxe@gmail.com" 54 | .row.t4.end 55 | a(href="mailto:posta@emretekin.com.tr").value "posta@emretekin.com.tr" 56 | .row.t3 57 | .obj ] 58 | .row.t3 59 | .name "web_site" 60 | a(href="http://emretekin.com.tr" target="_blank").value "http://emretekin.com.tr" 61 | .row.t3 62 | .name "kariyer_net" 63 | a(href="http://kariyer.net/ozgecmis/emretekin.com.tr" target="_blank").value "http://kariyer.net/ozgecmis/emretekin.com.tr" 64 | .row.t3.end 65 | .name "github" 66 | a(href="https://github.com/webexxe" target="_blank").value "https://github.com/webexxe" 67 | .row.t2 68 | .obj } 69 | .row.t2.end 70 | .name "education" 71 | .obj [ 72 | .row.t3.end 73 | .obj { 74 | .row.t4 75 | .name "school" 76 | .value "ANADOLU ÜNİVERSİTESİ AÇIK ÖĞRETİM FAKÜLTESİ" 77 | .row.t4 78 | .name "department" 79 | .value "İşletme" 80 | .row.t4.end 81 | .name "date" 82 | .value "2015 - Devam Ediyor" 83 | .row.t3 84 | .obj } 85 | .row.t3.end 86 | .obj { 87 | .row.t4 88 | .name "school" 89 | .value "ULUDAĞ ÜNİVERSİTESİ KARACABEY MESLEK YÜKSEK OKULU" 90 | .row.t4 91 | .name "department" 92 | .value "Bilgisayar Programcılığı" 93 | .row.t4.end 94 | .name "date" 95 | .value "2012 - 2015" 96 | .row.t3 97 | .obj } 98 | .row.t3.end 99 | .obj { 100 | .row.t4 101 | .name "school" 102 | .value "YILDIRIM BEYAZIT IMKB ENDUSTRİ MESLEK LİSESİ" 103 | .row.t4 104 | .name "department" 105 | .value "Bilişim Teknolojileri / Ağ Sistemleri Yönetimi" 106 | .row.t4.end 107 | .name "date" 108 | .value "2008 - 2012" 109 | .row.t3.end 110 | .obj } 111 | .row.t2 112 | .obj ] 113 | .row.t2.end 114 | .name "skills" 115 | .obj { 116 | .row.t3.end 117 | .name "javascript" 118 | .obj [ 119 | .row.t4 120 | .value "AngularJS" 121 | .row.t4 122 | .value "Ionic" 123 | .row.t4 124 | .value "jQuery Library" 125 | .row.t4 126 | .value "Coffe Script" 127 | .row.t4.end 128 | .value "Rest Api" 129 | .row.t3 130 | .obj ] 131 | .row.t3.end 132 | .name "css" 133 | .obj [ 134 | .row.t4 135 | .value "Sass" 136 | .row.t4 137 | .value "Less" 138 | .row.t4 139 | .value "Stylus" 140 | .row.t4 141 | .value "Bootstrap" 142 | .row.t4 143 | .value "Ionic" 144 | .row.t4 145 | .value "Materialize" 146 | .row.t4.end 147 | .value "Lungo" 148 | .row.t3 149 | .obj ] 150 | .row.t3.end 151 | .name "html" 152 | .obj [ 153 | .row.t4 154 | .value "Jade" 155 | .row.t4 156 | .value "Pug" 157 | .row.t4 158 | .value "HTML-5" 159 | .row.t4.end 160 | .value "XHTML" 161 | .row.t3 162 | .obj ] 163 | .row.t3.end 164 | .name "streaming_build" 165 | .obj [ 166 | .row.t4 167 | .value "Gulp" 168 | .row.t4 169 | .value "Grunt" 170 | .row.t4 171 | .value "Npm" 172 | .row.t4 173 | .value "Bower" 174 | .row.t4.end 175 | .value "Yeoman" 176 | .row.t3 177 | .obj ] 178 | .row.t3.end 179 | .name "version_control" 180 | .obj [ 181 | .row.t4 182 | .value "git/Github" 183 | .row.t4 184 | .value "git/Bitbucket" 185 | .row.t4.end 186 | .value "Svn" 187 | .row.t3 188 | .obj ] 189 | .row.t3.end 190 | .name "graphics_programs" 191 | .obj [ 192 | .row.t4 193 | .value "Adobe Photoshop" 194 | .row.t4 195 | .value "Adobe Illustrator" 196 | .row.t4.end 197 | .value "Sketch" 198 | .row.t3.end 199 | .obj ] 200 | .row.t2 201 | .obj } 202 | .row.t2.end 203 | .name "experience" 204 | .obj [ 205 | .row.t3.end 206 | .obj { 207 | .row.t4 208 | .name "company" 209 | .value "Garajyeri.com" 210 | .row.t4 211 | .name "department" 212 | .value "Front-End Developer" 213 | .row.t4 214 | .name "back_end" 215 | .value "Java - Play" 216 | .row.t4.end 217 | .name "date" 218 | .value "2016 - Devam Ediyor" 219 | .row.t3 220 | .obj } 221 | .row.t3.end 222 | .obj { 223 | .row.t4 224 | .name "company" 225 | .value "Turkticaret.net" 226 | .row.t4 227 | .name "department" 228 | .value "Front-End Developer" 229 | .row.t4 230 | .name "back_end" 231 | .value "Php - Laravel" 232 | .row.t4.end 233 | .name "date" 234 | .value "2015 - 2016" 235 | .row.t3 236 | .obj } 237 | .row.t3.end 238 | .obj { 239 | .row.t4 240 | .name "company" 241 | .value "Ulunet E-Ticaret" 242 | .row.t4 243 | .name "department" 244 | .value "Front-End Developer" 245 | .row.t4 246 | .name "back_end" 247 | .value ".Net MVC - Razor" 248 | .row.t4.end 249 | .name "date" 250 | .value "2014 - 2015" 251 | .row.t3 252 | .obj } 253 | .row.t3.end 254 | .obj { 255 | .row.t4 256 | .name "company" 257 | .value "Nestanıtım Grubu" 258 | .row.t4 259 | .name "department" 260 | .value "Web Developer" 261 | .row.t4 262 | .name "back_end" 263 | .value "Php - Wordpress" 264 | .row.t4.end 265 | .name "date" 266 | .value "2013 - 2014" 267 | .row.t3.end 268 | .obj } 269 | .row.t2.end 270 | .obj ] 271 | .row.t1.end 272 | .obj } -------------------------------------------------------------------------------- /_app/jade/_layout/_master.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | 3 | //- IE HACK 4 | 9 | 10 | - var title_name = "Emre Tekin"; 11 | 12 | //- HTML CODES 13 | html(lang="tr") 14 | head 15 | meta(charset="UTF-8") 16 | title 17 | block title 18 | meta(name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0") 19 | //BROWSER COLOR 20 | meta(name='theme-color', content='#333333') 21 | meta(name='msapplication-navbutton-color', content='#333333') 22 | meta(name='apple-mobile-web-app-status-bar-style', content='#333333') 23 | //CSS IMPORT 24 | link(rel="stylesheet" type="text/css" href="css/vendor.css") 25 | link(rel="stylesheet" type="text/css" href="css/style.css") 26 | //JS IMPORT 27 | script(src="js/vendor.js") 28 | script(src="js/scripts.js") 29 | //SEO META 30 | meta(name="description" content="") 31 | meta(name="keywords" content="") 32 | meta(name="robots" content="index, follow") 33 | //CONTENT SCOPE 34 | block body -------------------------------------------------------------------------------- /_app/jade/index.jade: -------------------------------------------------------------------------------- 1 | extends _layout/_master 2 | 3 | block title 4 | =title_name 5 | | | Kişisel Web Sitesi 6 | 7 | block body 8 | body#desktop 9 | main.editor 10 | .editor-header 11 | .action-buttons 12 | .a 13 | .b 14 | .c 15 | .title 16 | span.file jobs.json 17 | span.desc=title_name 18 | | CV 19 | .editor-frame 20 | .file-menu 21 | .menu-title Working Files 22 | ul 23 | li: a.active(href='_jobs.html' target='editor') jobs 24 | span .json 25 | li: a(href='_avatar.html' target='editor') avatar 26 | span .jpg 27 | .file-frame 28 | iframe#iframe(name="editor" src='_jobs.html' onLoad="$.frameLoad();") -------------------------------------------------------------------------------- /_app/js/script.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | var desktop = $("#desktop"), 4 | frame = $("#iframe"), 5 | frameX, 6 | editor = $(".editor"), 7 | action = $(".action-buttons"), 8 | menu_file = $(".file-menu a"), 9 | editor_title = $(".editor-header .title .file"), 10 | line = $(".row"); 11 | 12 | if (desktop.length) { 13 | 14 | $.frameLoad = function () { 15 | setTimeout(function () { 16 | frameX = frame.contents(); 17 | 18 | editor.add(frameX).on("click", function (e) { 19 | editor.removeClass("passive"); 20 | e.stopPropagation(); 21 | }); 22 | }, 1000) 23 | }; 24 | 25 | desktop.on("click", function () { 26 | editor.addClass("passive"); 27 | }); 28 | 29 | editor.find(".a").on("click", function () { 30 | editor.addClass("close"); 31 | 32 | setTimeout(function () { 33 | editor.removeClass("close"); 34 | }, 4000) 35 | }); 36 | 37 | editor.find(".b").on("click", function () { 38 | editor.toggleClass("min") 39 | }); 40 | 41 | editor.find(".c").on("click", function () { 42 | editor.toggleClass("full") 43 | }); 44 | 45 | menu_file.on("click", function () { 46 | var _this = $(this); 47 | editor_title.html(_this.html()); 48 | menu_file.removeClass("active"); 49 | _this.addClass("active"); 50 | }); 51 | 52 | } else { 53 | line.on("click", function () { 54 | line.removeClass("active"); 55 | $(this).addClass("active"); 56 | }); 57 | } 58 | }); -------------------------------------------------------------------------------- /_app/sass/style.scss: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | min-height: 100%; 4 | } 5 | 6 | body { 7 | min-height: 100%; 8 | } 9 | 10 | a { 11 | &:active, &:focus, &:visited { 12 | outline: none; 13 | text-decoration: none; 14 | } 15 | } 16 | 17 | body#desktop { 18 | background: #7399c3; 19 | background: url(https://9to5mac.files.wordpress.com/2016/06/sierra.jpg?quality=82) no-repeat center center fixed; 20 | -webkit-background-size: cover; 21 | -moz-background-size: cover; 22 | -o-background-size: cover; 23 | background-size: cover; 24 | overflow: hidden; 25 | 26 | .editor { 27 | background: #444; 28 | position: absolute; 29 | margin: auto; 30 | left: 0; 31 | right: 0; 32 | top: 0; 33 | bottom: 0; 34 | width: 90%; 35 | height: 90%; 36 | max-width: 1000px; 37 | max-height: 700px; 38 | border-radius: 5px; 39 | overflow: hidden; 40 | box-shadow: 0 10px 20px 2px rgba(0, 0, 0, 0.5); 41 | transition: all 300ms ease; 42 | 43 | .editor-header { 44 | background-color: #fff; 45 | padding: 0 10px; 46 | font-size: 0; 47 | line-height: 25px; 48 | cursor: default; 49 | 50 | .action-buttons { 51 | display: inline-block; 52 | vertical-align: middle; 53 | width: 50px; 54 | text-align: center; 55 | font-size: 20px; 56 | 57 | & > * { 58 | width: 12px; 59 | height: 12px; 60 | border-radius: 50%; 61 | display: inline-block; 62 | cursor: pointer; 63 | 64 | &.a { 65 | background-color: #F44336 66 | } 67 | &.b { 68 | background-color: #FFC107 69 | } 70 | &.c { 71 | background-color: #8BC34A 72 | } 73 | 74 | &:hover { 75 | box-shadow: inset 0 0 0 100px rgba(0, 0, 0, 0.1); 76 | } 77 | 78 | } 79 | } 80 | .title { 81 | display: inline-block; 82 | vertical-align: middle; 83 | width: calc(100% - 50px); 84 | font-size: 14px; 85 | text-align: center; 86 | 87 | .file:after{ 88 | content: " - "; 89 | } 90 | } 91 | } 92 | 93 | .editor-frame { 94 | font-size: 0; 95 | height: calc(100% - 25px); 96 | 97 | & > * { 98 | display: inline-block; 99 | vertical-align: top; 100 | font-size: initial; 101 | height: 100%; 102 | } 103 | 104 | .file-menu { 105 | background-color: #555; 106 | width: 175px; 107 | font-size: 14px; 108 | .menu-title { 109 | line-height: 30px; 110 | padding: 5px 10px 0 10px; 111 | color: #ccc; 112 | } 113 | 114 | ul { 115 | list-style: none; 116 | padding: 0; 117 | margin: 0; 118 | background-color: rgba(0, 0, 0, 0.1); 119 | 120 | li { 121 | a { 122 | padding: 0 20px; 123 | line-height: 25px; 124 | display: block; 125 | color: #fff; 126 | font-weight: lighter; 127 | text-decoration: none; 128 | font-size: 12px; 129 | 130 | span { 131 | color: #aaa; 132 | } 133 | 134 | &.active { 135 | background-color: rgba(0, 0, 0, 0.2); 136 | } 137 | 138 | } 139 | } 140 | } 141 | } 142 | 143 | .file-frame { 144 | background-color: #252525; 145 | width: calc(100% - 175px); 146 | 147 | iframe { 148 | width: 100%; 149 | height: 100%; 150 | border: none; 151 | } 152 | 153 | } 154 | } 155 | 156 | &.close { 157 | transform: scale(.8); 158 | opacity: 0; 159 | cursor: default; 160 | pointer-events: none; 161 | } 162 | &.min { 163 | top: initial; 164 | bottom: 25px; 165 | transform: translateY(100%); 166 | } 167 | &.full { 168 | max-width: 100%; 169 | width: 100%; 170 | max-height: 100%; 171 | height: 100%; 172 | border-radius: 0; 173 | 174 | .editor-header { 175 | background-color: #353535; 176 | color: #ccc; 177 | } 178 | 179 | } 180 | &.passive{ 181 | box-shadow: none; 182 | 183 | .action-buttons > *{ 184 | background-color: #d5d5d5 !important; 185 | } 186 | } 187 | } 188 | } 189 | 190 | body#code { 191 | counter-reset: line; 192 | background-color: #252525; 193 | font-family: 'Source Code Pro', monospace; 194 | font-size: 14px; 195 | color: #eee; 196 | padding: 5px 0; 197 | box-shadow: inset 40px 0 0 0 #303030; 198 | 199 | ::selection { 200 | background: #000; 201 | } 202 | ::-moz-selection { 203 | background: #000; 204 | } 205 | 206 | &::-webkit-scrollbar { 207 | width: 8px; 208 | } 209 | 210 | &::-webkit-scrollbar-track { 211 | background-color: rgba(0, 0, 0, 0.2); 212 | } 213 | 214 | &::-webkit-scrollbar-thumb { 215 | background-color: rgba(255, 255, 255, 0.1); 216 | } 217 | 218 | $text-indent: 20px; 219 | 220 | .row { 221 | display: block; 222 | line-height: 18px; 223 | height: 18px; 224 | text-indent: $text-indent; 225 | white-space: nowrap; 226 | font-size: 0; 227 | 228 | &.active { 229 | background: rgba(0, 0, 0, 0.15); 230 | } 231 | &:before { 232 | counter-increment: line; 233 | content: counter(line); 234 | width: 30px; 235 | float: left; 236 | text-align: right; 237 | font-size: 12px; 238 | text-indent: 0; 239 | color: #777; 240 | } 241 | &:after { 242 | content: ","; 243 | color: orange; 244 | font-size: 14px; 245 | } 246 | 247 | & > * { 248 | display: inline-block; 249 | text-indent: 0; 250 | font-size: 14px; 251 | } 252 | 253 | &.end { 254 | &:after { 255 | content: ""; 256 | } 257 | } 258 | 259 | @for $i from 1 through 10 { 260 | &.t#{$i} { 261 | text-indent: $text-indent +(20 * ($i - 1)); 262 | } 263 | } 264 | 265 | .name { 266 | color: #b593ff; 267 | &:after { 268 | content: ":"; 269 | color: orange; 270 | margin-right: 5px; 271 | } 272 | } 273 | 274 | .value { 275 | color: #afc757; 276 | &.and { 277 | &:after { 278 | content: ","; 279 | color: orange; 280 | font-size: 14px; 281 | margin-right: 5px; 282 | } 283 | } 284 | } 285 | 286 | .obj { 287 | 288 | } 289 | .boo { 290 | color: orange; 291 | } 292 | .cmd { 293 | color: gray; 294 | font-style: italic; 295 | } 296 | 297 | a { 298 | color: #6dd4ff !important; 299 | text-decoration: none; 300 | 301 | &:hover { 302 | color: #a4f2ff !important; 303 | } 304 | } 305 | } 306 | } 307 | 308 | body#image { 309 | font-family: 'Source Code Pro', monospace; 310 | 311 | img { 312 | width: 90%; 313 | max-width: 250px; 314 | margin: 30px; 315 | box-shadow: 0 5px 15px 0 rgba(0, 0, 0, 0.3); 316 | } 317 | 318 | small { 319 | font-size: 10px; 320 | display: block; 321 | margin: -20px 30px; 322 | color: #888; 323 | } 324 | } 325 | 326 | //MOBIL DEVICES 327 | @media (max-width: 768px) { 328 | body#desktop { 329 | .editor { 330 | .editor-frame { 331 | & > * { 332 | display: block; 333 | width: 100% !important; 334 | } 335 | 336 | .file-menu { 337 | height: 55px; 338 | .menu-title { 339 | padding: 0 10px; 340 | } 341 | ul { 342 | overflow-y: auto; 343 | white-space: nowrap; 344 | li { 345 | display: inline-block; 346 | vertical-align: middle; 347 | } 348 | } 349 | } 350 | 351 | .file-frame { 352 | height: calc(100% - 55px); 353 | } 354 | } 355 | } 356 | } 357 | } -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | //----------------------------------------------------------------------------------------------------------------// 2 | //GULP REQUIRE 3 | var 4 | gulp = require('gulp'), 5 | sass = require('gulp-sass'), 6 | autoprefixer = require('gulp-autoprefixer'), 7 | jade = require('gulp-jade'), 8 | browserSync = require('browser-sync'), 9 | concat = require('gulp-concat'), 10 | uglify = require('gulp-uglify'), 11 | reload = browserSync.reload, 12 | 13 | vendor_js = ['node_modules/jquery/dist/jquery.js'], 14 | vendor_css = ['node_modules/normalize-css/normalize.css']; 15 | 16 | //----------------------------------------------------------------------------------------------------------------// 17 | //GULP TASKS 18 | 19 | gulp 20 | .task('css', function () { 21 | gulp.src('_app/sass/**/*.scss') 22 | .pipe(sass().on('error', sass.logError)) 23 | .pipe(sass({outputStyle: 'compressed'})) 24 | .pipe(autoprefixer({browsers: ['last 2 versions', '> 5%', 'Firefox ESR']})) 25 | .pipe(gulp.dest('www/css/')); 26 | gulp.src(vendor_css[0]) 27 | .pipe(sass({outputStyle: 'compressed'})) 28 | .pipe(concat('vendor.css')) 29 | .pipe(gulp.dest('www/css/')); 30 | }) 31 | 32 | .task('jade', function () { 33 | gulp.src(['_app/jade/*.jade', '_app/jade/_files/*.jade', '!_app/jade/_*.jade']) 34 | .pipe(jade({ 35 | pretty: true 36 | })) 37 | .pipe(gulp.dest('www/')) 38 | .pipe(reload({stream: true})); 39 | }) 40 | 41 | .task('scripts', function () { 42 | gulp.src(['_app/js/**/*.js', '!_app/js/**/_*.js']) 43 | .pipe(uglify({mangle: false})) 44 | .pipe(concat('scripts.js')) 45 | .pipe(gulp.dest('www/js')); 46 | gulp.src(vendor_js) 47 | .pipe(uglify()) 48 | .pipe(concat('vendor.js')) 49 | .pipe(gulp.dest('www/js')) 50 | .pipe(reload({stream: true})) 51 | }) 52 | 53 | .task('browser-sync', function () { 54 | browserSync({ 55 | files: 'www/**/*', 56 | server: { 57 | baseDir: 'www/' 58 | }, 59 | https: false, 60 | port: 1923 61 | }); 62 | }) 63 | 64 | //-------------------------------------------------------------------------------------------------------------// 65 | //GULP START 66 | .task('watch', function () { 67 | gulp.watch('_app/sass/**/*.scss', ['css']); 68 | gulp.watch('_app/jade/**/*.jade', ['jade']); 69 | gulp.watch('_app/js/**/*.js', ['scripts']); 70 | }) 71 | 72 | .task('default', ['jade', 'css', 'scripts', 'browser-sync', 'watch']); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cv-editor", 3 | "version": "1.0.0", 4 | "description": "CV Page Design", 5 | "main": "gulpfile.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/webexxe/cv-editor.git" 9 | }, 10 | "author": "Emre Tekin", 11 | "license": "ISC", 12 | "bugs": { 13 | "url": "https://github.com/webexxe/cv-editor/issues" 14 | }, 15 | "homepage": "https://github.com/webexxe/cv-editor#readme", 16 | "devDependencies": { 17 | "browser-sync": "^2.18.7", 18 | "gulp": "^3.9.1", 19 | "gulp-autoprefixer": "^3.1.1", 20 | "gulp-concat": "^2.6.1", 21 | "gulp-jade": "^1.1.0", 22 | "gulp-sass": "^3.1.0", 23 | "gulp-uglify": "^2.0.1", 24 | "jquery": "^3.1.1", 25 | "normalize-css": "^2.3.1" 26 | } 27 | } 28 | --------------------------------------------------------------------------------