@@ -926,32 +926,50 @@ export function selected(dom) {
926926}
927927
928928/**
929- * @param {Element } dom
929+ * @param {HTMLInputElement } dom
930930 * @param {() => unknown } get_value
931931 * @param {(value: unknown) => void } update
932932 * @returns {void }
933933 */
934934export function bind_value ( dom , get_value , update ) {
935935 dom . addEventListener ( 'input' , ( ) => {
936- // @ts -ignore
936+ /** @type { any } */
937937 let value = dom . value ;
938- // @ts -ignore
939- const type = dom . type ;
940- if ( type === 'number' || type === 'range' ) {
941- value = value === '' ? null : + value ;
938+ if ( is_numberlike_input ( dom ) ) {
939+ value = to_number ( value ) ;
942940 }
943941 update ( value ) ;
944942 } ) ;
943+
945944 render_effect ( ( ) => {
946945 const value = get_value ( ) ;
947- const coerced_value = value == null ? null : value + '' ;
948- // @ts -ignore
949- dom . value = coerced_value ;
950946 // @ts -ignore
951947 dom . __value = value ;
948+
949+ if ( is_numberlike_input ( dom ) && value === to_number ( dom . value ) ) {
950+ // handles 0 vs 00 case (see https://github.com/sveltejs/svelte/issues/9959)
951+ return ;
952+ }
953+
954+ dom . value = stringify ( value ) ;
952955 } ) ;
953956}
954957
958+ /**
959+ * @param {HTMLInputElement } dom
960+ */
961+ function is_numberlike_input ( dom ) {
962+ const type = dom . type ;
963+ return type === 'number' || type === 'range' ;
964+ }
965+
966+ /**
967+ * @param {string } value
968+ */
969+ function to_number ( value ) {
970+ return value === '' ? null : + value ;
971+ }
972+
955973/**
956974 * @param {HTMLSelectElement } dom
957975 * @param {() => unknown } get_value
0 commit comments