JSPM

@algrith/safari-numfix

1.0.2
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 8
  • Score
    100M100P100Q39345F
  • License MIT

A lightweight utility to safely handle paste & keydown events on <input type="number"> fields in Safari. Provides a browser-aware workaround that preserves caret position, sanitizes multiple decimal points, and works with React, Vue, Angular, or vanilla JavaScript.

Package Exports

  • @algrith/safari-numfix
  • @algrith/safari-numfix/dist/index.module.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@algrith/safari-numfix) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Algrith Safari Number Fix (safari-numfix)

🧩 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