diff options
| author | Adam Soltys <[email protected]> | 2023-02-06 16:40:14 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-02-06 16:40:19 -0800 |
| commit | 66740dea41f2772d46e1b13b91ef0e7b1a68bfff (patch) | |
| tree | 2ff8926078222020c05252e64da6ae5e9c9cbbef /src/components/Pinpad.svelte | |
| parent | 916f331e0e9a051830ce988639bb2149788e8228 (diff) | |
| download | coinos-ui-66740dea41f2772d46e1b13b91ef0e7b1a68bfff.tar.gz coinos-ui-66740dea41f2772d46e1b13b91ef0e7b1a68bfff.zip | |
new pinpad component
Diffstat (limited to 'src/components/Pinpad.svelte')
| -rw-r--r-- | src/components/Pinpad.svelte | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/components/Pinpad.svelte b/src/components/Pinpad.svelte new file mode 100644 index 00000000..bf3778f7 --- /dev/null +++ b/src/components/Pinpad.svelte @@ -0,0 +1,81 @@ +<script> + import { Left, Icon } from '$comp'; + import { pin, selectedRate } from '$lib/store'; + import { f, s, focus, post, warning, sat, sats } from '$lib/utils'; + import { t } from '$lib/translations'; + + export let v; + export let cancel; + + let arrow = '<'; + let loading = false; + + const numPad = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'C', '0', '<']; + + const handleInput = (n) => { + v = (v || '').toString(); + if (n === 'C') return (v = ''); + if (n === '<') return (v = v.length > 1 ? Math.floor(v / 10) : ''); + if (v.length > 5) n = ''; + if (parseInt(n) >= 0) v += n; + }; + + let validate = (e) => { + let k = e.key || e.code; + if (k === 'Escape') cancel(); + if (e.key.length <= 1 && !(e.metaKey || e.ctrlKey || e.altKey) && !(k >= '0' && k <= '9')) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + }; + + let hide = true; +</script> + +<div class="flex justify-center items-center"> + <div class="space-y-5"> + <div class="text-5xl md:text-6xl font-semibold relative w-[300px]"> + {#if hide} + <input + on:keydown={validate} + use:focus + bind:value={v} + type="password" + class="outline-none border-0 text-center py-0" + pattern="[0-9]+" + /> + {:else} + <input + on:keydown={validate} + bind:value={v} + class="outline-none border-0 text-center py-0" + type="text" + pattern="[0-9]+" + /> + {/if} + <button type="button" on:click={() => (hide = !hide)} class="absolute -right-5 top-5"> + <Icon icon={hide ? 'eye-off' : 'eye'} style="w-8" /> + </button> + </div> + + <div class="grid grid-cols-3 gap-2 w-[300px] mx-auto grayscale"> + {#each numPad as value} + {#if value === arrow} + <button + type="button" + class="bg-primary rounded-xl py-4 px-8 font-semibold active:bg-black active:text-white flex justify-center items-center hover:opacity-80" + on:click={() => handleInput(value)} + > + <Left /> + </button> + {:else} + <button + type="button" + class="bg-primary rounded-xl py-4 px-8 font-semibold active:bg-black active:text-white hover:opacity-80" + on:click={() => handleInput(value)}>{value}</button + > + {/if} + {/each} + </div> + </div> +</div> |
