.c-message-box

scss
.c-message-box {
  background-color: use-color(base, 'white');
  color: use-color('grey', dark);
  display: flex;
  flex-direction: column;
  letter-spacing: 0.11px;
  line-height: 22px;
  min-height: 96%;
  overflow: auto;
  overflow-x: hidden;
  padding: 16px 16px 0;

  @include element('message') {
    @extend %message-base;
  }

  @include element('message-whisper') {
    @extend %message-base;
    background-color: use-color(base, true-white);
    border: dashed 1px use-color('grey', light-alt);
    min-height: max-content;
    min-width: 160px;
    overflow-x: hidden;
    padding-top: 0;

    label {
      color: use-color('grey', dark);
    }
  }

  @include element('message-sended') {
    @extend %message-base;
    @extend %message-sended-base;

    @include modifier('loading') {
      &::before {
        animation: loading-rotator 0.8s linear infinite, loading-colors 6s ease infinite;
        border-bottom: 4px solid;
        border-left: 4px solid transparent;
        border-radius: 50%;
        border-right: 4px solid;
        border-top: 4px solid;
        content: '';
        height: 14px;
        left: -24px;
        position: absolute;
        top: 8px;
        width: 14px;
      }
    }
  }

  @include element('message-intervention') {
    @extend %message-base;
    @extend %message-sended-base;
    min-height: max-content;
    min-width: 160px;
    overflow-x: hidden;
    padding: 0 40px 5px 12px;
    position: relative;

    &::before {
      background-color: use-color(secondary);
      border-radius: 4px 0 0 4px;
      content: '';
      height: 100%;
      left: 0;
      position: absolute;
      top: 0;
      width: 4px;
    }
  }

  @include element('message-label') {
    @include use-font('caption', 'light');
    align-items: center;
    display: inline-block;
    left: 4px;
    margin-left: -8px;
    overflow: hidden;
    padding: 4px 20px 4px 24px;
    text-overflow: ellipsis;
    top: 0;
    white-space: nowrap;
    width: calc(100% + 16px);
    word-break: break-all;

    &.intervention {
      background-color: transparentize(use-color('base', 'true-white'), 0.6);

      &::before {
        @extend %chat-message-label-icon;
        color: use-color('secondary');
        content: '\E007'; //icon-intervention
        margin-left: 4px;
      }
    }

    &.whisper {
      background-color: transparentize(use-color('grey', 'light-i'), 0.8);
      left: 0;
      padding-left: 28px;

      &::before {
        @extend %chat-message-label-icon;
        content: '\E011'; //icon-whispering
        left: 8px;
        margin-right: 4px;
      }
    }
  }

  @include element('username-label') {
    @include use-font('caption', 'semibold');
    align-items: center;
    color: use-color('secondary');
    display: inline-block;
    margin-bottom: -5px;
    overflow: hidden;
    text-overflow: ellipsis;
    text-transform: capitalize;
    white-space: nowrap;
    width: 100%;
    word-break: break-all;
  }

  @include element('message-status') {
    @include use-font('caption', 'light');
    color: use-color('grey', light);
    display: flex;
    margin: -4px 0 4px;
    padding: 0 4px;
    position: relative;

    &.not-visible {
      align-self: flex-start;
      justify-content: flex-start;

      &::after {
        @extend %chat-status-icon;
        content: '\E00A'; //icon-message-invisible
      }
    }

    &.visible {
      align-self: flex-end;
      justify-content: flex-end;

      &::after {
        @extend %chat-status-icon;
        content: '\E00E'; //icon-message-visible
      }
    }
    
    &.not-sent {
      align-self: flex-end;
      color: use-color(event, error);
      justify-content: flex-end;

      &::after {
        @extend %chat-status-icon;
        content: '\E00C'; //icon-message-not-sent
      }
    }
  }

  @include element('chat-state') {
    @include use-font('caption', 'light');
    align-items: center;
    background-color: transparentize(use-color('grey', light-i), 0.6);
    border-bottom: solid 1px use-color('grey', light-i);
    border-top: solid 1px use-color('grey', light-i);
    color: use-color('grey', light);
    display: flex;
    justify-content: center;
    margin: 8px 0 16px -16px;
    padding: 4px 0;
    text-transform: lowercase;
    width: calc(100% + 32px);

    [class^='icon-'],
    [class*=' icon-'] {
      font-size: 17px;
      margin-right: 8px;
    }
  }

  @include element('message-attachment') {
    @include use-font('caption', 'regular');
    background: transparentize(use-color('grey'), 0.9);
    border-bottom: 0;
    border-radius: 4px;
    color: use-color('grey');
    display: flex;
    margin-bottom: 4px;
    max-height: 40px;
    padding: 8px;
    width: 100%;

    img {
      margin-right: 8px;
    }
  }

  @include element('typing-indicator') {
    align-items: center;
    background-color: use-color(messages, received);
    background-image: $message-box-received-gradient;
    border-radius: 4px;
    box-shadow: $box-shadow-messages;
    display: flex;
    height: 35px;
    justify-content: space-between;
    margin-bottom: 4px;
    padding: 0 14px;
    position: relative;
    width: 40px;

    span {
      background-color: use-color('grey', light-i);
      border-radius: 50%;
      height: 10px;
      opacity: 0.4;
      width: 10px;

      @for $i from 1 through 3 {
        $delay: (
          1: 0.3333s,
          2: 0.6666s,
          3: 0.9999s
        );

        &:nth-child(#{$i}) {
          animation: 1s blink infinite map-get($delay, $i);
        }
      }
    }
  }

  // dropup rewrite
  .c-dropup {
    top: -24px;
  }

  // time send
  small {
    @include use-font('caption', 'regular');
    bottom: 1px;
    color: use-color('grey', light);
    position: absolute;
    right: 8px;
    
    span {
      display: inline-block;
      font-size: 12px;
      position: absolute;
      right: 0;
      top: -8px;
    }
    
    > .read {
      color: use-color(event, success);
    }

    .icon-message-resend,
    .icon-message-sent {
      font-size: 10px;
    }

  }
}

Classes & Estructura para el uso del Message box de Chattigo.

Todos los mensajes deben estar contenidos dentro de la clase .c-message-box. Dependiendo del tipo del mensaje, debe estar contenidos dentro de la clase que corresponda:

Mensajes

  • mensajes recibidos
    • .c-message-box__message
  • mensajes enviados
    • .c-message-box__message-sended
  • mensajes de susurros
    • .c-message-box__message-whisper
  • mensajes de intervención del supervisor
    • .c-message-box__message-intervention

Username Label - Mensajes Grupos

Para los mensajes enviados en grupos, para diferenciar el usuario que envío el mensaje, se debe agregar un label con el nombre del usuario y la clase c-message-box__username-label.

  <div class="c-message-box__message">
    <label class="c-message-box__username-label">
      Nombre de usuario
    </label>
    Quiero saber como se hace
    <small>10:00</small>
  </div>

Labels Mensajes: Susurros e Intervención

En el caso de los susurros e intervenciones, los mensajes deben ir acompañados de un label con la descripción correspondiente y el nombre de quien envío el mensaje.

La clase para los label es .c-message-box__message-label.

En el caso del whisper hay que agregar la clase .whisper la cual agregara el icono correspondiente:

  <div class="c-message-box__message-whisper">
    <label class="c-message-box__message-label whisper">
      Susurro de Oliver Hidalgo
    </label>
    Envíale el link de pago y registro para que no lo tenga que buscar
    <small>10:03</small>
  </div>

Para la intervención hay que agregar la clase .intervention la cual agregara el icono correspondiente:

  <div class="c-message-box__message-intervention">
    <label class="c-message-box__message-label intervention">
      Intervención de Oliver Hidalgo
    </label>
    Estimado Clientísimo Cliente, <br>¿Cómo le va?
    <small>10:08</small>
  </div>

Mensajes Estados

Los mensajes pueden tener algunos estados que quedan descritos bajo el mensaje, para todos los estados la clase principal es .c-message-box__message-status, dependiendo del caso se debe agregar la clase que identificara el tipo de estado, estas clases agregaran el icono correspondiente al mensaje.

  • Visible para cliente:
    • .c-message-box__message-status .visible
  • No visible para cliente:
    • .c-message-box__message-status .invisible
  • Mensaje no enviado:
    • .c-message-box__message-status .not-sent
  <span class="c-message-box__message-status visible">
    Visible para cliente
  </span>
  <span class="c-message-box__message-status not-visible">
    No visible para cliente
  </span>
  <span class="c-message-box__message-status not-sent">
    Mensaje no enviado
  </span>

Chat Estados

Cualquier el contenido del Chat puede ser afectado por estados como lo serían los de transferencia y asignación.

Estós estados quedan como un punto en el historial del chat y todos estos mantienen gráficamente el mismo comportamiento dentro del chat.

Sin embargo, cada estado varía su icono y mensaje:

  • Chat Asignado: usa el icono .icon-intervention
      <div class="c-message-box__chat-state">
        <span class="icon-intervention"></span>
        chat asignado por Supervisor
      </div>
    
  • Chat Transferido: usa el icono .icon-chat-transfer y el mensaje puede variar entre chat transferido por… o chat transferido a…
      <div class="c-message-box__chat-state">
        <span class="icon-chat-transfer"></span>
        chat transferido por nomagente
      </div>
    
      <div class="c-message-box__chat-state">
        <span class="icon-chat-transfer"></span>
        chat transferido a nomagente
      </div>
    

Attachment

Para mostrar un attachment dentro de un mensaje junto a un icono descriptivo,
Usar en la etiqueta <a> la clase .c-message-box__message-attachment en lugar de la clase .c-action-link.

Messages Deliver Status Icons

Los mensajes enviados pueden tener iconos en los cuales se puede identificar si un mensaje fue enviado, recibido, leido o que el mensaje no fue enviado y necesita una acción para ser reenviado.

Estos iconos deben ir dentro de la etiqueta small antes del tiempo y en el
caso de que un mensaje sea recibido y leido debe estar acompañada de la clase .read (en la etiqueta del icono).

icons class:

  • leido: .icon-message-received .read
      <div class="c-message-box__message-sended">
        Tiene que pagar para poder ingresar
        <small>
          <span class="icon-message-received read"></span>
          10:04
        </small>
      </div>
    
  • recibido: .icon-message-received
      <div class="c-message-box__message-sended">
        Tiene que pagar para poder ingresar
        <small>
          <span class="icon-message-received"></span>
          10:04
        </small>
      </div>
    
  • enviado: .icon-message-sent
      <div class="c-message-box__message-sended">
        Tiene que pagar para poder ingresar
        <small>
          <span class="icon-message-sent"></span>
          10:04
        </small>
      </div>
    
  • no enviado/reenviar: .icon-message-resend
      <div class="c-message-box__message-sended">
        Tiene que pagar para poder ingresar
        <small>
          <span class="icon-message-resend"></span>
          10:04
        </small>
      </div>
    

Indicador ‘Escribiendo’

Se utiliza para indicar cuando se esta tipieando.

  <div class="c-message-box__typing-indicator">
    <span></span>
    <span></span>
    <span></span>
  </div>

Dropup options in messages

Para opciones en el mensaje como Envio Outbound, existe el componente .c-dropup.

Básicamente este es el código a agregar en los mensajes:

  <div class="c-dropup__trigger">
    <span class="icon-menu-options"></span>
  </div>
  
  <ul class="c-dropup">
    <li class="c-dropup__item">
      <a href="#">
        <span class="icon-outbound"></span>
        Enviar Outbound
      </a>
    </li>
  </ul>

Example

html todos elementos descritos anteriormente
<div class="c-message-box">
  <div class="c-message-box__message">
    <label class="c-message-box__username-label">
      Nombre de usuario para los mensajes de grupos
    </label>
    hola
    <small>10:00</small>
  </div>
  
  <div class="c-message-box__message">
    <label class="c-message-box__username-label">
      Nombre de usuario
    </label>
    Quiero saber como se hace
    <small>10:00</small>
    <div class="c-dropup__trigger">
      <span class="icon-menu-options"></span>
    </div>
    <ul class="c-dropup">
      <li class="c-dropup__item">
        <a href="">
          <span class="icon-outbound"></span>
          Enviar Outbound
        </a>
      </li>
    </ul>
  </div>

  <div class="c-message-box__chat-state">
    <span class="icon-intervention"></span>
    Chat asignado por Supervisor
  </div>

  <div class="c-message-box__message-sended">
    Tiene que pagar para poder ingresar
    <small>
      <span class="icon-message-received"></span>
      10:00
    </small>
  </div>

  <div class="c-message-box__message-whisper">
    <label class="c-message-box__message-label whisper">
      Susurro de Oliver Hidalgo
    </label>
    Envíale el link de pago y registro para que no lo tenga que buscar
    <small>10:03</small>
  </div>
  <span class="c-message-box__message-status not-visible">
    No visible para cliente
  </span>

  <div class="c-message-box__message-sended">
    Aquí le dejo el link de pago
    <small>10:04</small>
  </div>

  <div class="c-message-box__message-sended">
    <a class="c-action-link" href="#">http://pagaporfa.org</a>
    <small>
      <span class="icon-message-sent"></span>
      10:04
    </small>
  </div>
  
  <div class="c-message-box__message-intervention">
    <label class="c-message-box__message-label intervention">
      Intervención de Oliver Hidalgo
    </label>
    Estimado Clientísimo Cliente, <br>¿Cómo le va?
    <small>
      <span class="icon-message-received read"></span>
      10:08
    </small>
  </div>
  <span class="c-message-box__message-status visible">
    Visible para cliente
  </span>

  <div class="c-message-box__chat-state">
    <span class="icon-chat-transfer"></span>
    chat transferido por nomagente
  </div>

  <div class="c-message-box__message-sended c-message-box__message-sended--loading">
    <a class="c-message-box__message-attachment">
      <img src="https://cdn.chattigo.com/assets/img/attachment/preview-tiny/PDF.svg" />
      Attachment name.pdf
    </a>
    Adjunto PDF
    <small>
      <span class="icon-message-resend"></span>
      10:10
    </small>
  </div>
  <span class="c-message-box__message-status not-sent">
    Mensaje no enviado
  </span>

  <div class="c-message-box__chat-state">
    <span class="icon-chat-transfer"></span>
    chat transferido a nomagente
  </div>

  <div class="c-message-box__typing-indicator">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>

</div>