your form is missing an "action".
try this as an example:
<form class="row g-3" action="https://www.b4x.com">
<div class="row">
<div class="col-lg-6">
<div class="mb-3">
<label for="firstnameInput" class="form-label">First
Name</label>
<input type="text" class="form-control" id="firstnameInput" placeholder="Enter your firstname" required>
</div>
<div class="mb-3">
<button id="btntest" type="submit">Test Button</button>
</div>
</div>
</div>
</form>
note: this is one of
many ways to handle the submit button. i simply went with what you had coded. i added an "action" and loaded the code into a browser. the results were as expected: 1) refusal to submit if first name was blank and 2) load b4x.com if the first name was populated.