text: /**
  @license
  Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
  This code may only be used under the BSD style license found at
  http://polymer.github.io/LICENSE.txt The complete set of authors may be found at
  http://polymer.github.io/AUTHORS.txt The complete set of contributors may be
  found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as
  part of the polymer project is also subject to an additional IP rights grant
  found at http://polymer.github.io/PATENTS.txt
  */
  import "@polymer/polymer/polymer-legacy.js";
  import "../iron-input/iron-input.js";
  import './paper-input-char-counter.js';
  import './paper-input-container.js';
  import './paper-input-error.js';
  import { IronFormElementBehavior } from "../iron-form-element-behavior/iron-form-element-behavior.js";
  import { DomModule } from "@polymer/polymer/lib/elements/dom-module.js";
  import { Polymer } from "@polymer/polymer/lib/legacy/polymer-fn.js";
  import { html } from "@polymer/polymer/lib/utils/html-tag.js";
  import { PaperInputBehavior } from './paper-input-behavior.js';
  /**
  Material design: [Text
  fields](https://www.google.com/design/spec/components/text-fields.html)
  
  `<paper-input>` is a single-line text field with Material Design styling.
  
      <paper-input label="Input label"></paper-input>
  
  It may include an optional error message or character counter.
  
      <paper-input error-message="Invalid input!" label="Input
      label"></paper-input> <paper-input char-counter label="Input
      label"></paper-input>
  
  It can also include custom prefix or suffix elements, which are displayed
  before or after the text input itself. In order for an element to be
  considered as a prefix, it must have the `prefix` attribute (and similarly
  for `suffix`).
  
      <paper-input label="total">
        <div prefix>$</div>
        <paper-icon-button slot="suffix" icon="clear"></paper-icon-button>
      </paper-input>
  
  A `paper-input` can use the native `type=search` or `type=file` features.
  However, since we can't control the native styling of the input (search icon,
  file button, date placeholder, etc.), in these cases the label will be
  automatically floated. The `placeholder` attribute can still be used for
  additional informational text.
  
      <paper-input label="search!" type="search"
          placeholder="search for cats" autosave="test" results="5">
      </paper-input>
  
  See `Polymer.PaperInputBehavior` for more API docs.
  
  ### Focus
  
  To focus a paper-input, you can call the native `focus()` method as long as the
  paper input has a tab index. Similarly, `blur()` will blur the element.
  
  ### Styling
  
  See `Polymer.PaperInputContainer` for a list of custom properties used to
  style this element.
  
  The following custom properties and mixins are available for styling:
  
  Custom property | Description | Default
  ----------------|-------------|----------
  `--paper-input-container-ms-clear` | Mixin applied to the Internet Explorer reveal button (the eyeball) | {}
  
  @group Paper Elements
  @element paper-input
  @hero hero.svg
  @demo demo/index.html
  */
  
  Polymer({
    is: 'paper-input',
    _template: html`
      <style>
        :host {
          display: block;
        }
  
        :host([focused]) {
          outline: none;
        }
  
        :host([hidden]) {
          display: none !important;
        }
  
        input {
          /* Firefox sets a min-width on the input, which can cause layout issues */
          min-width: 0;
        }
  
        /* In 1.x, the <input> is distributed to paper-input-container, which styles it.
        In 2.x the <iron-input> is distributed to paper-input-container, which styles
        it, but in order for this to work correctly, we need to reset some
        of the native input's properties to inherit (from the iron-input) */
        iron-input > input {
          @apply --paper-input-container-shared-input-style;
          font-family: inherit;
          font-weight: inherit;
          font-size: inherit;
          letter-spacing: inherit;
          word-spacing: inherit;
          line-height: inherit;
          text-shadow: inherit;
          color: inherit;
          cursor: inherit;
        }
  
        input:disabled {
          @apply --paper-input-container-input-disabled;
        }
  
        input::-webkit-outer-spin-button,
        input::-webkit-inner-spin-button {
          @apply --paper-input-container-input-webkit-spinner;
        }
  
        input::-webkit-clear-button {
          @apply --paper-input-container-input-webkit-clear;
        }
  
        input::-webkit-calendar-picker-indicator {
          @apply --paper-input-container-input-webkit-calendar-picker-indicator;
        }
  
        input::-webkit-input-placeholder {
          color: var(--paper-input-container-color, var(--secondary-text-color));
        }
  
        input:-moz-placeholder {
          color: var(--paper-input-container-color, var(--secondary-text-color));
        }
  
        input::-moz-placeholder {
          color: var(--paper-input-container-color, var(--secondary-text-color));
        }
  
        input::-ms-clear {
          @apply --paper-input-container-ms-clear;
        }
  
        input::-ms-reveal {
          @apply --paper-input-container-ms-reveal;
        }
  
        input:-ms-input-placeholder {
          color: var(--paper-input-container-color, var(--secondary-text-color));
        }
  
        label {
          pointer-events: none;
        }
      </style>
  
      <paper-input-container id="container" no-label-float="[[noLabelFloat]]" always-float-label="[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]" auto-validate$="[[autoValidate]]" disabled$="[[disabled]]" invalid="[[invalid]]">
  
        <slot name="prefix" slot="prefix"></slot>
  
        <label hidden$="[[!label]]" aria-hidden="true" for$="[[_inputId]]" slot="label">[[label]]</label>
  
        <!-- Need to bind maxlength so that the paper-input-char-counter works correctly -->
        <iron-input bind-value="{{value}}" slot="input" class="input-element" id$="[[_inputId]]" maxlength$="[[maxlength]]" allowed-pattern="[[allowedPattern]]" invalid="{{invalid}}" validator="[[validator]]">
          <input aria-labelledby$="[[_ariaLabelledBy]]" aria-describedby$="[[_ariaDescribedBy]]" disabled$="[[disabled]]" title$="[[title]]" type$="[[type]]" pattern$="[[pattern]]" required$="[[required]]" autocomplete$="[[autocomplete]]" autofocus$="[[autofocus]]" inputmode$="[[inputmode]]" minlength$="[[minlength]]" maxlength$="[[maxlength]]" min$="[[min]]" max$="[[max]]" step$="[[step]]" name$="[[name]]" placeholder$="[[placeholder]]" readonly$="[[readonly]]" list$="[[list]]" size$="[[size]]" autocapitalize$="[[autocapitalize]]" autocorrect$="[[autocorrect]]" on-change="_onChange" tabindex$="[[tabIndex]]" autosave$="[[autosave]]" results$="[[results]]" accept$="[[accept]]" multiple$="[[multiple]]">
        </iron-input>
  
        <slot name="suffix" slot="suffix"></slot>
  
        <template is="dom-if" if="[[errorMessage]]">
          <paper-input-error aria-live="assertive" slot="add-on">[[errorMessage]]</paper-input-error>
        </template>
  
        <template is="dom-if" if="[[charCounter]]">
          <paper-input-char-counter slot="add-on"></paper-input-char-counter>
        </template>
  
      </paper-input-container>
    `,
    behaviors: [PaperInputBehavior, IronFormElementBehavior],
    properties: {
      value: {
        // Required for the correct TypeScript type-generation
        type: String
      }
    },
  
    /**
     * Returns a reference to the focusable element. Overridden from
     * PaperInputBehavior to correctly focus the native input.
     *
     * @return {!HTMLElement}
     */
    get _focusableElement() {
      return this.inputElement._inputElement;
    },
  
    // Note: This event is only available in the 1.0 version of this element.
    // In 2.0, the functionality of `_onIronInputReady` is done in
    // PaperInputBehavior::attached.
    listeners: {
      'iron-input-ready': '_onIronInputReady'
    },
    _onIronInputReady: function () {
      // Even though this is only used in the next line, save this for
      // backwards compatibility, since the native input had this ID until 2.0.5.
      if (!this.$.nativeInput) {
        this.$.nativeInput = this.$$('input');
      }
  
      if (this.inputElement && this._typesThatHaveText.indexOf(this.$.nativeInput.type) !== -1) {
        this.alwaysFloatLabel = true;
      } // Only validate when attached if the input already has a value.
  
  
      if (!!this.inputElement.bindValue) {
        this.$.container._handleValueAndAutoValidate(this.inputElement);
      }
    }
  });