@@ -62,7 +62,7 @@ A simple multi-step form built with the Bootstrap Stepper. Each step displays fo
62
62
<label for="horizontalStepperUsername" class="form-label">Username</label>
63
63
<div class="input-group has-validation">
64
64
<span class="input-group-text" id="inputGroupPrepend">@</span>
65
- <input type="text" class="form-control" id="horizontalStepperUsername" aria-describedby="inputGroupPrepend">
65
+ <input type="text" class="form-control" id="horizontalStepperUsername" aria-describedby="inputGroupPrepend" required >
66
66
<div class="invalid-feedback">
67
67
Please choose a username.
68
68
</div>
@@ -353,14 +353,197 @@ The Stepper Component includes native HTML5 validation for each step. Before all
353
353
354
354
If a form is invalid, the stepper blocks navigation and displays validation messages.
355
355
356
- To disable native browser validation UI, add the ` novalidate ` attribute to your ` <form> ` elements.
356
+ ### Browser default validation
357
357
358
- ``` html
359
- <form novalidate >
360
- <input required >
361
- <button type =" submit" >Submit</button >
362
- </form >
363
- ```
358
+ This example shows a stepper with native browser validation enabled:
359
+
360
+ {{< example >}}
361
+ <div class =" stepper " data-coreui-toggle =" stepper " id =" validationStepper " >
362
+ <ol class =" stepper-steps " >
363
+ <li class="stepper-step">
364
+ <button type="button" class="stepper-step-button active" data-coreui-toggle="step" data-coreui-target="#validation-step-1">
365
+ <span class="stepper-step-indicator">1</span>
366
+ <span class="stepper-step-label">Account</span>
367
+ </button>
368
+ </li>
369
+ <li class="stepper-step">
370
+ <button type="button" class="stepper-step-button" data-coreui-toggle="step" data-coreui-target="#validation-step-2">
371
+ <span class="stepper-step-indicator">2</span>
372
+ <span class="stepper-step-label">Profile</span>
373
+ </button>
374
+ </li>
375
+ </ol >
376
+ <div class =" stepper-content " >
377
+ <div class="stepper-pane active show" id="validation-step-1">
378
+ <form class="row g-3 mb-4">
379
+ <div class="col-md-6">
380
+ <label for="validationEmail" class="form-label">Email</label>
381
+ <input type="email" class="form-control" id="validationEmail" required>
382
+ <div class="invalid-feedback">
383
+ Please provide a valid email.
384
+ </div>
385
+ </div>
386
+ <div class="col-md-6">
387
+ <label for="validationPassword" class="form-label">Password</label>
388
+ <input type="password" class="form-control" id="validationPassword" required minlength="8">
389
+ <div class="invalid-feedback">
390
+ Password must be at least 8 characters long.
391
+ </div>
392
+ </div>
393
+ </form>
394
+ <button class="btn btn-primary" data-coreui-stepper-action="next">Next</button>
395
+ </div>
396
+ <div class="stepper-pane" id="validation-step-2">
397
+ <form class="row g-3 mb-4">
398
+ <div class="col-md-6">
399
+ <label for="validationName" class="form-label">First name</label>
400
+ <input type="text" class="form-control" id="validationName" required>
401
+ <div class="invalid-feedback">
402
+ Please provide your first name.
403
+ </div>
404
+ </div>
405
+ <div class="col-md-6">
406
+ <label for="validationLastName" class="form-label">Last name</label>
407
+ <input type="text" class="form-control" id="validationLastName" required>
408
+ <div class="invalid-feedback">
409
+ Please provide your last name.
410
+ </div>
411
+ </div>
412
+ </form>
413
+ <button class="btn btn-secondary" data-coreui-stepper-action="prev">Previous</button>
414
+ <button class="btn btn-success" data-coreui-stepper-action="finish">Finish</button>
415
+ </div>
416
+ </div >
417
+ </div >
418
+ {{< /example >}}
419
+
420
+ ### Custom styles
421
+
422
+ To disable native browser styles validation and turn on custom styles, add the ` novalidate ` attribute to your forms:
423
+
424
+ {{< example >}}
425
+ <div class =" stepper " data-coreui-toggle =" stepper " id =" novalidateStepper " >
426
+ <ol class =" stepper-steps " >
427
+ <li class="stepper-step">
428
+ <button type="button" class="stepper-step-button active" data-coreui-toggle="step" data-coreui-target="#novalidate-step-1">
429
+ <span class="stepper-step-indicator">1</span>
430
+ <span class="stepper-step-label">Account</span>
431
+ </button>
432
+ </li>
433
+ <li class="stepper-step">
434
+ <button type="button" class="stepper-step-button" data-coreui-toggle="step" data-coreui-target="#novalidate-step-2">
435
+ <span class="stepper-step-indicator">2</span>
436
+ <span class="stepper-step-label">Profile</span>
437
+ </button>
438
+ </li>
439
+ </ol >
440
+ <div class =" stepper-content " >
441
+ <div class="stepper-pane active show" id="novalidate-step-1">
442
+ <form class="row g-3 mb-4" novalidate>
443
+ <div class="col-md-6">
444
+ <label for="customEmail" class="form-label">Email</label>
445
+ <input type="email" class="form-control" id="customEmail" required>
446
+ <div class="invalid-feedback">
447
+ Please provide a valid email.
448
+ </div>
449
+ </div>
450
+ <div class="col-md-6">
451
+ <label for="customPassword" class="form-label">Password</label>
452
+ <input type="password" class="form-control" id="customPassword" required minlength="8">
453
+ <div class="invalid-feedback">
454
+ Password must be at least 8 characters long.
455
+ </div>
456
+ </div>
457
+ </form>
458
+ <button class="btn btn-primary" data-coreui-stepper-action="next">Next</button>
459
+ </div>
460
+ <div class="stepper-pane" id="novalidate-step-2">
461
+ <form class="row g-3 mb-4" novalidate>
462
+ <div class="col-md-6">
463
+ <label for="customName" class="form-label">First name</label>
464
+ <input type="text" class="form-control" id="customName" required>
465
+ <div class="invalid-feedback">
466
+ Please provide your first name.
467
+ </div>
468
+ </div>
469
+ <div class="col-md-6">
470
+ <label for="customLastName" class="form-label">Last name</label>
471
+ <input type="text" class="form-control" id="customLastName" required>
472
+ <div class="invalid-feedback">
473
+ Please provide your last name.
474
+ </div>
475
+ </div>
476
+ </form>
477
+ <button class="btn btn-secondary" data-coreui-stepper-action="prev">Previous</button>
478
+ <button class="btn btn-success" data-coreui-stepper-action="finish">Finish</button>
479
+ </div>
480
+ </div >
481
+ </div >
482
+ {{< /example >}}
483
+
484
+ ### Skip validation
485
+
486
+ To completely skip form validation and allow free navigation between steps, add ` data-coreui-skip-validation="true" ` to the stepper:
487
+
488
+ {{< example >}}
489
+ <div class =" stepper " data-coreui-toggle =" stepper " data-coreui-skip-validation =" true " id =" skipValidationStepper " >
490
+ <ol class =" stepper-steps " >
491
+ <li class="stepper-step">
492
+ <button type="button" class="stepper-step-button active" data-coreui-toggle="step" data-coreui-target="#skip-step-1">
493
+ <span class="stepper-step-indicator">1</span>
494
+ <span class="stepper-step-label">Account</span>
495
+ </button>
496
+ </li>
497
+ <li class="stepper-step">
498
+ <button type="button" class="stepper-step-button" data-coreui-toggle="step" data-coreui-target="#skip-step-2">
499
+ <span class="stepper-step-indicator">2</span>
500
+ <span class="stepper-step-label">Profile</span>
501
+ </button>
502
+ </li>
503
+ </ol >
504
+ <div class =" stepper-content " >
505
+ <div class="stepper-pane active show" id="skip-step-1">
506
+ <form class="row g-3 mb-4">
507
+ <div class="col-md-6">
508
+ <label for="skipEmail" class="form-label">Email</label>
509
+ <input type="email" class="form-control" id="skipEmail" required>
510
+ <div class="invalid-feedback">
511
+ Please provide a valid email.
512
+ </div>
513
+ </div>
514
+ <div class="col-md-6">
515
+ <label for="skipPassword" class="form-label">Password</label>
516
+ <input type="password" class="form-control" id="skipPassword" required minlength="8">
517
+ <div class="invalid-feedback">
518
+ Password must be at least 8 characters long.
519
+ </div>
520
+ </div>
521
+ </form>
522
+ <button class="btn btn-primary" data-coreui-stepper-action="next">Next</button>
523
+ </div>
524
+ <div class="stepper-pane" id="skip-step-2">
525
+ <form class="row g-3 mb-4">
526
+ <div class="col-md-6">
527
+ <label for="skipName" class="form-label">First name</label>
528
+ <input type="text" class="form-control" id="skipName" required>
529
+ <div class="invalid-feedback">
530
+ Please provide your first name.
531
+ </div>
532
+ </div>
533
+ <div class="col-md-6">
534
+ <label for="skipLastName" class="form-label">Last name</label>
535
+ <input type="text" class="form-control" id="skipLastName" required>
536
+ <div class="invalid-feedback">
537
+ Please provide your last name.
538
+ </div>
539
+ </div>
540
+ </form>
541
+ <button class="btn btn-secondary" data-coreui-stepper-action="prev">Previous</button>
542
+ <button class="btn btn-success" data-coreui-stepper-action="finish">Finish</button>
543
+ </div>
544
+ </div >
545
+ </div >
546
+ {{< /example >}}
364
547
365
548
Validation is fully automatic, no extra JavaScript is needed.
366
549
@@ -422,6 +605,7 @@ const stepperList = stepperElementList.map(stepperEl => {
422
605
| Option | Type | Default | Description |
423
606
| --- | --- | --- | --- |
424
607
| ` linear ` | boolean | ` true ` | Forces steps to be completed in order (sequential navigation). Set ` false ` for free navigation. |
608
+ | ` skipValidation ` | boolean | ` false ` | When set to ` true ` , disables form validation completely, allowing users to navigate between steps regardless of form state. |
425
609
{{< /bs-table >}}
426
610
427
611
### Methods
0 commit comments