diff options
| author | Mark Otto <[email protected]> | 2017-12-22 16:13:01 -0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-12-22 16:13:01 -0800 |
| commit | 16f14172406fd88ddb21242ea361833ec19d4fc6 (patch) | |
| tree | b3b73371bf3b8d2d6273b0a9fb6235e48b7a2bbf /docs | |
| parent | 13150872c6637d0d224aa9d14fe8e103aff3139e (diff) | |
| download | bootstrap-16f14172406fd88ddb21242ea361833ec19d4fc6.tar.xz bootstrap-16f14172406fd88ddb21242ea361833ec19d4fc6.zip | |
Form check markup v2 (#25050)
* match layout behaviors
* ditch the indicator as separate element for psuedo-elements on the label
* move disabled to attribute only on input
* redo default inline check to support new markup
* redo inline forms
* clean up vars
* update validation mixin to new structure
* update checks in docs
* linting for for/id attributes
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/4.0/components/dropdowns.md | 8 | ||||
| -rw-r--r-- | docs/4.0/components/forms.md | 299 | ||||
| -rw-r--r-- | docs/4.0/migration.md | 13 |
3 files changed, 152 insertions, 168 deletions
diff --git a/docs/4.0/components/dropdowns.md b/docs/4.0/components/dropdowns.md index 926729a3d..b49e84f92 100644 --- a/docs/4.0/components/dropdowns.md +++ b/docs/4.0/components/dropdowns.md @@ -615,8 +615,8 @@ Put a form within a dropdown menu, or make it into a dropdown menu, and use [mar <input type="password" class="form-control" id="exampleDropdownFormPassword1" placeholder="Password"> </div> <div class="form-check"> - <label class="form-check-label"> - <input type="checkbox" class="form-check-input"> + <input type="checkbox" class="form-check-input" id="dropdownCheck"> + <label class="form-check-label" for="dropdownCheck"> Remember me </label> </div> @@ -639,8 +639,8 @@ Put a form within a dropdown menu, or make it into a dropdown menu, and use [mar <input type="password" class="form-control" id="exampleDropdownFormPassword2" placeholder="Password"> </div> <div class="form-check"> - <label class="form-check-label"> - <input type="checkbox" class="form-check-input"> + <input type="checkbox" class="form-check-input" id="dropdownCheck2"> + <label class="form-check-label" for="dropdownCheck2"> Remember me </label> </div> diff --git a/docs/4.0/components/forms.md b/docs/4.0/components/forms.md index d485ef4cd..ee67ffa80 100644 --- a/docs/4.0/components/forms.md +++ b/docs/4.0/components/forms.md @@ -26,10 +26,8 @@ Here's a quick example to demonstrate Bootstrap's form styles. Keep reading for <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password"> </div> <div class="form-check"> - <label class="form-check-label"> - <input type="checkbox" class="form-check-input"> - Check me out - </label> + <input type="checkbox" class="form-check-input" id="exampleCheck1"> + <label class="form-check-label" for="exampleCheck1">Check me out</label> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> @@ -154,7 +152,9 @@ If you want to have `<input readonly>` elements in your form styled as plain tex Default checkboxes and radios are improved upon with the help of `.form-check`, **a single class for both input types that improves the layout and behavior of their HTML elements**. Checkboxes are for selecting one or several options in a list, while radios are for selecting one option from many. -Disabled checkboxes and radios are supported, but to provide a `not-allowed` cursor on hover of the parent `<label>`, you'll need to add the `.disabled` class to the parent `.form-check`. The disabled class will also lighten the text color to help indicate the input's state. +Disabled checkboxes and radios are supported, but to provide a `not-allowed` cursor on hover of the parent `<label>`, you'll need to add the `disabled` attribute to the `.form-check-input`. The disabled attribute will apply a lighter color to help indicate the input's state. + +Checkboxes and radios use are built to support HTML-based form validation and provide concise, accessible labels. As such, our `<input>`s and `<label>`s are sibling elements as opposed to an `<input>` within a `<label>`. This is slightly more verbose as you must specify `id` and `for` attributes to relate the `<input>` and `<label>`. ### Default (stacked) @@ -162,36 +162,36 @@ By default, any number of checkboxes and radios that are immediate sibling will {% example html %} <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox" value=""> - Option one is this and that—be sure to include why it's great + <input class="form-check-input" type="checkbox" value="" id="defaultCheck1"> + <label class="form-check-label" for="defaultCheck1"> + Default checkbox </label> </div> -<div class="form-check disabled"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox" value="" disabled> - Option two is disabled +<div class="form-check"> + <input class="form-check-input" type="checkbox" value="" id="defaultCheck2" disabled> + <label class="form-check-label" for="defaultCheck2"> + Disabled checkbox </label> </div> {% endexample %} {% example html %} <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked> - Option one is this and that—be sure to include why it's great + <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked> + <label class="form-check-label" for="exampleRadios1"> + Default radio </label> </div> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2"> - Option two can be something else and selecting it will deselect option one + <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2"> + <label class="form-check-label" for="exampleRadios2"> + Second default radio </label> </div> <div class="form-check disabled"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios3" value="option3" disabled> - Option three is disabled + <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios3" value="option3" disabled> + <label class="form-check-label" for="exampleRadios3"> + Disabled radio </label> </div> {% endexample %} @@ -202,37 +202,31 @@ Group checkboxes or radios on the same horizontal row by adding `.form-check-inl {% example html %} <div class="form-check form-check-inline"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox" id="inlineCheckbox1" value="option1"> 1 - </label> + <input class="form-check-input" type="checkbox" id="inlineCheckbox1" value="option1"> + <label class="form-check-label" for="inlineCheckbox1">1</label> </div> <div class="form-check form-check-inline"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox" id="inlineCheckbox2" value="option2"> 2 - </label> + <input class="form-check-input" type="checkbox" id="inlineCheckbox2" value="option2"> + <label class="form-check-label" for="inlineCheckbox2">2</label> </div> -<div class="form-check form-check-inline disabled"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox" id="inlineCheckbox3" value="option3" disabled> 3 - </label> +<div class="form-check form-check-inline"> + <input class="form-check-input" type="checkbox" id="inlineCheckbox3" value="option3" disabled> + <label class="form-check-label" for="inlineCheckbox3">3 (disabled)</label> </div> {% endexample %} {% example html %} <div class="form-check form-check-inline"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> 1 - </label> + <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> + <label class="form-check-label" for="inlineRadio1">1</label> </div> <div class="form-check form-check-inline"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> 2 - </label> + <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> + <label class="form-check-label" for="inlineRadio2">2</label> </div> -<div class="form-check form-check-inline disabled"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3" disabled> 3 - </label> +<div class="form-check form-check-inline"> + <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3" disabled> + <label class="form-check-label" for="inlineRadio3">3 (disabled)</label> </div> {% endexample %} @@ -242,14 +236,10 @@ Add `.position-static` to inputs within `.form-check` that don't have any label {% example html %} <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input position-static" type="checkbox" id="blankCheckbox" value="option1" aria-label="..."> - </label> + <input class="form-check-input position-static" type="checkbox" id="blankCheckbox" value="option1" aria-label="..."> </div> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input position-static" type="radio" name="blankRadio" id="blankRadio1" value="option1" aria-label="..."> - </label> + <input class="form-check-input position-static" type="radio" name="blankRadio" id="blankRadio1" value="option1" aria-label="..."> </div> {% endexample %} @@ -349,8 +339,9 @@ More complex layouts can also be created with the grid system. </div> <div class="form-group"> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox"> Check me out + <input class="form-check-input" type="checkbox" id="gridCheck"> + <label class="form-check-label" for="gridCheck"> + Check me out </label> </div> </div> @@ -383,21 +374,21 @@ At times, you maybe need to use margin or padding utilities to create that perfe <legend class="col-form-label col-sm-2 pt-0">Radios</legend> <div class="col-sm-10"> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked> - Option one is this and that—be sure to include why it's great + <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked> + <label class="form-check-label" for="gridRadios1"> + First radio </label> </div> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios2" value="option2"> - Option two can be something else and selecting it will deselect option one + <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios2" value="option2"> + <label class="form-check-label" for="gridRadios2"> + Second radio </label> </div> <div class="form-check disabled"> - <label class="form-check-label"> - <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled> - Option three is disabled + <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled> + <label class="form-check-label" for="gridRadios3"> + Third disabled radio </label> </div> </div> @@ -407,8 +398,9 @@ At times, you maybe need to use margin or padding utilities to create that perfe <div class="col-sm-2">Checkbox</div> <div class="col-sm-10"> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox"> Check me out + <input class="form-check-input" type="checkbox" id="gridCheck1"> + <label class="form-check-label" for="gridCheck1"> + Example checkbox </label> </div> </div> @@ -490,8 +482,9 @@ The example below uses a flexbox utility to vertically center the contents and c </div> <div class="col-auto"> <div class="form-check mb-2"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox"> Remember me + <input class="form-check-input" type="checkbox" id="autoSizingCheck"> + <label class="form-check-label" for="autoSizingCheck"> + Remember me </label> </div> </div> @@ -507,27 +500,28 @@ You can then remix that once again with size-specific column classes. {% example html %} <form> <div class="form-row align-items-center"> - <div class="col-sm-3"> + <div class="col-sm-3 my-1"> <label class="sr-only" for="inlineFormInputName">Name</label> - <input type="text" class="form-control mb-2 mb-sm-0" id="inlineFormInputName" placeholder="Jane Doe"> + <input type="text" class="form-control" id="inlineFormInputName" placeholder="Jane Doe"> </div> - <div class="col-sm-3"> + <div class="col-sm-3 my-1"> <label class="sr-only" for="inlineFormInputGroupUsername">Username</label> - <div class="input-group mb-2 mb-sm-0"> + <div class="input-group"> <div class="input-group-prepend"> <div class="input-group-text">@</div> </div> <input type="text" class="form-control" id="inlineFormInputGroupUsername" placeholder="Username"> </div> </div> - <div class="col-auto"> - <div class="form-check mb-2 mb-sm-0"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox"> Remember me + <div class="col-auto my-1"> + <div class="form-check"> + <input class="form-check-input" type="checkbox" id="autoSizingCheck2"> + <label class="form-check-label" for="autoSizingCheck2"> + Remember me </label> </div> </div> - <div class="col-auto"> + <div class="col-auto my-1"> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> @@ -539,24 +533,23 @@ And of course [custom form controls](#custom-forms) are supported. {% example html %} <form> <div class="form-row align-items-center"> - <div class="col-auto"> + <div class="col-auto my-1"> <label class="mr-sm-2" for="inlineFormCustomSelect">Preference</label> - <select class="custom-select mb-2 mr-sm-2" id="inlineFormCustomSelect"> + <select class="custom-select mr-sm-2" id="inlineFormCustomSelect"> <option selected>Choose...</option> <option value="1">One</option> <option value="2">Two</option> <option value="3">Three</option> </select> </div> - <div class="col-auto"> - <label class="custom-control custom-checkbox mb-2 mr-sm-2"> - <input type="checkbox" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Remember my preference</span> - </label> + <div class="col-auto my-1"> + <div class="custom-control custom-checkbox mr-sm-2"> + <input type="checkbox" class="custom-control-input" id="customControlAutosizing"> + <label class="custom-control-label" for="customControlAutosizing">Remember my preference</label> + </div> </div> - <div class="col-auto"> - <button type="submit" class="btn btn-primary mb-2">Submit</button> + <div class="col-auto my-1"> + <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </form> @@ -586,8 +579,9 @@ You may need to manually address the width and alignment of individual form cont </div> <div class="form-check mb-2 mr-sm-2"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox"> Remember me + <input class="form-check-input" type="checkbox" id="inlineFormCheck"> + <label class="form-check-label" for="inlineFormCheck"> + Remember me </label> </div> @@ -599,21 +593,20 @@ Custom form controls and selects are also supported. {% example html %} <form class="form-inline"> - <label class="mr-2" for="inlineFormCustomSelectPref">Preference</label> - <select class="custom-select mb-2 mr-sm-2" id="inlineFormCustomSelectPref"> + <label class="my-1 mr-2" for="inlineFormCustomSelectPref">Preference</label> + <select class="custom-select my-1 mr-sm-2" id="inlineFormCustomSelectPref"> <option selected>Choose...</option> <option value="1">One</option> <option value="2">Two</option> <option value="3">Three</option> </select> - <label class="custom-control custom-checkbox mb-2 mr-sm-2"> - <input type="checkbox" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Remember my preference</span> - </label> + <div class="custom-control custom-checkbox my-1 mr-sm-2"> + <input type="checkbox" class="custom-control-input" id="customControlInline"> + <label class="custom-control-label" for="customControlInline">Remember my preference</label> + </div> - <button type="submit" class="btn btn-primary mb-2">Submit</button> + <button type="submit" class="btn btn-primary my-1">Submit</button> </form> {% endexample %} @@ -680,8 +673,9 @@ Add the `disabled` attribute to a `<fieldset>` to disable all the controls withi </select> </div> <div class="form-check"> - <label class="form-check-label"> - <input class="form-check-input" type="checkbox"> Can't check this + <input class="form-check-input" type="checkbox" id="disabledFieldsetCheck" disabled> + <label class="form-check-label" for="disabledFieldsetCheck"> + Can't check this </label> </div> <button type="submit" class="btn btn-primary">Submit</button> @@ -905,23 +899,18 @@ Our example forms show native textual `<input>`s above, but form validation styl {% example html %} <form class="was-validated"> - <label class="custom-control custom-checkbox"> - <input type="checkbox" class="custom-control-input" required> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Check this custom checkbox</span> - </label> + <div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="customControlValidation1" required> + <label class="custom-control-label" for="customControlValidation1">Check this custom checkbox</label> + </div> - <div class="custom-controls-stacked d-block my-3"> - <label class="custom-control custom-radio"> - <input id="radioStacked1" name="radio-stacked" type="radio" class="custom-control-input" required> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Toggle this custom radio</span> - </label> - <label class="custom-control custom-radio"> - <input id="radioStacked2" name="radio-stacked" type="radio" class="custom-control-input" required> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Or toggle this other custom radio</span> - </label> + <div class="custom-control custom-radio"> + <input type="radio" class="custom-control-input" id="customControlValidation2" name="radio-stacked" required> + <label class="custom-control-label" for="customControlValidation2">Toggle this custom radio</label> + </div> + <div class="custom-control custom-radio"> + <input type="radio" class="custom-control-input" id="customControlValidation3" name="radio-stacked" required> + <label class="custom-control-label" for="customControlValidation3">Or toggle this other custom radio</label> </div> <select class="custom-select d-block my-3" required> @@ -944,36 +933,30 @@ For even more customization and cross browser consistency, use our completely cu ### Checkboxes and radios -Each checkbox and radio is wrapped in a `<label>` for three reasons: - -- It provides a larger hit areas for checking the control. -- It provides a helpful and semantic wrapper to help us replace the default `<input>`s. -- It triggers the state of the `<input>` automatically, meaning no JavaScript is required. +Each checkbox and radio is wrapped in a `<div>` with a sibling `<span>` to create our custom control and a `<label>` for the accompanying text. Structurally, this is the same approach as our default `.form-check`. -We hide the default `<input>` with `opacity` and use the `.custom-control-indicator` to build a new custom form indicator in its place. Unfortunately we can't build a custom one from just the `<input>` because CSS's `content` doesn't work on that element. +We use the sibling selector (`~`) for all our `<input>` states—like `:checked`—to properly style our custom form indicator. When combined with the `.custom-control-label` class, we can also style the text for each item based on the `<input>`'s state. -We use the sibling selector (`~`) for all our `<input>` states—like `:checked`—to properly style our custom form indicator. When combined with the `.custom-control-description` class, we can also style the text for each item based on the `<input>`'s state. +We hide the default `<input>` with `opacity` and use the `.custom-control-label` to build a new custom form indicator in its place with `::before` and `::after`. Unfortunately we can't build a custom one from just the `<input>` because CSS's `content` doesn't work on that element. In the checked states, we use **base64 embedded SVG icons** from [Open Iconic](https://useiconic.com/open). This provides us the best control for styling and positioning across browsers and devices. #### Checkboxes {% example html %} -<label class="custom-control custom-checkbox"> - <input type="checkbox" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Check this custom checkbox</span> -</label> +<div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="customCheck1"> + <label class="custom-control-label" for="customCheck1">Check this custom checkbox</label> +</div> {% endexample %} Custom checkboxes can also utilize the `:indeterminate` pseudo class when manually set via JavaScript (there is no available HTML attribute for specifying it). <div class="bd-example bd-example-indeterminate"> - <label class="custom-control custom-checkbox"> - <input type="checkbox" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Check this custom checkbox</span> - </label> + <div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="customCheck2"> + <label class="custom-control-label" for="customCheck2">Check this custom checkbox</label> + </div> </div> If you're using jQuery, something like this should suffice: @@ -985,52 +968,42 @@ $('.your-checkbox').prop('indeterminate', true) #### Radios {% example html %} -<label class="custom-control custom-radio"> - <input id="radio1" name="radio" type="radio" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Toggle this custom radio</span> -</label> -<label class="custom-control custom-radio"> - <input id="radio2" name="radio" type="radio" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Or toggle this other custom radio</span> -</label> +<div class="custom-control custom-radio"> + <input type="radio" id="customRadio1" name="customRadio" class="custom-control-input"> + <label class="custom-control-label" for="customRadio1">Toggle this custom radio</label> +</div> +<div class="custom-control custom-radio"> + <input type="radio" id="customRadio2" name="customRadio" class="custom-control-input"> + <label class="custom-control-label" for="customRadio2">Or toggle this other custom radio</label> +</div> {% endexample %} -#### Disabled - -Custom checkboxes and radios can also be disabled. Add the `disabled` boolean attribute to the `<input>` and the custom indicator and label description will be automatically styled. +#### Inline {% example html %} -<label class="custom-control custom-checkbox"> - <input type="checkbox" class="custom-control-input" disabled> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Check this custom checkbox</span> -</label> - -<label class="custom-control custom-radio"> - <input id="radio3" name="radioDisabled" type="radio" class="custom-control-input" disabled> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Toggle this custom radio</span> -</label> +<div class="custom-control custom-radio custom-control-inline"> + <input type="radio" id="customRadioInline1" name="customRadioInline1" class="custom-control-input"> + <label class="custom-control-label" for="customRadioInline1">Toggle this custom radio</label> +</div> +<div class="custom-control custom-radio custom-control-inline"> + <input type="radio" id="customRadioInline2" name="customRadioInline1" class="custom-control-input"> + <label class="custom-control-label" for="customRadioInline2">Or toggle this other custom radio</label> +</div> {% endexample %} -#### Stacked +#### Disabled -Custom checkboxes and radios are inline to start. Add a parent with class `.custom-controls-stacked` to ensure each form control is on separate lines. +Custom checkboxes and radios can also be disabled. Add the `disabled` boolean attribute to the `<input>` and the custom indicator and label description will be automatically styled. {% example html %} -<div class="custom-controls-stacked"> - <label class="custom-control custom-radio"> - <input id="radioStacked3" name="radio-stacked" type="radio" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Toggle this custom radio</span> - </label> - <label class="custom-control custom-radio"> - <input id="radioStacked4" name="radio-stacked" type="radio" class="custom-control-input"> - <span class="custom-control-indicator"></span> - <span class="custom-control-description">Or toggle this other custom radio</span> - </label> +<div class="custom-control custom-checkbox"> + <input type="checkbox" class="custom-control-input" id="customCheckDisabled" disabled> + <label class="custom-control-label" for="customCheckDisabled">Check this custom checkbox</label> +</div> + +<div class="custom-control custom-radio"> + <input type="radio" id="radio3" name="radioDisabled" id="customRadioDisabled" class="custom-control-input" disabled> + <label class="custom-control-label" for="customRadioDisabled">Toggle this custom radio</label> </div> {% endexample %} diff --git a/docs/4.0/migration.md b/docs/4.0/migration.md index 370cb3a01..eccddccf9 100644 --- a/docs/4.0/migration.md +++ b/docs/4.0/migration.md @@ -10,10 +10,21 @@ toc: true While Beta 2 saw the bulk of our breaking changes during the beta phase, but we still have a few that needed to be addressed in the Beta 3 release. These changes apply if you're updating to Beta 3 from Beta 2 or any older version of Bootstrap. +### Miscellaneous + - Removed the unused `$thumbnail-transition` variable. We weren't transitioning anything, so it was just extra code. -- Changed the CSS for managing multiple `background-image`s on custom form checkboxes and radios. Previously, the `.custom-control-indicator` element had the background color, gradient, and SVG icon. Customizing the background gradient meant replacing all of those every time you needed to change just one. Now, we have `.custom-control-indicator` for the fill and gradient and `.custom-control-indicator::before` handles the icon. - The npm package no longer includes any files other than our source and dist files; if you relied on them and were running our scripts via the `node_modules` folder, you should adapt your workflow. + +### Forms + +- Rewrote both custom and default checkboxes and radios. Now, both have matching HTML structure (outer `<div>` with sibling `<input>` and `<label>`) and the same layout styles (stacked default, inline with modifier class). This allows us to style the label based on the input's state, simplifying support for the `disabled` attribute (previously requiring a parent class) and better supporting our form validation. + + As part of this, we've changed the CSS for managing multiple `background-image`s on custom form checkboxes and radios. Previously, the now removed `.custom-control-indicator` element had the background color, gradient, and SVG icon. Customizing the background gradient meant replacing all of those every time you needed to change just one. Now, we have `.custom-control-label::before` for the fill and gradient and `.custom-control-label::after` handles the icon. + + To make a custom check inline, add `.custom-control-inline`. + - Updated selector for input-based button groups. Instead of `[data-toggle="buttons"] { }` for style and behavior, we use the `data` attribute just for JS behaviors and rely on a new `.btn-group-toggle` class for styling. + - Removed `.col-form-legend` in favor of a slightly improved `.col-form-label`. This way `.col-form-label-sm` and `.col-form-label-lg` can be used on `<legend>` elements with ease. ### Input groups |
