Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URLs added here will be added as <link>s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Auto Save

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                .chat_window
  .top_menu
    .buttons
      .button.close
      .button.minimize
      .button.maximize
    .title Chat
  ul.messages
  .bottom_wrapper.clearfix
    .message_input_wrapper
      input.message_input placeholder='Type your message here...'
    .send_message
      .icon
      .text Send
    
.message_template
  li.message
    .avatar
    .text_wrapper
      .text

              
            
!

CSS

              
                $chatWindowMaxWidth: 800px
$chatWindowHeight: 500px
$colorGray: #edeff2
$colorGrayLight: #f8f8f8
$colorGrayDark: #bcbdc0
$colorGreen: #a3d063
$colorWhite: #fff
$colorOrange: #fdbf68
$colorOrangeLight: #ffe6cb
$colorOrangeDark: #c48843
$colorBlueLight: #c7eafc
$colorBlueDark: #45829b
$colorRed: #f5886e

*
  box-sizing: border-box

body
  background-color: $colorGray
  font-family: "Calibri", "Roboto", sans-serif
 
.chat_window
  position: absolute
  width: calc(100% - 20px)
  max-width: $chatWindowMaxWidth
  height: $chatWindowHeight
  border-radius: 10px
  background-color: $colorWhite
  left: 50%
  top: 50%
  transform: translateX(-50%) translateY(-50%)
  box-shadow: 0 10px 20px rgba(0, 0, 0, .15)
  background-color: $colorGrayLight
  overflow: hidden
  
.top_menu
  background-color: $colorWhite
  width: 100%
  padding: 20px 0 15px
  box-shadow: 0 1px 30px rgba(0, 0, 0, .1)
  .buttons
    margin: 3px 0 0 20px
    position: absolute
    .button
      width: 16px
      height: 16px
      border-radius: 50%
      display: inline-block
      margin-right: 10px
      position: relative
      &.close
        background-color: $colorRed
      &.minimize
        background-color: $colorOrange
      &.maximize
        background-color: $colorGreen
  .title
    text-align: center
    color: $colorGrayDark
    font-size: 20px

.messages
  position: relative
  list-style: none
  padding: 20px 10px 0 10px
  margin: 0
  height: 347px
  overflow: scroll
  .message
    clear: both
    overflow: hidden
    margin-bottom: 20px
    transition: all .5s linear
    opacity: 0
    &.left
      .avatar
        background-color: $colorRed
        float: left
      .text_wrapper
        background-color: $colorOrangeLight
        margin-left: 20px
        &::after,
        &::before
          right: 100%
          border-right-color: $colorOrangeLight
      .text
        color: $colorOrangeDark
    &.right
      .avatar
        background-color: $colorOrange
        float: right
      .text_wrapper
        background-color: $colorBlueLight
        margin-right: 20px
        float: right
        &::after,
        &::before
          left: 100%
          border-left-color: $colorBlueLight
      .text
        color: $colorBlueDark
    &.appeared
      opacity: 1
    .avatar
      width: 60px
      height: 60px
      border-radius: 50%
      display: inline-block
    .text_wrapper
      display: inline-block
      padding: 20px
      border-radius: 6px
      width: calc(100% - 85px)
      min-width: 100px
      position: relative
      &::after,
      &:before
        top: 18px
        border: solid transparent
        content: ' '
        height: 0
        width: 0
        position: absolute
        pointer-events: none
      &::after
        border-width: 13px
        margin-top: 0px
      &::before
        border-width: 15px
        margin-top: -2px
      
      .text
        font-size: 18px
        font-weight: 300

.bottom_wrapper
  position: relative
  width: 100%
  background-color: $colorWhite
  padding: 20px 20px
  position: absolute
  bottom: 0
  .message_input_wrapper
    display: inline-block
    height: 50px
    border-radius: 25px
    border: 1px solid $colorGrayDark
    width: calc(100% - 160px)
    position: relative
    padding: 0 20px
    .message_input
      border: none
      height: 100%
      box-sizing: border-box
      width: calc(100% - 40px)
      position: absolute
      outline-width: 0
      color: gray
  .send_message
    width: 140px
    height: 50px
    display: inline-block
    border-radius: 50px
    background-color: $colorGreen
    border: 2px solid $colorGreen
    color: $colorWhite
    cursor: pointer
    transition: all .2s linear
    text-align: center
    float: right
    &:hover
      color: $colorGreen
      background-color: $colorWhite
    .text
      font-size: 18px
      font-weight: 300
      display: inline-block
      line-height: 48px

.message_template
  display: none
  
              
            
!

JS

              
                Message = ({ @text, @message_side }) ->
  @draw = =>
    $message = $($('.message_template').clone().html())
    $message.addClass(@message_side).find('.text').html(@text)
    $('.messages').append($message)
    setTimeout ->
      $message.addClass('appeared')
    , 0
  @
  
$ ->
  message_side = 'right'
  
  getMessageText = ->
    $message_input = $('.message_input')
    $message_input.val()
  
  sendMessage = (text) ->
    return if text.trim() is ''

    $('.message_input').val('')
    $messages = $('.messages')
    message_side = if message_side is 'left' then 'right' else 'left'

    message = new Message({ text,  message_side })
    message.draw()
    $messages.animate  { scrollTop: $messages.prop('scrollHeight') }, 300
  
  $('.send_message').click (e) ->
    sendMessage getMessageText()
    
  $('.message_input').keyup (e) ->
    sendMessage(getMessageText()) if e.which is 13 # enter key
    
  sendMessage('Hello Philip! :)')
  setTimeout ->
    sendMessage('Hi Sandy! How are you?')
  , 1000
  
  setTimeout ->
    sendMessage('I\'m fine, thank you!')
  , 2000
              
            
!
999px

Console