{"_id":"@terminus/ui-input","_rev":"63-9407eccf02ccc50ba338063b684d62c7","name":"@terminus/ui-input","dist-tags":{"latest":"4.0.1","next":"4.0.2"},"versions":{"0.0.1":{"name":"@terminus/ui-input","version":"0.0.1","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^1.0.10","@terminus/ui-form-field":"*","@terminus/ui-icon":"*","@terminus/ui-pipes":"*","@terminus/ui-spacing":"*","@terminus/ui-validation-messages":"*","@terminus/ui-validators":"*","@terminus/ngx-tools":"^8.0.5","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@0.0.1","_nodeVersion":"12.10.0","_npmVersion":"6.10.3","dist":{"integrity":"sha512-8f+irJxu6b6t9zshNOVmEEeO5kEHVt+G02gCZPHtwFTCTvfjTHZoP5nNx74GOBmir8igpJkRAatB89YZpBn7Ug==","shasum":"72fc14b17ded9cf3d2ea27179a9fcf05ebdf468f","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-0.0.1.tgz","fileCount":75,"unpackedSize":1001602,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1eHmCRA9TVsSAnZWagAA/4kP+wV6L3dcB2pwpOSFNEDb\nvZR7nnLMElEVxkL5STvLMPRfK0MKUf/6n910IH1YDis1HmfOuoxhjhJqC0M7\n0wXuF2BQtJwOTQR49p357tIongF0Ap0Cblzwh9vIZxqc3qnq/1+npvclGwy0\nVNBeSyCPWTjSp1e/OontEUdQBvA7o59ARDTkzSUGCm144AeFYBefEQxbIKK0\nWflF3s8dsP24sxeVZaySdgfH+mb8B6zeB3OTJqRzJsDcmKSqdwYbALCvjpJw\nfYjYhntnRvKHW0pvEvFr/9tJ3/xV8uqqykXLZspJUI+kdibXHTRwlgrGhiD1\nJle3c8hJ/2KYy/mPa256aCoNQNwzAokEzHp3iIbyl6YAzXZ2bEk7ba7hqNpJ\n9CghiFb2a8zL6J8TmegzryBeRZ3fpdF+pGDihaiw49GrggPwSpnju/L8JK6l\nZTnNuO5XT4XspYNjbdDr8RBYRksvXIovLBakflEudFnLHg+VeeKhsk2hEHvL\nX+i65eNDNHUOpFVLcy/gXEBJE98UJQ9ZVj0gp6QVRUC9rH5PtpA941a97rbX\ndfa+FXBx2ZdMwNmf3ov3qmerEzWn1IIgfhCCLeLbyCb4nT3CXTqNPkj6Jd7T\n0bseaJj77RCxgtxRSdyOgwFc6/4oEpY4+3r5GZgqSugF/nieHPsNs3HX7UQF\n2689\r\n=i0kD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqj6kJHO+9N1nePdXtPDdHvBzdOsDjggi44uXsorMdfQIgfbIWtSb+5QigKgkyHkAnDmozLssTOsyoE3HWRAfZR9Q="}]},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmUser":{"name":"benjamincharity","email":"ben@benjamincharity.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_0.0.1_1591075302160_0.8794659560425357"},"_hasShrinkwrap":false},"1.0.0":{"name":"@terminus/ui-input","version":"1.0.0","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^1.0.10","@terminus/ui-form-field":"^0.0.1","@terminus/ui-icon":"^0.0.1","@terminus/ui-pipes":"^0.0.1","@terminus/ui-spacing":"^0.0.1","@terminus/ui-validation-messages":"^0.0.1","@terminus/ui-validators":"^0.0.2","@terminus/ngx-tools":"^8.0.5","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2","tslib":"^1.10.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.0","_nodeVersion":"12.16.3","_npmVersion":"6.14.5","dist":{"integrity":"sha512-Sjecl2OcHausqhngL++u2si0dx/HHsdiiyjOd1rRsTOeKjP1sO9kJmEiM4NuoBrEvrXfhgnCehfJG72Tm1c5OQ==","shasum":"a987d7da636933fa6fe44614b35530f61bded939","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.0.tgz","fileCount":24,"unpackedSize":129367,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2ShCCRA9TVsSAnZWagAAEm4P/3W0dFrYioZNMYreMCym\nOjgZujLRMVXTzW1JOsBHSqjao/fxYLrv4pSaEEfbl5VW8uOATjvZer/LZSPp\nEBNAF6qTt5Y160P+IZcgr7KPNBQFiVxY1eVwa3uiGiv4fmZWqgAPKrUcbO42\n7vpvg3myceiiZfXFc23oq3PWsE6Vq3oFINJDqDbtKMHkb/8tHZrX0+dxBO0C\n8kkRYpSSgg2bDX5rHML3yo+JNpAF4mQH+r/AW9keQEUggad1wYlT7R/MU+rN\n6VC1nQJHRklrIedmupJ3+7U/l8Ug7adV4ElZA6obILa83Iemvqx4cPu0gJso\nRpXnAoD1n6040rJeRUkKMGdYZ+MS+kmbhuiofg7SfHn/GfEOTBPdYDkr9wGm\ndweObGAscixF0wLVtrOiOGsLOmTLXHehnio81WoaGGRhVxfCP8BxNoxxQzmS\nGNxrm4PqB5dXO5q7Cw24YZtwnamsJJtdkfRU7DBWXljCs5OKvNZdT/kafSJ/\njqDdmdU7v0WCxW/bfK1IoQ8Ws0Z4OjK3bl7Sot16k8s8OiYenmTPPzAKvq+1\nyRI4A/s5cxmldUB8OoGDB8jfe7xfxXS3QCkYnrvTtINZzEVficAoo9BY1ani\ni2yXgfGCXSXdskIp4Zhdrk7rxOZLgsukGAUzEfS2OJFOOcsj8vTL0m2dTmxd\nV/r7\r\n=5Rfl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFjiNUtdfF7IYeyaDfz+sqNPSkAiKt/aMRJr3Gewyt6sAiEAvUAM30lz8f1itcLNSzpQyPTHY0PxdmDruWBAtXwZenI="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.0_1591289921697_0.9954435178904408"},"_hasShrinkwrap":false},"1.0.1":{"name":"@terminus/ui-input","version":"1.0.1","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^1.0.10","@terminus/ui-form-field":"^0.0.1","@terminus/ui-icon":"^0.0.1","@terminus/ui-pipes":"^0.0.1","@terminus/ui-spacing":"^0.0.1","@terminus/ui-validation-messages":"^0.0.1","@terminus/ui-validators":"^0.0.2","@terminus/ngx-tools":"^8.0.5","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2","tslib":"^1.10.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Github release][gh-release-badge]][gh-releases] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/master/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/master/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[gh-release-badge]:    https://img.shields.io/github/release/GetTerminus/terminus-oss.svg\n[gh-releases]:         https://github.com/GetTerminus/terminus-ui/releases/\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/CI%20Release/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.1","_nodeVersion":"12.16.3","_npmVersion":"6.14.5","dist":{"integrity":"sha512-8FWNkfK77AIP2SCGjIeQ5ioXwSd9ifbn3FGfXD8wIBZoKKDgI/uuSvWWim2TFlJ9aE9V9GCy2gctm/7EWdJm6Q==","shasum":"da572781af9e15b94ffd33dc2524526a706eddce","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.1.tgz","fileCount":24,"unpackedSize":129435,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2TwTCRA9TVsSAnZWagAAw1MP/jR+uJruL+t2Zt7s7AVU\nukWq8lpDoUcjmj6xsjkGBow0kCKsahY/O57BMb7aIKsF2aHd9h7Tj3/ugooq\ngCIAzpLWghj9baiuiaKHNrP5O0iXy2ljOBkltO0igXwj/xUrmA9/3Bsbkh5i\ncCMzzmKtFd71b4VO91kgmpyO57srJX7eptFsQjYor7OfMXJQ9dlKP/UB3znQ\n92dleAumJUKQSdSUWxfYUpk66oKHb1yt+GLw+AnjKdBfkvzShT1Covp1i3To\nk8xdLSNsVdKFzJeA6xPGME4p5kaC7rYsfMQpjfb8hgBwB1Zq0RY+dEO9iG69\nTa2A2+4vXcJhOk57LnFYNDnY0aPHHT0cUdWop9KwTqh+/tEJE4GwiDvhXYRA\ncAme/pMDkPLvYWPsbECnlP2eyHdcQN6xi6aYqy+c8s9GG5B/1vrV6Ah8PlMG\nJxdOvqWF1tYyMP6/dMn6AY+y1fhD0Tje8ypgiv7rSrYviCz9U2OJPG7XuCvD\n5Sa4x7A34+cscX0KpVcdUln0GRXHP86PA7XjOAmNrWptXBWd7f7iZlONGlMN\nIEMAb9t42yvRIXbqZQMwmBOj+/dl8u7wZRNmi78D09IrsVdCTrb9wIjPmWLX\nnc/UpyN7How/kcJU3mDMdJ8Fl7TGzCNh4rkQOL6jAD1r9AJa8Qa1O+kN0DZm\njZU6\r\n=Suy8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9EfUVOFIv8nVy4YG1l15nApwTVHkb0Yyx/7wdtiPXJQIgUU7bXe+ISgWFw87b7rI+n5ht4bYkS9ptzazuF0YAlqU="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.1_1591294994921_0.8887413087020055"},"_hasShrinkwrap":false},"1.0.2":{"name":"@terminus/ui-input","version":"1.0.2","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^1.0.10","@terminus/ui-form-field":"^0.0.1","@terminus/ui-icon":"^0.0.1","@terminus/ui-pipes":"^0.0.1","@terminus/ui-spacing":"^0.0.1","@terminus/ui-validation-messages":"^0.0.1","@terminus/ui-validators":"^0.0.2","@terminus/ngx-tools":"^8.0.5","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2","tslib":"^1.10.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.2","_nodeVersion":"12.16.3","_npmVersion":"6.14.5","dist":{"integrity":"sha512-+rhNkiJ5E9Sd1jdv74hCozguR6vv0UtEt03ZO9W3uhUy7Vthyay25ScRdmrJZSdYrjgRNXQqKPf38ZR8LjvMdQ==","shasum":"8c1723b05b005a4f56c97cc6620588361dfca2b1","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.2.tgz","fileCount":25,"unpackedSize":129489,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2aqsCRA9TVsSAnZWagAA/7YQAKC+QguAe1gE8ySqDCXR\nl+Yy6TxDHNcoEjioIJUvKDFI2yVWklYDKGm4qg/hIkk6cfv42nYAmERo7ECD\na7jWCmmKAAQe0VY8UZb2sVYbW+tCmrZZIlcifeTkYvnPURU2VK1szEIeKm86\nd3VLO0daeX8YmoLm1d99aYEOJdYYNUImBv4mkRig/ti4IMmrFBuMjxwl9NEf\nPUWwnjLaHJq/o5lyUBW2wibrqt9wJc01FEeQb9X8WnH5/u5ioxZ0ar/nAzvD\nslxTtf8D1ylW502sr67fBoLZAv307usClLcyWurW5VPtyULs/zJNX6mGKref\nSIzHK84Zt0SNc2qZN1qqPA72oxT0YeqhPrU23oKq+IpTpTOaiuz0ehC67t5+\nXSqtbfL2rDwAi9kKgCzUakrdiKmyLMXuGeHPRj0SmxEKOBjUGGAWraVY7YaS\nHI7sYFOe3D/PRWa7rtUN8afU9UUqU/tVhy1xByye3jX04EBkumMjK/Y2lhjR\nx02F7r/9Q6Co06Y91ZFfLrfJvnRHAfSpVLcJnFyi+sP2P1jS3RJ67RgBZpgD\n+NxuEtS5u/0Mlhe8sWW69LKNS5sMUZl8Ec4SJQnJgAIKV5QrXV1sueWZzsIQ\nqeMiyFZRjcrJL0otg1mSiiNGTH8PF9YTLi6/E7y26qjbwuc0znJTQMve1Aj4\nTLxl\r\n=YDu/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDtB2MnDHr/OBuDPrFEyVRg0U94TIzqCp4lZLrPX50kVAiBzf7Ca06RyMoz217GR7e3ONljdrW3tQp2goHL5PmxO6w=="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.2_1591323308207_0.21441899815822185"},"_hasShrinkwrap":false},"1.0.3":{"name":"@terminus/ui-input","version":"1.0.3","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^1.0.10","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@terminus/ui-utilities":"1.0.3"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Github release][gh-release-badge]][gh-releases] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/master/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/master/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[gh-release-badge]:    https://img.shields.io/github/release/GetTerminus/terminus-oss.svg\n[gh-releases]:         https://github.com/GetTerminus/terminus-ui/releases/\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.3","_nodeVersion":"12.18.0","_npmVersion":"lerna/3.22.1/node@v12.18.0+x64 (linux)","dist":{"integrity":"sha512-Iq6g16fEbnQ1mOtAqUevth0jDzwdKDeNDWQsaS+PGNVvDanVXFx6EztKbRafTais0lXUHcmLkuBy8NxlR3w+EA==","shasum":"9a77b23532efb9d7d27a4c06cc7395bc3e9eab8c","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.3.tgz","fileCount":77,"unpackedSize":1004536,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4NMeCRA9TVsSAnZWagAA4eUP/2m6WhDlcT3PcGzGo4CO\nbGy2INuNko39TL438/WryKU8mVx5KJkA+5LfiwL1UMCdvnNdJOGScxYPYYpL\n4RuwCfydlGojQLkt80DNdBrslpRkSZRg77bHbzrj77rnR+ZayNDNZyr6X/WR\nT1+wo8XnFAwPv66zyxeumYgUfnk32S0vkHIgbLg8bbZl0Oh/mA74nPV5GQBL\nmt+0xjHiz6weAFhzrL9JkNv2oI+XFcjm8jzp5+YrXevfoiNxCaoW83DF1Uiy\n/Hz4F+JgbzCSq4icQHG599y92eLSTOJxJ13ZFe7VlhtWbALfA2Boqz3P1saC\nHxHi5wYRzoh3HYak8MyjXQbnGUZJq3UiSFthxoBGK5MDaRbzdci5xZEuJu+z\nx0Adw3AW5mpaD7lH7vTFS/p1PG7yVaWX7wAB5FxL45ZhP78SsIoeIUQ1tXwo\n9iIC3lGb7eSBLL0WU7OYQYZi2dVgj5FKzuezeTMsmPP/gQLVPKMJNRafYlr0\nZXTT4DftTTXjaehUukBJ4jF9KzrygoT0l0jO3ZEuwhO63Dod1/mew4Hszqeh\nYC8a06XExKMeaeHpUB8cw6hRpbyKvXAXzetlC3Ssg3CJo/c5aoqXEwvU4uIe\nH1quELkO4XSt5hguKlSH/qQ6zK0OkNDDt7E/guIbqzJ/BeMl680NtYgYcVlY\nVRtt\r\n=2SHG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwxAcC6qY8dDTOVq6a4b8B9infPufmmVW6WNQIwmimtgIhAIB2J5K5UI8WnfWx5Bnb1qwOsbpTIy1Y4WvWZdB3qbnf"}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.3_1591792413713_0.17427452965911372"},"_hasShrinkwrap":false},"1.0.4":{"name":"@terminus/ui-input","version":"1.0.4","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^1.0.10","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.4","_nodeVersion":"12.10.0","_npmVersion":"6.10.3","dist":{"integrity":"sha512-2vEUY3FHJQpIxnGJWdZKaxJwO2YKjUNo+a4xDAcDE1m8KKaHcZJZccPhaQuLqtQcg+6MHd/A7VbXlCUT03Xxfw==","shasum":"4992428928ce8d3e6c217898fc4592361804180d","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.4.tgz","fileCount":76,"unpackedSize":1003693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4NagCRA9TVsSAnZWagAA8vUP/j7qRoVWuEZpv47QN0nr\nWhwc/ZF63gPZ3nQr4xe7EGyCP53d0OuiFXQsedQRZFk6uHmbUYmntGUtYr7t\nur9+pKPYj74dePVAGsbqqdARhfMzBGTEoqTKF5BHElfPsjODZIfJERH1j7b3\n36yR5WgNz3/FKzaKyR+GkFQu0U09Ui36sI9NeJ+P35lj1ZSHx4lElZS6rbXv\nMXbwpVniRgad2Er/DFMXOJFCSQ1C22NsI/iW+nwK3+hEfv6ZGNDZ/A/9EeAe\nEKAk5fzmfHFDNtprbBhfNydQzpW6bsZ8KgaZsUshIaY0YHVsL+E+gr/pKhuQ\nbdvEY0Ue03wHJcvyKrNGKnhQqHi3LEVwpKtVwQXssYOLf8qZ2aA+M9JEcurg\nUjrkOM2yeuQiuFTWBSoQYOFrG5jN6Q2ocLWdo1SuP7XGenqAS3Exla093bVJ\nZcg3W4Wda8VILHsZ2c4wNkLxWo8B3ONvfXPl0/JUKtOVvRt3kdLa0DDuGYXE\n/OKD4HRkXto4AwAonC/ofm9mKkTFBk+MBh72pBrr9afb1wMCzlAC0XcwwznP\ncoEjGhL1nQEpaKoxCEUr9ORk7jTtd1Qw3BDYkrYv+5RT/ySqA0cZ6Is/RoYy\nGyFnn2lUugi3ZyMDoIBqFKOq3AWZAjzX4gJGfNldGL3VpFFE8+r2qtvsd6vp\n6zdY\r\n=Nbmf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICUyOouf+jRDn78wezSpR1eS7rTGDPyRSrEDYwVHOnbCAiEAnsQlYCJ93AKxzYHYA2dZdMCeIohKe8m0NQj6TJRp9os="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"benjamincharity","email":"ben@benjamincharity.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.4_1591793311895_0.6867340367201431"},"_hasShrinkwrap":false},"1.0.5":{"name":"@terminus/ui-input","version":"1.0.5","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^2.0.2","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@terminus/ui-utilities":"1.0.3"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.5","_nodeVersion":"12.18.0","_npmVersion":"lerna/3.22.1/node@v12.18.0+x64 (linux)","dist":{"integrity":"sha512-HkZXuAFxBp7z0TD15F3GPUMjgs2M9OKG2TWOxrJyt/W6aZ9v+ByEZFW2X+L2vqfLh/kGP1tkaZFsW+IQnlULDQ==","shasum":"fddc6624e80fe2de9b2a3391d37b6f4d00d09d13","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.5.tgz","fileCount":77,"unpackedSize":1005104,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4j09CRA9TVsSAnZWagAAhlUP/3SnftVhbkSygbq7mgl3\nq3y9sHmELiSVyqFd/6xNiYmRniOqCiJtnpTsczLelc6jRL0BX+ehi3YsNwRc\niyboF9A6p6S0KUcide0j838/iWjV9s+rCeJSrgI8HN/7OLU+MVnTJFftbDT4\nBnaciSHrP/x2pgGm7JM51+fUBg0BwDdhITMd780Py/IKH9TbyIZVA84xjK+R\nce67OqMEhPk00uaL1H1YsG/Rnat6CiDpYXUPOyjnUkO2SfmQjSH0IIB8cNvy\nJCx4AZZWn8yp6tIWQjrPuqpPoKJK6QeHl7P8JzVnlgxdhPew1dDX/je6+gQx\nKSdawn1hV3zYv9kgMctaPzF3qjpVA5UTqxjFPgYzUwXwGKoDWLiZlm22nbDA\nFPJDRmv1uzrHs489u0pjLRjWnvUNiFDPRGcOw5mxmvGo/00noYvsd3jc2tJk\nKj0xHheTDN/vNds83R/OnJk5f4MkweRyb1kVE+/3QxUugTquy1TG4cLXRZks\ntDV5PWumIr20V5aYwYI9X4rYSLIEHUti1vCkSuaJwCmLVzO/sgT9xDyBz9FB\nXhJvCMPjoqEYt3TxinVOzt2QoLygS+xHUoyovjwn9FmgwhIgfBuGTQk52MLc\nWZQNYuTgyN7vqHLiXDDLlCCl6NGS2fFNfxf8XYvhUgCPes04AKbtkTqwtCjr\npL7d\r\n=5Um/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDs662tdDCfJ02lQL+lY2DE1y4zMoG9JdaH+Ax3+7tagIgAcq+0zsJM9DHPWG62kfSv6IsHC+abRDWYaEZVYSkEJE="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.5_1591885116850_0.6300926211851061"},"_hasShrinkwrap":false},"1.0.6":{"name":"@terminus/ui-input","version":"1.0.6","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^2.0.2","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.6","_nodeVersion":"12.18.0","_npmVersion":"lerna/3.22.1/node@v12.18.0+x64 (linux)","dist":{"integrity":"sha512-wDcT4pY/7Hf6nobcKnz5dJx++il+OmfAK4CFhOVUncCL8LXr2CG7THZ8pDCXI0AhvB2c7u25+EzoiZOrzRgHeQ==","shasum":"1f318e5565225bbecd3beb0c7624f9a74d5ee112","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.6.tgz","fileCount":77,"unpackedSize":1005152,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe8iEuCRA9TVsSAnZWagAAAoUP/i3ePqGgnHN745ySyAUC\niv2iuMm6/r7JhCCMAVcSo8a7/4i92MEoP2GCumZYeezwxVf65CaXpSKZR2i6\n4cBy1n8SnqKfEZ06kphsR8D3RedCsET6SazIxW52u27zak5dmjSLJC1Oh7Jv\njqlKjg92tJmBKKSsKueDV58NMBeXEsY+3gjjLDwI3LiENyOvtCySZBVYj7SG\neTEznJ5wbu5kI6Kin8gnqxe4XLetrw3s/GclZMEuuU5+fHDV+8YwnbHwSv4U\nX+NZsTvkqC4SIOHy8hjA9V4XK3YFp1JxOL4VRKT0vdNaSteNHZVx/3q7sIrQ\n+im6A8sEySEV58AaVmOBzqPVzu+X/Yc9CoTevsriDRcvr0o0p50R/13NeMqN\nlfXHU4R/daiAQAz/DLrsUIJusad0xf/VKwpXe53wIjPBjLeaV65Av0QnlhB2\nSiuQJ6ZcOknEp4gTnU7+TU/O0+L3lytn05KavyLD4UlE3mZioUQAahdtUS/C\nLx/nNuuTj7+LD1miaVf+codq4cdYwgaWkL3DAxQwthNyJaucMcIq3iL/Aw5d\nW86u8VVtacEYbJv7IJk0G72wKf4FP8WQsmS8Zd0R8xqZpR3xtJNgLdF/IHkC\nrgwLNXpx7JFCvaJek2+tt6KF/FyrTtCOoUDFvxa2FPLOT5j96CVeupcEBSDE\nh0U1\r\n=033q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB28I03YIRmQW0XRRIYGugf75XV0v2pBkYbXupIHvLelAiEA9OOoLopUlYz+ujGW1UslxkXK2RkPXDW3h+/ttLQg1Jk="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.6_1592926510465_0.5761584709681209"},"_hasShrinkwrap":false},"1.0.7":{"name":"@terminus/ui-input","version":"1.0.7","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^2.0.2","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.7","_nodeVersion":"12.18.1","_npmVersion":"lerna/3.22.1/node@v12.18.1+x64 (linux)","dist":{"integrity":"sha512-rJBp3IeVtlWKEVf17v844O0JMmnTLCWL2VurR/bGadoZ4DfrjvBugFoxz8WrZG23LcpEnNvA2i2FfUm1s7/gjQ==","shasum":"1fc9420f717b1246eb0c8543a899a94edd6a0fdf","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.7.tgz","fileCount":77,"unpackedSize":1005360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBJcYCRA9TVsSAnZWagAAGhgP/A4duEoaJzjlGn7m3SH7\nMKbwOE4RvfodlfzGWh4jgMOc7NVtZowuXp+4xUXwgiNjJ6sp/zcXn6STD8u5\n1KYtjMQv4FsgVV8HqDo09bAwwqZDO1HM5AA/hkFF0fP+lbUR0TpL38HVpHkQ\nlJP0RqtsvY4UkT8+TvE9Hmf+fH5wOWrdYIGhuyAyhnGx0GICom/ekFDwHSOJ\n+LVmStOoT4961s2YdHEsyN2o32IRUzg3pFXoxJWEKhZwqTv9FTytOe9FTtx5\nJmV7OsAbSu6XaEVAyOqMlEqbAqzmEawQoFTJX7S3eDmDdzeoharTU23zcrYY\ndGR/HpFTZpp6z/XTW6hTW7mPJP8KKJSpp/EbH0z4ks7T7xqcHvIj8rpY16ZE\nv6dk1gMfCw1i6kWnFxMuvLux5sjEsLKR0YHXPqtyfrHIaht6kiJ1QL1g1maL\nPioa7RqlBxPolDz59+izI/CUJ4kGKemZrkqwneX0PGdLynWlQgNdkg/XTvGT\nVaR613fZSiSMW/j1jbWt3n0SMhwlMEa6O5gYrJuagSyVdR2SlTf0eS3Yoz8x\nffb5RWXyQRNWvEuqjEuAioMUZllgMYjS3UTRn0GqSslxhZqdaQOfALr1n/TG\nxH5bketWPJFbF0vGhvkHhATrCdMx1STRdgHHB0Yyta5dUfEk/ahwFGEDpRZh\nanvE\r\n=yuUq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCm0L3uP3QVqMlmQwYfrGY387FBbXnen/R4J7DMFuUPfwIgOhB53oCCMP6FurS5552WNZ+SoSf41HEImwZK6M15H6s="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.7_1594136343845_0.5901861351564932"},"_hasShrinkwrap":false},"1.0.8":{"name":"@terminus/ui-input","version":"1.0.8","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^2.0.2","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@terminus/ui-utilities":"1.0.5","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Github release][gh-release-badge]][gh-releases] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [Styles to be added](#styles-to-be-added)\n  - [Links to be added](#links-to-be-added)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n  * @angular/cdk\n  * @angular/flex-layout\n  * @angular/material\n  * @terminus/design-tokens\n  * @terminus/ngx-tools\n  * @terminus/ui-form-field\n  * @terminus/ui-icon\n  * @terminus/ui-input\n  * @terminus/ui-pipes\n  * @terminus/ui-spacing\n  * @terminus/ui-styles\n  * @terminus/ui-utilities\n  * @terminus/ui-validation-messages\n  * @terminus/ui-validators\n  * date-fns\n  * text-mask-addons\n  * text-mask-core\n\nUsing `ng add` command can help getting all the dependencies installed:\n\n```bash\n    ng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n  * BrowserAnimationsModule\n  * TsInputModule\n  * FormsModule\n  * ReactiveFormsModule\n\n\n### Styles to be added\n\n At top level `styles.scss`, add these styles:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```\n\n### Links to be added\n\nIn order to have material icons shown up correctly, add this to the top level html\n\n```html\n<link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[gh-release-badge]:    https://img.shields.io/github/release/GetTerminus/terminus-oss.svg\n[gh-releases]:         https://github.com/GetTerminus/terminus-ui/releases/\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.8","_nodeVersion":"12.18.1","_npmVersion":"lerna/3.22.1/node@v12.18.1+x64 (linux)","dist":{"integrity":"sha512-8YD3Y/FEl88ZThoDaR+n0xUU4RI1DO5+lV4YsO7jnrSZnnJDJ6UKyZTdrL7OCaH3P/hy2QB56Di9gyeu+n/Aog==","shasum":"d148a95b9f53669fc83261120f173e0f48f88063","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.8.tgz","fileCount":77,"unpackedSize":1007007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDLTpCRA9TVsSAnZWagAA/bsQAI7LC4WMYMD5DVvUHq5b\nIImBZxy1leSo0ejU4XY0mAGPycD42BfbZoPmvNfZT5rCTkY/wxuK/It2F9Sy\njbSo1Cv6WZ41dCgMjzVcNE9iKFA41fEa7K1UBoJY6dfx2iiT+XuFbQRkae4b\nFKV5/6gR4lhnVufXfGWew8dgPnoJd26+Uh+AnbQ6ZPd3h1mx1iR12VA6Z08g\n3qwOFknjYzWBVN8fvLpCTnahsFU9afDnIVYjU0eTaT8ja18ve4Spv8SdGKuf\n14/Cw96+j2wFxnJUVs7ZYug/PQMnTT7yUZ41fUZRp8A5T4RtZ2jBJfS5I80m\nkRqWr+8elUDwB2ZMZynCKfepTxRfo59ZmmwsgucRhmJYIOPWQHCIzdLSadq9\nGjU8n82AHV8Ogza99CHJfxYP+FYXhEBAeN/p9zrze1T8QyQ1qahDDgc9a1Z2\nsRJ9GOdEEXWvCVGaljadN1BoxaYmVR4bGuE47EfsTImccKV/h2JXVoLqNMsr\nEW8xgWs8Q8muAXd0+t6W1nSQCr0aGlQOR/U4jrQW0+Qie0j1XJPulNablsTR\nCWGz00s3+jNlmr4IApnEVpp0DjsCMPonMwVZYwchFA4B1W8rLyYAed90miL2\nIW90M69op+ryB6/oUYkq0bkm6eNgi5kvXIUbvbXS78WZLQ6kp9pH6skmW+Y3\nwO8d\r\n=Baq/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdKpp1LBivKS15Fio7ivzmAN0RkrfkYbkRzUjTi3TVxAIgJmxtwA7mUSCH5Ih1edXRQtQl+0do61BDSlL/hcEiojM="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.8_1594668265123_0.4515743369516225"},"_hasShrinkwrap":false},"1.0.9":{"name":"@terminus/ui-input","version":"1.0.9","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^2.1.0","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@terminus/ui-utilities":"1.0.5","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@1.0.9","_nodeVersion":"12.18.2","_npmVersion":"lerna/3.22.1/node@v12.18.2+x64 (linux)","dist":{"integrity":"sha512-Uqm9hj2V4p1r9uySG8/HoY0FrYha8vcD+rK/oaqPZx5Qrnqo1H4Aj+mV/ZaEfj6pmLXEbK34z9d4w4yEVLPzeQ==","shasum":"b99657f431e784280a95659f082196ab29212e6a","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-1.0.9.tgz","fileCount":81,"unpackedSize":1010454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDipJCRA9TVsSAnZWagAAD2kP/jIRE7A/BXH+LkRScYBS\n5yAIOgri5OgkEufmns9uKWkwcx9pgkt+6N41W/VvygDjzVza107Z8jriYpBC\nN2LQMv3xO0wn5nPefHxOrykTyxPOkrfdow5y+0Y2K8Gd+G7e09dY1rfXMX3O\no/2/apbQOg+cNAJ1/A8Dttoptc3U2i82P8YpU90DHPU7JEr5ZwhC9oaGS4hL\n2VCOx5Myz9dShyDQqHh+3E4je43/7SIKIvxdJKlMfpNAFntstAtVslQiDQ7l\nGrjuxTt1SYyQp4uJejnZ6Hs+64cD8TbpK5wlvypEVQ7R5iSaQYBm9yI5Zo88\nRFL597vBhj7sPzxR1odXAAoJmCwXGgo8RlnL4O0RCOAPrW763ocodAt5eXZP\nCJC21AKQGeJx3Jn5MzKcVyMu5BjROeXtt49NFyYYJ4xXYJ7LWH9iR/t1GeAx\ncasj59tcqc7/XcByY0cN4cKO/S1ZJuyDZRBTwzSd+/EPyAQDdwlU8g/sQ3OY\nWvPSYibylmmx+85kvEmAnztlYw6iK47HPy9SQ1PgTRPA0eh9+GHxjNnB/5rQ\n33m790TwnxWn5hprjYpMrjDkCqT1fHuZ/r5bJTNdoSdGFa5i31EkT4YEXrV8\nLS8ZUfzVd5wn/hWk3MIquMUuXtFRLa8wlJn+cylK027zO2KmXOGgVHelHiTQ\nSjG6\r\n=QUZW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhVZAxyuWRjCNyWDvfza5GV7Ey5P7RnBPxoWDv7V7TUAIhAPrqGJG9Zcb1mD1lWCRChi4qYev320hDtkWVHSFyW3/f"}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_1.0.9_1594763848555_0.28235887936994675"},"_hasShrinkwrap":false},"2.0.0":{"name":"@terminus/ui-input","version":"2.0.0","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^1.0.0","@terminus/ui-icon":"^1.0.0","@terminus/ui-pipes":"^1.0.0","@terminus/ui-spacing":"^1.0.0","@terminus/ui-validation-messages":"^1.0.0","@terminus/ui-validators":"^1.0.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0","@terminus/ui-utilities":"1.0.7","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/ngx-tools`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.0","_nodeVersion":"12.18.2","_npmVersion":"lerna/3.22.1/node@v12.18.2+x64 (linux)","dist":{"integrity":"sha512-OQhURmrolj4O92HOS48DJq3hlAYqMa3KUct5XMJ8Kk9aLbz8gS3e0mdub195SzGjioYsLd2KvwP3fJP5AugnsQ==","shasum":"439d9be5c021173b3bfb4c03199d6553c2056a0a","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.0.tgz","fileCount":81,"unpackedSize":1016317,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfHy2UCRA9TVsSAnZWagAAe0kP/1Xyu43c1gqnumsfQH8D\n1f/C+fiHnsUSBx1mT4UXdlT/9l9u77Ysak5VeWaoKfKV6Jti6++babdnTdpf\nE24o6ruM5ZWJQJ6s4MLBxNZXi3w2zZWdirkR+YtWicMkZZb72gxUc2A9YBcW\nr6N5PybppCKgrn3UbuElA/e38EzHSWKLdpMq+M1hQY/wS0ywXRCFqGuFUV/Z\n05woKCyJwQUG9tEtrGFldsQoeXSfJrOmYepxSdo682GtQ9Ykm0a3Gqa4VigD\nMOhDURrxyuOo2sM6oBTBhrPaReCw96opKqRcNC+oFX1hh9axdKbf8ePF1X3Y\ndRuM57H/NLQOmYTiFf27SOKq+yg/emsRunt6SLHtVohG/MzSO2jby6uRZGqi\nEPTo+saXAGRbMaVn+RdOD/kwJZprEIUUzO54u+9bjaEx8adxR5BeMmgd/PCf\n3Sk4aS/0Ln84UhvwvHX24X9iHJihZH/au/vJpXi9XniKHlwlZJzFBpNxMzmX\nmtCVvG4UD5kiqd+sVwMhFnZnSOe/6RAXdvEYFaBp247y+dioUzXtO69bnDa9\ntQXFSwjAPZbcJYqtLOy8PVlaiaRzKhHGY6iKwyKwV4vCA0yYw0RWQcClxUIK\nbP/fNqA5Q2Wml0HrW+Bpe+Lf5j5q5cdf0ikOn2lCY2BIte4EoEFzF5H0JR3h\nsVly\r\n=B+5Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnQSLejcla4owui1qF26foVdnvTm1B7qbdkuZQr3YFIQIgUVmImJjavl/TRiQZAYasoiaRIhXuaHJnVbjGeiEZl+Q="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.0_1595878804132_0.3169732738686448"},"_hasShrinkwrap":false},"2.0.1":{"name":"@terminus/ui-input","version":"2.0.1","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0","@terminus/ui-utilities":"1.0.8","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.1","_nodeVersion":"12.18.2","_npmVersion":"lerna/3.22.1/node@v12.18.2+x64 (linux)","dist":{"integrity":"sha512-INpqOI6R5aJMeRIZj6+IOI94zNRHJWYG0MV4/oR1MIK8VroROEf7ZMA+uRAc2cL+4EfxwTHyQsH+30WDUafqsg==","shasum":"710401c81e94e3e373afed525983e69f6c23096e","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.1.tgz","fileCount":81,"unpackedSize":1016603,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIERMCRA9TVsSAnZWagAAFhsP+QB4OIpioPK2ccfgwwwR\nSqSXraPOLcq4+f3HfA0rAwqxrCD6U1K7DJiMRhXB+ZesmdNoz0kEsoIHnnva\nysyo43wS6PI1wpYXekaOfdjOI0IOhyKZ4bq8E3tKqdtxSDFFZyzz5zkKmYZn\ndpH8vue07iHugZBnoSKc3DQDHwI53E0LpEiB4fiHTAoWg0/H/+T89cUfN++C\nVAr5+GUGcEMeEIr64YKVXYj+xcoVBchxeW8WLPIQpZqMUH0z2/oPUdhcMysi\ngJlSAqMSWupwy6TSwas8alsDuyXEQaRTciO+Px3luKN1OX6R0jL/33dO/+mY\nX3bzSCeGDsusE/zzBdGDAsQW0JH5EM45iYUXdD4+Kdu6XHm4D5256oCjJikc\nKX8gq2NJ1A3+Paxh0Oz0Vq6Ij0T3zuCaDahK/unEfP1t31CbihBqr6PG0qp8\nJ6O6KZezP1Qk1TojzcabQ96fH0GXotFiQ46IlYql2BX7UNLJuRc1ONMAIe4J\npLj9fppoj3Kf4dKgHWwRqHs7WGiWDD05eWMI0t7BDA6zT7ORE6xte6sbhgMS\neHcedjOljuaq5aZnutos+chQbOF4i3ohNSjYV3KTkOqhj0U7cIB7Q860zUg4\nMp96BpTr/H05b/h7G2f+Sar6nXpLWftLpRlfdDPEF2t9c/zX/KHhAMstyNoT\nD0EN\r\n=vpjL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAWyFnRBQR9eMXRfPe3zDPDXUSAN0HPTHzVguj7nK2d0AiEAiUeUUeCVslEHvGqIN3677mqe5fG70dyQQZZlJxDY+aA="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.1_1595950156270_0.2484666632760375"},"_hasShrinkwrap":false},"2.0.2":{"name":"@terminus/ui-input","version":"2.0.2","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0","@terminus/ui-utilities":"1.0.8","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/ngx-tools`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.2","_nodeVersion":"12.18.2","_npmVersion":"lerna/3.22.1/node@v12.18.2+x64 (linux)","dist":{"integrity":"sha512-tlzC9XqXtch5S1qanboRzbaoL/OK9oH3Hw/2dR/Tawj0zv0cZ41raqUchL8Y8TNt6oVlehiWRVNCp43BxOh0LA==","shasum":"71d6aa992ce8472c51491fa312d580fd96803a96","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.2.tgz","fileCount":81,"unpackedSize":1017270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIG5cCRA9TVsSAnZWagAA2bsP/3Hg2kZC0ASVBl99f3E5\nqE9CNgBncWnCcmXGbrLw60+CvVQGkNvxqpDu41e1jxQg8nZyuMs0TdDxmG19\nB32yDEFZ8NLFroVf+/Q9X7gb8reou7iBLNBwIggiBT7JtbDScMOckdijOAra\n1R172/73FwuRjtC3vNXCuWx0eW8BK/ZUJER/4F41tzrChp5evHC77UzxVOIt\nPCxXSMKL6/CEVZULNGNXpsfYadOlAnwvZlq5lWNWjEjtcfqAsPFkA9kIf3Y2\nAXC2R2wGpLKjoG/XL7VaLdBJZh3UUTg/bm5kr1/xEPXTpmccxxLaKUF0cSGP\n0fE2w+oZwCm8KOPJ7PKtQikotQwEJ1xT1kubvomX02Fc48ePiXfLy1YrjrY1\nSB3p6pQxGfIab0uO/BqV0C+OOqHlaso4onoff/cDkCXaWyWna+bIZbUwI8rf\nUcO1H8AH5TsxcxHMmLHlVrZGfpNWkn0SgGXgaZ+YAdqNhD9USOEcyw5fvykG\nhvYyVNHZrxkIJmXTmEGrAtnx7SafH3fqk4YNpANpOBTNibQRY3o/BSlPQQiM\nfXWVwYtTebHpneVUlmSM7nupQdtuiHVM4Omvlxjlb1NlW4lVH8hPqGIuqLj8\nwZK3+X7FGedhjTPiP6F03gzewQxwV498llizBg8M7Ji4WWSvHa91Qr/E+1/C\nzCrG\r\n=1ja5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/1Njjl7MIdKagvX6ZbhfNGx/fb54DkvdsDYEvRfAkdAIgYoDP9wzMMFQhq8GsgY7JugMqNcTDagPLSuasORrV/Y0="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.2_1595960924016_0.1548486963289375"},"_hasShrinkwrap":false},"2.0.3":{"name":"@terminus/ui-input","version":"2.0.3","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0","@terminus/ui-utilities":"1.0.8","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.3","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-4xOMYAo8GRzjq2HcONJ+lk/1pkI9ayauXvj6HaAhGco2sa6Pk8PhotsNYw07VWaoeFfSkAjUzJ9ae2rVXRFiqQ==","shasum":"6f931f3465ca90669896f17505031e62ec8b8970","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.3.tgz","fileCount":81,"unpackedSize":1017676,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIXQiCRA9TVsSAnZWagAAI9AP/2WpJP9xxpQPe0Zcx7mD\n16FM5xiUH6HOi4MUdxbHm7OOQipfCu7xxbFKU83wtmgxUI9vvdk+Hkv1XSWg\nMVy1wYblMgXEWoNNJGD+SlUEma+4V3tzweyU5ldHuK0HsTtzTfFnlKSaRbD/\ntIfThiQEaj4SxnlnfYoeLsQPmjiWne8HPCHIT0pf2oI1V+5dJ8kI6MSyGM0k\n4uD/5E57uTG2KqT1ySo933yXCWle1b6tfzwB74IZ31Yl5lZGTCZVaJ+xOmyL\nAXV+lGSzEy9RMwY1Q/omJnITBgkIOLyg8gFOcyTcQqwlOOkLQKN8oCKsu0Oj\nfunaDGoSzDNxaCGv8jY3CcQigiOd7vE/0in7h90cbvjpynbEleBstJ3WUafa\neRu1UgAbFUpLzkPw8I+aZ81shZI8sXpX7hhvcf9EhTPUElSyVFiDg3vB3hch\nZnwO0DY4Sjrwx38AJm9L/yWViJGErNhdsbw8+O3IFQSjYJLwRDhFDstAXdOL\nTnwcK5pqeTsKqy/v+BEJ/8VG3z1tOKTgJixUf/TjxnSkH0UFk48neUcohZzD\nhdAhogmznlbEtfrTZDpmqVf/Akw6J2FUB0ZwyCrWzbGsJO5V8FhwWhlikJ3d\nzGvi6zgIlwupbzxzsEaiYgnJHa+rwcwZAKA5oOt/Oh48kTMwcLQarb8AbWUY\n/Xw8\r\n=BipY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0bNrvUMeXWT5lz+RyrMUzT14SsejrLx3GvfXynPQgbQIgQcMAAicpsJD0g307bMzGSEWhX/UFhXelYBm45s6PJQI="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.3_1596027938132_0.3595658024104107"},"_hasShrinkwrap":false},"2.0.4":{"name":"@terminus/ui-input","version":"2.0.4","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/ngx-tools":"^8.0.5","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"10.0.0","@terminus/ui-utilities":"1.0.8","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.4","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-WkuqWB4u4hjRVaBCoK45VJhfqZyrjbb3dCF1djYhSp3qpyDo/5dKbPfDjZjFDs7dWR4E3cs3pk4RZVgDP1mSoA==","shasum":"d1f0632cf1566a01b7fd876d80a108326599bedb","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.4.tgz","fileCount":81,"unpackedSize":1017876,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIZbuCRA9TVsSAnZWagAABr8P/i6o5YTzavhM3A2nd2lU\nV/fFKIjFk1UonpKailKsp6+MHYWFQRrMxvQoxqOwWpmS1CKwnDaIvNV2RKsc\nU8J0Lyo3+6zNH6fVAde02E/rHpBrvnrp2LCNpJJidrRQB7KqAHOBZ6CuFxSF\nIimLQ4X/go2cuZzzjHyX0xnrJ8dyvJsUlKUhVlO79I0h3TMwg1Y0KLlkKhJ0\nFrepTY0rWVHQAgJZIZUN+YBth8/Th4YOKwhXWR8xWG6RogO+DJf6a2slWvG9\nAUgo2hwFOeqb0MYiKsNGbh+tUiF7wwiF0Afr069HW4UQtaRNp4xiExT3Ew43\n6/VEohMXlIPXyM7GP1iaNgPJXxy+2f/gPK9XHbyY9tt+zd/b1lAuiJDxAztJ\nHsKn5VLAPJ/syX/WnWfB2yuZM/bSo9JjlZuw72XpK7LL20qZYecHwCRcOQLK\n/hQbyNOj5OA8TivAX2JBGZv4bBVdKgS0FvqKldZNVcSZvOoizbSabrUJv/dB\niKUPATU7tgFdB+OKDwaUnfWtd1CpOyvYNkymnwVRmMNm/P0c+oTDrVDGk7lR\nLdu6y9dppJ9FQ1oTOCMzvYPEGcEEmBhY1SRP1M6LvoFJlzw/3UC/p30Qh71C\nMSXc9wMsNHlNnlt8HPGtbG44epMBEoViD+9XTGYosk1FVg2AH/QJQZfRwvEB\nhpNZ\r\n=D7j+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCumGMRTYO0Omr0RHrwHOxKaBua476ugwDPQ0cEtsuuKQIhALFPl+SYxo3fRM3oeovhyfc6aUu39Wb3bDdtH1JpIe70"}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.4_1596036845643_0.9185086309991377"},"_hasShrinkwrap":false},"2.0.5":{"name":"@terminus/ui-input","version":"2.0.5","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.9","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.5","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-8ThEdIx1gQnpxSPLVe7MDLmCqtARQZz2hjHopsoiUS6V1flywoxkH/lr5dPImgTACdaSwBmiySSWiVZtwr4hPQ==","shasum":"a4eab1a97e72ef2126af419f77fd882037d23b64","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.5.tgz","fileCount":81,"unpackedSize":1016428,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJCQPCRA9TVsSAnZWagAAEmYP/RvdFDnlWiERi2d6cUuX\nRnJIDEETkwK9cnr6QGY5jIYeXF8AitpyLZ2mOcjOunVCQQJHIbk54KPqLh/c\ntLVvZ5g4Kz5DfgDvk4Ib6zbeuKGkfbc4ck5//vWDtuCz2KRa7kOGvEbeFYDz\n7Fp/0pmDvmKNQchHMlY65xHPchqPQ80IOYh+0cOcDx/RpkKD917UtIE8qnUp\nMVZphAlRmOY5Xgxe9yyxCqSGM3WRwDHNa0ZPDqS1hr6Mkfozrk3WXwsY/rl3\n9fe85mj0VSvA9G9ZDgjZAjl92k56+7pNkRx0EKUY9PrvZQ2SQZlLAqQvAwcx\nJ0OHb3ubnLB/SDGvbmkzqHGq5XPx1LHQY3RTUr85AYNZT21dExVl/uWPUDxr\n5ATegwXhlLNXM/hK0WHtAfzdpg059Icym6ktiojDyny2H0hBsVpd5gjyYrOm\nlPEUYSVe0Rr78h7SyWRyI23yYoa+zMedKpfi/I0whdQjakWUv77qCrfffU73\nzfaFUhujqARbf/R1ZLpiQ3Yqju2DA8tcVqF7ReIQCSKrW0jlzRRqEBg3hP9s\n7Qpe0QFuTxUrU6g/ZadX5Wauc81Yjq00hiutGxD+81HpJUcJDyHrr4yoH5AS\npjrpy/IDrIyd0ofJMHw0pNnyH+IhdUHi7EO3bYAmqTBbQSY0lz1oEhXYGyno\ndkKZ\r\n=7kBG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZibNZ8OKmY+9SekABzSG63dIySFwfbeo4AqhP1UEhBgIhAOGEm2x059FzjHn+z+E36Vy0azDMFQ0yHxJiSOkKYw8i"}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.5_1596204047410_0.4050384409855725"},"_hasShrinkwrap":false},"2.0.6":{"name":"@terminus/ui-input","version":"2.0.6","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.9","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon name to `prefixIcon`:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  prefixIcon=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: https://material.io/icons\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.6","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-JmxHQY0XU0nuQ8XEV217IqCT8aHce+DlzPWMi2dbk5IDvv/jDSqqsz1CDA/IolxPHE7ehxe7YPmxjj79GZPt7g==","shasum":"8f9e62b26cd155e63518b8bc2c5f73b0f46d0985","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.6.tgz","fileCount":81,"unpackedSize":1016890,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfKwSICRA9TVsSAnZWagAA5hsQAJZC0jNpdlQtEMwva0fq\nvriHxbC8MPF9IM2iGhjRiJvusuHN161MF1/d91WcJlgVMeAoFUbtFangPsiK\nUApZ5f59tL6V1+7LZY3jAT/5tIdSDaeprUkTatggdlJe+WIMOy4hBhN1tfXh\nHV9bRMOECFnXBBUOZEGhISlg9QppdIQc6PUCZmRtFGNWyTlL8xWJWNIRnOa3\nHkHl7tvDTko86mLxt1OpXuEpWy7QRt36B9mGHBhoN/UrDpNuvfCDmtGTpo1f\nAppdXyAF8N7v6o/5S3dm/x0b14J9nf1R1VMm7lZPAsqYM6K9QToblomNdbLN\n8HOpCiPGNPipn2dVYf4lAPsjCA2U+sbG9HsU7GQQo9kmAhIKa1R1B+5mFbp3\nc22zCG9RuMp2Bx+qqmcDVB/o77WQo3QVSenQh8CpfdZUrok4gqbgoZp/VV6d\nEyCEEY5QWbUe+JC+NAQDO6Do1srsH7Z927yHFi9GrFgJ6yHtjY2piIqM4y9a\n8qjKxquT60l6s62talUGCqVBmoVI4wV03MZ/p7THftZJAr066qKClAQN7yuM\nIsM7TjTP90o/34rBf9UF7nBE/i89JhC4kPsNbAEsZAQqnRjRkbRdc6tAzpti\nGj1ke1ILmiKQKrzjUoYNCQihWMWAK42yTH4TsD0DzvVTqP97On+0mNk0kvk/\nrjvD\r\n=1RWt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHgo21siqZhD0MWhoqN97qu0LCp2S+pGD7u9+6iV8u24AiEA1l86E393VGpQUkzu39NvyYRe7+yzoVRPC9KgSoYUuo4="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.6_1596654727704_0.4461338586561412"},"_hasShrinkwrap":false},"2.0.7":{"name":"@terminus/ui-input","version":"2.0.7","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.0","@terminus/ui-icon":"^2.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.9","@terminus/ui-validation-messages":"^1.0.11","@terminus/ui-validators":"^1.0.7","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.9","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.7","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-6T4l8Mi4hHfhXuP39Z3JQegBnT0vVFdGc4lQqqh45RXAS0JyZliClkMSBdoGeMOGjbvcbquaJzvS7FIy0hNI8Q==","shasum":"81dbc6a3c31091792275b880f5d5196a563797cf","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.7.tgz","fileCount":81,"unpackedSize":1017246,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLDrgCRA9TVsSAnZWagAASqwP/RGw9AQz9mfrPVpq+9O9\nCJyjPyhyGimtwh8MN1bxOnFGCePxot9hDZFAujt8ILlbPE4tPlgPmjmD7dNg\nr1LWjzz/DqOI4R1sxn+X0c/0T8n+hi7fSv5kbVtTSx1Sv9A/qKEcqLnbKg4+\niBXUPtFQlAs6B9mc5QtkhCvn2a+r4x3XDXYMZYROFSIh1QQ/PG8/I7vW5itx\nTVcZWIFiEtFifPubKKKaz8gNXEq7TU6/kR8Bd+rUjiegdvRCwseEcuh+xCgw\ngS7ZINz8iITt8IlbkNcYn2dmOiD806pt0YYzLMtQP1OxV8AHi28ys5jhixZa\nc7GTL5KV2o7rqvWCIo9Ihqmys5+KGDr+BID26tmZ3Ao2ryTamkiaThxY2DpE\nXDwnorloLwW+JS7B882dwxh2Ehdpm+yJkp2SY1YpK9WNI0UH/DAtcRrYWYCv\nPhstLr1ldzydT+GC1PEVXbGTWZEMnGoflwu7zVjZpV3qay5xiKL63+pf6EET\nz+bg8Bl5SeYra04Km2Akd9APbt8way8Up5ZFwBBINgaegvGBm1nE2JtKR54F\n1e6bQ9SE3wHJ6EyFqPmnzOQNJ6HPI+60/7nibCVUm3Kx2V1jbq0/zwSVPzuH\nuKVCfLh87P2lUGzJqtUiPtGubrl6cFhUMdh+hJ5g61AKQKXnZweLsLr+RYX8\nuxTH\r\n=+vBv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEFMVb0MslxR6umIRsKd0JgkmdasXg7XlXlwc2JECb8fAiAWuggL2V+ozbn9Rt6mHBr7LWWTqOM/9IZri6oyUY2FAQ=="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.7_1596734176334_0.8296953646796581"},"_hasShrinkwrap":false},"2.0.8":{"name":"@terminus/ui-input","version":"2.0.8","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.10","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.8","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-7Wou80B7E+KuAum0Dm28tO8HNqmM1aaP9uz8XtR3wdnUTSl7uhY10uTR++WVrhRfDUKXABhj46gWyrpoK7qd0g==","shasum":"b714b56d69afa89ba4552b02eed8955b8f048539","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.8.tgz","fileCount":81,"unpackedSize":1017444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMXPYCRA9TVsSAnZWagAAgoIP/A5sRE6XxTDbs64VCnE5\nK29Lf9ZT8r7jFUwvVV49jVUxwuq/Hzq/2Wj+aeyKKV2bHlWD7LXIS/hsHT2a\nE0ZRy9r5lUF/OOSA4P0r519yNadds1vtQ36aKOWHY4zHBP8eRzg4QWhlWet1\nSiw3Dbr1vEDWMxWtBbYTtEx8P3L0OTJrM2AkgTgkWjY6+ks/PPrm7pSa7gTC\n7gAQEDNOAvKmKkpwI59sbdo5aFn5JS5//qfty+YDHqZkLEnGpbs7x8wbwUKa\nAt54j/KOof/mJRqA1J/DKdjz5KOXT4TDskY9TN4DpJsJ5CC6dhlUA03bo0Tn\nDU110/kLdzbXmb0evJRTwlOT7z2abbPnfpRVrYaQDecoikTdaSSYG18b70dt\nx7Elwo2ABy5a3ZK2rTo9lzaSPd4YZSXtaj31WeQFqosLNHDxruWDsG0O86ff\n4zIZYte1WVh6IMMO/ExfkCUlt2ZjCuuHl3JhATWX3p4OsUf06qSKqP6rQ+wZ\nBwhUA4nV1mainKR6tzm7mPq3Jh67hmHdCYXmpBCOgoj2uAgAvKMZtrgCKFyt\nG5qmTbUBdJbuZCpERqvEiLw1V5M1FuNt1kvAoM64Vee1AcorN05cD/3WliON\nDcRvXhSPpqMKaEyVu3/8JxdQd8C/wLs8FceSi3ocRBTrqbb5ldfbiLm/lRgE\nUfd+\r\n=PdUc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFpeBLbJ7gsedZ/oPaa2s/GRqnqFoijlhH4kf/vjNzwyAiBJTDyWhqvnSxY1Rmkz3U9wdZRJaKLDj9Cc6EO3b73IaA=="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.8_1597076439413_0.04846240534512036"},"_hasShrinkwrap":false},"2.0.9":{"name":"@terminus/ui-input","version":"2.0.9","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.12","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.9","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-VW81m8pt1UrGHYs6hYMMk6MNfBsI8OFur30SZP1BfWctVZdy9aZ6i7V6TDTpA8RiHqYtgU1aC8APUvFYdeoZIg==","shasum":"ebef16577749e02f8175dea06f0e74f2daf44c80","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.9.tgz","fileCount":81,"unpackedSize":1017766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNq4uCRA9TVsSAnZWagAAZ5kP/102DWcPGL644OKDzWgG\nZcWJgNZk8WidUwQXW46L9crhPwFpulPpqyaeoatJeq7FYfx5vuxlGVnYpIdT\non0DHi5EeFYxpIA8R4JtyKIhGGty3Wx7YR+M9Kfjh8ipuZhI/VAQDSGJLXhm\nnqAwlvYSBgOV935ngAIl/dmhtZWPSMnpagNbYozDpzrvLWpzoZgBp0wV6A8F\nqplFZKVu+nyxYNEiewlsJopVAi3j2HCOSrhHnukP+EE2GuOJ034Up3c4/pAU\n6t6AMaYJ7YE4iXseL1wx/l6SYofIsXLciXOLB9CUBWpIkmml9mDc2dfu7fip\nnMs8s0Nf/W3FWiVI2jwaBAPmxm8DlnJTB26Z3G50NxSPlnxRQxxVzCjh/6vm\nFuasX5SppFn45QtN8pWx/yi1r95XOxKSimLIdgEox6YrUKRcIs3GlYLCInWP\nCWfHDxZBGLVy6Ju3nthqaWuVRygfgRUYuTF5t9OwP5TPp79dDwAXSccCTv2j\nZe8AJP1JXTBu8DnKNE5B1S9zDpyTgy9A2Sf6RVjajwSr0NKtVlJLTRaIfYIk\nr2tF8e047aCQ5SsVTqAH6B6PXksbvd/BDYhZ6LyWLZJzPT5CE19kdSDHMQgp\nc0pjG9uNTiF6qwi2M0H4PiXRTizHCKD+WiWrxLr0/kPcSN4A/ivKrgiArXJD\nTovc\r\n=8fJL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDM3Obl2mNRTVvf5MLzYSmokyD33pVJQ3FR4464kmR8KQIgLYndOcjii6XIdz95jsK7ZvWXjuuJOVdP/sZZTpA1/Xg="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.9_1597419054287_0.8841846706509662"},"_hasShrinkwrap":false},"2.0.10":{"name":"@terminus/ui-input","version":"2.0.10","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.12","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.10","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-Pdkp7wjJW74RJbvnKJ9gkv5ujdK9Y2th36Y/We3h92ATeX1OFmi7SCwT8PhLzOgGdeffMq4LE1RLqZ1bG4IMcQ==","shasum":"4a03724b5077d81c007579ce5ec78308e921ec02","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.10.tgz","fileCount":81,"unpackedSize":1019872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRXkSCRA9TVsSAnZWagAAMckQAIQCvJZ3lipQlCaD4yw3\nUkXt/ofMpQp+0eACKQqCJHm39SF80Xu/6stljmyOVprcf7fPfFrfFrZ0Dj18\nkcO3zUCPGTZ5cQ9BUD81gJqRcoDY0amsOuRqAxbBftVuEtmOQgvXPsdD04n/\nBOZtknRqS9GRdFMVc5tyGjqPCDicmkbBEhIC55Qwte8eSlRbeKjhczI+ifgn\ntCPakMaoEkhAUWmmK+PHWKXW9U5Ht2gEZnMgB7KnZK6xb+UAw9QTmb43sDiU\noTOxZlyNiKSCIuYdQJX8YgKmCsQz6cZsSv0m1A5CEEObm1kVO+ycJvprfP6E\nhR+wnrIfy62URKKe1oZq9G5Td2DoJPNwJzJFXZ7mUAoGCbt7Q/YnzlTxo3ya\n5ClnEtWZUZP6SuBOzHLQAIrzV0h4jvjJr7KXEQTg9FAmQTkrDLIB8wmnN7se\n7nFzsl3uJOxtTWS7dLhD96lghDAofyZTKKAOtGbd8DAtBh7JS09nxpQEY+JU\nwqOQcYTSfofR7AOwcavD0I++tLhjEKL8R75bRE8TH77diu+5hByvIzAmJAE+\n0pKXAhiBhJ6k+7a+idAHneFRWBZ4OLkq4gdAxhyi6ty5HLeEnmusPU5CF7Qx\nXryKjFGuOiDa7IMZAdDzJJWPuXW9YytCiFYGNKXZq4DKOnXL3VOy/0SWy3Fg\nMJQy\r\n=9ppk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMqC8mJozhAjkkVXrHmkILSbRdIOpsw3NbvuCdzDHbKQIhAPzMeF36BDPlAeHpfWECaBN2p+/2GAI1DSiVAduk8cUH"}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.10_1598388498043_0.6668964292011841"},"_hasShrinkwrap":false},"2.0.11":{"name":"@terminus/ui-input","version":"2.0.11","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.12","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.11","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-kFR6RqLS+wJcsV+T0cPvqEfx9s/ed8IbbD/dN7hj6CZaalNTC7GsYkfcrWPgVZ14wqWrrbtuziq1JvMeE8wnfg==","shasum":"db30e995d038da35bf1b040ce3060365c7a2a4d7","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.11.tgz","fileCount":81,"unpackedSize":1020172,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRoUJCRA9TVsSAnZWagAAwcAP/R+C6/udl/cUi2UU7va2\nTF1+dzMTNO6AIgWf7flK6C6mL38MPJ8hZOQ+JEAXxdy9FcweKGauuJsvNiBA\nlMI2MZJ5A+0Dk6RsalJSFwAcxV4owJ7KWds/KF6dNWnAOaI3co5bO31zUX5j\nUm9mNUo8+5Ee+KGB98bf7qFuE7yXJd6SnMlvBPWdFQdM8AcAbAuQkMZE/L5y\nA7UWJqTvm75EUAFPfac7d23YhCy0qbjPPBUv1lAN8W7mF+kcO2o1chGMAGu7\nrSZfuZffRHtbNdN++XT39ofUN9TPvSjjNaj9rp7tYHKfWOhHiVhS2in3Wya2\njCOpsh2jr/S6Xmb+uPiFBmelCuAytgHlAoA+c2RWI+EnZjru2BlTFFtRv/uz\nTEXAIMWTrh3CIY2ZhfWAkOZCT4Oi8lKQqeilAaI3xaRilpKJePlpyFnjC718\ntxmqBUmZXXikAkSmLZ7KRghrsQRUgchV6HhTfx4Shxd64P272Hvw/ntQmc/R\nilXmK/xWoiHB/nygk38lgcVCrElFaVDy51GKADikhWH05aSw3dmeEF7CkqY4\nGWDJ1RjgWwjhsqrH5NVNaN2OIpC9ghcWfq+w5L83T7izRf4kejHM80juppjW\n6xSwF1IXPJZnpuMG8HoDGATZXJpqhDw+ztcnuj8+S9b2payXqTKt5xCCb9Q6\n4n4G\r\n=C0T/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeqOcvdbiR1vWMwwYr2xZWVc6z3lra+rws4xi+SmfvJQIgRLp0EJkVAfiKJwYDNEfPADccFz9KK5M1KArCZ9Z06wo="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.11_1598457097192_0.2348899035811991"},"_hasShrinkwrap":false},"2.0.12":{"name":"@terminus/ui-input","version":"2.0.12","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.12","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.12","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-D/jVxlT4c/DQnn7VXIvAlFHsPEBhol9WHExtmYnTsQJ8/PLp1ROzkr/YBvsmAFsNLZBo+Y+iyqYgZXU83soetg==","shasum":"a582d9ab03cc416a8e3c5f54dd2d3c572c5a44ed","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.12.tgz","fileCount":81,"unpackedSize":1020369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRtaYCRA9TVsSAnZWagAALkMP/04zJvLisz5IMrwIUzLk\ngj9A2nU9tFv6fYwenTcdepqN5z7yRp2UKlCu48Dwpo/yGFG5dTTG2bK6ZZ9j\nf3VV2ZmRCW6yyk9He+YvakR5M5wrHTLWkWtqHPSvOENcuiJ8yK7UxolVHzAB\nle5fYCwcSBOmXPGGg1LIC3mRl7v073lmb+pCxFX51SBMaGd6r+BvEMU02uTY\nnIJof+/IWpPXGxHpCcr2CNvuVU+VAEN5ljNbKTSeBPuJQto7TM2DJbfqxIo+\ngt33ghclzmGrG2uUzdk/MqEdnZWk941innZmFXHgDtc1FC08pWBvLd4wz24x\n9gbJD579yBFaBBjnIfvHpvok6o8ZgU08DMQysYS7Nac5JdBoYkemD6mAKhzY\nU1Imst3PZ1acARUnDgxDJfvONkzNnDizm9saXcXYGx+2QiZcRwSIxGJYE46L\nnV/StEuJH+/Z6EBC0mZYqQtSOGn4so7+DwHKsC3S3m+vizpu7Ezf8QYF4SAe\n6IRmvPq6W4Dxok6AT0ET0VuzLKAdfrmkdToend7qnGrf3rENjlzrAuyQrDCg\nZxvnit8sA6leHeRZGddv33ZdZGj5OIViIP5fBmRconU2lWRCb2Zdr6khRXP0\ngxvUoSw0yxCGxwUF0MgkBp9oayySk5R85hu+D4HJaLcsWEaitU+nOke/aHhS\ny1qM\r\n=NmjQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHYAYieE+kdgPN0CiZ/ffH3avhd4j0PiXz41eTkGG6OmAiEA1GBjmdQb/amSErmbc1/vNhw7NQBLth3dCWv1RgbDxp0="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.12_1598477975998_0.4395924379700549"},"_hasShrinkwrap":false},"2.0.13":{"name":"@terminus/ui-input","version":"2.0.13","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.12","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.13","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-nt1hnC+DNdK4o9XYlk6GVntD2cNzbetvcX8Wtcy6S9zrCNq0WsKGzOTDAR9cfwRcvvYejFHStB6K9FYkR80zIg==","shasum":"b807b4844303936f3d6df9096f5b04fe1fecfde4","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.13.tgz","fileCount":81,"unpackedSize":1020566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUXkVCRA9TVsSAnZWagAAIsAP/19uke/QdlPw9KUX1ypW\njGIjVj+sR9soan/Dgv45PdaClFtJY+ex0YUGUesnVat75N+oAHHFVqARhSiN\nokz+W9vRUdKeLbPLeozygpKXRADWzuYAk+vGG36MGNonZeGLr5Wo9XpjvUr2\nKlqzClJ1r4X7a2YxFabGJb2V4PmOq5YhuoY1vGB6TomE6ISdAlA/34DK1cQF\nT6U/aiCDlKuHZYqsWty9ACW+tAi8SisTHjur7wkL5Lufl393JpFYuLH/Xkib\n7jQ8Dp56RFyhMprKJO8Ll2I6wCsUhbmN0oSe0BXZ2HCUVGtUPAeylZje9x7T\n12uRSEgpZbdFsoWhW+myXy90ZwJ4AkH4wkFHc0w6DtezYcwMU5JZxTNCoHkn\nu/Haw9fa1OrompqlGBIjipLzlxVc8r1AGPNm0OUVX/h2MVJjgiFutgcd6ogd\n7SkXvbbDnSF1Rk4U+qNzAg597SLZG0/xhrYVYSsz2gjvPYglDSRpSXcBs1BR\niqNCN24cF83M8Z/CRxix9X7JNUYB0A8j/dTH5oJbThT0CfyljlKPYJcdM1nP\nJCjHsLFtdAVbbwYpzjXX10x/preJ0SuLnN93amWZ01sOQBkK1/JQ7NrP0kgO\nWJmWPDvmGJf3p/pLGfpmV2L0UhhvWMZ941oYfvlbejC21LNciUOQi+ssi1Mg\ndXSR\r\n=kYvQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnbc1btTeKQyauL3MsMjJezqyVnfHKx45EkV8Z/WZT0AIhAO1f0cHGpOA+5xmI5bNcYVYdCq45igcmBqkio5Pg3lNM"}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.13_1599174933291_0.21897759084513413"},"_hasShrinkwrap":false},"2.0.14":{"name":"@terminus/ui-input","version":"2.0.14","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.1.0","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.1.0","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.0.13","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.0.14","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-fFufXAN4AZVvaOuLDs72jm3FuXMOH/ItViYSMOsBPWuY/bryKI9MPkOaQ4i6YA/q2MK1lZH80lHTkTvr3aw4zA==","shasum":"962824e0817ef1d36a0119cdda7c4a7e4cbf855d","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.0.14.tgz","fileCount":81,"unpackedSize":1020785,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUlb0CRA9TVsSAnZWagAABDgP/j+s72XqBVF4ymgnqEww\nJNw6KoV5GPr+3c9UEmJVe6VDm0MtdgRRWTMX+r1XiT32AsaO3Qda7BAiqUUC\nPp5zpLhl+5sSgIs2JrbPYTbE89Nn9VPbAw7UbJBY2V+Ed3vIwm9mT+Fsf5Si\n1ArbcMDBPsYxUSMLN5oszDxF5EjHdfHcs1Fmc1SzAKDKOQslLkNa8fsHMOcy\noBB1Ebt/0VHEn8Nufin18ZNSNDbiqRchHQCeqvRgEmMZD4zHvi1voyXhixHG\nUtxMOlyz+SivRNltsM2hKxVDPOvg0hWQxVtF371txJpsMYNOb1KtQX0w/AEp\n9iQfTLczneuwooL5Voua/107VW2SadIvO8ZDNoAtYxWsvMSzdODb7uQDP6lL\n05KOksiFscKQsiT8NGRF+Ihhbuo9EralBAtLYxgnhzh/PaUjfizl8GEAE217\n5xMEizHEq1PrAKDwelHcIrf9af7frEO0pR0zx825nhumyJSEaIXYKePNJ5LF\nuVA1WbnPtRlRI4TRg2i1BnKT7iRveCfSgYbCGzGWEYoX64CMPCVFci6gPKHk\nKeOnYlz4dLVyoaKU98qbs6dZFAdWE2y+jJMbKvzffO1iN+jlRDB+OMJhp+rw\nWsZxY4+euAfxu/4AkK2SZvD4voQwpcs91sNPGGgYkC81q9LDM8rniJToQGnS\n3LyV\r\n=wDLV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3M3yda2mdeZU/EsNMJAEF9F/FMrZA38CWmXQla0kemQIgcgG2Y6VvTwQAg0a2prqWWewReIbKF8u+Cxvb3Lfop2g="}]},"maintainers":[{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.0.14_1599231731714_0.8889612300816565"},"_hasShrinkwrap":false},"2.1.0":{"name":"@terminus/ui-input","version":"2.1.0","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.1.0","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.0","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-TKJ5cZzvfEV1Inrc7XFc9xaZwGQIId/HeJeXvlbMwunRTBBFwMcPwkytRX/je4z6ns9zRnGYSMXXNJsoN6xRfg==","shasum":"7b7f2d4886ce3460db04810bfa7e5d4b3e55a7b1","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.0.tgz","fileCount":81,"unpackedSize":1021588,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfV9LuCRA9TVsSAnZWagAAyCkP+gOzrHiXzCuPkAo1nz1U\ntd0lq2q+kdSGZNNSgWR4W4PB/boL5eQmNyMFOmNMQjQ0vVWOJp1jlO/G6cNo\nDj+LQLTojZGYWZPFdm51dX/e/2eUlPOvvgiiGrSfugRB4a6VmKQkrUCOUBad\n1laHMSgYwh+TpjUOfZZufK9nnMIWYSsbGNnHikr/UnxlnxgOFyVM82R1HPi9\nWmYYci5xcRUYPQt8dfGHL2YBA2OJL4EZarKBBXjGBCzQ0+yd6xtustqUGSw5\nux7rQT8SZT981H3dD9YJM5fml6+jxVzQ0tMSzj3+rMCFgLKq8c6UhCbQrOIG\nOY6fizFZO1/y76RIchIMrj3RwUjSYyauB5Nu3bi1wb2VkupfjjyIhE4UGk9V\ntsxAQlf0ccyGiPpvRPOilyv/EQkhPbyXkfA9L199R/XcxEIe40dm3e9ioj2V\ndjKcfgorh8RFKN1/Au2XI9Dn9vfnXoMcJaLjt7a9+Eb92o4LTWHtlZ6Mf2J3\nz7W66E4Or5RKK7+8irs4V13sb656DwAmv1PK0TyKZltVOjrxXXSKoX5WcHML\naxPeAWCwuCyBu4TU27a0bPpkiHdWqX/YaiSe8qdYi6l5N3N1rOiS7OwCZsfH\n4p6V/q/tBnu5aTifm3McO+XuGNeGBdZzWXR9UF5xSyfBrVQ1VoTTCgbFH8yQ\nv2Fi\r\n=ygpz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0ckmATcp5nihLnYQP/wcfsTJjt4wl3qNyObEWjfuqtgIgWms9UUzraAc+I5g0MQFQzUgsOOQ+ywkzEupal3ZebIs="}]},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.0_1599591149873_0.9686079473690703"},"_hasShrinkwrap":false},"2.1.1":{"name":"@terminus/ui-input","version":"2.1.1","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.1.0","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.1","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-EZKdtlKKNGtqjJWZcVdjVubML7hGrZ2OH1ls4I0g9zntQ4BvZT9WYRrRxCQX2aPZaoALBOXUlWMOB7FpsBQewQ==","shasum":"be3a48d3f9c6c2e93658c9f869db6a1eedc82826","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.1.tgz","fileCount":81,"unpackedSize":1021782,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfW4ChCRA9TVsSAnZWagAAM3AQAI2+u3IIvXYOgw41tUDQ\nLYgwOg4ikRU50FlOkF9OpWCXchmTfUxPzDo92Oea9FVh80tkXuX4vbeSD5Kv\nVIZ24cM9uGAWXz9iW5TMZa/mYo+coZuCzMP0MMxBmjeGQ/2cz9aAniJ4J4QV\nfv5FgdfLeKz+xkJcKSFTEH+JXzPsrbCNUhglQSy2Uzm+y3dLC8bLF/hMflf/\nVKFZpl8zcLrx0tmYT9ug4PEDzIBWMbgURJN8yuV1i+d0zvK1hTy5dx6QBWf2\nC16esBevUsMTU6LY4XlVCRHWpNS43uxrlPYOJLnxrZcYy7r475T1r0nwOTBK\nDwNE41l5KOgb9BVWTY+1XJRn+2qTMFQxjk+wDqDqPcjR8ahzNGEIIdswmC8D\nesynO8R5krJwM2CgRZRovrBNa5pjnnO1QLLxmqNfP4xoaH/PlI/G7e4uJKVE\nvZfhWjhl3G928k0phnYewl/vPWaLBI3KVIhj/hDb7PrfMRqouUEABfrF1N5y\n+YmNsD6PvIhBWdHl5iBFylpjeMnQGFete+G3LbJLYfK4PDqb0AiVL19jHuvU\n+INgd0EWC9vK3g4zK1CaKMzhvAmxGEEXshjskerN9SPwbuK7l+bopCKqSah7\n4K2Tbw/0nuZMVO2LdGiux0STkRA+2Kf+XEhZRs1PDDiZXgDfw/4szV4sbkqs\n/zyh\r\n=PjOm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHzU9zh5g1HV447bv0GZKENQZfE8pbTRFsSY5UmDeSw1AiEAhv5JJ0cQ94LuLgvt5Y+wPeKpzVEj21o0D4gsU5oNkPs="}]},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.1_1599832224945_0.671241697845502"},"_hasShrinkwrap":false},"2.1.2":{"name":"@terminus/ui-input","version":"2.1.2","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.1.0","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.2","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-qNzwtxGDiBH6fObdEVDeDmpCgyLlSfN63tX0Qil91DY8y2uOeTvKgFQFs9b3mnM46CGvIRUJkP9Q6ubJeDceZQ==","shasum":"a4e92a4ab3082b44a4513dcbbae86927a21ba6b9","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.2.tgz","fileCount":81,"unpackedSize":1021976,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfW7VZCRA9TVsSAnZWagAAGLMP/j++StXCXX6FHxCMPp9l\nCU2zQUM8Y0eFZLHkGbrcRi5IU2EmzrTpID1hXtRo0uWIt4VSFc4qHBLRySLP\n0auvfQv1G7bWRx3CAYcB/Z2CiH5PmsqvCJ2YFveAnZg4U3NEyVB3ZeMHXsAi\nuf1chRtVtYoEh3am54JXoY2cJMvcMQA1ClYeAloZbTpQdyGgitPaqLwHWiQb\nSGwF24kMMuieNbBI+opmY61bWI93BxgZVhnJ4sOdL3TPrQrT0R9KvjRRVOh+\nDVhyEggUJ+afgvF9c5dkfxMShOrt+ya4zgTnv7NdTHk5Csl1NiqRe9PdCDgc\nK/43SW1OV/8bvX1p0Hk3WdzXD2NfwGPL+xymFwAcBI+NVhCSXDtURnY8wo9i\nx/Yrg9ry+hMsTocsJDCk89TXRriqeZypYczCKBzCFZSnXMa/vHiPuVX0fiSU\nZACCN+8FicWM5r8P5egZjFCgPZZ/TKCBomk11o9dz1yIcw8iryd+tnYvFvbJ\nd5O2yWGKfRvRSl3i0HjnaFmpzgvnr9S3Gmu237TQ9GaSZJ/k9gUexFV8vKvy\n5fcx8DyT0lp916qIRwLfCx77brpVjruwa3puleEVHWrdl6SQtcYt9xXPkpdp\n0PjLLlYpT/JYfF42y16CqNX/PEKtnzHhjjxSUKoCv8sTuhirBieRFVpblrvY\nEKC8\r\n=W8Ls\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCetJQk+VbMaVWACu6T67lmfJQI8O9uL0uqXnAPDSDgyAIgG/Qpi7/UWOS6JMikYq8d2eLI3iIk66rvwblTuBMMUME="}]},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.2_1599845721097_0.7439919804690263"},"_hasShrinkwrap":false},"2.1.3":{"name":"@terminus/ui-input","version":"2.1.3","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.1.0","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.3","_nodeVersion":"12.18.3","_npmVersion":"lerna/3.22.1/node@v12.18.3+x64 (linux)","dist":{"integrity":"sha512-guVa6sdn4DcfFppTdhNHtCdPyVMrRFs9vNlW0by2/5MGWvgoiwsMaY5n34pEURBWSnf4HsU49QiR4n9Ro8Tqeg==","shasum":"99c5b2df375b78d837ad299d9613eeb88c61e2ec","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.3.tgz","fileCount":81,"unpackedSize":1022566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfX6qoCRA9TVsSAnZWagAA+c4P/0XnSIWXEvOHzzWA65TN\nCLmt1YtXzDNecsZQ/20icP1FrXIKNdTck/Eqm4PSeF0GArWSUfgjZzHBWi0g\nmGji0MydxrMBc58bzOCWPNk5rcoB1tpGMjl4N8v4lCxDxLkTcHVwoy2RLG6p\nUwWd08W51L8RxKPpkD0ojob481UxE7S/ygi4ZxeeGMQYNM1qb9Mi4snJHyay\nL4F8IJo6ydSCxNGKvM6vROh4ivCT3yUV8YOEa0LfQ1ibqKYW7ybNx952z6NR\nS1KFNQYeOa2h0mOlVmzxUpSgxeyM/abRofPR3cz8P5yI0mAZKeTrx1h6YQVx\nwCJg8nP9yRUllyVJKJpkYDCrj9TX94Ik662UhQLnSFXC4oiVL7nSUQbvWVyN\nfWJVP+kv94k7tU3qaC38Ix+vYxCueoj9Wi8A5vJJooJZ5JrJ19v6O4FH8Bjh\ne/Qml9z7PiFsPPJWIGqIw0lS21kK+4Z68n2Li909990oD4ABs83XoAf3PoDE\nBvjn7msuOAjtKZqarbQ25AzxSmPMPV7X5qvEQGxeCWOAn42sVdrWHeLbu53B\n7P15Q4h2p/JhsSRCeC9PwoFoJvrGS/Ds4iYyizB/mkfe6RI2LwkrgjGyyLLv\nhDH55hQmVxPsRt66xwaJ3zpfB1gdRUoCJIzOqbUcEoEV/uPqJmPDJzLKnc1W\nPFYB\r\n=fkRT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDilflxbAQMYbaJtPdVPLfDn8wkRGwt/JZTLiebmfcLVQIgeuRoHf/iLMhykKBxmZWxCsy5iJ7PiNzQfP/d/08TBHw="}]},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.3_1600105127971_0.07229885079355292"},"_hasShrinkwrap":false},"2.1.4":{"name":"@terminus/ui-input","version":"2.1.4","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.0.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.1.0","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.4","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-BJ8xBXi3y2KVzwPGBURD9KkKCeJP0TUVH5xret4IKfKFST6APAF5/lt2YCQpoi9bZrRRZzgoZ+1Kd48+3lQ7NQ==","shasum":"c14351b8073e97b841f05e3ef250c6ef007fa28a","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.4.tgz","fileCount":81,"unpackedSize":1023117,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpWCiCRA9TVsSAnZWagAAksQP/job3Yg2v2BYMwuxgwPY\nymyLSaF2h4S1PSujRxVeC4Qk0rrdp7NrzE4C48EaijvHyW+ZPDyYot/0aAs7\nbO3dT+Yo/ufwu3RFx8DqJkjRLL7O8KRg46fy77BVpCuLPFr+jTrksxsH65CJ\ngs6RIWag6itVpd5weRuiBJ+u1DefBFEwRIGahnez+LcPbFm6fxqCu3US5LQd\nyY+59TInQAgF6KRdevAhKQJdcIZNoE27HiONlNS5g6v59OdROegRCvYVM1UL\njtoKmxRsyBLk0cSmXQIxg0Xr5/B39BUxiZ/IvopJek4hFK5wWKvFGSg6+cA2\n8ULq5Hwhp4I8d4dYcXdVpaOIeFNF/sPDRtKQeyBrx7Rlu9uPscisBoIUmZ7l\nQfMiVrCogYw5WiY7AS5CaMrycj7WqAuJMKtze/Z32CLDxnlMkd42Vj+gUjF7\n8atRHbJQkKltVR2FVb4b7fNb9J3ge99+ceL/JMQdqN0GazAkFnBkttVF3d3B\nTXZe5a/phe7zZ3UOVOqECTiRZ7tCuUIpmoKcTlVxI1bvgq3KHECEWuhWmdyN\nz2jWHb0eLRbyP0XRUd1vxtZCS3cIlQW40aSwv/EMjQssrtAI0z8p6NIYL03h\nLt9gvicanmGFFB5daor3kgyGlvfquIIy3kveqaFLxZlgGkvgzeP4ZBLeZ9qN\naNho\r\n=PsbG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICDm2CSdHBaBMe/hVPyLKKHDMtRch2Pysrp+KnAUjHSnAiBs+GxjtXl3OjZhPE79ON+7xHvlTKETDYa2EbK1p/VlBg=="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.4_1604673698210_0.7191706291728148"},"_hasShrinkwrap":false},"2.1.5":{"name":"@terminus/ui-input","version":"2.1.5","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.1.4","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12","@terminus/ui-utilities":"1.1.0","@fortawesome/fontawesome-svg-core":"1.2.30","@fortawesome/angular-fontawesome":"0.6.0","@fortawesome/pro-solid-svg-icons":"5.14.0"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.5","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-VA3JxA0gS5CVFCbDWdgV0tFl8+bKGQITCNCvRk/1fgIJ3oFN67+ZKJjDokivreJU09ReQwJusX8qFHOR+cOXtw==","shasum":"f9257ba55093baefa93fc1d6932b53e9d41f9969","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.5.tgz","fileCount":81,"unpackedSize":1023404,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpYCrCRA9TVsSAnZWagAAF9QP/i161uH4hKSPoyAblemX\nxz+i74B+6qHdZQSbsV0P3i+68Qp62JBuEXnVj+Y5k515BCvL0ZYEnVlZbmCq\nU9pGszwdEfz9aFy9NFuVzdO3EY+hhc0EpUSL6q9c3k2Ae5CngC0OTEq3A1hq\nGPOvoHXetKx25vc0f6w1MLp9BXlPKJZG/LQ5Zbm1JWJqTWxzPSL82LdrLnBn\nKKbPTl83YcJC43XHl+y+t04OEYyLG+nuWoWa6ffe7pYv1SZ2rQfeZ/BSZBzp\ng/J6VmfC4oWtfhowSjMvGwNnaQHP23xgbWBii95QPVqB//xA2CUkznAAdwjs\neKvFcA+XFJ9KjyJkIE4J5lTukCbruPRZdhjmLfgLxZzD/FtgwPWGr5U7Sk+j\nzPx7fnp4GwdYCUru+9twX8PI3uUSK+MDDIxA1blS7uErZg3B9AU3RhCojqWm\n/oWITICRkxzfLS6ngHK1tH+WsernEyimnidqbOOOkAudQspiaA1VFQBAlvRj\nLMngg0kPQMSeeT3qJxD6viyM9ubocSayKPTAzlzqBzrOaguesPCy8hmzo6PU\nc8mOw+Q/vlKykWmumV54DB3jgKFJgbqMTshS6uMsn2Ms44QytIB4qknknRWv\nn4h26K61Z7Bf72EumEjBFnthKCjqPGOmLhTlV2g8aCYBXDZeHUbr983OPe4b\nq6Jh\r\n=SXBG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqpFtl9O0gv2hjyxkza2x0Qs0uh9OsKFkJzaBHMYbaQgIhAPn0JH692ZH3XxS3uzMkT9PpVhV/EBRSvEwXWTP0Kw2B"}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.5_1604681898955_0.11591039794676261"},"_hasShrinkwrap":false},"2.1.6":{"name":"@terminus/ui-input","version":"2.1.6","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@fortawesome/angular-fontawesome":"^0.6.0","@fortawesome/fontawesome-svg-core":"^1.2.30","@fortawesome/pro-solid-svg-icons":"^5.14.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.1.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-utilities":"^1.1.0","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular/router":"9.1.11","ngx-webstorage-service":"4.1.0","ngx-clipboard":"13.0.1","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12"},"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [Packages that need to be installed](#packages-that-need-to-be-installed)\n  - [Modules that need to be in NgModule](#modules-that-need-to-be-in-ngmodule)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Prefix icon](#prefix-icon)\n  - [Disabled](#disabled)\n  - [Required](#required)\n    - [Required asterisk `*`](#required-asterisk-)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Validation timing](#validation-timing)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a max/min date range](#set-a-maxmin-date-range)\n    - [Open calendar to a specific date](#open-calendar-to-a-specific-date)\n    - [Open calendar to a specific view](#open-calendar-to-a-specific-view)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\n### Packages that need to be installed\n\n- `@angular/cdk`\n- `@angular/flex-layout`\n- `@angular/material`\n- `@terminus/design-tokens`\n- `@terminus/fe-utilities`\n- `@terminus/ui-form-field`\n- `@terminus/ui-icon`\n- `@terminus/ui-input`\n- `@terminus/ui-pipes`\n- `@terminus/ui-spacing`\n- `@terminus/ui-styles`\n- `@terminus/ui-utilities`\n- `@terminus/ui-validation-messages`\n- `@terminus/ui-validators`\n- `date-fns`\n- `text-mask-addons`\n- `text-mask-core`\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### Modules that need to be in NgModule\n\n- `BrowserAnimationsModule`\n- `TsInputModule`\n- `FormsModule`\n- `ReactiveFormsModule`\n\n### CSS imports\n\nIn your top level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n> Note: If you don't need a full form group you can provide a stand-alone control: `myControl = new FormControl();`\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, a padding bottom is added for the message, otherwise, no padding at the bottom.\n\n```html\n<ts-input\n  [formControl]=\"myFormCtrl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Prefix icon\n\nTo include an icon as a prefix to the input, pass a valid icon instance to `prefixIcon`:\n\n```typescript\nimport { faHome } from '@fortawesome/pro-solid-svg-icons/faHome';\n...\npublic home = faHome;\n```\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [prefixIcon]=\"home\"\n></ts-input>\n```\n\n> See all valid icon possibilities: <https://fontawesome.com/icons>\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: null, disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  required\n></ts-input>\n```\n\nIf only the required asterisk is needed rather than validation errors, the `isRequired` flag can be used:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n#### Required asterisk `*`\n\nIf the input should be required, but the required asterisk `*` is not needed, disable it with the\n`hideRequiredMarker` input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isRequired]=\"true\"\n  [hideRequiredMarker]=\"true\"\n></ts-input>\n```\n\n> NOTE: We should not hide this visual indicator without a very good reason!\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Validation timing\n\nValidate on change rather than blur:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [validateOnChange]=\"true\"\n></ts-input>\n```\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  #myVar=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyVar: TsInputComponent;\n\nconsole.log('Component Class: ', this.myVar);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a max/min date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('startDate')\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    [formControl]=\"myForm.get('endDate')\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  [formControl]=\"myForm.get('myControl')\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.6","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-s1L6qwypmueHU/ZsvO4usiA2t+kgm0IIuBzq2LasmAOSbMlAlSbSUQUBkAIxHNO6ix1gUZ0bghQS7EHgYv+e4g==","shasum":"8e54217ce36debca9f89247069541374f824d6ca","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.6.tgz","fileCount":81,"unpackedSize":1023708,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqWhICRA9TVsSAnZWagAALkoP/R/4aKHChm//XaitdPdV\nAMO2V/EfWErIRlugOBVh3New4f28g7O3inOwUvDQBH8aqPbULlwEbQ90t8bU\nJtpWBa8AbkfV/HlYv/M8wrXVYnAgYeu2JGvUjlN8AINzUi9tA90zMUE8Ch57\nYVBzNz0P3AM9cMphAlUD8ZxhQb95gqFuVSEz2ytXKWc/gJvZcrlR2eKCks+L\nWIdDbJULe83Esor9UfF5o2vzIy3ANCWgsf8AfcE5qvqq+H62O4XdAmJEX791\nA+qx7RUED+kIHkP4SH5lCG0f6b4TBWs3QRp5bprOqFhPXGM9xwyO3s5AoClR\nqeBXnlXVXOWdR6ooW3Nfb6SMNsh/AbYhoS7r5pZ3Zddp5b2lVq3Z6NxzYMrk\nxGx5aPMXYRjV2N4r6s+SE6/Z/ziEyO52eU7JlksJWNro6+LkAcjXXaUd3g1M\nn4wLQdYN9+7IzHsBc0N+xYXxhF/QiB5M7BY8kPS3fdronbLBimHlgZ23I++X\ncg8RkPl3UhN3dyuUPsmAD4P8he15TVTPP5KfzgsK/8ELYTi1CR938hDHYUkm\n4bdvg1+CydJcVjwZwHNgWe2ugm/TlpU4iKfH+T+fQJ3WbU9FCOGz1ILcffVH\n/thJUvtYkl7CEroKHtIfInczVebzCzTHG1rF7p5isxD6xw4Meh01kqRDftxm\nxHTV\r\n=LzAx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH320mwOoC/EO4eSh2ppXthFDjTtL9wmO2JJIarT8xT/AiEAxJFw4UQy0WHjEJukOXGj27tRk6dRutrjzEV6QVodDVE="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.6_1604937799783_0.3758123449719484"},"_hasShrinkwrap":false},"2.1.7":{"name":"@terminus/ui-input","version":"2.1.7","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@fortawesome/angular-fontawesome":"^0.6.0","@fortawesome/fontawesome-svg-core":"^1.2.30","@fortawesome/pro-solid-svg-icons":"^5.14.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.1.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-utilities":"^1.1.0","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.7","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-oSKtaBJmMjnzQK7++3M0UtR11EgM5RgZ57yMBwyBax8z8S5oTz1IDeTDaCTxuZfcWmsiRGo0xa9lDaxPBZeD+w==","shasum":"115e5189dbc6a0b9c10f7529e6baaf07333286c8","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.7.tgz","fileCount":81,"unpackedSize":1024109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfq9MQCRA9TVsSAnZWagAAj6MP/jvJSnzS4AFTYlfzxc+g\nARhw76PZflo/aNzrobohv7DHmNNvef+6NJhWjJsQhSi/NVByIKYXXSos1yfY\nm4nMLYXiEBiH9+wt6MQbAnMBpR46ffn8ASZT54ghO8daEef6HZlUDBv4Xblh\nhOUSsU1DTuTc6RcT14MQk10AWBqjzDz2PGHM7U1AoLBrBQGWq2T2+OH/6k62\nikqVsJmDgg7yZ3U+jalvgoWTGE8KC086aGUNKHweMWau9B5rmEfi5j28ylE0\nqIuh7dQc7eAmfDUHqwebnODcHnlLT5N3HupH4fLaTlMdkC1HeRHl2rDwEQE7\nXtp32XZPxuVcoGPux9TDF9EQS5Mffr9E6ddFwZwpK6sNck9N8+4EG2b6vepY\neggOZ/RhuOHR1eTzazFf30ef3zg53oEy59nQWcZZLnUSavKsJl/j3gdtmS6F\nUGLcJZzN0UzCw1IDb5XMfhh9RbPIPDPe+n6RJawWWfiF04vF+VjrKuImJ+Lg\nKITDqJpdK9IHnSBwlquoEJzn6d/BdGIb2Ex2RTtn8Q6SvpSd7EFRWH7Qh7Hi\nrAPK3NBv4oU+8EqwBxEZCyEyltkhyB1lVI5ldRbLZdzSxPexWvFiLXzV9vhF\n0V8ES4+VD00xTsFSvMa0ra/GXee57tPrzimzugGVPCWzjAEDomfpvLePFhB7\nMdW2\r\n=s5yK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHCrCG8Zm8FbD5LEGaySswer8Sezj6arB56Aa/TUw0/4AiEAzGmyC8DuAzZLqf+WPxwXdYxH7kiUgcs37rPiLmrRSuA="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.7_1605096208045_0.7582182796006458"},"_hasShrinkwrap":false},"2.1.8":{"name":"@terminus/ui-input","version":"2.1.8","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/flex-layout":"~9.0.0-beta.29","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@fortawesome/angular-fontawesome":"^0.6.0","@fortawesome/fontawesome-svg-core":"^1.2.30","@fortawesome/pro-solid-svg-icons":"^5.14.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-form-field":"^2.0.8","@terminus/ui-icon":"^2.1.5","@terminus/ui-pipes":"^1.0.7","@terminus/ui-spacing":"^1.0.11","@terminus/ui-styles":"^1.1.0","@terminus/ui-utilities":"^1.1.0","@terminus/ui-validation-messages":"^1.0.14","@terminus/ui-validators":"^1.0.9","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12"},"description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.1.8","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-fHnet8fij7tWMivNttjDVSN97kajygCqnssaESVS6leDvFC0Fm6tkj1bTAYwsQ/vfXotXjIDi1OLKJ6yD9hWqw==","shasum":"c0498dcbe041f9a06ef4430ec45c66894094d7a9","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.1.8.tgz","fileCount":81,"unpackedSize":1024494,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrB2wCRA9TVsSAnZWagAAEe4P/ikNnDG8+5CyhUsOoOwm\nCTmAh0upgc4afswiTUDUxKcI0oxM4P/vzVLPG/E/uKfnn+Q6r0f3HHWFhgpu\nlF87ogdk7RsSQ2M8rv3Hz2BRvnNxWwFv3r9BiqSCvzQXoaEW33Ae9nT9DJGt\n+/p4+FPLC0ha2E7HuT5bhUY+CVSD45ZdGlrbAnVpWblj/U9R0Ru9hXxb4aFa\nlXHOaxhrHMzN9TrIHoi5grXLOytm0RM6WsI6LeXSODk2bbRd2UClxg0TNBPv\nqq/0DEA/haFiWBOQZfY6YNoKrv0ZTsW0hzCPJhga6ubmeQ/3OrLSXv80encD\nRR1etq0gRLFBDJPFq1imTvgW3eIqnaPJkkj9WyPCZqqZT0rlb9+iFWzjhlCO\nB4rgwZPJyCnYO6uXyp4yujm1xX0IlUxxNiCQ6PEbfVuaKqECqvZNYBtv4cgI\nRsRkR9vTZsH9ozq5r6Vr1DUgXs3/YFZ75O+dhKXhPlJteAtmlKaAyXyDYqFr\nNI2XVQbQvsNaP2qHRXfYZcESe78hhOkUS1MXE255cpO4UuHa4hOO2F36uYTG\nbzft1EeWPt4gPCpgGDspPZ5wEUQuNv3wEee5AcOxkIvBXbrpV90os/7HJQg4\nACMsf5FEY+5K/CZmrazbWjpa0cup/f6DBnjLz3ZhSN5Y8oRiPg3Hh3wIiCEv\nbI3L\r\n=uQZ7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEvJC2kP6o7/VduL5ulIaU+JWRHNlU5rTJMVDnEv37T0AiBFNL7o4IJrWEljRs2bSU5sfnoc8fOs408PQZzGxatvVg=="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.1.8_1605115312031_0.6391264016942007"},"_hasShrinkwrap":false},"2.2.0":{"name":"@terminus/ui-input","version":"2.2.0","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-styles":"^1.1.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Disabled](#disabled)\n  - [Required](#required)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a min/max date range](#set-a-minmax-date-range)\n    - [Open the calendar to a specific date](#open-the-calendar-to-a-specific-date)\n    - [Open the calendar to a specific view](#open-the-calendar-to-a-specific-view)\n    - [Default open](#default-open)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### CSS imports\n\nIn your top-level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input formControlName=\"myControl\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, space below the\ninput is added for the message.\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: '', disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  required\n></ts-input>\n```\n\nThe `isRequired` flag can also be used:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  #myInput=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyInput: TsInputComponent;\n\nconsole.log('Component Class: ', this.myInput);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a min/max date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open the calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open the calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Default open\n\nThe datepicker can be opened on load:\n\n```html\n<ts-input [datepickerDefaultOpen]=\"true\"></ts-input>\n```\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    formControlName=\"startDate\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    formControlName=\"endDate\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@2.2.0","_nodeVersion":"12.20.0","_npmVersion":"lerna/3.22.1/node@v12.20.0+x64 (linux)","dist":{"integrity":"sha512-0/VRM1fopih9dPTy45zdEXFkqotXsgOqk4S3zeH8uMUiQsTvbZaA3qP/ciFCnKYnHnv61TuqF3GQi006/nKxOQ==","shasum":"9c626fbec6409923e49e341dadf1939212047bf2","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-2.2.0.tgz","fileCount":81,"unpackedSize":986333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfykTlCRA9TVsSAnZWagAA4GwQAIvgXRsobI6KlnlsD207\nGowVZVWY9LptAYbcmkPTw3lPg89l95fPEi1y0wTMtZ5CUFvYpxQINY5TfNXh\nwrhMb0xmyMx4MDR98hlZpIk3NPXprhYFodDIqndybRvBQKaixFVI6GqLyOtA\n4GSH9Nmq12uouW3g6JGuiLYHGmzI/uCIf7tESKjZo/UJWKMK1dXnRPa5P93z\nLwnX1xO3FGYPMREiZwg62YOSReysNQWqxNpGg5PsNZJVvciRu+iDZjkdX2Se\n2SqsvszSJVc4GLnQ0yuB5s+el1aoiIostMGxXSgQVMtaO69AnxGwPsjwHrX8\nydBnFY0+Mxu6h976T1JkRoRani6RHvfzpn5rWNb5ANxMjJGCmq1dtD8GT/xH\n2DJdqkDWmicfB9tytiJTOWuB/tuZKjlRzYltQNqecSH525IjRlxYHgPvahD8\nnPSTRpcanUf+DZBlhf3xkJj6DrCZKl8FWnrjY1igTmBrN3Hsc2wROgd8jDUo\njvLHSnJJnzXRvtDZkJv+tGV2qr7D7wdjZevrdCNDc3ZKx7ByhP17RZRUrEiT\n62tOLKHonWpuqg4KaG/4zwVZY7mWTyxvv72NSmH9LBkbnU4j2NyUUp5orP8O\npHZdktDgcg9zY7dmREf7gKBV1lszLcCE0OFViLcnNadhdeEE7E5rj+Wx+cuN\n07tX\r\n=xByh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQEpi1/ClXwbWlqJJX5PFx2F60HDDmd5tSx65t5fBeyAIgevFmD2+R9e8sW9+ZyfQW9Lv0l1vCsdqxLUXNlVvPtQU="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_2.2.0_1607091428967_0.015090424407668612"},"_hasShrinkwrap":false,"deprecated":"Deprecated as this should have been a major release. Please use <=2.1.8 || >=3.0.0"},"3.0.0":{"name":"@terminus/ui-input","version":"3.0.0","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-styles":"^1.1.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"description":"<h1>Input</h1>","_id":"@terminus/ui-input@3.0.0","_nodeVersion":"12.20.0","_npmVersion":"lerna/3.22.1/node@v12.20.0+x64 (linux)","dist":{"integrity":"sha512-Vv2cLhvejzLqs/l/r/uQxzayngX77Forkx5u4w8nq7AoUT0TRN3+ZQVmGsyuZsotNW27uwnPWZRUcmchxI05fA==","shasum":"febdf1ef5359a5121ffeec51a2ef8f0892c32664","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-3.0.0.tgz","fileCount":81,"unpackedSize":987186,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfylvdCRA9TVsSAnZWagAArxQP/2qZcssDeT47kHgQUrgD\nItvfVtnBEcp6+DcxJwb18GaSyah5SsaaNyI/4np+rNkPI5srxSDKBN0RRt4C\nEkvxvFyZfmoXdHdppETkaIkpIVoQXUqTkMRutnddODzeYeulBJBG7f1lFcIm\n6aIB6KNH6oQxWIpQDbuDlCWlOIlWM5cPK69O3TCA29+U20LXnxoDma+Og891\nHdCeitJ2pWPEJQNFyQGzGWhQVNMthrYYOZ9Aaol6KrQNLahRB+P+79Ni/tA/\nxTF48InxupFInrC9Rx62i+V1R6rzaeX9msbZ+hO5Lt5QK5muNWdq6JAh6mFN\nd/TyM6RoV0VQ202xFBafKTnruQzuLHL9m8ee35JGWGxGLJwYHfdH1oGtPHRW\nGrHacvMrEuV//MJV7pkJWR5eA5RMaJzIYEnHjCeNTUyOMm9wo3o2yPrBVKcG\ntf8Sku6uPcX2fEdtiHSO+M7AA0L8I6lRHm8nQDQqIOp2pKiNcSNFXlPLDKJx\nm2TLIrkyfidAmmC5gYcmOutWDPyAbF5EoZpGYcqAHUCNEqf/p7eOji39eJIh\nUEPxrvS46hDRKX+/j/ikDovSSp+Uay+GDAlc/W90V72q80zVLZbNmr/vqgSD\nkb9f4go/ZJz8DC4gjJdVuzWJQ91qWIlAwltjOC76uWLYlhXqwnTCByAZ4/j5\nEKJE\r\n=P8kM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUpmv/loUskI6WczfiAWYHjhj+b0gJduk+9fFZD7fk6wIhAPgaSk8AFVKUhGexWbzfV14fNmNNwJkmBSOr1nq0oSTU"}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_3.0.0_1607097308464_0.19895563829356777"},"_hasShrinkwrap":false},"3.0.1":{"name":"@terminus/ui-input","version":"3.0.1","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"dependencies":{"tslib":"^1.10.0","@angular-devkit/schematics":"9.1.9","@schematics/angular":"9.1.12"},"peerDependencies":{"@angular/cdk":"^9.2.4","@angular/common":"^9.1.0","@angular/core":"^9.1.0","@angular/forms":"^9.1.0","@angular/material":"^9.2.4","@angular/platform-browser":"^9.1.0","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^1.0.0","@terminus/ui-pipes":"^1.0.7","@terminus/ui-styles":"^1.1.0","date-fns":"^2.13.0","rxjs":"^6.5.0","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm5/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm5":"esm5/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm5":"fesm5/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"description":"<h1>Input</h1>","_id":"@terminus/ui-input@3.0.1","_nodeVersion":"12.20.0","_npmVersion":"lerna/3.22.1/node@v12.20.0+x64 (linux)","dist":{"integrity":"sha512-3gvX9uF4z18MTeErGnj/bEt6PMCCgJ44L4kS6TuxyDmAwNzhYA+zq515STZoEqTDOZX6Vw7VA20bBkwqRzUIKg==","shasum":"2220d2f71490a4388436a890c9b69945931da4c6","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-3.0.1.tgz","fileCount":81,"unpackedSize":987685,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfz41CCRA9TVsSAnZWagAAA7YP+wcLhYg76YzmyDGHPd+l\nUxJEQCVxT1QnjXKnMR4dzoOixZGf5YBNhJJ6LlQHVZm7VOEd4wi7zzYtK2Gd\nu4O1rxHTsovRL1lJQLVHH5zkvldlbazzpv2TEAQMRcy4qp/DCpPNjtp9FKGQ\nXJ0Gy70SzLHm27ba9wD1TyzwcoR+cu3xMAsXn+M5W1Hl5fqc89nj7UWljTRL\n6+h5GDfA5kOILVqj6P9b/MKItXGyUBGcUNvCRQg9bB8ySQ71y4aqZs5xEgY3\nDtR6nXtS4tW7r5/RRWXFdNV13lWFztAwRP7nKfTQuTQ+/OeFWp4aINTXeQBU\n0X0wQaI1mdwHbzMRSs0P06gPEurH0jdZ1WP5vPuyWfetE0+1M36brzhypUql\nnW2WnXzr89fw+BwpJCFx9jtWTY18unt9AoQlBwm1aLC7bJZdF9knOAXxx8W3\nVrvhPl2/TtpY/jy6nIWoP9+MrA6UzJIHmxaXpGUcDJlcgjRxEalB3WCnDN5H\npIHBAO502S7d6EPD6ZJD98drjIlOHoiM5nCals7nKPqxjudKLt6ORlxHr3CH\nZupzXYqsNj5Vxn2MonTH3gLwi7JvysouLNczniLmsfMYTAHtFmiXs/v3wD9y\nEGvcW2o+dtrGIjmIEQqAJEP2fzhUtuzuhNIW3CAwEFX+YIuPdw1q2NIEt4fW\nRwiM\r\n=pIN0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGfufNvKZtc5ARx5SFnykMGKjA6N9mWEbEhGG/GtzZW9AiEAyRarGL8A/zkAIqHK3/FDH3TUUo+lMyibushpGXpapzA="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"terminus_devops","email":"devops@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"benjamincharity","email":"ben@benjamincharity.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_3.0.1_1607437633281_0.29281202742362256"},"_hasShrinkwrap":false},"4.0.0":{"name":"@terminus/ui-input","version":"4.0.0","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"dependencies":{"tslib":"^2.0.3","@angular-devkit/schematics":"11.0.4","@schematics/angular":"11.0.4"},"peerDependencies":{"@angular/cdk":"^11.0.3","@angular/common":"^11.0.4","@angular/core":"^11.0.4","@angular/forms":"^11.0.4","@angular/material":"^11.0.3","@angular/platform-browser":"^11.0.4","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^2.0.0","@terminus/ui-pipes":"^2.0.0","@terminus/ui-styles":"^2.0.0","date-fns":"^2.16.1","rxjs":"^6.6.3","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm2015/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"description":"<h1>Input</h1>","_id":"@terminus/ui-input@4.0.0","_nodeVersion":"12.20.0","_npmVersion":"lerna/3.22.1/node@v12.20.0+x64 (linux)","dist":{"integrity":"sha512-J1YIsILaGbP+JbFLrJAGWcKQ206fmJQb3GFAc5kgz7OGfDcmuLVEG+7plc1NP2n9+OQ9kkspchoU7V9cf/7lzw==","shasum":"871657a196a3fc89b10b922b255548a3bb4d1234","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-4.0.0.tgz","fileCount":59,"unpackedSize":675252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf2hfQCRA9TVsSAnZWagAAXsAP/ib5tROuaKDqC3fDLzSx\nuuifzIFhgBY8fGZ1jbZ/hRSiaO5FF1O1sXON/jqYki4nfWgwSR+nEuOjlwSQ\neDzx4VN9sUW88iLJvQAPzbwIZCgN2GyA7WcegB9mST606+we837v72hMQtFq\nDy60gyWKrvAgHLmj0qS0qAz/hD97ctwKlUUxmhr3gyWSuHjcMU1fek9udLmh\nnl4gCjRhZ3jBtwIEpkrM0JGmaDgMcqnFRPCLgkLGv44ac4CekTbr00K0O9JA\n4NvIH21Iypi3tAESfhp+q4V1e5R7UPEpT6TC/1pAgaumfiQVPtL2CeIOFx7t\n1J2Uus58mp77dxL5gQj1CPaUPS0R3STTLufUNSDSScGkVcnBoRq0Me79QhrL\nllhHaOqVg8t7w88E/iAuHmzKDhf2OLyHPOvnjOHYb9SiIWYwrBGJySJf8dQy\nHQGELEbSSEKBEkcXEjl4TCUF3N8r8b62BzDWV4eAmeJ/FIpyJi5EtNdlYwUO\nbxJzRFBlq8EHZvLR4qfMwgj9B7V6ioqveaoPGPYx5mW6dhydw+/7/bHc2Y6N\njBeBz7E05b9vqXwH6MCyWxb5PItdOq2Kd/8K+tyG7nJZNyd/mQXu/BhzgW71\nqmBPm/qxfrm85aEqcTFqZwp/zSwdAFofuIK3891Vy6CiSu6FaIeoDyQ5qMtW\nhbGc\r\n=BOaF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBO/hr5znfvtAXA1toA2y9I51430qy0zL2OIl69or0rBAiEA3t6+3P6P3IXGTnvJtdVXRRCUhPgUl5c/vsR8jZtrEN0="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"benjamincharity","email":"ben@benjamincharity.com"},{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_4.0.0_1608128464433_0.9614877872534242"},"_hasShrinkwrap":false},"4.0.1":{"name":"@terminus/ui-input","version":"4.0.1","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"dependencies":{"tslib":"^2.0.3","@angular-devkit/schematics":"11.0.4","@schematics/angular":"11.0.4"},"peerDependencies":{"@angular/cdk":"^11.0.3","@angular/common":"^11.0.4","@angular/core":"^11.0.4","@angular/forms":"^11.0.4","@angular/material":"^11.0.3","@angular/platform-browser":"^11.0.4","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^2.0.0","@terminus/ui-pipes":"^2.0.0","@terminus/ui-styles":"^2.0.0","date-fns":"^2.16.1","rxjs":"^6.6.3","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm2015/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"description":"<h1>Input</h1>","_id":"@terminus/ui-input@4.0.1","_nodeVersion":"12.21.0","_npmVersion":"lerna/3.22.1/node@v12.21.0+x64 (linux)","dist":{"integrity":"sha512-lkSFtmsC61d/IhN+FeaBxeKBUw3Ed/2j4KAI0MFmbK3obIN+4G2xNk8neLoycC3ejIry5jjZ3Vm/hRTYQDSuhw==","shasum":"95122ad9960d3ebf9caca8d4e7c2788bae902d77","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-4.0.1.tgz","fileCount":59,"unpackedSize":677662,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgW6WSCRA9TVsSAnZWagAADccP+QDaJ5yZNDJXaqcs3tzg\nVytCvmZOvFx4MAh+Q2Vu+JcTc5RzRmAP176hlsGo1HKzKJG/9RKoYmCY7/KN\n+nXkFLori7i2D0sg6Ya+90b9dSILTuwpyLoKMHbU/zEpZu0f3IIDbLLKM+Dz\n0Cf5+h2JEb438rGN/hjbUd1DGgIfs+vSeN5FbwhNolsOB4uDBe5up0APNRux\nfdTMKPMMjpUTTXrX9iv19mWwtZquEfBuDNr7noqeqzI9XCAZr2RO1CEJ4UTz\nt2VLqA3PSAPIMyCZRhjuIbnxh4ghpymwTuSFPRrc9Tbf2o98gQ2+uTtHcqSM\nwpTMqHtpUv4ec+Q4I3t7kb8WUoTINuu7GKrsfABDgZqWPArkE35x7GmRVCNZ\nKUt3ntjMEqjuNCPCZ+8T4JbeSus6+7t4grUukFAQm2JtImzrbwoq4e7wAO3T\n9hwgWITyhkCvYcsv1IS1CYCLxIQSYoB7EgKuum8pHCHU/qGxTjEPKRaWQUWn\n5SkmCvARIbVhTeagXadfICTfbtFaFXHUl6xMq+tnJbH7rOCYeifVt/eeN/9o\n9xOsvZZXT0bEfT2kZfkT9LEvlOfKnnSL1SG+8FM4Qzbh+Vb+oC7I9KpqFhKq\nb2eOxIIVNw7p+wnhvJQizKzOE9dHv6UW6FLtBsGx4kQ60Ga8MY4hF0uir//U\noz6y\r\n=Q7rJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHs7h277Mtv0q1Y458u1+CbJK7stYFJddQShSnadNAqUAiBe8PBgA3dn4iqU1gPci0NGL5XFe1pASZ4DxPwHR3GHyg=="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_4.0.1_1616618897619_0.35197134277820874"},"_hasShrinkwrap":false},"4.0.2":{"name":"@terminus/ui-input","version":"4.0.2","license":"MIT","author":{"name":"@terminus"},"private":false,"homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"publishConfig":{"access":"public","tag":"next","directory":"../../../dist/libs/ui/input"},"dependencies":{"tslib":"^2.0.3","@angular-devkit/schematics":"12.2.13","@schematics/angular":"11.0.4"},"peerDependencies":{"@angular/cdk":"^11.0.3","@angular/common":"^11.0.4","@angular/core":"^11.0.4","@angular/forms":"^11.0.4","@angular/material":"^11.0.3","@angular/platform-browser":"^11.0.4","@terminus/design-tokens":"^3.1.0","@terminus/fe-utilities":"^2.0.0","@terminus/ui-pipes":"^2.0.0","@terminus/ui-styles":"^2.0.0","date-fns":"^2.16.1","rxjs":"^6.6.3","text-mask-addons":"^3.8.0","text-mask-core":"^5.1.2"},"schematics":"./schematics/collection.json","main":"bundles/terminus-ui-input.umd.js","module":"fesm2015/terminus-ui-input.js","es2015":"fesm2015/terminus-ui-input.js","esm2015":"esm2015/terminus-ui-input.js","fesm2015":"fesm2015/terminus-ui-input.js","typings":"terminus-ui-input.d.ts","metadata":"terminus-ui-input.metadata.json","sideEffects":false,"readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [Error message](#error-message)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Disabled](#disabled)\n  - [Required](#required)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Small mode](#small-mode)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a min/max date range](#set-a-minmax-date-range)\n    - [Open the calendar to a specific date](#open-the-calendar-to-a-specific-date)\n    - [Open the calendar to a specific view](#open-the-calendar-to-a-specific-view)\n    - [Default open](#default-open)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### CSS imports\n\nIn your top-level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input formControlName=\"myControl\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### Error message\n\nPass in an error message:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  errorMessage=\"Must be a valid email address\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, space below the\ninput is added for the message.\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: '', disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  required\n></ts-input>\n```\n\nThe `isRequired` flag can also be used:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  #myInput=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyInput: TsInputComponent;\n\nconsole.log('Component Class: ', this.myInput);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Small mode\n\nA smaller version of the input can be used:\n\n```html\n<ts-input [isSmall]=\"true\"></ts-input>\n```\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a min/max date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open the calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open the calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Default open\n\nThe datepicker can be opened on load:\n\n```html\n<ts-input [datepickerDefaultOpen]=\"true\"></ts-input>\n```\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    formControlName=\"startDate\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    formControlName=\"endDate\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md","description":"<h1>Input</h1>","_id":"@terminus/ui-input@4.0.2","_nodeVersion":"12.22.7","_npmVersion":"lerna/3.22.1/node@v12.22.7+x64 (linux)","dist":{"integrity":"sha512-6hF11QApLAuJNAYaqjJ+ro4+1rTRvIRwD1dfwUVTI8+P9syjbW+Rvs2wozXsFTBNctp1e0yatiNMOYEe6nlZUQ==","shasum":"8f3e8df5f387d2640823294892254dbae10128be","tarball":"https://registry.npmjs.org/@terminus/ui-input/-/ui-input-4.0.2.tgz","fileCount":54,"unpackedSize":559332,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhp6v7CRA9TVsSAnZWagAAPbwP/iOcKWzmWO9rLciBdDEW\n7b39vTv5BUj+NRM7GtnvHzuuF1r1HH1V0lTuPEb6XZJ4/6Xd+VUCCHZK9mmn\nDNlX6LCUXofQBZnCwJQe9ZySf7g9+MCQC5UYB+BVIFLs3NFpat535FIdv04O\n80WWjwfEkBxBKC6uLL+KADwPNQKD3S8LQuP//mGlnPpZr45A0m71WGS4Q4V0\nDfbsldnyclJ/B/4Vk7YJJnvfF9g1QZceYrl5vxejtQmntCBpIVOy5Bjw7HaH\nJnqM8Xnm0mNq1/dgqVap9aqY2WXevB30iXyV86c/PHGUF7Du5RtHaRAf+FSq\nBiH4P8ay3pusDKb2lRgvWXK5K11x/O2tSwZxUqtIS3RvURT4m/09Kxj4wOC0\nAitV2/y08QIBzTGM+q0arIzqyGEQWuNjEfSU130lCnYFosSD3GiII4HDclpW\n6I6yhwBJazRzXhEeDdmd4SF/f9+Fhv6ILHdeRtzh9HKTCaMWXj4nHoYzHvx3\nV5tTxx0qnVBIq1uYBf26QEyf1RZIJx7uQxU7yolfuOsgFOLka2OJQfz4C7Kv\nSeCaK1JLqluP4rUK+OoS1gEEgdcL0f4MejLRpLwBPyOObHiXM+mD+cUkCyXj\nbcDvCuwQ6bO1dVZE3GHL78nvyKWYIXtuUI4EAxnZarHb6KiKrayv1sf0hrZ4\nbApt\r\n=1wC0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF+LNWU601Ko5saIKFy8DKG5FueJLSlk3NopKex2caorAiEA0kxvBYt0UKEoICTF3QmxnEHb57NBQ/Oml3XxV/QKcxI="}]},"_npmUser":{"name":"terminus_devops","email":"devops@terminus.com"},"directories":{},"maintainers":[{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ui-input_4.0.2_1638378491073_0.7462108990285701"},"_hasShrinkwrap":false}},"time":{"created":"2020-06-02T05:21:42.026Z","0.0.1":"2020-06-02T05:21:42.456Z","modified":"2022-04-07T05:16:15.505Z","1.0.0":"2020-06-04T16:58:41.852Z","1.0.1":"2020-06-04T18:23:15.029Z","1.0.2":"2020-06-05T02:15:08.315Z","1.0.3":"2020-06-10T12:33:33.936Z","1.0.4":"2020-06-10T12:48:32.110Z","1.0.5":"2020-06-11T14:18:37.020Z","1.0.6":"2020-06-23T15:35:10.598Z","1.0.7":"2020-07-07T15:39:04.063Z","1.0.8":"2020-07-13T19:24:25.242Z","1.0.9":"2020-07-14T21:57:28.759Z","2.0.0":"2020-07-27T19:40:04.257Z","2.0.1":"2020-07-28T15:29:16.418Z","2.0.2":"2020-07-28T18:28:44.161Z","2.0.3":"2020-07-29T13:05:38.334Z","2.0.4":"2020-07-29T15:34:05.814Z","2.0.5":"2020-07-31T14:00:47.596Z","2.0.6":"2020-08-05T19:12:07.862Z","2.0.7":"2020-08-06T17:16:16.519Z","2.0.8":"2020-08-10T16:20:39.553Z","2.0.9":"2020-08-14T15:30:54.454Z","2.0.10":"2020-08-25T20:48:18.214Z","2.0.11":"2020-08-26T15:51:37.394Z","2.0.12":"2020-08-26T21:39:36.182Z","2.0.13":"2020-09-03T23:15:33.391Z","2.0.14":"2020-09-04T15:02:11.950Z","2.1.0":"2020-09-08T18:52:30.055Z","2.1.1":"2020-09-11T13:50:25.092Z","2.1.2":"2020-09-11T17:35:21.278Z","2.1.3":"2020-09-14T17:38:48.117Z","2.1.4":"2020-11-06T14:41:38.360Z","2.1.5":"2020-11-06T16:58:19.109Z","2.1.6":"2020-11-09T16:03:19.944Z","2.1.7":"2020-11-11T12:03:28.268Z","2.1.8":"2020-11-11T17:21:52.260Z","2.2.0":"2020-12-04T14:17:09.156Z","3.0.0":"2020-12-04T15:55:09.497Z","3.0.1":"2020-12-08T14:27:13.521Z","4.0.0":"2020-12-16T14:21:04.615Z","4.0.1":"2021-03-24T20:48:17.868Z","4.0.2":"2021-12-01T17:08:11.338Z"},"maintainers":[{"name":"bmalinconico-terminus","email":"brian.malinconico@terminus.com"},{"name":"atlwendy","email":"atlwendy@gmail.com"},{"name":"terminus_devops","email":"devops@terminus.com"}],"description":"<h1>Input</h1>","homepage":"https://github.com/GetTerminus/terminus-oss","repository":{"type":"git","url":"git+https://github.com/GetTerminus/terminus-oss.git"},"author":{"name":"@terminus"},"bugs":{"url":"https://github.com/GetTerminus/terminus-oss/issues"},"license":"MIT","readme":"<h1>Input</h1>\n\n[![CI/CD Status][github-action-badge]][github-action-link] [![Codecov][codecov-badge]][codecov-project] [![MIT License][license-image]][license-url]  \n[![NPM version][npm-version-image]][npm-package] [![Library size][file-size-badge]][raw-distribution-js]\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n## Table of Contents\n\n- [Installation](#installation)\n  - [CSS imports](#css-imports)\n  - [CSS resources](#css-resources)\n- [Usage](#usage)\n  - [Hint](#hint)\n  - [Error message](#error-message)\n  - [No validation or hint](#no-validation-or-hint)\n  - [Disabled](#disabled)\n  - [Required](#required)\n  - [Clearable](#clearable)\n  - [Focused](#focused)\n  - [Input Type](#input-type)\n  - [Input Attributes](#input-attributes)\n  - [Component reference](#component-reference)\n  - [Usage with Reactive Forms](#usage-with-reactive-forms)\n  - [Event Emitters](#event-emitters)\n  - [Small mode](#small-mode)\n  - [Masks](#masks)\n    - [Available Masks](#available-masks)\n    - [Sanitize the model value](#sanitize-the-model-value)\n    - [Allow decimals in number-based masks](#allow-decimals-in-number-based-masks)\n  - [Datepicker](#datepicker)\n    - [Filter out available dates](#filter-out-available-dates)\n    - [Set a min/max date range](#set-a-minmax-date-range)\n    - [Open the calendar to a specific date](#open-the-calendar-to-a-specific-date)\n    - [Open the calendar to a specific view](#open-the-calendar-to-a-specific-view)\n    - [Default open](#default-open)\n    - [Example with dynamic validation](#example-with-dynamic-validation)\n  - [Textarea](#textarea)\n    - [Rows](#rows)\n- [Test Helpers](#test-helpers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Installation\n\nUse the `ng add` command to quickly install all the needed dependencies:\n\n```bash\nng add @terminus/ui-input\n```\n\n### CSS imports\n\nIn your top-level stylesheet, add these imports:\n\n```css\n@import '~@terminus/design-tokens/css/library-design-tokens.css';\n@import '~@terminus/ui-styles/terminus-ui.css';\n```  \n\n### CSS resources\n\nLoad the needed font families by adding this link to the `<head>` of your application:\n\n```css\n<link href=\"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400&display=swap\" rel=\"stylesheet\">\n```\n\n## Usage\n\nAttach an `NgModel` or `FormControl` to the input:\n\n```html\n<ts-input [formControl]=\"myForm.get('myControl')\"></ts-input>\n<!-- OR -->\n<ts-input formControlName=\"myControl\"></ts-input>\n<!-- OR -->\n<ts-input [(ngModel)]=\"myModel\"></ts-input>\n```\n\nWe should _almost always_ being using a `FormControl`.\n\n### Hint\n\nA 'hint' can be displayed below the input on the right-hand side. This should be used for helpful user information such as input\nrequirements.\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  hint=\"Must contain only numbers and letters.\"\n></ts-input>\n```\n\n### Error message\n\nPass in an error message:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  errorMessage=\"Must be a valid email address\"\n></ts-input>\n```\n\n### No validation or hint\n\nA flag to define whether this input field needs validation or hint. If it needs validation or hint, space below the\ninput is added for the message.\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [noValidationOrHint]=\"true\"\n></ts-input>\n```\n\n### Disabled\n\nInputs can be disabled by setting the component flag OR by setting the associated `FormControl` to `disabled`.\n\nThe `isDisabled` flag works with both `ngModel` and `FormControl` inputs:\n\n```html\n<ts-input [isDisabled]=\"true\"></ts-input>\n```\n\nWhen using Reactive Forms, controls should be disabled via the control:\n\n```typescript\nmyControl: FormControl = new FormControl({value: '', disabled: true});\n```\n\n### Required\n\nWhen using a `FormControl`, set the required validator on the control:\n\n```typescript\nmyControl = new FormControl(null, Validators.required);\n```\n\nWhen using `ngModel`, validations are placed on the input as data-attributes (just like native HTML inputs):\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  required\n></ts-input>\n```\n\nThe `isRequired` flag can also be used:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isRequired]=\"true\"\n></ts-input>\n```\n\n### Clearable\n\nIf the input should be easily reset, include the `isClearable` flag to enable a 'clear input'\nbutton: (button will appear as small `x` icon at the far right of the input)\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isClearable]=\"true\"\n></ts-input>\n```\n\nWhen the input is cleared, the `cleared` event emitter will be fired with the value `true`.\n\n### Focused\n\nAuto-focus the input when the view loads:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isFocused]=\"true\"\n></ts-input>\n```\n\n> NOTE: If multiple inputs within the same view set `isFocused` to true, the _**last one rendered\n> will receive the final focus**_.\n\nThis can also be used to dynamically focus an existing input:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isFocused]=\"myFocusedFlag\"\n></ts-input>\n```\n\n```typescript\nmyFocusedFlag = false;\n\ntoggleInputFocus() {\n  this.myFocusedFlag = !this.myFocusedFlag;\n}\n```\n\n### Input Type\n\nThe input type can be defined with the type input:\n\n```html\n<ts-input type=\"email\"></ts-input>\n```\n\n> For all allowed types, see `TsInputTypes`.\n\n### Input Attributes\n\n`autocapitalize`, `autocomplete`, `spellcheck`, `readonly`\n\n```html\n<ts-input\n  [autocapitalize]=\"true\"\n  autocomplete=\"email\"\n  [spellcheck]=\"true\"\n  [readOnly]=\"false\"\n></ts-input>\n```\n\n> For all allowed `autocomplete` types, see `TsInputAutocompleteTypes`.\n\n### Component reference\n\nTo get a reference to the component class, assign the exported name to a local variable:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  #myInput=\"tsInput\"\n></ts-input>\n```\n\n```typescript\n@ViewChild(TsInputComponent, {static: false})\nmyInput: TsInputComponent;\n\nconsole.log('Component Class: ', this.myInput);\n```\n\n### Usage with Reactive Forms\n\nPass in the form control:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input [formControl]=\"myForm.get('date')\"></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  date: [\n    null, // If you need a default value, change this `null` to your value\n    [\n      Validators.required,\n    ],\n  ],\n});\n```\n\n**NOTE:** If using a form with nested form groups, _each group_ must be created with\n`formBuilder.group` for the form `get` control to work:\n\n```typescript\n// Notice the nested `dateRange` object without using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: {\n    startDate: [\n      new Date(2017, 4, 6),\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n    ],\n  },\n});\n\n// THIS WILL FAIL!\nconst range = myForm.get('dateRange');\n\n//////////////////////////////////////////////////\n\n// Notice the nested `dateRange` object IS using `.group`\nmyForm: FormGroup = this.formBuilder.group({\n  dateRange: this.formBuilder.group({\n    startDate: [\n      new Date(2017, 4, 6),\n      [\n        Validators.required,\n      ],\n    ],\n    endDate: [\n      new Date(2017, 4, 8),\n      [\n        Validators.required,\n      ],\n    ],\n  }),\n});\n\n// Now there is a group for us to 'get'\nconst range = myForm.get('dateRange');\n```\n\n### Event Emitters\n\nSupported event emitters:\n\n```html\n<ts-input\n  (inputBlur)=\"inputLostFocus($event)\"\n  (cleared)=\"inputWasBlurred($event)\"\n  (inputFocus)=\"inputGainedFocus($event)\"\n  (selected)=\"newDateSelected($event)\"\n  (inputPaste)=\"inputValuePasted($event)\"\n></ts-input>\n```\n\n> NOTE: The `selected` input is only available when `datepicker` is true.\n\n### Small mode\n\nA smaller version of the input can be used:\n\n```html\n<ts-input [isSmall]=\"true\"></ts-input>\n```\n\n### Masks\n\nMasks enable the input to enforce specific formatting for values; such as postal codes: `12345-1234`.\n\n#### Available Masks\n\n| Mask         | Input value  | Masked Value     |\n|--------------|--------------|------------------|\n| `currency`   | `12.34`      | `$12.34`         |\n| `date`       | `12121982`   | `12-12-1982`     |\n| `number`     | `1234.56`    | `1,234.56`       |\n| `percentage` | `12.4`       | `12.4%`          |\n| `phone`      | `1231231234` | `(123) 123-1234` |\n| `postal`     | `123456789`  | `12345-6789`     |\n\n#### Sanitize the model value\n\nMost often you will not want the mask characters to be saved as part of the actual value. By default this component will sanitize the value\nbefore saving it to the model. This can be disabled if needed:\n\n```html\n<ts-input mask=\"phone\" [maskSanitizeValue]=\"false\"></ts-input>\n```\n\nThis setup will format the value displayed in the UI: `(123) 456-7890`)while saving the pure value to the model: `1234567890`.\n\n#### Allow decimals in number-based masks\n\nBy default, number based masks (`number`, `percentage`) allow decimals. This can be disabled:\n\n```html\n<ts-input mask=\"number\" [maskAllowDecimal]=\"false\"></ts-input>\n```\n\nThis means when the user types `12.34`, the input UI and model value will both be `1234`.\n\n### Datepicker\n\nTo add datepicker abilities to an input, set the `datepicker` input:\n\n```html\n<ts-input [datepicker]=\"true\"></ts-input>\n```\n\n#### Filter out available dates\n\nIf, for instance, you need to prohibit weekend days (sat/sun) from being selected you can pass in a\ncustom method to filter dates:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [dateFilter]=\"myFilter\"\n></ts-datepicker>\n```\n\n```typescript\nmyFilter = (d: Date): boolean => {\n  const day = d.getDay();\n  // Prevent Saturday and Sunday from being selected.\n  return day !== 0 && day !== 6;\n}\n```\n\n#### Set a min/max date range\n\nTo define bounds for date selection, pass in a valid `Date` to `minDate` and/or `maxDate`:\n\n```html\n<ts-input\n  [datepicker]=\"true\"\n  [minDate]=\"date1\"\n  [minDate]=\"date2\"\n></ts-input>\n```\n\n```typescript\ndate1 = new Date(2017, 2, 1);\ndate2 = new Date(2017, 8, 1);\n```\n\n#### Open the calendar to a specific date\n\nPass in a `Date` to `openTo`:\n\n```html\n<ts-datepicker [openTo]=\"myDate\"></ts-datepicker>\n```\n\n```typescript\nmyDate = new Date(2017, 5, 12);\n```\n\n#### Open the calendar to a specific view\n\nBy default, the calendar opens up to show the month view. This can be changed to show the year view initially:\n\n```html\n<ts-datepicker [startingView]=\"year\"></ts-datepicker>\n```\n\n`year` and `month` are the only two valid values.\n\n#### Default open\n\nThe datepicker can be opened on load:\n\n```html\n<ts-input [datepickerDefaultOpen]=\"true\"></ts-input>\n```\n\n#### Example with dynamic validation\n\nWe can recreate a version of the {@link TsDateRangeComponent} using dynamic validation:\n\n```html\n<form [formGroup]=\"myForm\" novalidate>\n  <ts-input\n    [datepicker]=\"true\"\n    formControlName=\"startDate\"\n    (selected)=\"rangeStartChange($event)\"\n  ></ts-input>\n\n  <ts-input\n    [datepicker]=\"true\"\n    formControlName=\"endDate\"\n    (selected)=\"rangeEndChange($event)\"\n  ></ts-input>\n\n  <button (click)=\"submit(myForm.value)\">Submit</button>\n</form>\n```\n\n```typescript\nmyForm = this.formBuilder.group({\n  startDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n  endDate: [\n    null,\n    [\n      Validators.required,\n    ],\n  ],\n});\n\n// When the startDate changes, we want to set that date as the minDate for the endDate\nrangeStartChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('endDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.minDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n\n// When the endDate changes, we want to set that date as the maxDate for the startDate\nrangeEndChange(event: MatDatepickerInputEvent) {\n  if (event) {\n    // Get the from control\n    const control = this.formTwo.get('startDate');\n\n    // Set all validators.\n    // NOTE: setting validators will clear ALL existing validators, so we must add the required\n    // validator here again\n    control.setValidators([\n      Validators.required,\n      this.validatorsService.maxDate(event.value),\n    ]);\n    // Tell the control to update according to the new validators\n    control.updateValueAndValidity();\n  }\n}\n```\n\n### Textarea\n\nSwitch from a standard input to a textarea:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isTextarea]=\"true\"\n></ts-input>\n```\n\n#### Rows\n\nThe row count can be dynamically adjusted:\n\n```html\n<ts-input\n  formControlName=\"myControl\"\n  [isTextarea]=\"true\"\n  textareaRows=\"12\"\n></ts-input>\n```\n\n## Test Helpers\n\nSome helpers are exposed to assist with testing. These are imported from `@terminus/ui-input/testing`;\n\n[[source]][test-helpers-src]\n\n| Function               |\n|------------------------|\n| `getAllInputInstances` |\n| `getInputInstance`     |\n| `getInputElement`      |\n| `sendInput`            |\n\n<!-- Links -->\n[test-helpers-src]:    testing/src/test-helpers.ts\n[license-url]:         https://github.com/GetTerminus/terminus-oss/blob/release/LICENSE\n[license-image]:       http://img.shields.io/badge/license-MIT-blue.svg\n[codecov-project]:     https://codecov.io/gh/GetTerminus/terminus-oss\n[codecov-badge]:       https://codecov.io/gh/GetTerminus/terminus-oss/branch/release/graph/badge.svg\n[npm-version-image]:   http://img.shields.io/npm/v/@terminus/ui-input.svg\n[npm-package]:         https://www.npmjs.com/package/@terminus/ui-input\n[github-action-badge]: https://github.com/GetTerminus/terminus-oss/workflows/Release%20CI/badge.svg\n[github-action-link]:  https://github.com/GetTerminus/terminus-oss/actions?query=workflow%3A%22CI+Release%22\n[file-size-badge]:     http://img.badgesize.io/https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.min.js?compression=gzip\n[raw-distribution-js]: https://unpkg.com/@terminus/ui-input/bundles/terminus-ui-input.umd.js\n","readmeFilename":"README.md"}