mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-16 01:52:19 +08:00

- Change the checkbox's `display` property to `block` when the `justify` or `alignment` property is set. - Set the default `justify-content` style to `space-between` so that a checkbox with `width: 100%` set without `justify` or `alignment` set will still have the same default - Modifies the `label` e2e test to remove the explicit width as setting the property will make them full-width - Adds two examples to the `label` e2e test of labels that do not have `justify` set but use `width: 100%` to ensure they are working as expected without it
308 lines
7.2 KiB
SCSS
308 lines
7.2 KiB
SCSS
@import "../../themes/ionic.globals";
|
|
@import "./checkbox.vars.scss";
|
|
|
|
// Checkbox
|
|
// --------------------------------------------------
|
|
|
|
:host {
|
|
/**
|
|
* @prop --size: Size of the checkbox icon
|
|
*
|
|
* @prop --checkbox-background: Background of the checkbox icon
|
|
* @prop --checkbox-background-checked: Background of the checkbox icon when checked
|
|
*
|
|
* @prop --border-color: Border color of the checkbox icon
|
|
* @prop --border-radius: Border radius of the checkbox icon
|
|
* @prop --border-width: Border width of the checkbox icon
|
|
* @prop --border-style: Border style of the checkbox icon
|
|
* @prop --border-color-checked: Border color of the checkbox icon when checked
|
|
*
|
|
* @prop --transition: Transition of the checkbox icon
|
|
*
|
|
* @prop --checkmark-color: Color of the checkbox checkmark when checked
|
|
* @prop --checkmark-width: Stroke width of the checkbox checkmark
|
|
*/
|
|
--checkbox-background-checked: #{ion-color(primary, base)};
|
|
--border-color-checked: #{ion-color(primary, base)};
|
|
--checkmark-color: #{ion-color(primary, contrast)};
|
|
--transition: none;
|
|
|
|
display: inline-block;
|
|
|
|
position: relative;
|
|
|
|
cursor: pointer;
|
|
|
|
user-select: none;
|
|
z-index: $z-index-item-input;
|
|
}
|
|
|
|
:host(.in-item) {
|
|
flex: 1 1 0;
|
|
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
/**
|
|
* Checkbox can be slotted
|
|
* in components such as item and
|
|
* toolbar which is why we do not
|
|
* limit the below behavior to just ion-item.
|
|
*/
|
|
:host([slot="start"]),
|
|
:host([slot="end"]) {
|
|
// Reset the flex property when the checkbox
|
|
// is slotted to avoid growing the element larger
|
|
// than its content.
|
|
flex: initial;
|
|
|
|
width: auto;
|
|
}
|
|
|
|
:host(.ion-color) {
|
|
--checkbox-background-checked: #{current-color(base)};
|
|
--border-color-checked: #{current-color(base)};
|
|
--checkmark-color: #{current-color(contrast)};
|
|
}
|
|
|
|
.checkbox-wrapper {
|
|
display: flex;
|
|
|
|
flex-grow: 1;
|
|
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
|
|
height: inherit;
|
|
|
|
cursor: inherit;
|
|
}
|
|
|
|
.label-text-wrapper {
|
|
text-overflow: ellipsis;
|
|
|
|
white-space: nowrap;
|
|
|
|
overflow: hidden;
|
|
}
|
|
|
|
:host(.in-item) .label-text-wrapper {
|
|
@include margin($checkbox-item-label-margin-top, null, $checkbox-item-label-margin-bottom, null);
|
|
}
|
|
|
|
:host(.in-item.checkbox-label-placement-stacked) .label-text-wrapper {
|
|
@include margin($checkbox-item-label-margin-top, null, $form-control-label-margin, null);
|
|
}
|
|
|
|
:host(.in-item.checkbox-label-placement-stacked) .native-wrapper {
|
|
@include margin(null, null, $checkbox-item-label-margin-bottom, null);
|
|
}
|
|
|
|
/**
|
|
* If no label text is placed into the slot
|
|
* then the element should be hidden otherwise
|
|
* there will be additional margins added.
|
|
*/
|
|
.label-text-wrapper-hidden {
|
|
display: none;
|
|
}
|
|
|
|
input {
|
|
@include visually-hidden();
|
|
}
|
|
|
|
.native-wrapper {
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
}
|
|
|
|
.checkbox-icon {
|
|
@include border-radius(var(--border-radius));
|
|
|
|
position: relative;
|
|
|
|
width: var(--size);
|
|
height: var(--size);
|
|
|
|
transition: var(--transition);
|
|
|
|
border-width: var(--border-width);
|
|
border-style: var(--border-style);
|
|
border-color: var(--border-color);
|
|
|
|
background: var(--checkbox-background);
|
|
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.checkbox-icon path {
|
|
fill: none;
|
|
stroke: var(--checkmark-color);
|
|
stroke-width: var(--checkmark-width);
|
|
|
|
opacity: 0;
|
|
}
|
|
|
|
// Justify Content
|
|
// ---------------------------------------------
|
|
|
|
:host(.checkbox-justify-space-between) .checkbox-wrapper {
|
|
justify-content: space-between;
|
|
}
|
|
|
|
:host(.checkbox-justify-start) .checkbox-wrapper {
|
|
justify-content: start;
|
|
}
|
|
|
|
:host(.checkbox-justify-end) .checkbox-wrapper {
|
|
justify-content: end;
|
|
}
|
|
|
|
// Align Items
|
|
// ---------------------------------------------
|
|
|
|
:host(.checkbox-alignment-start) .checkbox-wrapper {
|
|
align-items: start;
|
|
}
|
|
|
|
:host(.checkbox-alignment-center) .checkbox-wrapper {
|
|
align-items: center;
|
|
}
|
|
|
|
// Justify Content & Align Items
|
|
// ---------------------------------------------
|
|
|
|
// The checkbox should be displayed as block when either justify
|
|
// or alignment is set; otherwise, these properties will have no
|
|
// visible effect.
|
|
:host(.checkbox-justify-space-between),
|
|
:host(.checkbox-justify-start),
|
|
:host(.checkbox-justify-end),
|
|
:host(.checkbox-alignment-start),
|
|
:host(.checkbox-alignment-center) {
|
|
display: block;
|
|
}
|
|
|
|
// Label Placement - Start
|
|
// ----------------------------------------------------------------
|
|
|
|
/**
|
|
* Label is on the left of the checkbox in LTR and
|
|
* on the right in RTL.
|
|
*/
|
|
:host(.checkbox-label-placement-start) .checkbox-wrapper {
|
|
flex-direction: row;
|
|
}
|
|
|
|
:host(.checkbox-label-placement-start) .label-text-wrapper {
|
|
/**
|
|
* The margin between the label and
|
|
* the checkbox should be on the end
|
|
* when the label sits at the start.
|
|
*/
|
|
@include margin(null, $form-control-label-margin, null, 0);
|
|
}
|
|
|
|
// Label Placement - End
|
|
// ----------------------------------------------------------------
|
|
|
|
/**
|
|
* Label is on the right of the checkbox in LTR and
|
|
* on the left in RTL.
|
|
*/
|
|
:host(.checkbox-label-placement-end) .checkbox-wrapper {
|
|
flex-direction: row-reverse;
|
|
}
|
|
|
|
/**
|
|
* The margin between the label and
|
|
* the checkbox should be on the start
|
|
* when the label sits at the end.
|
|
*/
|
|
:host(.checkbox-label-placement-end) .label-text-wrapper {
|
|
@include margin(null, 0, null, $form-control-label-margin);
|
|
}
|
|
|
|
// Label Placement - Fixed
|
|
// ----------------------------------------------------------------
|
|
|
|
:host(.checkbox-label-placement-fixed) .label-text-wrapper {
|
|
/**
|
|
* The margin between the label and
|
|
* the checkbox should be on the end
|
|
* when the label sits at the start.
|
|
*/
|
|
@include margin(null, $form-control-label-margin, null, 0);
|
|
}
|
|
|
|
/**
|
|
* Label is on the left of the checkbox in LTR and
|
|
* on the right in RTL. Label also has a fixed width.
|
|
*/
|
|
:host(.checkbox-label-placement-fixed) .label-text-wrapper {
|
|
flex: 0 0 100px;
|
|
|
|
width: 100px;
|
|
min-width: 100px;
|
|
max-width: 200px;
|
|
}
|
|
|
|
// Label Placement - Stacked
|
|
// ----------------------------------------------------------------
|
|
|
|
/**
|
|
* Label is on top of the checkbox.
|
|
*/
|
|
:host(.checkbox-label-placement-stacked) .checkbox-wrapper {
|
|
flex-direction: column;
|
|
}
|
|
|
|
:host(.checkbox-label-placement-stacked) .label-text-wrapper {
|
|
@include transform(scale(#{$form-control-label-stacked-scale}));
|
|
|
|
/**
|
|
* The margin between the label and
|
|
* the checkbox should be on the bottom
|
|
* when the label sits at the top.
|
|
*/
|
|
@include margin(null, 0, $form-control-label-margin, 0);
|
|
|
|
/**
|
|
* Label text should not extend
|
|
* beyond the bounds of the checkbox.
|
|
*/
|
|
max-width: calc(100% / #{$form-control-label-stacked-scale});
|
|
}
|
|
|
|
:host(.checkbox-label-placement-stacked.checkbox-alignment-start) .label-text-wrapper {
|
|
@include transform-origin(start, top);
|
|
}
|
|
|
|
:host(.checkbox-label-placement-stacked.checkbox-alignment-center) .label-text-wrapper {
|
|
@include transform-origin(center, top);
|
|
}
|
|
|
|
// Checked / Indeterminate Checkbox
|
|
// ---------------------------------------------
|
|
|
|
:host(.checkbox-checked) .checkbox-icon,
|
|
:host(.checkbox-indeterminate) .checkbox-icon {
|
|
border-color: var(--border-color-checked);
|
|
|
|
background: var(--checkbox-background-checked);
|
|
}
|
|
|
|
:host(.checkbox-checked) .checkbox-icon path,
|
|
:host(.checkbox-indeterminate) .checkbox-icon path {
|
|
opacity: 1;
|
|
}
|
|
|
|
// Disabled Checkbox
|
|
// ---------------------------------------------
|
|
|
|
:host(.checkbox-disabled) {
|
|
pointer-events: none;
|
|
}
|