Skip to content

Instantly share code, notes, and snippets.

@fourcolors
Last active January 20, 2020 07:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fourcolors/8c7dc745e5df882af023aa5cb2496a47 to your computer and use it in GitHub Desktop.
Save fourcolors/8c7dc745e5df882af023aa5cb2496a47 to your computer and use it in GitHub Desktop.
Svelte 9 Phone Field
<script>
const digits = Array(10).fill(null);
const focusNext = i => {
const next = digits[i + 1];
if (Boolean(next)) next.focus();
};
const focusPrevious = i => {
const next = digits[i - 1];
if (Boolean(next)) next.focus();
};
const isDigit = e => e.which >= 48 && e.which <= 57;
const deleteOrBackspace = e => e.which === 46 || e.which === 8;
const handleKeydown = e => {
if (!isDigit(e) && !deleteOrBackspace(e)) {
e.preventDefault();
return;
}
};
const handleKeyup = (e, i) => {
if (deleteOrBackspace(e)) {
focusPrevious(i);
} else if (isDigit) {
focusNext(i);
}
};
</script>
<style>
.digit {
width: 20px;
height: 30px;
text-align: center;
font-size: 20px;
}
.phone-container {
font-size: 26px;
padding: 20px;
}
</style>
<div class="phone-container">
+1
{#each digits as d, i}
{#if i === 0}({/if}
{#if i === 3}){/if}
{#if i === 6}-{/if}
<input
on:keyup={e => handleKeyup(e, i)}
on:keydown={e => handleKeydown(e)}
bind:this={digits[i]}
class="digit"
type="tel"
maxlength="1" />
{/each}
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment