Permalink
Browse files

Initial commit

  • Loading branch information...
0 parents commit b7adc2a4383a99397e362b62b5800ac1b9613543 @BuckyMaler committed Nov 25, 2016
Showing with 2,092 additions and 0 deletions.
  1. +3 −0 .babelrc
  2. +83 −0 .gitignore
  3. +15 −0 README.md
  4. +41 −0 config/auth.js
  5. +30 −0 config/db-setup.js
  6. +24 −0 config/helpers.js
  7. +46 −0 config/middleware.js
  8. +3 −0 config/secrets.js
  9. +27 −0 db/schema.js
  10. +2 −0 dist/assets/css/main.css
  11. +1 −0 dist/assets/img/checkmark.svg
  12. +1 −0 dist/assets/img/cross.svg
  13. +1 −0 dist/assets/img/select.svg
  14. +1 −0 dist/assets/img/user.svg
  15. +25 −0 dist/assets/js/app.js
  16. +18 −0 dist/views/index.html
  17. +16 −0 kill.sh
  18. +83 −0 package.json
  19. +93 −0 routes/apiRouter.js
  20. +69 −0 routes/authRouter.js
  21. +26 −0 routes/indexRouter.js
  22. +74 −0 server.js
  23. +36 −0 src/assets/css/1-base/_animations.sass
  24. +10 −0 src/assets/css/1-base/_body-element.sass
  25. +3 −0 src/assets/css/1-base/_fonts.scss
  26. +221 −0 src/assets/css/1-base/_normalize.scss
  27. +14 −0 src/assets/css/1-base/_selection-colors.sass
  28. +8 −0 src/assets/css/1-base/_vars.sass
  29. +14 −0 src/assets/css/2-layout/_grid.sass
  30. +94 −0 src/assets/css/3-modules/_form.sass
  31. +123 −0 src/assets/css/3-modules/_header.sass
  32. +68 −0 src/assets/css/3-modules/_login-success.sass
  33. +15 −0 src/assets/css/3-modules/_main.sass
  34. +45 −0 src/assets/css/3-modules/_sidebar.sass
  35. +77 −0 src/assets/css/3-modules/_taskList.sass
  36. +5 −0 src/assets/css/3-modules/_views.sass
  37. +24 −0 src/assets/css/main.sass
  38. +1 −0 src/assets/img/checkmark.svg
  39. +1 −0 src/assets/img/cross.svg
  40. +1 −0 src/assets/img/select.svg
  41. +1 −0 src/assets/img/user.svg
  42. +88 −0 src/assets/js/actions.js
  43. +42 −0 src/assets/js/app.js
  44. +42 −0 src/assets/js/components/form.js
  45. +44 −0 src/assets/js/components/header.js
  46. +19 −0 src/assets/js/components/headerForm.js
  47. +32 −0 src/assets/js/components/login.js
  48. +26 −0 src/assets/js/components/loginSuccess.js
  49. +38 −0 src/assets/js/components/register.js
  50. +57 −0 src/assets/js/components/userTaskList.js
  51. +27 −0 src/assets/js/components/visitorTaskList.js
  52. +15 −0 src/assets/js/models/data.js
  53. +69 −0 src/assets/js/models/user.js
  54. +39 −0 src/assets/js/store.js
  55. +49 −0 src/assets/js/views/userView.js
  56. +44 −0 src/assets/js/views/visitorView.js
  57. +18 −0 src/views/index.html
@@ -0,0 +1,3 @@
+{
+ "presets": ["es2015","react"]
+}
@@ -0,0 +1,83 @@
+### OSX ###
+*.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+# Thumbnails
+._*
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules
+jspm_packages
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+
+
+### Sass ###
+.sass-cache/
+*.css.map
+
+
+### Config ###
+./config/secrets.js
@@ -0,0 +1,15 @@
+# [Simply2do](http://simply2do.herokuapp.com)
+
+Simply2do is a full stack application. The Front-End MVC is managed by Backbone and React. The Back-End is managed by Express and Mongoose. You can add, remove, and mark tasks as complete. In addition to that, you can filter tasks. Lastly, Simply2do includes user functionality, so sign up and start tracking your tasks.
+
+This project was developed with HTML5, Sass, JavaScript, Backbone, React + Flux, Mongoose, and Express.
+
+[LIVE PREVIEW](http://simply2do.herokuapp.com)
+
+## Credits:
+
+* [Sơn Min](https://dribbble.com/SonMin) heavily influenced the design
+
+## Misc:
+
+* Follow Bucky: [Twitter](https://twitter.com/BuckyMaler), [GitHub](https://github.com/BuckyMaler)
@@ -0,0 +1,41 @@
+const passport = require('passport')
+const LocalStrategy = require('passport-local').Strategy;
+
+
+module.exports = function(UserModel){
+ let authFields = {
+ usernameField: 'email',
+ passwordField: 'password'
+ }
+
+ let onLogin = function(inputUser, inputPW, done){
+ UserModel.findOne({"email": inputUser}, function(err, results){
+ console.log('running onlogin')
+ if(err || !results){
+ //will trigger failure callback
+ done(null , false, {message: "no user exists with that email"})
+ } else if(results.password !== inputPW) {
+ //will trigger failure callback
+ done(null, false, {message: "bad password"} )
+ } else {
+ done(null, results);
+ //calls req.login(results)
+ }
+ })
+
+ }
+
+ passport.serializeUser( function(user, done){
+ done(null, user.id);
+ } )
+
+ passport.deserializeUser( function(userId, done){
+ UserModel.findById(userId, "-password", function(err, record){
+ done(null, record)
+ })
+ })
+
+
+ passport.use( new LocalStrategy(authFields, onLogin) )
+}
+
@@ -0,0 +1,30 @@
+const mongoose = require('mongoose')
+
+module.exports = {
+ connectToDB: function(projectName){
+ console.log('running db-setup')
+ let dbLocation = 'mongodb://localhost/'+ projectName
+
+ if (process.env.NODE_ENV === "development"){
+ dbLocation += "_dev"
+ mongoose.connect(dbLocation , (err, db)=>{
+ if (err) {
+ console.log(err)
+ }
+ else {
+ console.log("\n\n===== Connected to: " + dbLocation + "=====\n\n")
+ }
+ })
+ } else {
+ mongoose.connect(process.env.MONGODB_URI , (err, db)=>{
+ if (err) {
+ console.log(err)
+ }
+ else {
+ console.log("\n\n===== Connected to: " + dbLocation + "=====\n\n")
+ }
+ })
+ }
+ console.log('finished setup')
+ }
+}
@@ -0,0 +1,24 @@
+const sanitizeUser = function(userRecord){
+ let userNoPW = {}
+
+ for (var prop in (userRecord._doc || userRecord)) {
+ if (prop !== 'password') userNoPW[prop] = userRecord._doc[prop]
+ }
+
+ return userNoPW
+}
+
+const updateFields = function(record, resBody){
+ if (resBody.password) delete req.body.password
+
+ for (var prop in resBody) {
+ record[prop] = resBody[prop]
+ }
+ return record
+}
+
+
+module.exports = {
+ sanitizeUser: sanitizeUser,
+ updateFields: updateFields
+}
@@ -0,0 +1,46 @@
+const checkAuth = function(req, res, next){
+ if(!req.user) {
+ res.status(400).send( 'no authenticated user for current session' )
+ }
+ else next()
+}
+
+const errorHandler = function(err, req, res, next) {
+ console.log(err)
+ res.render(err);
+ return
+}
+
+const cookifyUser = function(req,res,next) {
+ if (req.user) {
+ res.cookie(global.PROJECT_NAME + '_user',JSON.stringify(req.user))
+ res.cookie('tiy_full_stack_app_name', global.PROJECT_NAME)
+ next()
+ }
+ else {
+ console.log('no user')
+ res.cookie(global.PROJECT_NAME + '_user','null')
+ res.cookie('tiy_full_stack_app_name', global.PROJECT_NAME)
+ next()
+ }
+}
+
+const parseQuery = function(req,res,next) {
+ if (req.query) {
+ for (var prop in req.query) {
+ if (prop[0] === '$') {
+ let val = req.query[prop]
+ req.query[prop] = JSON.parse(val)
+ }
+ }
+ }
+ next()
+}
+
+module.exports = {
+ checkAuth: checkAuth,
+ errorHandler: errorHandler,
+ cookifyUser: cookifyUser,
+ parseQuery: parseQuery
+}
+
@@ -0,0 +1,3 @@
+module.exports = {
+ sessionSecret: 'friendship'
+}
@@ -0,0 +1,27 @@
+const mongoose = require('mongoose')
+
+// ----------------------
+// USERS
+// ----------------------
+const usersSchema = new mongoose.Schema({
+ // required for authentication
+ email: { type: String, required: true },
+ password: { type: String, required: true },
+ // x..x..x..x..x..x..x..x..x..x..x..x..x..x..x..x..x..x..x..x
+
+ // example of optional fields
+ name: { type: String },
+ createdAt: { type: Date, default: Date.now }
+
+})
+
+const taskSchema = new mongoose.Schema({
+ user_id: { type: String, required: true },
+ description: { type: String, required: true },
+ complete: { type: Boolean, default: false }
+})
+
+module.exports = {
+ User: mongoose.model('User', usersSchema),
+ Task: mongoose.model('Task', taskSchema)
+}
@@ -0,0 +1,2 @@
+@import url("https://fonts.googleapis.com/css?family=Roboto:400,500,700");/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}body{background-color:#2f2f2f;font-size:14px;line-height:1.6;font-family:'Roboto', sans-serif;color:#73716E;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;overflow-x:hidden}@-webkit-keyframes scaleUp{from{-webkit-transform:scale(0.8);transform:scale(0.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{from{-webkit-transform:scale(0.8);transform:scale(0.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes fadeUp{from{opacity:.5}to{opacity:1}}@keyframes fadeUp{from{opacity:.5}to{opacity:1}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes stroke{100%{stroke-dashoffset:0}}@keyframes stroke{100%{stroke-dashoffset:0}}@-webkit-keyframes scale{from{-webkit-transform:none;transform:none;50%{-webkit-transform:scale3d(1.1, 1.1, 1);transform:scale3d(1.1, 1.1, 1)}to{-webkit-transform:none;transform:none}}}@keyframes scale{from{-webkit-transform:none;transform:none;50%{-webkit-transform:scale3d(1.1, 1.1, 1);transform:scale3d(1.1, 1.1, 1)}to{-webkit-transform:none;transform:none}}}@-webkit-keyframes fill{100%{box-shadow:inset 0px 0px 0px 30px #C1A670}}@keyframes fill{100%{box-shadow:inset 0px 0px 0px 30px #C1A670}}::-moz-selection{background:#FFF498}::selection{background:#FFF498}::-moz-selection{background:#FFF498}img::-moz-selection{background:transparent}img::selection{background:transparent}img::-moz-selection{background:transparent}body{-webkit-tap-highlight-color:#FFF498}*{box-sizing:border-box}.l-wrapper{position:relative;width:90%;margin:0 auto}.l-wrapper--small{max-width:450px}.l-wrapper--medium{max-width:600px}.visitor-view,.user-view{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex}.sidebar{position:fixed;width:35%;height:100vh;background-color:#282828}.sidebar__toggle{display:none}@media (max-width: 991px){.sidebar{top:0;right:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:80%;max-width:350px;box-shadow:0 0 15px #222;z-index:1;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease, -webkit-transform .6s ease}.sidebar--is-open{-webkit-transform:translateX(0);transform:translateX(0)}.sidebar__toggle{position:absolute;top:15px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:30px;height:30px;cursor:pointer}.sidebar__toggle--close{left:0;opacity:0;-webkit-animation:fadeIn .6s ease-in-out 1s forwards;animation:fadeIn .6s ease-in-out 1s forwards}.sidebar__toggle--open{right:15px}.sidebar__toggle img{width:16px}}.main{position:relative;width:65%;opacity:.5;pointer-events:none}.main--logged-in{-webkit-animation:fadeUp .6s ease-in-out 1s forwards;animation:fadeUp .6s ease-in-out 1s forwards;pointer-events:auto}@media (max-width: 991px){.main{width:100%}}.form{-webkit-transform:scale(0.8);transform:scale(0.8);position:relative;padding-top:60px;opacity:0;-webkit-animation:scaleUp .6s ease-in-out forwards;animation:scaleUp .6s ease-in-out forwards}.form .options{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0 0 60px 0;padding:0;list-style:none}.form .options__el{font-size:28px;font-weight:700;font-family:serif;border-bottom:1px solid transparent;cursor:pointer;-webkit-transition:color .2s ease-in-out, border-color .2s ease-in-out;transition:color .2s ease-in-out, border-color .2s ease-in-out}.form .options span{margin:0 18px;font-weight:500}.form .register,.form .login{position:relative}.form .register__label,.form .login__label{display:block;color:#C1A670;font-weight:500;text-transform:uppercase}.form .register__submit,.form .login__submit{text-align:center}.form .register__submit button,.form .login__submit button{padding:8px 46px;color:#fff;font-weight:500;border:none;border-radius:50px;box-shadow:0 3px 20px #222;background-color:#C1A670;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.form .register__submit button:hover,.form .login__submit button:hover{background-color:#c4aa77}.form .register__input,.form .login__input{width:100%;margin-bottom:45px;padding:20px 0;color:#bebdbc;border:none;border-bottom:1px solid #73716E;border-radius:0;background-color:transparent;opacity:.6}.form .register__input:focus,.form .login__input:focus{outline:none}.form .register .login__alert,.form .login .login__alert{color:#C1A670;margin:0 0 15px 0;padding:5px 10px;border:1px solid #C1A670;border-radius:3px}@media (max-width: 480px){.form .options{margin:0 0 45px 0}.form .options__el{font-size:24px}.form .register__submit,.form .login__submit{margin-top:15px}.form .register__input,.form .login__input{margin-bottom:30px;padding:15px 0}}.header{position:relative;margin-top:60px}.header .filter{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:45px}.header .filter--is-open .filter__toggle-el{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.header .filter--is-open .filter__options-el span{-webkit-transform:translateX(0);transform:translateX(0);visibility:visible}.header .filter__toggle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:40px;height:40px;margin-right:45px;cursor:pointer}.header .filter__toggle-el{-webkit-transform:rotate(45deg);transform:rotate(45deg);display:block;width:24px;-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear, -webkit-transform .2s linear}.header .filter__options{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:0;list-style:none}.header .filter__options-el{margin-right:30px;font-weight:500;text-transform:uppercase;overflow:hidden}.header .filter__options-el:last-child{margin-right:0}.header .filter__options-el span{-webkit-transform:translateX(-100%);transform:translateX(-100%);display:block;visibility:hidden;cursor:pointer;-webkit-transition:color .2s ease-in-out, -webkit-transform .2s linear;transition:color .2s ease-in-out, -webkit-transform .2s linear;transition:transform .2s linear, color .2s ease-in-out;transition:transform .2s linear, color .2s ease-in-out, -webkit-transform .2s linear}.header .filter__options-el span.is-active{color:#C1A670}.header__title{color:#C1A670;font-size:46px;font-family:serif}.header__form{position:relative;margin-bottom:90px}.header__form-input{width:100%;padding:20px 35px 20px 0;color:#bebdbc;font-size:18px;font-family:serif;font-style:italic;border:none;border-bottom:1px solid #73716E;border-radius:0;background-color:transparent;opacity:.6}.header__form-input:focus{outline:none}.header__form-submit{position:absolute;top:50%;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:30px;height:30px;border:none;background:transparent}.header__form-submit img{-webkit-transform:rotate(45deg);transform:rotate(45deg);position:relative;left:-10px;display:block;width:22px;opacity:.6}@media (max-width: 480px){.header .filter{margin-bottom:45px}.header .filter__toggle{margin-right:30px}.header .filter__options-el{margin-right:18px}.header__title{font-size:32px}.header__form{margin-bottom:60px}}.login-success{position:relative;padding-top:60px}.login-success .blurb{font-weight:500;font-size:16px;text-align:left}.login-success .blurb .pull-request{color:#73716E;font-weight:700;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.login-success .blurb .pull-request:hover{color:#C1A670}.login-success .blurb__attribution{display:block;margin-top:10px;font-size:16px;font-family:serif;font-style:italic;text-align:right}.login-success__content{text-align:center;opacity:0;-webkit-animation:fadeIn .6s ease-in-out 1s forwards;animation:fadeIn .6s ease-in-out 1s forwards}.login-success__content .logout{margin-top:60px;font-weight:500;text-decoration:underline;border:none;background-color:transparent;-webkit-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.login-success__content .logout:hover{color:#C1A670}.login-success .checkmark{display:block;width:40px;height:40px;margin:0 auto 45px auto;border-radius:50%;stroke-width:2;stroke:#fff;stroke-miterlimit:10;box-shadow:inset 0px 0px 0px #C1A670;-webkit-animation:fill .4s ease-in-out .4s forwards, scale .2s ease-in-out .8s both;animation:fill .4s ease-in-out .4s forwards, scale .2s ease-in-out .8s both}.login-success .checkmark__circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:2;stroke-miterlimit:10;stroke:#C1A670;fill:none;-webkit-animation:stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;animation:stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards}.login-success .checkmark__check{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;-webkit-animation:stroke 0.2s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;animation:stroke 0.2s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards}.task-list{position:relative;margin:0 0 60px 0;padding:0;list-style:none}.task{margin-bottom:10px}.task__info{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.task__info input[type="checkbox"]{display:none}.task__info input[type="checkbox"]:checked ~ .task__info-status .toggle__target{opacity:.6}.task__info input[type="checkbox"]:checked ~ .task__info-status .toggle__checkmark{-webkit-transform:scale(1);transform:scale(1)}.task__info input[type="checkbox"]:checked ~ .task__info-description{opacity:.6}.task__info-status{position:relative;width:30px;height:30px;margin-right:15px}.task__info-status .toggle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;cursor:pointer}.task__info-status .toggle__target{width:12px;height:12px;border:2px solid #C1A670;border-radius:50%;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.task__info-status .toggle__checkmark{position:absolute;top:25%;left:35%;-webkit-transform:scale(0);transform:scale(0);display:block;width:14px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out, -webkit-transform .2s ease-in-out}.task__info-description{position:relative;font-size:18px;font-weight:500;cursor:pointer;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.task__info-description:hover::before{width:100%}.task__info-description::before{content:'';position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:0%;height:1px;background-color:#999794;-webkit-transition:width .2s ease;transition:width .2s ease}
+
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0" y="0" viewBox="0 0 20 14" xml:space="preserve" enable-background="new 0 0 20 14" fill="#C1A670"><path d="M19 0c0.3 0 0.5 0.1 0.7 0.3C19.9 0.5 20 0.7 20 1c0 0.3-0.1 0.5-0.3 0.7l-12 12C7.5 13.9 7.3 14 7 14s-0.5-0.1-0.7-0.3l-6-6C0.1 7.5 0 7.3 0 7c0-0.3 0.1-0.5 0.3-0.7S0.7 6 1 6c0.3 0 0.5 0.1 0.7 0.3L7 11.6 18.3 0.3C18.5 0.1 18.7 0 19 0z"/></svg>
Oops, something went wrong.

0 comments on commit b7adc2a

Please sign in to comment.