Based on this dribbble shot: https://dribbble.com/shots/1818748-Appon-Chat-Widget. Search field is functional. You can also add your own messages to the chat window! A random response will be given :)
A Pen by Justin Kaufman on CodePen.
Based on this dribbble shot: https://dribbble.com/shots/1818748-Appon-Chat-Widget. Search field is functional. You can also add your own messages to the chat window! A random response will be given :)
A Pen by Justin Kaufman on CodePen.
<div class="container clearfix"> | |
<div class="people-list" id="people-list"> | |
<div class="search"> | |
<input type="text" placeholder="search" /> | |
<i class="fa fa-search"></i> | |
</div> | |
<ul class="list"> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_01.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Vincent Porter</div> | |
<div class="status"> | |
<i class="fa fa-circle online"></i> online | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_02.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Aiden Chavez</div> | |
<div class="status"> | |
<i class="fa fa-circle offline"></i> left 7 mins ago | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_03.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Mike Thomas</div> | |
<div class="status"> | |
<i class="fa fa-circle online"></i> online | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_04.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Erica Hughes</div> | |
<div class="status"> | |
<i class="fa fa-circle online"></i> online | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_05.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Ginger Johnston</div> | |
<div class="status"> | |
<i class="fa fa-circle online"></i> online | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_06.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Tracy Carpenter</div> | |
<div class="status"> | |
<i class="fa fa-circle offline"></i> left 30 mins ago | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_07.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Christian Kelly</div> | |
<div class="status"> | |
<i class="fa fa-circle offline"></i> left 10 hours ago | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_08.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Monica Ward</div> | |
<div class="status"> | |
<i class="fa fa-circle online"></i> online | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_09.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Dean Henry</div> | |
<div class="status"> | |
<i class="fa fa-circle offline"></i> offline since Oct 28 | |
</div> | |
</div> | |
</li> | |
<li class="clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_10.jpg" alt="avatar" /> | |
<div class="about"> | |
<div class="name">Peyton Mckinney</div> | |
<div class="status"> | |
<i class="fa fa-circle online"></i> online | |
</div> | |
</div> | |
</li> | |
</ul> | |
</div> | |
<div class="chat"> | |
<div class="chat-header clearfix"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/195612/chat_avatar_01_green.jpg" alt="avatar" /> | |
<div class="chat-about"> | |
<div class="chat-with">Chat with Vincent Porter</div> | |
<div class="chat-num-messages">already 1 902 messages</div> | |
</div> | |
<i class="fa fa-star"></i> | |
</div> <!-- end chat-header --> | |
<div class="chat-history"> | |
<ul> | |
<li class="clearfix"> | |
<div class="message-data align-right"> | |
<span class="message-data-time" >10:10 AM, Today</span> | |
<span class="message-data-name" >Olia</span> <i class="fa fa-circle me"></i> | |
</div> | |
<div class="message other-message float-right"> | |
Hi Vincent, how are you? How is the project coming along? | |
</div> | |
</li> | |
<li> | |
<div class="message-data"> | |
<span class="message-data-name"><i class="fa fa-circle online"></i> Vincent</span> | |
<span class="message-data-time">10:12 AM, Today</span> | |
</div> | |
<div class="message my-message"> | |
Are we meeting today? Project has been already finished and I have results to show you. | |
</div> | |
</li> | |
<li class="clearfix"> | |
<div class="message-data align-right"> | |
<span class="message-data-time" >10:14 AM, Today</span> | |
<span class="message-data-name" >Olia</span> <i class="fa fa-circle me"></i> | |
</div> | |
<div class="message other-message float-right"> | |
Well I am not sure. The rest of the team is not here yet. Maybe in an hour or so? Have you faced any problems at the last phase of the project? | |
</div> | |
</li> | |
<li> | |
<div class="message-data"> | |
<span class="message-data-name"><i class="fa fa-circle online"></i> Vincent</span> | |
<span class="message-data-time">10:20 AM, Today</span> | |
</div> | |
<div class="message my-message"> | |
Actually everything was fine. I'm very excited to show this to our team. | |
</div> | |
</li> | |
<li> | |
<div class="message-data"> | |
<span class="message-data-name"><i class="fa fa-circle online"></i> Vincent</span> | |
<span class="message-data-time">10:31 AM, Today</span> | |
</div> | |
<i class="fa fa-circle online"></i> | |
<i class="fa fa-circle online" style="color: #AED2A6"></i> | |
<i class="fa fa-circle online" style="color:#DAE9DA"></i> | |
</li> | |
</ul> | |
</div> <!-- end chat-history --> | |
<div class="chat-message clearfix"> | |
<textarea name="message-to-send" id="message-to-send" placeholder ="Type your message" rows="3"></textarea> | |
<i class="fa fa-file-o"></i> | |
<i class="fa fa-file-image-o"></i> | |
<button>Send</button> | |
</div> <!-- end chat-message --> | |
</div> <!-- end chat --> | |
</div> <!-- end container --> | |
<script id="message-template" type="text/x-handlebars-template"> | |
<li class="clearfix"> | |
<div class="message-data align-right"> | |
<span class="message-data-time" >{{time}}, Today</span> | |
<span class="message-data-name" >Olia</span> <i class="fa fa-circle me"></i> | |
</div> | |
<div class="message other-message float-right"> | |
{{messageOutput}} | |
</div> | |
</li> | |
</script> | |
<script id="message-response-template" type="text/x-handlebars-template"> | |
<li> | |
<div class="message-data"> | |
<span class="message-data-name"><i class="fa fa-circle online"></i> Vincent</span> | |
<span class="message-data-time">{{time}}, Today</span> | |
</div> | |
<div class="message my-message"> | |
{{response}} | |
</div> | |
</li> | |
</script> |
(function(){ | |
var chat = { | |
messageToSend: '', | |
messageResponses: [ | |
'Why did the web developer leave the restaurant? Because of the table layout.', | |
'How do you comfort a JavaScript bug? You console it.', | |
'An SQL query enters a bar, approaches two tables and asks: "May I join you?"', | |
'What is the most used language in programming? Profanity.', | |
'What is the object-oriented way to become wealthy? Inheritance.', | |
'An SEO expert walks into a bar, bars, pub, tavern, public house, Irish pub, drinks, beer, alcohol' | |
], | |
init: function() { | |
this.cacheDOM(); | |
this.bindEvents(); | |
this.render(); | |
}, | |
cacheDOM: function() { | |
this.$chatHistory = $('.chat-history'); | |
this.$button = $('button'); | |
this.$textarea = $('#message-to-send'); | |
this.$chatHistoryList = this.$chatHistory.find('ul'); | |
}, | |
bindEvents: function() { | |
this.$button.on('click', this.addMessage.bind(this)); | |
this.$textarea.on('keyup', this.addMessageEnter.bind(this)); | |
}, | |
render: function() { | |
this.scrollToBottom(); | |
if (this.messageToSend.trim() !== '') { | |
var template = Handlebars.compile( $("#message-template").html()); | |
var context = { | |
messageOutput: this.messageToSend, | |
time: this.getCurrentTime() | |
}; | |
this.$chatHistoryList.append(template(context)); | |
this.scrollToBottom(); | |
this.$textarea.val(''); | |
// responses | |
var templateResponse = Handlebars.compile( $("#message-response-template").html()); | |
var contextResponse = { | |
response: this.getRandomItem(this.messageResponses), | |
time: this.getCurrentTime() | |
}; | |
setTimeout(function() { | |
this.$chatHistoryList.append(templateResponse(contextResponse)); | |
this.scrollToBottom(); | |
}.bind(this), 1500); | |
} | |
}, | |
addMessage: function() { | |
this.messageToSend = this.$textarea.val() | |
this.render(); | |
}, | |
addMessageEnter: function(event) { | |
// enter was pressed | |
if (event.keyCode === 13) { | |
this.addMessage(); | |
} | |
}, | |
scrollToBottom: function() { | |
this.$chatHistory.scrollTop(this.$chatHistory[0].scrollHeight); | |
}, | |
getCurrentTime: function() { | |
return new Date().toLocaleTimeString(). | |
replace(/([\d]+:[\d]{2})(:[\d]{2})(.*)/, "$1$3"); | |
}, | |
getRandomItem: function(arr) { | |
return arr[Math.floor(Math.random()*arr.length)]; | |
} | |
}; | |
chat.init(); | |
var searchFilter = { | |
options: { valueNames: ['name'] }, | |
init: function() { | |
var userList = new List('people-list', this.options); | |
var noItems = $('<li id="no-items-found">No items found</li>'); | |
userList.on('updated', function(list) { | |
if (list.matchingItems.length === 0) { | |
$(list.list).append(noItems); | |
} else { | |
noItems.detach(); | |
} | |
}); | |
} | |
}; | |
searchFilter.init(); | |
})(); |
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> | |
<script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/3.0.0/handlebars.min.js"></script> | |
<script src="//cdnjs.cloudflare.com/ajax/libs/list.js/1.1.1/list.min.js"></script> |
@import url(https://fonts.googleapis.com/css?family=Lato:400,700); | |
$green: #86BB71; | |
$blue: #94C2ED; | |
$orange: #E38968; | |
$gray: #92959E; | |
*, *:before, *:after { | |
box-sizing: border-box; | |
} | |
body { | |
background: #C5DDEB; | |
font: 14px/20px "Lato", Arial, sans-serif; | |
padding: 40px 0; | |
color: white; | |
} | |
.container { | |
margin: 0 auto; | |
width: 750px; | |
background: #444753; | |
border-radius: 5px; | |
} | |
.people-list { | |
width: 260px; | |
float: left; | |
.search { | |
padding: 20px; | |
} | |
input { | |
border-radius: 3px; | |
border: none; | |
padding: 14px; | |
color: white; | |
background: #6A6C75; | |
width: 90%; | |
font-size: 14px; | |
} | |
.fa-search { | |
position: relative; | |
left: -25px; | |
} | |
ul { | |
padding: 20px; | |
height: 770px; | |
li { | |
padding-bottom: 20px; | |
} | |
} | |
img { | |
float: left; | |
} | |
.about { | |
float: left; | |
margin-top: 8px; | |
} | |
.about { | |
padding-left: 8px; | |
} | |
.status { | |
color: $gray; | |
} | |
} | |
.chat { | |
width: 490px; | |
float:left; | |
background: #F2F5F8; | |
border-top-right-radius: 5px; | |
border-bottom-right-radius: 5px; | |
color: #434651; | |
.chat-header { | |
padding: 20px; | |
border-bottom: 2px solid white; | |
img { | |
float: left; | |
} | |
.chat-about { | |
float: left; | |
padding-left: 10px; | |
margin-top: 6px; | |
} | |
.chat-with { | |
font-weight: bold; | |
font-size: 16px; | |
} | |
.chat-num-messages { | |
color: $gray; | |
} | |
.fa-star { | |
float: right; | |
color: #D8DADF; | |
font-size: 20px; | |
margin-top: 12px; | |
} | |
} | |
.chat-history { | |
padding: 30px 30px 20px; | |
border-bottom: 2px solid white; | |
overflow-y: scroll; | |
height: 575px; | |
.message-data { | |
margin-bottom: 15px; | |
} | |
.message-data-time { | |
color: lighten($gray, 8%); | |
padding-left: 6px; | |
} | |
.message { | |
color: white; | |
padding: 18px 20px; | |
line-height: 26px; | |
font-size: 16px; | |
border-radius: 7px; | |
margin-bottom: 30px; | |
width: 90%; | |
position: relative; | |
&:after { | |
bottom: 100%; | |
left: 7%; | |
border: solid transparent; | |
content: " "; | |
height: 0; | |
width: 0; | |
position: absolute; | |
pointer-events: none; | |
border-bottom-color: $green; | |
border-width: 10px; | |
margin-left: -10px; | |
} | |
} | |
.my-message { | |
background: $green; | |
} | |
.other-message { | |
background: $blue; | |
&:after { | |
border-bottom-color: $blue; | |
left: 93%; | |
} | |
} | |
} | |
.chat-message { | |
padding: 30px; | |
textarea { | |
width: 100%; | |
border: none; | |
padding: 10px 20px; | |
font: 14px/22px "Lato", Arial, sans-serif; | |
margin-bottom: 10px; | |
border-radius: 5px; | |
resize: none; | |
} | |
.fa-file-o, .fa-file-image-o { | |
font-size: 16px; | |
color: gray; | |
cursor: pointer; | |
} | |
button { | |
float: right; | |
color: $blue; | |
font-size: 16px; | |
text-transform: uppercase; | |
border: none; | |
cursor: pointer; | |
font-weight: bold; | |
background: #F2F5F8; | |
&:hover { | |
color: darken($blue, 7%); | |
} | |
} | |
} | |
} | |
.online, .offline, .me { | |
margin-right: 3px; | |
font-size: 10px; | |
} | |
.online { | |
color: $green; | |
} | |
.offline { | |
color: $orange; | |
} | |
.me { | |
color: $blue; | |
} | |
.align-left { | |
text-align: left; | |
} | |
.align-right { | |
text-align: right; | |
} | |
.float-right { | |
float: right; | |
} | |
.clearfix:after { | |
visibility: hidden; | |
display: block; | |
font-size: 0; | |
content: " "; | |
clear: both; | |
height: 0; | |
} | |
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet" /> |