@@ -926,32 +926,50 @@ export function selected(dom) {
926
926
}
927
927
928
928
/**
929
- * @param {Element } dom
929
+ * @param {HTMLInputElement } dom
930
930
* @param {() => unknown } get_value
931
931
* @param {(value: unknown) => void } update
932
932
* @returns {void }
933
933
*/
934
934
export function bind_value ( dom , get_value , update ) {
935
935
dom . addEventListener ( 'input' , ( ) => {
936
- // @ts -ignore
936
+ /** @type { any } */
937
937
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 ) ;
942
940
}
943
941
update ( value ) ;
944
942
} ) ;
943
+
945
944
render_effect ( ( ) => {
946
945
const value = get_value ( ) ;
947
- const coerced_value = value == null ? null : value + '' ;
948
- // @ts -ignore
949
- dom . value = coerced_value ;
950
946
// @ts -ignore
951
947
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 ) ;
952
955
} ) ;
953
956
}
954
957
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
+
955
973
/**
956
974
* @param {HTMLSelectElement } dom
957
975
* @param {() => unknown } get_value
0 commit comments