/* Copyright 2017 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

/* This template provides the styles used by the Speech feature. There is one UI
 * used for on the local NTP: the Full Page UI ("overlay") that takes over the
 * whole page.
 *
 * This mode also has a hidden and a visible state to allow for show and hide
 * animations. As such, there are 2 different UIs, specified by different
 * modifier classes (the class is applied to the Element with id=voice-overlay):
 *   - Hidden in the Full Page view (parent class: overlay-hidden).
 *   - Visible in the Full Page view (parent class: overlay).
 *
 * In addition, speech recognition can be in one of 5 different states that can
 * manifest in each of the UIs (the corresponding class names are applied to the
 * element with id=outer):
 *   - Listening for audio (parent class: voice-ml).
 *   - Receiving speech (parent class: voice-rs).
 *   - Error received (parent class: voice-er).
 *   - Inactive (no parent class).
 *
 * For details, see go/gws-speech-design and go/local-ntp-voice-search. */

/* Color constants. */
:root {
  --dark_red: rgb(205, 0, 0);
  --grey: #777;
  --light_grey: #eee;
  --light_red: rgb(255, 68, 68);

  --active_icon_color: white;
  --button_shadow: rgba(0, 0, 0, .1);
  --inactive_icon_color: #999;
  --level_animation_color: #dbdbdb;
  --listening_icon_color: var(--light_red);
  --text_link_color: rgb(17, 85, 204);
}

/* The dialog container for the background element. */
.overlay-dialog {
  background: transparent;
  border: none;
}

/* The background element. */
.overlay,
.overlay-hidden {
  background: white;
  height: 100%;
  left: 0;
  opacity: 0;
  overflow: hidden;
  position: fixed;
  text-align: left;
  top: 0;
  transition: visibility 0s linear 218ms, background-color 218ms;
  visibility: hidden;
  width: 100%;
  z-index: 10000;
}

/* Full Page visible style for the background element. */
.overlay {
  opacity: 1;
  transition-delay: 0s;
  visibility: visible;
}

/* The close 'x' button. */
.close-button {
  color: black;
  cursor: pointer;
  font-size: 26px;
  height: 11px;
  line-height: 15px;
  margin: 15px;
  opacity: .54;
  padding: 0;
  position: absolute;
  right: 0;
  top: 0;
  width: 15px;
}

html[dir=rtl] .close-button {
  left: 0;
  right: auto;
}

.close-button:hover {
  opacity: .66;
}

.close-button:active {
  opacity: .78;
}

/* The vertical positioning container. */
.outer {
  display: block;
  height: 42px;
  pointer-events: none;
  position: absolute;
}

/* Full Page visible and hidden state of the positioning container. */
.overlay .outer,
.overlay-hidden .outer {
  margin: auto;
  margin-top: 312px;
  max-width: 572px;
  min-width: 534px;
  padding: 0 223px;
  position: relative;
  top: 0;
}

/* Style for the inner container used for horizontal positioning. */
.inner-container {
  height: 100%;
  opacity: .1;
  pointer-events: none;
  transition: opacity 318ms ease-in;
  width: 100%;
}

.voice-ml .inner-container,
.voice-rs .inner-container,
.voice-er .inner-container {
  opacity: 1;
  transition: opacity 0s;
}

/* MICROPHONE BUTTON */
/* Button with microphone icon in center from which pulses and vibrations
 * emanate. */
.button {
  background-color: white;
  border: 1px solid var(--light_grey);
  border-radius: 100%;
  bottom: 0;
  box-shadow: 0 2px 5px var(--button_shadow);
  cursor: pointer;
  display: inline-block;
  left: 0;
  opacity: 0;
  pointer-events: none;
  position: absolute;
  right: 0;
  top: 0;
  transition: background-color 218ms, border 218ms, box-shadow 218ms;
}

/* Button state when speech recognition is inactive. */
.overlay-hidden .button {
  opacity: 0;
  pointer-events: none;
  position: absolute;
  transition-delay: 0;
}

/* Button state when speech recognition is active. */
.overlay .button {
  opacity: 1;
  pointer-events: auto;
  position: absolute;
  transition-delay: 0;
}

/* Button state when speech input is being received by the microphone. */
.voice-rs .button {
  background-color: var(--light_red);
  border: 0;
  box-shadow: none;
}

/* Vibrating input volume level. */
.level {
  background-color: var(--level_animation_color);
  border-radius: 100%;
  display: inline-block;
  height: 301px;
  left: -69px;
  opacity: 1;
  pointer-events: none;
  position: absolute;
  top: -69px;
  transform: scale(.01);
  transition: opacity 218ms;
  width: 301px;
}

/* Container for scaling and positioning of the button. */
.button-container {
  float: right;
  pointer-events: none;
  position: relative;
  transition: transform 218ms, opacity 218ms ease-in;
}

html[dir=rtl] .button-container {
  float: left;
}

/* Common styles applied to the button-container. */
.overlay .button-container,
.overlay-hidden .button-container {
  height: 165px;
  right: -70px;
  top: -70px;
  width: 165px;
}

html[dir=rtl] .overlay .button-container,
html[dir=rtl] .overlay-hidden .button-container {
  left: -70px;
  right: auto;
}

/* Container style when speech recognition is inactive. */
.overlay-hidden .button-container {
  transform: scale(.1);
}

/* Style applied to the button when clicked in the 'receiving audio' state. */
.voice-rs .button:active {
  background-color: var(--dark_red);
}

/* Style applied to the button when clicked. */
.button:active {
  background-color: var(--light_grey);
}

/* TEXT */
/* Classes:
 *   - voice-text - Text area style class
 *   - voice-text-2l - 2 line style class
 *   - voice-text-3l - 3 line style class
 *   - voice-text-4l - 4 line style class
 *   - voice-text-5l - 5 line style class */

/* Styles applied to the positioning text-container element. */
.text-container {
  pointer-events: none;
}

/* Full Page UI style for the text-container. */
.overlay .text-container,
.overlay-hidden .text-container {
  position: absolute;
}

/* This class is used to specify the speech recognition text formatting. */
.voice-text {
  font-weight: normal;
  line-height: 1.2;
  opacity: 0;
  pointer-events: none;
  position: absolute;
  text-align: left;
  transition: opacity 100ms ease-in, margin-left 500ms ease-in,
              top 0s linear 218ms;
}

html[dir=rtl] .voice-text {
  text-align: right;
}

/* Recognition results text hidden in the Full Page UI. */
.overlay-hidden .voice-text {
  margin-left: 44px;
}

html[dir=rtl] .overlay-hidden .voice-text {
  margin-left: 0;
  margin-right: 44px;
}

/* Styles applied to the text output elements. Common style for the text area
 * class for the full Page UI. To vertically center the text as longer queries
 * are wrapped, the 'top' position is specified in em here and below. */
.overlay .voice-text,
.overlay-hidden .voice-text {
  font-size: 32px;
  left: -44px;
  top: -.2em;
  width: 460px;
}

html[dir=rtl] .overlay .voice-text,
html[dir=rtl] .overlay-hidden .voice-text {
  left: auto;
  right: -44px;
}

/* Common style for when the text areas are made visible. */
.overlay .voice-text {
  margin-left: 0;
  opacity: 1;
  transition: opacity 500ms ease-out, margin-left 500ms ease-out;
}

html[dir=rtl] .overlay .voice-text {
  margin-left: auto;
  margin-right: 0;
}

/* Interim (low confidence) text. */
#voice-text-i {
  color: var(--grey);
}

/* Final (high confidence) text. */
#voice-text-f {
  color: black;
}

/* Text area links. */
.voice-text-link {
  color: var(--text_link_color);
  cursor: pointer;
  font-size: 18px;
  font-weight: 500;
  pointer-events: auto;
  text-decoration: underline;
}

/* Range of motion for the typing animation. */
@keyframes type {
    from {
      width: 0;
    }
    to {
      width: 460px;
    }
}

/* Style to simulate typing the "Listening..." text. */
.listening-animation {
  animation: type 900ms steps(30, end);
  overflow: hidden;
  white-space: nowrap;
}

/* Styles applied to simulate vertical scrolling. Common webkit transition
 * style for vertical text scrolling. */
.voice-text-2l.voice-text,
.voice-text-3l.voice-text,
.voice-text-4l.voice-text {
  transition: top 218ms ease-out;
}

/* When the text height is two lines. */
.voice-text-2l.voice-text {
  top: -.6em;
}

/* When the text height is three lines. */
.voice-text-3l.voice-text {
  top: -1.3em;
}

/* When the text height is four lines. */
.voice-text-4l.voice-text {
  top: -1.7em;
}

/* When the text height is more than five lines, shift the text up. */
.voice-text-5l.voice-text {
  top: -2.5em;
}

/* MICROPHONE ICON */
/* The microphone icon is made up of 4 parts:
 *   - the audio receiver,
 *   - the shell that surrounds the lower half of the audio receiver,
 *   - the stem that holds up the shell and the audio receiver,
 *   - and a wrapper that positions the shell and stem.
 *
 *     /===\
 *     |   |  <==== Audio receiver.
 *     |   |
 *  \  \===/  / <== Shell.
 *   \_______/
 *       |
 *       |  <====== Stem. */

/* Container element for microphone icon. */
.microphone {
  direction: ltr;
  height: 87px;
  left: 43px;
  pointer-events: none;
  position: absolute;
  top: 47px;
  width: 42px;
}

/* Part 1 of CSS-only microphone icon: the audio receiver.
 * Positioned in the center. */
.receiver {
  background-color: var(--inactive_icon_color);
  border-radius: 30px;
  height: 46px;
  left: 25px;
  pointer-events: none;
  position: absolute;
  width: 24px;
}

/* Part 2 of CSS-only microphone icon: the shell and stem wrapper element.
 * Positioned below the audio receiver element. */
.wrapper {
  bottom: 0;
  height: 53px;
  left: 11px;
  overflow: hidden;
  pointer-events: none;
  position: absolute;
  width: 52px;
}

/* Part 3 of CSS-only microphone icon: the stem that supports the shell.
 * Positioned below the audio receiver element and the shell element. */
.stem {
  background-color: var(--inactive_icon_color);
  bottom: 14px;
  height: 14px;
  left: 22px;
  pointer-events: none;
  position: absolute;
  width: 9px;
  z-index: 1; /* z-index is only used to specify position relative to stem. */
}

/* Part 4 of CSS-only microphone icon: shell that holds the receiver.
 * Positioned below the audio receiver element and above the stem element. */
.shell {
  border: 7px solid var(--inactive_icon_color);
  border-radius: 28px;
  bottom: 27px;
  height: 57px;
  pointer-events: none;
  position: absolute;
  width: 38px;
  z-index: 0; /* z-index is only used to specify position relative to stem. */
}

/* The .voice-ml style is applied when the UI is in
 * the 'listening for audio' state. */
.voice-ml .receiver,
.voice-ml .stem {
  background-color: var(--listening_icon_color);
}

.voice-ml .shell {
  border-color: var(--listening_icon_color);
}

/* The .voice-rs style is applied when the UI is in
 * the 'receiving speech' state. */
.voice-rs .receiver,
.voice-rs .stem {
  background-color: var(--active_icon_color);
}

.voice-rs .shell {
  border-color: var(--active_icon_color);
}
