Skip to content

🧩 A lightweight utility to safely handle paste & keydown events on number input fields in Safari.

License

Notifications You must be signed in to change notification settings

algrith/safari-numfix

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🧩 A lightweight utility to safely handle paste and keydown events on number input fields in Safari.

Safari has a sanitization deficiency in <input type="number"> fields compared to modern browsers. It allows non-numeric characters and multiple decimal points, leading to unexpected or invalid values. This package provides a browser-aware workaround that intercepts paste & keydown events, corrects invalid numeric formats, and updates the input value correctly.


Algrith Safari Number Fix (safari-numfix) is released under the MIT license. npm downloads/month

🚀 Features

  • ✅ Ignores paste actions that include non-numeric characters
  • ✅ Fixes Safari-specific paste behavior for number inputs
  • ✅ Works with React, Vue, Angular, or plain JavaScript
  • ✅ Maintains accurate caret position on insert
  • ✅ Ensures only one decimal point is allowed
  • ✅ Restricts non-numeric entries on keydown
  • ✅ TypeScript support

📦 Installation

npm install @algrith/safari-numfix
# or
yarn add @algrith/safari-numfix

🔧 Usage

ReactJs

import { keyDownEventHandler, pasteEventHandler } from '@algrith/safari-numfix';

const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
  console.log(event.target.value);
};

<input
  onPaste={(e) => pasteEventHandler(e, handleChange)}
  onKeyDown={keyDownEventHandler}
  onChange={handleChange}
  type="number"
/>

VueJs

<script setup>
import { keyDownEventHandler, pasteEventHandler } from '@algrith/safari-numfix';

const handleChange = (e) => {
  console.log(e.target.value);
};
</script>

<template>
  <input
    @paste="(e) => pasteEventHandler(e, handleChange)"
    @keydown="keyDownEventHandler"
    @input="handleChange"
    type="number"
  />
</template>

Angular

import { keyDownEventHandler, pasteEventHandler } from '@algrith/safari-numfix';

onKeyDown(event: KeyboardEvent) {
  keyDownEventHandler(event);
};

onPaste(event: ClipboardEvent) {
  pasteEventHandler(event, this.onChange.bind(this));
}

VanillaJs

<input id="numInput" type="number" />

<script type="module">
  import { keyDownEventHandler, pasteEventHandler } from 'https://cdn.skypack.dev/@algrith/safari-numfix';

  const input = document.getElementById('numInput');

  input.addEventListener('keydown', keyDownEventHandler);

  input.addEventListener('paste', (e) => {
    pasteEventHandler(e, (event) => {
      console.log('Updated value:', event.target.value);
    });
  });
</script>

TypeScript Support

Types files can be found at https://github.com/algrith/safari-numfix/tree/main/src/types.ts.

Contributing

About

🧩 A lightweight utility to safely handle paste & keydown events on number input fields in Safari.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published