@@ -101,6 +101,9 @@ export class NumberField extends TextfieldBase {
101101 @query ( '.buttons' )
102102 private buttons ! : HTMLDivElement ;
103103
104+ @query ( '#form' )
105+ public form ! : HTMLFormElement ;
106+
104107 @property ( { type : Boolean , reflect : true } )
105108 public override focused = false ;
106109
@@ -476,6 +479,16 @@ export class NumberField extends TextfieldBase {
476479 this . inputElement . setSelectionRange ( nextSelectStart , nextSelectStart ) ;
477480 }
478481
482+ private handleSubmit ( event : Event ) : void {
483+ event . preventDefault ( ) ;
484+ this . dispatchEvent (
485+ new Event ( 'submit' , {
486+ cancelable : true ,
487+ bubbles : true ,
488+ } )
489+ ) ;
490+ }
491+
479492 private valueWithLimits ( nextValue : number ) : number {
480493 let value = nextValue ;
481494 if ( typeof this . min !== 'undefined' ) {
@@ -606,7 +619,7 @@ export class NumberField extends TextfieldBase {
606619 protected override renderField ( ) : TemplateResult {
607620 this . autocomplete = 'off' ;
608621 return html `
609- ${ super . renderField ( ) }
622+ < form id =" form " > ${ super . renderField ( ) } </ form >
610623 ${ this . hideStepper
611624 ? nothing
612625 : html `
@@ -704,7 +717,31 @@ export class NumberField extends TextfieldBase {
704717 this . addEventListener ( 'compositionend' , this . handleCompositionEnd ) ;
705718 }
706719
720+ public override connectedCallback ( ) : void {
721+ super . connectedCallback ( ) ;
722+ this . _firstUpdateAfterConnected = true ;
723+ this . requestUpdate ( ) ;
724+ }
725+
726+ public override disconnectedCallback ( ) : void {
727+ // Cleanup form event listener and remove form element from DOM
728+ this . form . removeEventListener ( 'submit' , this . handleSubmit . bind ( this ) ) ;
729+ this . form . remove ( ) ;
730+ super . disconnectedCallback ( ) ;
731+ }
732+
733+ protected override firstUpdateAfterConnected ( ) : void {
734+ super . firstUpdateAfterConnected ( ) ;
735+ this . form . addEventListener ( 'submit' , this . handleSubmit . bind ( this ) ) ;
736+ }
737+
707738 protected override updated ( changes : PropertyValues < this> ) : void {
739+ super . updated ( changes ) ;
740+ if ( this . _firstUpdateAfterConnected ) {
741+ this . _firstUpdateAfterConnected = false ;
742+ this . firstUpdateAfterConnected ( ) ;
743+ }
744+
708745 if ( changes . has ( 'min' ) || changes . has ( 'formatOptions' ) ) {
709746 let inputMode = 'numeric' ;
710747 const hasNegative = typeof this . min !== 'undefined' && this . min < 0 ;
0 commit comments