|  | 
| 49 | 49 |       </ion-header> | 
| 50 | 50 | 
 | 
| 51 | 51 |       <ion-content id="content" class="ion-padding"> | 
| 52 |  | -        <div class="grid"> | 
| 53 |  | -          <div class="grid-item"> | 
| 54 |  | -            <h2>No Hint</h2> | 
| 55 |  | -            <ion-input label="Email"></ion-input> | 
| 56 |  | -          </div> | 
|  | 52 | +        <ion-input | 
|  | 53 | +          type="email" | 
|  | 54 | +          fill="solid" | 
|  | 55 | +          label="Email" | 
|  | 56 | +          label-placement="floating" | 
|  | 57 | +          helper-text="Enter a valid email" | 
|  | 58 | +          error-text="Invalid email" | 
|  | 59 | +        ></ion-input> | 
| 57 | 60 | 
 | 
| 58 |  | -          <div class="grid-item"> | 
| 59 |  | -            <h2>Helper Hint</h2> | 
| 60 |  | -            <ion-input label="Email" helper-text="Enter your email"></ion-input> | 
| 61 |  | -          </div> | 
|  | 61 | +        <script> | 
|  | 62 | +          const input = document.querySelector('ion-input'); | 
| 62 | 63 | 
 | 
| 63 |  | -          <div class="grid-item"> | 
| 64 |  | -            <h2>Error Hint</h2> | 
| 65 |  | -            <ion-input | 
| 66 |  | -              class="ion-touched ion-invalid" | 
| 67 |  | -              label="Email" | 
| 68 |  | -              error-text="Please enter a valid email" | 
| 69 |  | -            ></ion-input> | 
| 70 |  | -          </div> | 
|  | 64 | +          input.addEventListener('ionInput', (ev) => validate(ev)); | 
|  | 65 | +          input.addEventListener('ionBlur', () => markTouched()); | 
| 71 | 66 | 
 | 
| 72 |  | -          <div class="grid-item"> | 
| 73 |  | -            <h2>Custom Error Color</h2> | 
| 74 |  | -            <ion-input | 
| 75 |  | -              class="ion-touched ion-invalid custom-error-color" | 
| 76 |  | -              label="Email" | 
| 77 |  | -              error-text="Please enter a valid email" | 
| 78 |  | -            ></ion-input> | 
| 79 |  | -          </div> | 
|  | 67 | +          const validateEmail = (email) => { | 
|  | 68 | +            return email.match( | 
|  | 69 | +              /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ | 
|  | 70 | +            ); | 
|  | 71 | +          }; | 
| 80 | 72 | 
 | 
| 81 |  | -          <div class="grid-item"> | 
| 82 |  | -            <h2>Counter</h2> | 
| 83 |  | -            <ion-input label="Email" counter="true" maxlength="100"></ion-input> | 
| 84 |  | -          </div> | 
|  | 73 | +          const validate = (ev) => { | 
|  | 74 | +            const value = ev.target.value; | 
| 85 | 75 | 
 | 
| 86 |  | -          <div class="grid-item"> | 
| 87 |  | -            <h2>Custom Counter</h2> | 
| 88 |  | -            <ion-input id="custom-counter" label="Email" counter="true" maxlength="100"></ion-input> | 
| 89 |  | -          </div> | 
|  | 76 | +            input.classList.remove('ion-valid'); | 
|  | 77 | +            input.classList.remove('ion-invalid'); | 
| 90 | 78 | 
 | 
| 91 |  | -          <div class="grid-item"> | 
| 92 |  | -            <h2>Counter with Helper</h2> | 
| 93 |  | -            <ion-input label="Email" counter="true" maxlength="100" helper-text="Enter an email"></ion-input> | 
| 94 |  | -          </div> | 
|  | 79 | +            if (value === '') return; | 
| 95 | 80 | 
 | 
| 96 |  | -          <div class="grid-item"> | 
| 97 |  | -            <h2>Counter with Error</h2> | 
| 98 |  | -            <ion-input | 
| 99 |  | -              class="ion-touched ion-invalid" | 
| 100 |  | -              label="Email" | 
| 101 |  | -              counter="true" | 
| 102 |  | -              maxlength="100" | 
| 103 |  | -              error-text="Please enter a valid email" | 
| 104 |  | -            ></ion-input> | 
| 105 |  | -          </div> | 
| 106 |  | -        </div> | 
|  | 81 | +            validateEmail(value) ? input.classList.add('ion-valid') : input.classList.add('ion-invalid'); | 
|  | 82 | +          }; | 
| 107 | 83 | 
 | 
| 108 |  | -        <script> | 
| 109 |  | -          const customCounterInput = document.querySelector('ion-input#custom-counter'); | 
| 110 |  | -          customCounterInput.counterFormatter = (inputLength, maxLength) => { | 
| 111 |  | -            const length = maxLength - inputLength; | 
| 112 |  | -            return `${maxLength - inputLength} characters left`; | 
|  | 84 | +          const markTouched = () => { | 
|  | 85 | +            input.classList.add('ion-touched'); | 
| 113 | 86 |           }; | 
| 114 | 87 |         </script> | 
| 115 | 88 |       </ion-content> | 
|  | 
0 commit comments