Log in Email Password @if (invalid) { Invalid email or password. } Log in Don't have an account? Register
Register @if (error) { {{ error }} } Email {{ emailTouched && !emailValid ? 'Please enter a valid email address.' : '' }} Password {{ passwordTouched && !passwordValid ? 'Password must be at least ' + minPasswordLength + ' characters.' : '' }} Register Already have an account? Log in
Item Details List @for (list of lists(); track $index) { {{ list.title }} } Priority @for (level of priorityLevels(); track $index) { {{ level.title }} } Note
New List Title setNewListTitle(e.target.value)} aria-invalid={newListError ? 'true' : undefined} onKeyDown={e => e.key === 'Enter' && commitNewList()} maxLength={200} /> {newListError && {newListError}}
List Options Title setListOptionsEditor(ed => ({ ...ed, title: e.target.value }))} onKeyDown={e => e.key === 'Enter' && updateListOptions()} maxLength={200} />
Item Details List setItemDetailsEditor(ed => ({ ...ed, listId: +e.target.value }))}> {lists.map(list => ( {list.title} ))} Priority setItemDetailsEditor(ed => ({ ...ed, priority: +e.target.value }))}> {priorityLevels.map(level => ( {level.title} ))} Note setItemDetailsEditor(ed => ({ ...ed, note: e.target.value }))}>
Register {error && {error}} Email setEmail(e.target.value)} onBlur={() => setEmailTouched(true)} aria-invalid={emailInvalid} aria-describedby="email-helper" /> {emailTouched && !emailValid ? 'Please enter a valid email address.' : ''} Password setPassword(e.target.value)} onBlur={() => setPasswordTouched(true)} aria-invalid={passwordInvalid} aria-describedby="password-helper" /> {passwordTouched && !passwordValid ? `Password must be at least ${MIN_PASSWORD_LENGTH} characters.` : ''} Register Already have an account? Log in