Index: third_party/polymer/v0_8/components/iron-autogrow-textarea/iron-autogrow-textarea.html |
diff --git a/third_party/polymer/v0_8/components/iron-autogrow-textarea/iron-autogrow-textarea.html b/third_party/polymer/v0_8/components/iron-autogrow-textarea/iron-autogrow-textarea.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6a21146944b9800c606f7e5f8a159a4e061f625c |
--- /dev/null |
+++ b/third_party/polymer/v0_8/components/iron-autogrow-textarea/iron-autogrow-textarea.html |
@@ -0,0 +1,210 @@ |
+<!-- |
+@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 |
+--> |
+ |
+<link rel="import" href="../polymer/polymer.html"> |
+<link rel="import" href="../iron-flex-layout/classes/iron-flex-layout.html"> |
+<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html"> |
+ |
+<!-- |
+`iron-autogrow-textarea` is an element containing a textarea that grows in height as more |
+lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will |
+never scroll. |
+ |
+Example: |
+ |
+ <iron-autogrow-textarea id="a1"> |
+ <textarea id="t1"></textarea> |
+ </iron-autogrow-textarea> |
+ |
+Because the `textarea`'s `value` property is not observable, you should use |
+this element's `bind-value` instead for imperative updates. |
+ |
+@group Iron Elements |
+@hero hero.svg |
+@demo demo/index.html |
+--> |
+ |
+<dom-module id="iron-autogrow-textarea"> |
+ |
+ <style> |
+ :host { |
+ display: inline-block; |
+ position: relative; |
+ width: 400px; |
+ border: 1px solid; |
+ padding: 2px; |
+ -moz-appearance: textarea; |
+ -webkit-appearance: textarea; |
+ } |
+ |
+ .mirror-text { |
+ visibility: hidden; |
+ word-wrap: break-word; |
+ } |
+ |
+ textarea { |
+ position: relative; |
+ outline: none; |
+ border: none; |
+ resize: none; |
+ background: inherit; |
+ /* see comments in template */ |
+ width: 100%; |
+ height: 100%; |
+ font-size: inherit; |
+ font-family: inherit; |
+ } |
+ |
+ ::content textarea:invalid { |
+ box-shadow: none; |
+ } |
+ |
+ </style> |
+ <template> |
+ <!-- the mirror sizes the input/textarea so it grows with typing --> |
+ <div id="mirror" class="mirror-text" aria-hidden="true"> </div> |
+ |
+ <!-- size the input/textarea with a div, because the textarea has intrinsic size in ff --> |
+ <div class="textarea-container fit"> |
+ <textarea id="textarea" required$="[[required]]" rows$="[[rows]]" maxlength$="[[maxlength]]"></textarea> |
+ </div> |
+ </template> |
+ |
+<script> |
+ |
+ Polymer({ |
+ |
+ is: 'iron-autogrow-textarea', |
+ |
+ behaviors: [ |
+ Polymer.IronValidatableBehavior |
+ ], |
+ |
+ properties: { |
+ |
+ /** |
+ * Use this property instead of `value` for two-way data binding. |
+ */ |
+ bindValue: { |
+ observer: '_bindValueChanged', |
+ type: String |
+ }, |
+ |
+ /** |
+ * The initial number of rows. |
+ * |
+ * @attribute rows |
+ * @type number |
+ * @default 1 |
+ */ |
+ rows: { |
+ type: Number, |
+ value: 1, |
+ observer: '_updateCached' |
+ }, |
+ |
+ /** |
+ * The maximum number of rows this element can grow to until it |
+ * scrolls. 0 means no maximum. |
+ * |
+ * @attribute maxRows |
+ * @type number |
+ * @default 0 |
+ */ |
+ maxRows: { |
+ type: Number, |
+ value: 0, |
+ observer: '_updateCached' |
+ }, |
+ |
+ /** |
+ * Set to true to mark the textarea as required. |
+ */ |
+ required: { |
+ type: Boolean |
+ }, |
+ |
+ /** |
+ * The maximum length of the input value. |
+ */ |
+ maxlength: { |
+ type: Number |
+ } |
+ |
+ }, |
+ |
+ listeners: { |
+ 'input': '_onInput' |
+ }, |
+ |
+ /** |
+ * Returns the underlying textarea. |
+ */ |
+ get textarea() { |
+ return this.$.textarea; |
+ }, |
+ |
+ _update: function() { |
+ this.$.mirror.innerHTML = this._valueForMirror(); |
+ |
+ var textarea = this.textarea; |
+ // If the value of the textarea was updated imperatively, then we |
+ // need to manually update bindValue as well. |
+ if (textarea && this.bindValue != textarea.value) { |
+ this.bindValue = textarea.value; |
+ } |
+ }, |
+ |
+ _bindValueChanged: function() { |
+ var textarea = this.textarea; |
+ if (!textarea) { |
+ return; |
+ } |
+ |
+ textarea.value = this.bindValue; |
+ this._update(); |
+ // manually notify because we don't want to notify until after setting value |
+ this.fire('bind-value-changed', {value: this.bindValue}); |
+ }, |
+ |
+ _onInput: function(event) { |
+ this.bindValue = event.path ? event.path[0].value : event.target.value; |
+ this._update(); |
+ }, |
+ |
+ _constrain: function(tokens) { |
+ var _tokens; |
+ tokens = tokens || ['']; |
+ // Enforce the min and max heights for a multiline input to avoid measurement |
+ if (this.maxRows > 0 && tokens.length > this.maxRows) { |
+ _tokens = tokens.slice(0, this.maxRows); |
+ } else { |
+ _tokens = tokens.slice(0); |
+ } |
+ while (this.rows > 0 && _tokens.length < this.rows) { |
+ _tokens.push(''); |
+ } |
+ return _tokens.join('<br>') + ' '; |
+ }, |
+ |
+ _valueForMirror: function() { |
+ var input = this.textarea; |
+ if (!input) { |
+ return; |
+ } |
+ this.tokens = (input && input.value) ? input.value.replace(/&/gm, '&').replace(/"/gm, '"').replace(/'/gm, ''').replace(/</gm, '<').replace(/>/gm, '>').split('\n') : ['']; |
+ return this._constrain(this.tokens); |
+ }, |
+ |
+ _updateCached: function() { |
+ this.$.mirror.innerHTML = this._constrain(this.tokens); |
+ } |
+ }) |
+</script> |